#pragma once #include #include #include #include namespace alpaqa::util { template void check_dim_msg(crvec v, auto sz, std::string msg) { if (v.size() != sz) { msg += "\n(should be "; msg += std::to_string(sz); msg += ", got "; msg += std::to_string(v.size()); msg += ")"; throw std::invalid_argument(msg); } } template void check_dim_msg(std::optional> &v, auto sz, std::string msg) { if (!v) { v = vec::Zero(sz); } else if (v->size() != sz) { msg += "\n(should be "; msg += std::to_string(sz); msg += ", got "; msg += std::to_string(v->size()); msg += ")"; throw std::invalid_argument(msg); } } template void check_dim(std::string name, V &&v, auto sz) { name += ": dimension mismatch"; check_dim_msg(std::forward(v), sz, name); } template void check_dim_msg(crmat m, auto rows, auto cols, std::string msg) { if (m.cols() != cols || m.rows() != rows) { msg += "\n(should be "; msg += std::to_string(rows); msg += "×"; msg += std::to_string(cols); msg += ", got "; msg += std::to_string(m.rows()); msg += "×"; msg += std::to_string(m.cols()); msg += ")"; throw std::invalid_argument(msg); } } template void check_dim(std::string name, crmat m, auto rows, auto cols) { name += ": dimension mismatch"; check_dim_msg(m, rows, cols, name); } } // namespace alpaqa::util