1 #ifndef SimTK_SimTKCOMMON_MEASURE_H_ 
    2 #define SimTK_SimTKCOMMON_MEASURE_H_ 
   64 #define SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH) \ 
   65     class Implementation;                                           \ 
   66     explicit MH(Implementation* imp) : PH(imp) {}                   \ 
   67     MH(SimTK::Subsystem& sub, Implementation* imp,                  \ 
   68        const SimTK::AbstractMeasure::SetHandle& sh)                 \ 
   70     MH& operator=(const MH& src) {PH::operator=(src); return *this;}\ 
   71     MH& shallowAssign(const MH& src) {PH::shallowAssign(src); return *this;}\ 
   72     MH& deepAssign(const MH& src) {PH::deepAssign(src); return *this;} 
   78 #define SimTK_MEASURE_HANDLE_PREAMBLE(MH,PH)    \ 
   79     SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH)   \ 
   80     MH() : PH(new Implementation()) {}          \ 
   81     explicit MH(SimTK::Subsystem& sub)          \ 
   82     : PH(sub,new Implementation(), typename PH::SetHandle()) {} 
   88 #define SimTK_MEASURE_HANDLE_PREAMBLE_ABSTRACT(MH,PH)   \ 
   89     SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH)           \ 
  111 #define SimTK_MEASURE_HANDLE_POSTSCRIPT(MH,PH) \ 
  112     static bool isA(const SimTK::AbstractMeasure& m)                        \ 
  113     {   return dynamic_cast<const Implementation*>(&m.getImpl()) != 0; }    \ 
  114     static const MH& getAs(const SimTK::AbstractMeasure& m)                 \ 
  115     {   assert(isA(m)); return static_cast<const MH&>(m); }                 \ 
  116     static MH& updAs(SimTK::AbstractMeasure& m)                             \ 
  117     {   assert(isA(m)); return static_cast<MH&>(m); }                       \ 
  118     const Implementation& getImpl() const                                   \ 
  119     {   return SimTK_DYNAMIC_CAST_DEBUG<const Implementation&>              \ 
  120                     (SimTK::AbstractMeasure::getImpl());}                   \ 
  121     Implementation& updImpl()                                               \ 
  122     {   return SimTK_DYNAMIC_CAST_DEBUG<Implementation&>                    \ 
  123                     (SimTK::AbstractMeasure::updImpl());}  
  180     {   
return shallowAssign(source); }
 
  206     int getNumTimeDerivatives() 
const;
 
  216     Stage getDependsOnStage(
int derivOrder=0) 
const;
 
  221     {   
return impl && impl==other.impl;}
 
  226     bool isInSubsystem() 
const;
 
  232     bool isSameSubsystem(
const Subsystem&) 
const;
 
  236     MeasureIndex getSubsystemMeasureIndex() 
const;
 
  246     int getRefCount() 
const;
 
  251     Implementation* impl;
 
  359     {   
updImpl().setValue(value); 
return *
this; }
 
  380     explicit Zero(
int size);
 
  400     explicit One(
int size);
 
  435     {   
getImpl().setValue(state, value); }
 
  495     {   
updImpl().setDependsOnStage(dependsOn); 
return *
this; }
 
  502     {   
updImpl().setInvalidatedStage(invalidated); 
return *
this; }
 
  531     {   
return getImpl().updValue(state); }
 
  554     {   
getImpl().markAsNotValid(state); }
 
  560     {   updValue(state) = value; markAsValid(state); }
 
  607             "Measure_<T>::Plus::ctor()",
 
  608             "Arguments must be in the same Subsystem as this Measure.");
 
  632             "Measure_<T>::Minus::ctor()",
 
  633             "Arguments must be in the same Subsystem as this Measure.");
 
  656             "Measure_<T>::Scale::ctor()",
 
  657             "Argument must be in the same Subsystem as this Measure.");
 
  662     { 
return getImpl().getOperandMeasure(); }
 
  690               const T&              initAlloc=T(0))
 
  697     {   
return getImpl().setValue(s, value); }
 
  702     {   
return getImpl().getDerivativeMeasure(); }
 
  706     {   
return getImpl().getInitialConditionMeasure(); }
 
  709     {   
updImpl().setDerivativeMeasure(d); 
return *
this; }
 
  711     {   
updImpl().setInitialConditionMeasure(ic); 
return *
this; }
 
  761     {   
return getImpl().isUsingApproximation(); }
 
  766     {   
return getImpl().getOperandMeasure(); }
 
  772     {   
updImpl().setOperandMeasure(operand); 
return *
this; }
 
  778     {   
updImpl().setForceUseApproximation(mustApproximate); }
 
  785     {   
return getImpl().getForceUseApproximation(); }
 
  857     {   
updImpl().setOperation(op); 
return *
this; }
 
  868     {   
return getImpl().getTimeOfExtremeValue(state); }
 
  871     {   
return getImpl().setValue(s, value); }
 
  874     {   
return getImpl().getOperandMeasure(); }
 
  877     {   
updImpl().setOperandMeasure(s); 
return *
this; }
 
  991     {   
updImpl().setUseLinearInterpolationOnly(linearOnly); 
return *
this; }
 
 1007     {   
updImpl().setCanUseCurrentValue(canUseCurrentValue); 
return *
this; }
 
 1011     {   
updImpl().setSourceMeasure(source); 
return *
this; }
 
 1015     {   
updImpl().setDelay(delay); 
return *
this; }
 
 1019     {   
return getImpl().getUseLinearInterpolationOnly(); }
 
 1023     {   
return getImpl().getCanUseCurrentValue(); }
 
 1027     {   
return getImpl().getSourceMeasure(); }
 
 1032     {   
return getImpl().getDelay(); }
 
#define SimTK_ERRCHK_ALWAYS(cond, whereChecked, msg)
Definition: ExceptionMacros.h:281
 
#define SimTK_MEASURE_HANDLE_PREAMBLE(MH, PH)
Definition: Measure.h:78
 
Operation
Definition: Measure.h:841
 
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:224
 
This is the header which should be included in user programs that would like to make use of all the S...
 
Includes internal headers providing declarations for the basic SimTK Core classes.
 
The abstract parent of all Measure Implementation classes.
Definition: MeasureImplementation.h:48
 
Stage getDependsOnStage(int derivOrder) const
Definition: MeasureImplementation.h:105
 
An object of this type is used as a dummy argument to make sure the automatically-generated handle co...
Definition: Measure.h:156
 
This is the base class for all Measure handle classes.
Definition: Measure.h:151
 
AbstractMeasure & operator=(const AbstractMeasure &source)
Shallow assignment operator results in this handle referencing the same Implementation object as does...
Definition: Measure.h:179
 
Implementation & updImpl()
Definition: Measure.h:243
 
const Implementation & getImpl() const
Definition: Measure.h:242
 
bool isSameMeasure(const AbstractMeasure &other) const
There can be multiple handles on the same Measure.
Definition: Measure.h:220
 
const Subsystem & getSubsystem() const
Return a reference to the Subsystem that owns this Measure.
Definition: MeasureImplementation.h:229
 
bool isSameSubsystem(const Subsystem &) const
Is getSubsystem() the same as the passed-in Subsystem?
Definition: MeasureImplementation.h:233
 
bool isEmptyHandle() const
Definition: Measure.h:223
 
bool hasImpl() const
Definition: Measure.h:244
 
This is a class to represent unique IDs for events in a type-safe way.
 
Definition: MeasureImplementation.h:612
 
This creates a Measure whose value is a Topology-stage constant of any type T.
Definition: Measure.h:341
 
SimTK_MEASURE_HANDLE_PREAMBLE(Constant, Measure_< T >)
 
Constant(const T &value)
Create a constant measure that is not part of any Subsystem, and provide the constant value.
Definition: Measure.h:347
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Constant, Measure_< T >)
 
Constant(Subsystem &sub, const T &value)
Create a constant measure with the given value and install it into the given Subsystem.
Definition: Measure.h:352
 
Constant & setValue(const T &value)
Change the value returned by this Measure.
Definition: Measure.h:358
 
Definition: MeasureImplementation.h:2028
 
(CAUTION: still under development) This is a Measure whose value at time t is the value that its sour...
Definition: Measure.h:973
 
Delay & setCanUseCurrentValue(bool canUseCurrentValue)
(Advanced) Allow the Delay measure to refer to the current value when estimating the delayed value.
Definition: Measure.h:1006
 
Delay(Subsystem &sub, const Measure_< T > &source, Real delay)
Create a Measure whose output is the same as the given source measure but delayed by a time delay.
Definition: Measure.h:981
 
const Measure_< T > & getSourceMeasure() const
Obtain a reference to the source Measure.
Definition: Measure.h:1026
 
bool getUseLinearInterpolationOnly() const
Return the value of the "use linear interpolation only" flag.
Definition: Measure.h:1018
 
Real getDelay() const
Get the amount of time by which this Measure is delaying its source Measure.
Definition: Measure.h:1031
 
Delay & setSourceMeasure(const Measure_< T > &source)
Replace the source measure.
Definition: Measure.h:1010
 
bool getCanUseCurrentValue() const
Return the value of the "can use current value" flag.
Definition: Measure.h:1022
 
Delay & setDelay(Real delay)
Change the delay time.
Definition: Measure.h:1014
 
Delay & setUseLinearInterpolationOnly(bool linearOnly)
(Advanced) Restrict the Delay measure to use only linear interpolation to estimate delayed values.
Definition: Measure.h:990
 
Definition: MeasureImplementation.h:1305
 
This Measure operator returns the time derivative of its operand measure, or a numerical approximatio...
Definition: Measure.h:744
 
bool getForceUseApproximation() const
Check the current value of the flag which forces this measure to use numerical approximation regardle...
Definition: Measure.h:784
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Differentiate, Measure_< T >)
 
const Measure_< T > & getOperandMeasure() const
Get a reference to the measure that is being differentiated by this measure.
Definition: Measure.h:765
 
Differentiate & setOperandMeasure(const Measure_< T > &operand)
Set the measure that is to be differentiated by this measure.
Definition: Measure.h:771
 
Differentiate(Subsystem &subsystem, const Measure_< T > &operand)
Create a measure whose value is the time derivative of the given operand measure.
Definition: Measure.h:752
 
void setForceUseApproximation(bool mustApproximate)
Force use of numerical approximation for the derivative, even if the operand measure can supply its o...
Definition: Measure.h:777
 
bool isUsingApproximation() const
Test whether the derivative returned as the value of this measure is being estimated numerically,...
Definition: Measure.h:760
 
SimTK_MEASURE_HANDLE_PREAMBLE(Differentiate, Measure_< T >)
 
Definition: MeasureImplementation.h:1444
 
This Measure tracks extreme values attained by the elements of its source operand since the last init...
Definition: Measure.h:837
 
void setValue(State &s, const T &value) const
Definition: Measure.h:870
 
Real getTimeOfExtremeValue(const State &state) const
Return the time at which the reported extreme value first occurred.
Definition: Measure.h:867
 
@ MaxAbs
Definition: Measure.h:842
 
Extreme & setOperandMeasure(const Measure_< T > &s)
Definition: Measure.h:876
 
@ Maximum
Definition: Measure.h:843
 
const Measure_< T > & getOperandMeasure() const
Definition: Measure.h:873
 
Operation getOperation() const
Return the operation currently being performed by this measure.
Definition: Measure.h:860
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Extreme, Measure_< T >)
 
Extreme & setOperation(Operation op)
Set the operation to be performed.
Definition: Measure.h:856
 
@ MinAbs
Definition: Measure.h:844
 
Extreme(Subsystem &sub, const Measure_< T > &operand, Operation op=MaxAbs)
Default behavior for the Extreme measure is to find the operand's value that is of maximum absolute v...
Definition: Measure.h:851
 
SimTK_MEASURE_HANDLE_PREAMBLE(Extreme, Measure_< T >)
 
void setDefaultValue(const T &defaultValue)
Set a new default value for this Measure.
Definition: MeasureImplementation.h:407
 
const T & getDefaultValue() const
Return a reference to the value that this Measure will use to initialize its value-level state resour...
Definition: MeasureImplementation.h:416
 
bool getIsPresumedValidAtDependsOnStage() const
Definition: MeasureImplementation.h:422
 
const T & getValue(const State &s, int derivOrder) const
Definition: MeasureImplementation.h:365
 
void setIsPresumedValidAtDependsOnStage(bool presume)
Definition: MeasureImplementation.h:418
 
The implementation for Integrate measures allocates a continuous state variable or variables from the...
Definition: MeasureImplementation.h:1146
 
This measure yields the time integral of a given derivative measure, initializing with an initial con...
Definition: Measure.h:677
 
SimTK_MEASURE_HANDLE_PREAMBLE(Integrate, Measure_< T >)
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Integrate, Measure_< T >)
 
const Measure_< T > & getInitialConditionMeasure() const
Get the measure whose value is used as an initial condition for the integral at the start of an integ...
Definition: Measure.h:705
 
Integrate(Subsystem &subsystem, const Measure_< T > &deriv, const Measure_< T > &ic, const T &initAlloc=T(0))
Create a new measure that will use Measure ic's value for initial conditions, and then integrate the ...
Definition: Measure.h:687
 
Integrate & setDerivativeMeasure(const Measure_< T > &d)
Definition: Measure.h:708
 
void setValue(State &s, const T &value) const
Set the current value of this measure by modifying the state variables that hold the integral.
Definition: Measure.h:696
 
const Measure_< T > & getDerivativeMeasure() const
Get the integrand (derivative) measure for this integral.
Definition: Measure.h:700
 
Integrate & setInitialConditionMeasure(const Measure_< T > &ic)
Definition: Measure.h:710
 
Track the value of the operand that is of maximum absolute value.
Definition: Measure.h:905
 
MaxAbs(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:908
 
Track the maximum value of the operand (signed).
Definition: Measure.h:895
 
Maximum(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:898
 
Track the value of the operand that is of minimum absolute value (not very useful).
Definition: Measure.h:916
 
MinAbs(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:919
 
Track the minimum value of the operand (signed).
Definition: Measure.h:885
 
Minimum(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:888
 
Definition: MeasureImplementation.h:1023
 
This Measure is the difference of two Measures of the same type T.
Definition: Measure.h:622
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Minus, Measure_< T >)
 
SimTK_MEASURE_HANDLE_PREAMBLE(Minus, Measure_< T >)
 
Minus(Subsystem &sub, const Measure_< T > &left, const Measure_< T > &right)
Definition: Measure.h:626
 
This creates a Measure::Constant whose value is always T(1) and can't be changed.
Definition: Measure.h:391
 
Definition: MeasureImplementation.h:970
 
This Measure is the sum of two Measures of the same type T.
Definition: Measure.h:597
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Plus, Measure_< T >)
 
Plus(Subsystem &sub, const Measure_< T > &left, const Measure_< T > &right)
Definition: Measure.h:601
 
SimTK_MEASURE_HANDLE_PREAMBLE(Plus, Measure_< T >)
 
Definition: MeasureImplementation.h:792
 
This Measure holds the result of some externally-determined computation, and helps to coordinate the ...
Definition: Measure.h:457
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Result, Measure_< T >)
 
bool isValid(const State &state) const
Check whether the value contained in this Measure is currently valid.
Definition: Measure.h:544
 
Result & setInvalidatedStage(Stage invalidated)
Change the invalidated stage for this measure's value, which must be strictly greater than the curren...
Definition: Measure.h:501
 
SimTK_MEASURE_HANDLE_PREAMBLE(Result, Measure_< T >)
 
void setValue(const State &state, const T &value) const
Set a new value and mark it as valid.
Definition: Measure.h:559
 
Result & setDependsOnStage(Stage dependsOn)
Change the dependsOn stage for this measure's value, which must be strictly less than the current set...
Definition: Measure.h:494
 
Stage getDependsOnStage() const
Get the dependsOn stage for this measure's value.
Definition: Measure.h:484
 
Stage getInvalidatedStage() const
Get the invalidated stage for this measure's value.
Definition: Measure.h:486
 
void markAsValid(const State &state) const
Mark the current value as valid.
Definition: Measure.h:539
 
Result & setIsPresumedValidAtDependsOnStage(bool presume)
Normally a Result measure's value is not considered valid unless we are notified explicitly that it i...
Definition: Measure.h:516
 
T & updValue(const State &state) const
Obtain write access to the Measure's value in order to modify it.
Definition: Measure.h:530
 
bool getIsPresumedValidAtDependsOnStage() const
Return the value of the "presumed valid at dependsOn stage" flag.
Definition: Measure.h:521
 
void markAsNotValid(const State &state) const
Manually mark the contained value as invalid.
Definition: Measure.h:553
 
Result(Subsystem &sub, Stage dependsOn, Stage invalidated)
Create a new Result measure and add it to the indicated subsystem.
Definition: Measure.h:479
 
NOT IMPLEMENTED YET – This is a Measure operator which, upon occurrence of a designated event,...
Definition: Measure.h:1057
 
const Measure_< T > & getSource() const
 
SampleAndHold & setEventId(EventId)
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(SampleAndHold, Measure_< T >)
 
SampleAndHold(Subsystem &sub, const Measure_< T > &source, EventId e)
 
EventId getEventId() const
 
SampleAndHold & setSource(const Measure_< T > &s)
 
void setValue(State &s, const T &value) const
Set the held value to a particular value, unrelated to the source.
 
SimTK_MEASURE_HANDLE_PREAMBLE(SampleAndHold, Measure_< T >)
 
void sample(State &s) const
Force this Measure to sample its input at the current time.
 
Definition: MeasureImplementation.h:1078
 
This Measure multiplies some other Measure by a Real scale factor.
Definition: Measure.h:647
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Scale, Measure_< T >)
 
SimTK_MEASURE_HANDLE_PREAMBLE(Scale, Measure_< T >)
 
Scale(Subsystem &sub, Real factor, const Measure_< T > &operand)
Definition: Measure.h:651
 
const Measure_< T > & getOperandMeasure() const
Get the operand (thing being scaled) measure for this measure.
Definition: Measure.h:661
 
Definition: MeasureImplementation.h:908
 
This measure produces a sinusoidal function of time:
Definition: Measure.h:575
 
SimTK_MEASURE_HANDLE_PREAMBLE(Sinusoid, Measure_< T >)
 
Sinusoid(Subsystem &sub, const T &litude, const T &frequency, const T &phase=T(0))
Definition: Measure.h:579
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Sinusoid, Measure_< T >)
 
This creates a Measure::Time whose value is always T(time).
Definition: Measure.h:409
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Time, Measure_< T >)
 
SimTK_MEASURE_HANDLE_PREAMBLE(Time, Measure_< T >)
 
Definition: MeasureImplementation.h:712
 
This creates a Measure whose value is a discrete State variable of any type T.
Definition: Measure.h:422
 
SimTK_MEASURE_HANDLE_PREAMBLE(Variable, Measure_< T >)
 
void setValue(State &state, const T &value) const
Definition: Measure.h:434
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Variable, Measure_< T >)
 
Variable(Subsystem &sub, Stage invalidates, const T &defaultValue)
Definition: Measure.h:429
 
This creates a Measure::Constant whose value is always T(0) and can't be changed.
Definition: Measure.h:371
 
This is the base handle class for all Measures whose value type is known, including all the Simbody b...
Definition: Measure.h:263
 
SimTK_MEASURE_HANDLE_POSTSCRIPT(Measure_, AbstractMeasure)
 
const T & getValue(const State &s, int derivOrder=0) const
Retrieve the Value of this Measure or one of its time derivatives, assuming the supplied State has be...
Definition: Measure.h:276
 
Measure_ & setDefaultValue(const T &defaultValue)
Change the default value associated with this Measure.
Definition: Measure.h:285
 
const T & getDefaultValue() const
Obtain a reference to the default value associated with this Measure.
Definition: Measure.h:290
 
SimTK_MEASURE_HANDLE_PREAMBLE_ABSTRACT(Measure_, AbstractMeasure)
This class is still abstract so we don't want it to allocate an Implementation object in its default ...
 
This class is basically a glorified enumerated type, type-safe and range checked but permitting conve...
Definition: Stage.h:66
 
This object is intended to contain all state information for a SimTK::System, except topological info...
Definition: State.h:280
 
A Subsystem is expected to be part of a larger System and to have interdependencies with other subsys...
Definition: Subsystem.h:55
 
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
 
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:607
 
SimTK_DEFINE_UNIQUE_INDEX_TYPE(AssemblyConditionIndex)
 
Measure_< Real > Measure
This typedef is a convenient abbreviation for the most common kind of Measure – one that returns a si...
Definition: Measure.h:330