PolyFEM
Loading...
Searching...
No Matches
polyfem::solver::StackedAugmentedLagrangianForm Class Reference

#include <StackedAugmentedLagrangianForm.hpp>

Inheritance diagram for polyfem::solver::StackedAugmentedLagrangianForm:
[legend]
Collaboration diagram for polyfem::solver::StackedAugmentedLagrangianForm:
[legend]

Classes

class  Block
 
struct  Term
 

Public Member Functions

 StackedAugmentedLagrangianForm ()
 
std::string name () const override
 
Block add_block (const int size)
 
void add (const Block &block, std::shared_ptr< AugmentedLagrangianForm > form)
 
int size () const
 
void init (const Eigen::VectorXd &x) override
 Initialize the form.
 
void finish () override
 
void update_quantities (const double t, const Eigen::VectorXd &x) override
 Update time-dependent fields.
 
void update_lagrangian (const Eigen::VectorXd &x, const double k_al) override
 
double compute_error (const Eigen::VectorXd &x) const override
 
bool can_project () const override
 
void project_gradient (Eigen::VectorXd &grad) const override
 
void project_hessian (StiffnessMatrix &hessian) const override
 
void project_diag (Eigen::VectorXd &diag) const override
 
- Public Member Functions inherited from polyfem::solver::AugmentedLagrangianForm
 AugmentedLagrangianForm ()
 
virtual ~AugmentedLagrangianForm ()
 
void set_initial_weight (const double k_al)
 
double lagrangian_weight () const
 
const StiffnessMatrixconstraint_matrix () const
 
const Eigen::MatrixXd & constraint_value () const
 
const StiffnessMatrixconstraint_projection_matrix () const
 
const Eigen::MatrixXd & constraint_projection_vector () const
 
bool has_projection () const
 
void set_scale (const double scale) override
 sets the scale for the form
 
- Public Member Functions inherited from polyfem::solver::Form
virtual ~Form ()
 
virtual double value (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied with the weigth.
 
Eigen::VectorXd value_per_element (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied with the weigth.
 
virtual void first_derivative (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
 Compute the first derivative of the value wrt x multiplied with the weigth.
 
void second_derivative (const Eigen::VectorXd &x, StiffnessMatrix &hessian) const
 Compute the second derivative of the value wrt x multiplied with the weigth.
 
virtual bool is_step_valid (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Determine if a step from solution x0 to solution x1 is allowed.
 
virtual double max_step_size (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Determine the maximum step size allowable between the current and next solution.
 
virtual void line_search_begin (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1)
 Initialize variables used during the line search.
 
virtual void line_search_end ()
 Clear variables used during the line search.
 
virtual void post_step (const polysolve::nonlinear::PostStepData &data)
 Update fields after a step in the optimization.
 
virtual void solution_changed (const Eigen::VectorXd &new_x)
 Update cached fields upon a change in the solution.
 
virtual void init_lagging (const Eigen::VectorXd &x)
 Initialize lagged fields TODO: more than one step.
 
virtual void update_lagging (const Eigen::VectorXd &x, const int iter_num)
 Update lagged fields.
 
virtual int max_lagging_iterations () const
 Get the maximum number of lagging iteration allowable.
 
virtual bool uses_lagging () const
 Does this form require lagging?
 
virtual void set_project_to_psd (bool val)
 Set project to psd.
 
bool is_project_to_psd () const
 Get if the form's second derivative is projected to psd.
 
void enable ()
 Enable the form.
 
void disable ()
 Disable the form.
 
void set_enabled (const bool enabled)
 Set if the form is enabled.
 
bool enabled () const
 Determine if the form is enabled.
 
virtual double weight () const
 Get the form's multiplicative constant weight.
 
void set_weight (const double weight)
 Set the form's multiplicative constant weight.
 
virtual bool is_step_collision_free (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Checks if the step is collision free.
 
void set_output_dir (const std::string &output_dir)
 

Protected Member Functions

double value_unweighted (const Eigen::VectorXd &x) const override
 Compute the value of the form.
 
void first_derivative_unweighted (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
 Compute the first derivative of the value wrt x.
 
void second_derivative_unweighted (const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
 Compute the second derivative of the value wrt x.
 
- Protected Member Functions inherited from polyfem::solver::AugmentedLagrangianForm
double L_weight () const
 
double A_weight () const
 
- Protected Member Functions inherited from polyfem::solver::Form
std::string resolve_output_path (const std::string &path) const
 
virtual Eigen::VectorXd value_per_element_unweighted (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied per element.
 

Private Member Functions

void validate_block (const Block &block) const
 
Eigen::VectorXd gather (const Eigen::VectorXd &x, const Term &term) const
 
int global_index (const Term &term, const int local_index) const
 
void rebuild_constraint_data ()
 
void sync_child_weights () const
 

Private Attributes

std::vector< Blockblocks_
 
std::vector< Termterms_
 
int size_ = 0
 
bool projection_available_ = false
 

Additional Inherited Members

- Protected Attributes inherited from polyfem::solver::AugmentedLagrangianForm
double k_al_
 penalty parameter
 
Eigen::VectorXd lagr_mults_
 vector of lagrange multipliers
 
StiffnessMatrix A_
 Constraints matrix.
 
Eigen::MatrixXd b_
 Constraints value.
 
StiffnessMatrix A_proj_
 Constraints projection matrix.
 
Eigen::MatrixXd b_proj_
 Constraints projection value.
 
- Protected Attributes inherited from polyfem::solver::Form
bool project_to_psd_ = false
 If true, the form's second derivative is projected to be positive semidefinite.
 
double weight_ = 1
 weight of the form (e.g., AL penalty weight or Δt²)
 
bool enabled_ = true
 If true, the form is enabled.
 
std::string output_dir_
 

Detailed Description

Definition at line 10 of file StackedAugmentedLagrangianForm.hpp.

Constructor & Destructor Documentation

◆ StackedAugmentedLagrangianForm()

polyfem::solver::StackedAugmentedLagrangianForm::StackedAugmentedLagrangianForm ( )
inline

Member Function Documentation

◆ add()

void polyfem::solver::StackedAugmentedLagrangianForm::add ( const Block block,
std::shared_ptr< AugmentedLagrangianForm form 
)

Definition at line 21 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::StackedAugmentedLagrangianForm::Block::id(), rebuild_constraint_data(), terms_, and validate_block().

Here is the call graph for this function:

◆ add_block()

StackedAugmentedLagrangianForm::Block polyfem::solver::StackedAugmentedLagrangianForm::add_block ( const int  size)

Definition at line 10 of file StackedAugmentedLagrangianForm.cpp.

References blocks_, size(), and size_.

Here is the call graph for this function:

◆ can_project()

bool polyfem::solver::StackedAugmentedLagrangianForm::can_project ( ) const
inlineoverridevirtual

Reimplemented from polyfem::solver::AugmentedLagrangianForm.

Definition at line 47 of file StackedAugmentedLagrangianForm.hpp.

References polyfem::solver::AugmentedLagrangianForm::has_projection().

Referenced by project_diag(), project_gradient(), and project_hessian().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ compute_error()

double polyfem::solver::StackedAugmentedLagrangianForm::compute_error ( const Eigen::VectorXd &  x) const
overridevirtual

Implements polyfem::solver::AugmentedLagrangianForm.

Definition at line 63 of file StackedAugmentedLagrangianForm.cpp.

References gather(), size_, terms_, and x.

Here is the call graph for this function:

◆ finish()

void polyfem::solver::StackedAugmentedLagrangianForm::finish ( )
overridevirtual

Reimplemented from polyfem::solver::Form.

Definition at line 37 of file StackedAugmentedLagrangianForm.cpp.

References terms_.

◆ first_derivative_unweighted()

void polyfem::solver::StackedAugmentedLagrangianForm::first_derivative_unweighted ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
overrideprotectedvirtual

Compute the first derivative of the value wrt x.

Parameters
[in]xCurrent solution
[out]gradvOutput gradient of the value wrt x

Implements polyfem::solver::Form.

Definition at line 117 of file StackedAugmentedLagrangianForm.cpp.

References blocks_, gather(), global_index(), size_, sync_child_weights(), terms_, and x.

Here is the call graph for this function:

◆ gather()

Eigen::VectorXd polyfem::solver::StackedAugmentedLagrangianForm::gather ( const Eigen::VectorXd &  x,
const Term term 
) const
private

Definition at line 180 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::StackedAugmentedLagrangianForm::Term::block, blocks_, polyfem::solver::StackedAugmentedLagrangianForm::Block::offset(), polyfem::solver::StackedAugmentedLagrangianForm::Block::size(), size_, and x.

Referenced by compute_error(), first_derivative_unweighted(), init(), second_derivative_unweighted(), update_lagrangian(), update_quantities(), and value_unweighted().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ global_index()

int polyfem::solver::StackedAugmentedLagrangianForm::global_index ( const Term term,
const int  local_index 
) const
private

Definition at line 187 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::StackedAugmentedLagrangianForm::Term::block, and blocks_.

Referenced by first_derivative_unweighted(), and second_derivative_unweighted().

Here is the caller graph for this function:

◆ init()

void polyfem::solver::StackedAugmentedLagrangianForm::init ( const Eigen::VectorXd &  x)
overridevirtual

Initialize the form.

Parameters
xCurrent solution

Reimplemented from polyfem::solver::Form.

Definition at line 29 of file StackedAugmentedLagrangianForm.cpp.

References gather(), size_, sync_child_weights(), terms_, and x.

Here is the call graph for this function:

◆ name()

std::string polyfem::solver::StackedAugmentedLagrangianForm::name ( ) const
inlineoverridevirtual

Implements polyfem::solver::Form.

Definition at line 33 of file StackedAugmentedLagrangianForm.hpp.

◆ project_diag()

void polyfem::solver::StackedAugmentedLagrangianForm::project_diag ( Eigen::VectorXd &  diag) const
overridevirtual

Reimplemented from polyfem::solver::AugmentedLagrangianForm.

Definition at line 94 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::A_proj_, can_project(), and size_.

Here is the call graph for this function:

◆ project_gradient()

void polyfem::solver::StackedAugmentedLagrangianForm::project_gradient ( Eigen::VectorXd &  grad) const
overridevirtual

Reimplemented from polyfem::solver::AugmentedLagrangianForm.

Definition at line 77 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::A_proj_, can_project(), and size_.

Here is the call graph for this function:

◆ project_hessian()

void polyfem::solver::StackedAugmentedLagrangianForm::project_hessian ( StiffnessMatrix hessian) const
overridevirtual

Reimplemented from polyfem::solver::AugmentedLagrangianForm.

Definition at line 84 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::A_proj_, can_project(), size_, and polyfem::solver::Form::value().

Here is the call graph for this function:

◆ rebuild_constraint_data()

void polyfem::solver::StackedAugmentedLagrangianForm::rebuild_constraint_data ( )
private

Definition at line 194 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::A_, polyfem::solver::AugmentedLagrangianForm::A_proj_, polyfem::solver::AugmentedLagrangianForm::b_, polyfem::solver::AugmentedLagrangianForm::b_proj_, polyfem::solver::StackedAugmentedLagrangianForm::Term::block, blocks_, polyfem::solver::StackedAugmentedLagrangianForm::Term::form, polyfem::solver::StackedAugmentedLagrangianForm::Block::offset(), projection_available_, polyfem::solver::StackedAugmentedLagrangianForm::Block::size(), size_, and terms_.

Referenced by add(), update_lagrangian(), and update_quantities().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ second_derivative_unweighted()

void polyfem::solver::StackedAugmentedLagrangianForm::second_derivative_unweighted ( const Eigen::VectorXd &  x,
StiffnessMatrix hessian 
) const
overrideprotectedvirtual

Compute the second derivative of the value wrt x.

Parameters
[in]xCurrent solution
[out]hessianOutput Hessian of the value wrt x

Implements polyfem::solver::Form.

Definition at line 137 of file StackedAugmentedLagrangianForm.cpp.

References blocks_, entries, gather(), global_index(), size_, sync_child_weights(), terms_, and x.

Here is the call graph for this function:

◆ size()

int polyfem::solver::StackedAugmentedLagrangianForm::size ( ) const
inline

Definition at line 38 of file StackedAugmentedLagrangianForm.hpp.

References size_.

Referenced by add_block().

Here is the caller graph for this function:

◆ sync_child_weights()

void polyfem::solver::StackedAugmentedLagrangianForm::sync_child_weights ( ) const
private

Definition at line 303 of file StackedAugmentedLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::k_al_, and terms_.

Referenced by first_derivative_unweighted(), init(), second_derivative_unweighted(), update_quantities(), and value_unweighted().

Here is the caller graph for this function:

◆ update_lagrangian()

void polyfem::solver::StackedAugmentedLagrangianForm::update_lagrangian ( const Eigen::VectorXd &  x,
const double  k_al 
)
overridevirtual

Implements polyfem::solver::AugmentedLagrangianForm.

Definition at line 54 of file StackedAugmentedLagrangianForm.cpp.

References gather(), polyfem::solver::AugmentedLagrangianForm::k_al_, rebuild_constraint_data(), size_, terms_, and x.

Here is the call graph for this function:

◆ update_quantities()

void polyfem::solver::StackedAugmentedLagrangianForm::update_quantities ( const double  t,
const Eigen::VectorXd &  x 
)
overridevirtual

Update time-dependent fields.

Parameters
tCurrent time
xCurrent solution at time t

Reimplemented from polyfem::solver::Form.

Definition at line 43 of file StackedAugmentedLagrangianForm.cpp.

References gather(), rebuild_constraint_data(), size_, sync_child_weights(), terms_, and x.

Here is the call graph for this function:

◆ validate_block()

void polyfem::solver::StackedAugmentedLagrangianForm::validate_block ( const Block block) const
private

Definition at line 172 of file StackedAugmentedLagrangianForm.cpp.

References blocks_, polyfem::solver::StackedAugmentedLagrangianForm::Block::id(), polyfem::solver::StackedAugmentedLagrangianForm::Block::offset(), and polyfem::solver::StackedAugmentedLagrangianForm::Block::size().

Referenced by add().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ value_unweighted()

double polyfem::solver::StackedAugmentedLagrangianForm::value_unweighted ( const Eigen::VectorXd &  x) const
overrideprotectedvirtual

Compute the value of the form.

Parameters
xCurrent solution
Returns
Computed value

Implements polyfem::solver::Form.

Definition at line 102 of file StackedAugmentedLagrangianForm.cpp.

References gather(), size_, sync_child_weights(), terms_, polyfem::solver::Form::value(), and x.

Here is the call graph for this function:

Member Data Documentation

◆ blocks_

std::vector<Block> polyfem::solver::StackedAugmentedLagrangianForm::blocks_
private

◆ projection_available_

bool polyfem::solver::StackedAugmentedLagrangianForm::projection_available_ = false
private

Definition at line 73 of file StackedAugmentedLagrangianForm.hpp.

Referenced by rebuild_constraint_data().

◆ size_

◆ terms_


The documentation for this class was generated from the following files: