216 lines (191 with data), 7.1 kB
#ifndef _ANYMOCAP_CREATE_CONSTRAINT_CLASS_ANY_
#define _ANYMOCAP_CREATE_CONSTRAINT_CLASS_ANY_
/*
---
group: MoCap
topic: Parameter Identification
descr: |
Collection of class templates for adding constraints between
design variables in Parameter optimization studies.
---
To use these drivers import the file:
#include "<AMMR_TOOLS>/AnyMoCap/CreateConstraintClass.any"
See the individual classes for more information.
*/
// Add a constraint to AnyMoCap models between two design variables
// in the parameter identification study.
// By default the Design variables are linked to be equal by adding a constraint
// `Coef1*DesVar1 - Coef2*DesVar2 = 0`
//
// It is also possible change the link by setting `Coef1` and `Coef2`, and the
// `Constraint_Type` argument.
//
// :::{rubric} Example:
// :::
// ```{code-block} AnyScriptDoc
// LinkDesignVars EqualThighLength (
// Desvar1=RightThighLength,
// Desvar2=LeftThighLength,
// ) = {};
//```
// The constraint can be changed by changing the `Constraint_Type` argument.
//
#class_template LinkDesignVars (
DesVar1,
DesVar2,
Constraint_Type = EqualToZero,
Coef1 = 1,
Coef2= 1,
PARAMETER_OPT_STUDY = Main.Studies.ParameterIdentification
)
{
// Arguments
// ------------
// LinkDesignVars#DesVar1
// The first design variable to link.
// LinkDesignVars#DesVar2
// The second design variable to link.
// LinkDesignVars#Constraint_Type
// The type of constraint to add between the design variables.
// Possible values are: EqualToZero, LessThanZero, GreaterThanZero
// LinkDesignVars#Coef1
// The coefficient of the first design variable in the constraint equation.
// LinkDesignVars#Coef2
// The coefficient of the second design variable in the constraint equation.
// LinkDesignVars#PARAMETER_OPT_STUDY
// The parameter optimization study to add the constraint to.
Main.ModelSetup.ParameterIdentification = {
AnyDesMeasure LinkedDesignVars_##DesVar1##_##DesVar2 = {
Type = Constraint_Type;
Val = (Coef1) *.DesVar1.Val - (Coef2)*.DesVar2.Val;
};
};
PARAMETER_OPT_STUDY = {
AnyDesMeasure &LinkedDesignVars_##DesVar1##_##DesVar2 = Main.ModelSetup.ParameterIdentification.LinkedDesignVars_##DesVar1##_##DesVar2 ;
};
};
// Small convenience class to quickly add an `AnyDesMeasure` constraint to
// the `Main.ModelSetup.ParameterIdentification` folder and link it
// to the parameter optimization study.
//
// :::{rubric} Example:
// :::
// Here is an example of adding a constraints which forces the pelvis width
// to follow the overall body scale.
//
// :::{note} The following assumes the pelvis width is a design variable, and a model which
// uses the `ScaleXYZ` scaling law.
// :::
//
// ```{code-block} AnyScriptDoc
// CreateConstraint ScaleHeadWithBody(
// Constraint_Type = EqualToZero,
// ) =
//{
// Value = Main.HumanModel.Anthropometrics.SegmentScaleFactors.BodyScale
// - Main.HumanModel.Anthropometrics.SegmentScaleFactors.Pelvis.WidthScale;
// };
//```
//
#class_template CreateConstraint (
NAME=__NOT_DEFINED__,
Constraint_Type = EqualToZero,
PARAMETER_OPT_STUDY = Main.Studies.ParameterIdentification)
{
// Arguments
// CreateConstraint#Constraint_Type
// The type of constraint to add between the design variables.
// Possible values are: EqualToZero, LessThanZero, GreaterThanZero
// CreateConstraint#PARAMETER_OPT_STUDY
// The parameter optimization study to add the constraint to.
// CreateConstraint
/// The value used in constraint. This is usually set to some expression between
/// other variables.
#var AnyFloat Value;
Main.ModelSetup.ParameterIdentification = {
#if NAME == __NOT_DEFINED__
AnyDesMeasure __NAME__##Constraint_Type =
#else
AnyDesMeasure NAME##Constraint_Type =
#endif
{
Type = Constraint_Type;
Val = ....Value;
};
};
PARAMETER_OPT_STUDY = {
#if NAME == __NOT_DEFINED__
AnyDesMeasure &__NAME__##Constraint_Type = Main.ModelSetup.ParameterIdentification.__NAME__##Constraint_Type ;
#else
AnyDesMeasure &NAME##Constraint_Type = Main.ModelSetup.ParameterIdentification.NAME##Constraint_Type ;
#endif
};
};
// Convenience class to quickly add an constraints to markers in a cluster.
// The constraints ensures the markers remain in a rectangular shape.
//
// :::{note} Adding such a constraint is often not be necessary and may
// make it more difficult for the optimizer.
// :::
//
// :::{rubric} Example:
// :::
//
// ```{code-block} AnyScriptDoc
// Create4clusterRectangleConstraint ThighClusterConstraint(
// marker1 = RThigh1,
// marker2 = RThigh2,
// marker3 = RThigh3,
// marker4 = RThigh4,
// ) = {};
//
//```
//
#class_template Create4clusterRectangleConstraint (
marker1,
marker2,
marker3,
marker4,
PARAMETER_OPT_STUDY = Main.Studies.ParameterIdentification,
){
// Arguments
// ------------
// Create4clusterRectangleConstraint#marker1
// The first marker in the cluster.
// Create4clusterRectangleConstraint#marker2
// The second marker in the cluster.
// Create4clusterRectangleConstraint#marker3
// The third marker in the cluster.
// Create4clusterRectangleConstraint#marker4
// The fourth marker in the cluster.
// Create4clusterRectangleConstraint#PARAMETER_OPT_STUDY
// The parameter optimization study to add the constraint to.
PARAMETER_OPT_STUDY = {
// equal opposing sides in the rectangular cluster
AnyDesMeasure __NAME__##_SideConstraint1 = {
Type = EqualToZero;
Val = vnorm(marker1.sRelOptEdit-marker2.sRelOptEdit) - vnorm(marker3.sRelOptEdit-marker4.sRelOptEdit);
};
// equal opposing sides in the rectangular cluster
AnyDesMeasure __NAME__##_SideConstraint2= {
Type = EqualToZero;
Val = vnorm(marker2.sRelOptEdit-marker3.sRelOptEdit) - vnorm(marker4.sRelOptEdit-marker1.sRelOptEdit);
};
// equal diagonals in the cluster
AnyDesMeasure __NAME__##_DiagonalConstraint= {
Type = EqualToZero;
Val = vnorm(marker1.sRelOptEdit-marker3.sRelOptEdit) - vnorm(marker2.sRelOptEdit-marker4.sRelOptEdit);
};
};
};
#class_template Create4clusterParallelogramConstraint (name, marker1, marker2, marker3, marker4,
PARAMETER_OPT_STUDY = Main.Studies.ParameterIdentification){
PARAMETER_OPT_STUDY = {
// equal opposing sides in the rectangular cluster
AnyDesMeasure name##_ParallelogramConstraint = {
Type = EqualToZero;
Val = vnorm(marker4.sRelOptEdit+ marker2.sRelOptEdit - marker1.sRelOptEdit - marker3.sRelOptEdit);
};
};
};
#endif