29#include <polysolve/nonlinear/BoxConstraintSolver.hpp>
30#include <polysolve/linear/Solver.hpp>
33#include <polyfem/embedded_spec/polyfem_opt.hpp>
34#include <polyfem/embedded_spec/polyfem_objective.hpp>
49 spdlog::level::level_enum,
50 {{spdlog::level::level_enum::trace,
"trace"},
51 {spdlog::level::level_enum::debug,
"debug"},
52 {spdlog::level::level_enum::info,
"info"},
53 {spdlog::level::level_enum::warn,
"warning"},
54 {spdlog::level::level_enum::err,
"error"},
55 {spdlog::level::level_enum::critical,
"critical"},
56 {spdlog::level::level_enum::off,
"off"},
57 {spdlog::level::level_enum::trace, 0},
58 {spdlog::level::level_enum::debug, 1},
59 {spdlog::level::level_enum::info, 2},
60 {spdlog::level::level_enum::warn, 3},
61 {spdlog::level::level_enum::err, 3},
62 {spdlog::level::level_enum::critical, 4},
63 {spdlog::level::level_enum::off, 5}})
70 const json &solver_params,
71 const json &linear_solver_params,
72 const double characteristic_length,
73 const bool strict_validation)
75 auto names = polysolve::nonlinear::Solver::available_solvers();
76 if (std::find(names.begin(), names.end(), solver_params[
"solver"]) != names.end())
77 return polysolve::nonlinear::Solver::create(
78 solver_params, linear_solver_params, characteristic_length,
adjoint_logger(), strict_validation);
80 names = polysolve::nonlinear::BoxConstraintSolver::available_solvers();
81 if (std::find(names.begin(), names.end(), solver_params[
"solver"]) != names.end())
82 return polysolve::nonlinear::BoxConstraintSolver::create(
83 solver_params, linear_solver_params, characteristic_length,
adjoint_logger(), strict_validation);
91 if (args.is_string() && args.get<std::string>() ==
"auto")
93 Eigen::VectorXd
x = var2sim.
data[0]->inverse_eval();
106 int accumulative = 0;
108 for (
const auto &arg : args)
110 const auto &arg_initial = arg[
"initial"];
111 Eigen::VectorXd tmp(variable_sizes[var]);
112 if (arg_initial.is_array() && arg_initial.size() > 0)
115 x.segment(accumulative, tmp.size()) = tmp;
117 else if (arg_initial.is_number())
119 tmp.setConstant(arg_initial.get<
double>());
120 x.segment(accumulative, tmp.size()) = tmp;
127 if (var2sim.
data.size() != 1)
129 logger().warn(
"Computing initial guess via inverse eval with multiple"
130 " variable to simulation. You should make sure var2sim maps one"
131 " to one to optimization parameter blocks in perfect order.");
133 x += var2sim.
data[var]->inverse_eval();
136 accumulative += tmp.size();
145 Eigen::MatrixXd solution;
146 varform.
solve(solution,
nullptr, {},
false);
153 for (
auto &arg : args)
156 else if (args.is_object())
159 const bool valid_input = jse.verify_json(args, rules);
163 logger().error(
"invalid objective json:\n{}", jse.log2str());
164 throw std::runtime_error(
"Invalid objective json file");
167 args = jse.inject_defaults(args, rules);
169 for (
auto &it : args.items())
171 if (it.key().find(
"objective") != std::string::npos)
179 json args_in = input_args;
185 jse.strict = strict_validation;
186 rules = jse::embed::polyfem_opt_spec::polyfem_opt::spec();
188 polysolve::linear::Solver::apply_default_solver(rules,
"/solver/linear");
191 if (args_in.contains(
"/solver/linear"_json_pointer))
192 polysolve::linear::Solver::select_valid_solver(args_in[
"solver"][
"linear"],
logger());
194 const bool valid_input = jse.verify_json(args_in, rules);
198 logger().error(
"invalid input json:\n{}", jse.log2str());
199 throw std::runtime_error(
"Invalid input json file");
202 json args = jse.inject_defaults(args_in, rules);
204 const json obj_rules = jse::embed::polyfem_objective_spec::polyfem_objective::spec();
214 if (args[
"number"].is_number())
216 return args[
"number"].get<
int>();
218 else if (args[
"number"].is_null() && args[
"initial"].size() > 0)
220 return args[
"initial"].size();
222 else if (args[
"number"].is_object())
224 auto selection = args[
"number"];
225 if (selection.contains(
"surface_selection"))
227 auto surface_selection = selection[
"surface_selection"].get<std::vector<int>>();
228 auto varform_id = selection[
"state"];
229 std::set<int> node_ids = {};
230 for (
const auto &surface : surface_selection)
232 std::vector<int> ids;
234 for (
const auto &i : ids)
237 return node_ids.size() * varforms[varform_id]->get_mesh().dimension();
239 else if (selection.contains(
"volume_selection"))
241 auto volume_selection = selection[
"volume_selection"].get<std::vector<int>>();
242 auto varform_id = selection[
"state"];
243 std::set<int> node_ids = {};
244 for (
const auto &volume : volume_selection)
246 std::vector<int> ids;
248 for (
const auto &i : ids)
252 if (selection[
"exclude_boundary_nodes"])
254 std::vector<int> ids;
256 for (
const auto &i : ids)
260 return node_ids.size() * varforms[varform_id]->get_mesh().dimension();
std::vector< std::shared_ptr< VariableToSimulation > > data
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
void apply_objective_json_spec(json &args, const json &rules)
void compute_surface_node_ids(const varform::DifferentiableVarForm &varform, const int surface_selection, std::vector< int > &node_ids)
spdlog::logger & logger()
Retrieves the current logger.
spdlog::logger & adjoint_logger()
Retrieves the current logger for adjoint.
void compute_total_surface_node_ids(const varform::DifferentiableVarForm &varform, std::vector< int > &node_ids)
void compute_volume_node_ids(const varform::DifferentiableVarForm &varform, const int volume_selection, std::vector< int > &node_ids)
void log_and_throw_adjoint_error(const std::string &msg)
static int compute_variable_size(const json &args, const std::vector< std::shared_ptr< varform::DifferentiableVarForm > > &varforms)
static void solve_pde(varform::DifferentiableVarForm &varform)
static json apply_opt_json_spec(const json &input_args, bool strict_validation)
static Eigen::VectorXd inverse_evaluation(const json &args, const int ndof, const std::vector< int > &variable_sizes, VariableToSimulationGroup &var2sim)
static std::shared_ptr< polysolve::nonlinear::Solver > make_nl_solver(const json &solver_params, const json &linear_solver_params, const double characteristic_length, const bool strict_validation=true)