Go to the documentation of this file. 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(); }
1081 #endif // SimTK_SimTKCOMMON_MEASURE_H_
SampleAndHold(Subsystem &sub, const Measure_< T > &source, EventId e)
bool getIsPresumedValidAtDependsOnStage() const
Return the value of the "presumed valid at dependsOn stage" flag.
Definition: Measure.h:521
@ MaxAbs
Definition: Measure.h:842
This object is intended to contain all state information for a SimTK::System, except topological info...
Definition: State.h:280
Measure_ & setDefaultValue(const T &defaultValue)
Change the default value associated with this Measure.
Definition: Measure.h:285
void setValue(State &s, const T &value) const
Definition: Measure.h:870
const Measure_< T > & getDerivativeMeasure() const
Get the integrand (derivative) measure for this integral.
Definition: Measure.h:700
const Measure_< T > & getSource() const
Scale(Subsystem &sub, Real factor, const Measure_< T > &operand)
Definition: Measure.h:651
Extreme & setOperation(Operation op)
Set the operation to be performed.
Definition: Measure.h:856
void setValue(const State &state, const T &value) const
Set a new value and mark it as valid.
Definition: Measure.h:559
Real getDelay() const
Get the amount of time by which this Measure is delaying its source Measure.
Definition: Measure.h:1031
const Measure_< T > & getOperandMeasure() const
Get a reference to the measure that is being differentiated by this measure.
Definition: Measure.h:765
This creates a Measure::Constant whose value is always T(1) and can't be changed.
Definition: Measure.h:391
A Subsystem is expected to be part of a larger System and to have interdependencies with other subsys...
Definition: Subsystem.h:55
SampleAndHold & setEventId(EventId)
SimTK_MEASURE_HANDLE_PREAMBLE(Plus, Measure_< T >)
The abstract parent of all Measure Implementation classes.
Definition: MeasureImplementation.h:48
SampleAndHold & setSource(const Measure_< T > &s)
bool getIsPresumedValidAtDependsOnStage() const
Definition: MeasureImplementation.h:422
MinAbs(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:919
Stage getDependsOnStage() const
Get the dependsOn stage for this measure's value.
Definition: Measure.h:484
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_POSTSCRIPT(Scale, Measure_< T >)
Implementation & updImpl()
Definition: Measure.h:243
(CAUTION: still under development) This is a Measure whose value at time t is the value that its sour...
Definition: Measure.h:973
MaxAbs(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:908
void setValue(State &s, const T &value) const
Set the held value to a particular value, unrelated to the source.
Delay & setSourceMeasure(const Measure_< T > &source)
Replace the source measure.
Definition: Measure.h:1010
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
Variable(Subsystem &sub, Stage invalidates, const T &defaultValue)
Definition: Measure.h:429
bool hasImpl() const
Definition: Measure.h:244
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 ...
SimTK_MEASURE_HANDLE_PREAMBLE(Variable, Measure_< T >)
This is a System that represents the dynamics of a particle moving along a smooth surface.
Definition: Assembler.h:37
bool isValid(const State &state) const
Check whether the value contained in this Measure is currently valid.
Definition: Measure.h:544
SimTK_MEASURE_HANDLE_PREAMBLE(Differentiate, Measure_< T >)
Delay & setCanUseCurrentValue(bool canUseCurrentValue)
(Advanced) Allow the Delay measure to refer to the current value when estimating the delayed value.
Definition: Measure.h:1006
bool isSameSubsystem(const Subsystem &) const
Is getSubsystem() the same as the passed-in Subsystem?
Definition: MeasureImplementation.h:233
SimTK_MEASURE_HANDLE_POSTSCRIPT(SampleAndHold, Measure_< T >)
Definition: MeasureImplementation.h:1078
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
Delay & setUseLinearInterpolationOnly(bool linearOnly)
(Advanced) Restrict the Delay measure to use only linear interpolation to estimate delayed values.
Definition: Measure.h:990
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
SimTK_MEASURE_HANDLE_POSTSCRIPT(Measure_, AbstractMeasure)
void markAsValid(const State &state) const
Mark the current value as valid.
Definition: Measure.h:539
SimTK_MEASURE_HANDLE_POSTSCRIPT(Constant, Measure_< T >)
bool getCanUseCurrentValue() const
Return the value of the "can use current value" flag.
Definition: Measure.h:1022
Constant & setValue(const T &value)
Change the value returned by this Measure.
Definition: Measure.h:358
Definition: MeasureImplementation.h:612
This is the base class for all Measure handle classes.
Definition: Measure.h:151
Track the value of the operand that is of minimum absolute value (not very useful).
Definition: Measure.h:916
This Measure operator returns the time derivative of its operand measure, or a numerical approximatio...
Definition: Measure.h:744
void markAsNotValid(const State &state) const
Manually mark the contained value as invalid.
Definition: Measure.h:553
Operation getOperation() const
Return the operation currently being performed by this measure.
Definition: Measure.h:860
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
Result(Subsystem &sub, Stage dependsOn, Stage invalidated)
Create a new Result measure and add it to the indicated subsystem.
Definition: Measure.h:479
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:224
Integrate & setDerivativeMeasure(const Measure_< T > &d)
Definition: Measure.h:708
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
SimTK_MEASURE_HANDLE_POSTSCRIPT(Minus, Measure_< T >)
This Measure multiplies some other Measure by a Real scale factor.
Definition: Measure.h:647
@ MinAbs
Definition: Measure.h:844
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
NOT IMPLEMENTED YET – This is a Measure operator which, upon occurrence of a designated event,...
Definition: Measure.h:1057
Extreme & setOperandMeasure(const Measure_< T > &s)
Definition: Measure.h:876
AbstractMeasure & operator=(const AbstractMeasure &source)
Shallow assignment operator results in this handle referencing the same Implementation object as does...
Definition: Measure.h:179
SimTK_MEASURE_HANDLE_POSTSCRIPT(Time, Measure_< T >)
Definition: MeasureImplementation.h:792
Sinusoid(Subsystem &sub, const T &litude, const T &frequency, const T &phase=T(0))
Definition: Measure.h:579
SimTK_MEASURE_HANDLE_PREAMBLE(SampleAndHold, Measure_< T >)
This measure yields the time integral of a given derivative measure, initializing with an initial con...
Definition: Measure.h:677
Constant(const T &value)
Create a constant measure that is not part of any Subsystem, and provide the constant value.
Definition: Measure.h:347
Integrate & setInitialConditionMeasure(const Measure_< T > &ic)
Definition: Measure.h:710
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
#define SimTK_ERRCHK_ALWAYS(cond, whereChecked, msg)
Definition: ExceptionMacros.h:281
Definition: MeasureImplementation.h:1023
SimTK_MEASURE_HANDLE_PREAMBLE(Integrate, Measure_< T >)
SimTK_MEASURE_HANDLE_PREAMBLE(Result, Measure_< T >)
This class is basically a glorified enumerated type, type-safe and range checked but permitting conve...
Definition: Stage.h:66
An object of this type is used as a dummy argument to make sure the automatically-generated handle co...
Definition: Measure.h:156
Stage getDependsOnStage(int derivOrder) const
Definition: MeasureImplementation.h:105
This creates a Measure whose value is a Topology-stage constant of any type T.
Definition: Measure.h:341
SimTK_MEASURE_HANDLE_POSTSCRIPT(Result, Measure_< T >)
Definition: MeasureImplementation.h:1444
Definition: MeasureImplementation.h:970
bool isEmptyHandle() const
Definition: Measure.h:223
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
Plus(Subsystem &sub, const Measure_< T > &left, const Measure_< T > &right)
Definition: Measure.h:601
Definition: MeasureImplementation.h:1305
Minus(Subsystem &sub, const Measure_< T > &left, const Measure_< T > &right)
Definition: Measure.h:626
SimTK_MEASURE_HANDLE_POSTSCRIPT(Sinusoid, Measure_< T >)
SimTK_MEASURE_HANDLE_POSTSCRIPT(Integrate, Measure_< T >)
Track the minimum value of the operand (signed).
Definition: Measure.h:885
Track the maximum value of the operand (signed).
Definition: Measure.h:895
Delay & setDelay(Real delay)
Change the delay time.
Definition: Measure.h:1014
SimTK_MEASURE_HANDLE_PREAMBLE(Minus, Measure_< T >)
Maximum(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:898
Operation
Definition: Measure.h:841
#define SimTK_MEASURE_HANDLE_PREAMBLE(MH, PH)
Definition: Measure.h:78
SimTK_MEASURE_HANDLE_PREAMBLE(Scale, Measure_< T >)
SimTK_MEASURE_HANDLE_POSTSCRIPT(Plus, Measure_< T >)
const T & getDefaultValue() const
Obtain a reference to the default value associated with this Measure.
Definition: Measure.h:290
SimTK_MEASURE_HANDLE_POSTSCRIPT(Variable, Measure_< T >)
const T & getValue(const State &s, int derivOrder) const
Definition: MeasureImplementation.h:365
EventId getEventId() const
SimTK_MEASURE_HANDLE_PREAMBLE(Time, Measure_< T >)
This Measure is the sum of two Measures of the same type T.
Definition: Measure.h:597
void sample(State &s) const
Force this Measure to sample its input at the current time.
SimTK_MEASURE_HANDLE_POSTSCRIPT(Extreme, Measure_< T >)
const Measure_< T > & getSourceMeasure() const
Obtain a reference to the source Measure.
Definition: Measure.h:1026
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:606
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
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
void setIsPresumedValidAtDependsOnStage(bool presume)
Definition: MeasureImplementation.h:418
SimTK_MEASURE_HANDLE_PREAMBLE(Constant, Measure_< T >)
void setDefaultValue(const T &defaultValue)
Set a new default value for this Measure.
Definition: MeasureImplementation.h:407
Track the value of the operand that is of maximum absolute value.
Definition: Measure.h:905
Real getTimeOfExtremeValue(const State &state) const
Return the time at which the reported extreme value first occurred.
Definition: Measure.h:867
Differentiate & setOperandMeasure(const Measure_< T > &operand)
Set the measure that is to be differentiated by this measure.
Definition: Measure.h:771
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
@ Maximum
Definition: Measure.h:843
This Measure is the difference of two Measures of the same type T.
Definition: Measure.h:622
bool isSameMeasure(const AbstractMeasure &other) const
There can be multiple handles on the same Measure.
Definition: Measure.h:220
This Measure tracks extreme values attained by the elements of its source operand since the last init...
Definition: Measure.h:837
bool getForceUseApproximation() const
Check the current value of the flag which forces this measure to use numerical approximation regardle...
Definition: Measure.h:784
SimTK_DEFINE_UNIQUE_INDEX_TYPE(AssemblyConditionIndex)
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
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_PREAMBLE(Extreme, Measure_< T >)
SimTK_MEASURE_HANDLE_POSTSCRIPT(Differentiate, Measure_< T >)
const Implementation & getImpl() const
Definition: Measure.h:242
This creates a Measure::Constant whose value is always T(0) and can't be changed.
Definition: Measure.h:371
const Measure_< T > & getOperandMeasure() const
Get the operand (thing being scaled) measure for this measure.
Definition: Measure.h:661
The implementation for Integrate measures allocates a continuous state variable or variables from the...
Definition: MeasureImplementation.h:1146
Stage getInvalidatedStage() const
Get the invalidated stage for this measure's value.
Definition: Measure.h:486
Minimum(Subsystem &sub, const Measure_< T > &operand)
Definition: Measure.h:888
Definition: MeasureImplementation.h:908
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
T & updValue(const State &state) const
Obtain write access to the Measure's value in order to modify it.
Definition: Measure.h:530
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
const Subsystem & getSubsystem() const
Return a reference to the Subsystem that owns this Measure.
Definition: MeasureImplementation.h:229
This creates a Measure::Time whose value is always T(time).
Definition: Measure.h:409
bool getUseLinearInterpolationOnly() const
Return the value of the "use linear interpolation only" flag.
Definition: Measure.h:1018
void setValue(State &state, const T &value) const
Definition: Measure.h:434
This measure produces a sinusoidal function of time:
Definition: Measure.h:575
Definition: MeasureImplementation.h:2028
const Measure_< T > & getOperandMeasure() const
Definition: Measure.h:873
This creates a Measure whose value is a discrete State variable of any type T.
Definition: Measure.h:422
SimTK_MEASURE_HANDLE_PREAMBLE(Sinusoid, Measure_< T >)
This Measure holds the result of some externally-determined computation, and helps to coordinate the ...
Definition: Measure.h:457
Definition: MeasureImplementation.h:712