19 Eigen::VectorXi active_dofs)
20 : dof_num_(varforms[0]->primary_space().ndof()),
21 varforms_(std::move(varforms)),
22 diff_caches_(std::move(diff_caches)),
23 parametrization_(std::move(parametrizations)),
24 active_dofs_(std::move(active_dofs))
31 if (!varform->get_problem().is_time_dependent())
51 for (
int i = 0; i <
varforms_.size(); ++i)
53 Eigen::MatrixXd sol, vel;
61 sol.conservativeResize(Eigen::NoChange, 1);
65 vel.conservativeResize(Eigen::NoChange, 1);
68 if (sol.rows() !=
dof_num_ || sol.cols() != 1)
70 log_and_throw_adjoint_error(
"Fail to construct initial condition variable to simulation. Reason: Invalid initial solution shape ({}, {}). Expect ({}, 1).",
73 if (vel.rows() !=
dof_num_ || vel.cols() != 1)
75 log_and_throw_adjoint_error(
"Fail to construct initial condition variable to simulation. Reason: Invalid initial velocity shape ({}, {}). Expect ({}, 1).",
98 if (varform.get() == &target)
115 assert(dc->initial_condition_override &&
"Initial-condition optimization must initialize its override");
116 auto &initial_condition_override = *dc->initial_condition_override;
117 auto &sol = initial_condition_override.solution;
118 auto &vel = initial_condition_override.velocity;
119 assert(sol.rows() ==
dof_num_ && sol.cols() >= 1 &&
"Initial solution override must match the simulation DOFs");
120 assert(vel.rows() ==
dof_num_ && vel.cols() >= 1 &&
"Initial velocity override must match the simulation DOFs");
122 for (
int i = 0; i < active_num; ++i)
128 initial_condition_override.acceleration = {};
134 assert(state_variables.size() == 2 *
dof_num_);
140 for (
int i = 0; i < active_num; ++i)
149 Eigen::VectorXd term, cur_term;
150 for (
int i = 0; i <
varforms_.size(); ++i)
156 Eigen::MatrixXd adjoint_nu =
get_adjoint_mat(*varform, *diff_cache, 1);
159 if (term.size() != cur_term.size())
169 assert(term.size() == 2 *
dof_num_);
173 for (
int j = 0; j < active_num; ++j)
190 assert(
diff_caches_[0]->initial_condition_override &&
"Initial-condition optimization must initialize its override");
191 const auto &initial_condition_override = *
diff_caches_[0]->initial_condition_override;
192 const Eigen::MatrixXd &sol = initial_condition_override.solution;
193 const Eigen::MatrixXd &vel = initial_condition_override.velocity;
194 assert(sol.rows() ==
dof_num_ && sol.cols() >= 1 &&
"Initial solution override must match the simulation DOFs");
195 assert(vel.rows() ==
dof_num_ && vel.cols() >= 1 &&
"Initial velocity override must match the simulation DOFs");
199 for (
int j = 0; j < active_num; ++j)
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
std::vector< std::shared_ptr< DiffCache > > DiffCachePtrs
std::vector< std::shared_ptr< varform::DifferentiableVarForm > > VarFormPtrs
Eigen::VectorXi active_dofs_
int inverse_dof() const override
Compute optimization variables dof.
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Compute adjoint contribution of objective gradient.
InitialConditionVariableToSimulation(VarFormPtrs varforms, DiffCachePtrs diff_caches, CompositeParametrization parametrizations, Eigen::VectorXi active_dofs)
Construct InitialConditionVariableToSimulation.
Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const override
Apply parametrization jacobian to compute the gradient w.r.t.
Eigen::VectorXd inverse_eval() const override
Compute optimization variables from forward simulation varform::DifferentiableVarForm.
bool affects_varform(const varform::DifferentiableVarForm &target) const override
Return true if current var2sim maps to target varform.
std::string name() const override
DiffCachePtrs diff_caches_
void update(const Eigen::VectorXd &x) override
Update forward simulation varforms from optimization variables.
ParameterType parameter_type() const override
void update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override
Update varform variables from optimization variables.
CompositeParametrization parametrization_
bool is_active_dofs_valid(const Eigen::VectorXi &active_dofs, const std::vector< std::shared_ptr< varform::DifferentiableVarForm > > &varforms, std::string &reason)
Validate active solution space dofs selection given varforms.
void log_and_throw_adjoint_error(const std::string &msg)
Eigen::MatrixXd get_adjoint_mat(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, int type)
Get adjoint parameter nu or p.