[bfdf16]: / Tools / AnyMocap / CreateConstraintClass.any

Download this file

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