1#ifndef SimTK_SimTKCOMMON_MEASURE_IMPLEMENTATION_H_
2#define SimTK_SimTKCOMMON_MEASURE_IMPLEMENTATION_H_
58 : copyNumber(src.copyNumber+1), mySubsystem(0), refCount(0) {}
65 { copyNumber=src.copyNumber+1;
66 refCount=0; mySubsystem=0; }
106 SimTK_ERRCHK2(0 <= derivOrder && derivOrder <= getNumTimeDerivatives(),
107 "Measure::getDependsOnStage()",
108 "derivOrder %d was out of range; this Measure allows 0-%d.",
109 derivOrder, getNumTimeDerivatives());
110 return getDependsOnStageVirtual(derivOrder);
115 { assert(!mySubsystem && mx.isValid());
116 mySubsystem = ⊂ myIndex = mx; }
123 {
return getSubsystem().getMySubsystemIndex(); }
126 {
if (isInSubsystem()) getSubsystem().invalidateSubsystemTopologyCache(); }
155 MeasureIndex myIndex;
159 mutable int refCount;
179 "An empty Measure handle can't be put in a Subsystem.");
196 if (impl != src.impl) {
212 impl = src.impl->
clone();
256template <
class T>
class Measure_Num {
259template <>
class Measure_Num<float> {
261 typedef float Element;
262 static int size(
const float&) {
return 1;}
263 static const float& get(
const float& v,
int i) {assert(i==0);
return v;}
264 static float& upd(
float& v,
int i) {assert(i==0);
return v;}
265 static void makeNaNLike(
const float&,
float& nanValue)
266 { nanValue = CNT<float>::getNaN();}
267 static void makeZeroLike(
const float&,
float& zeroValue) {zeroValue=0.f;}
270template <>
class Measure_Num<double> {
272 typedef double Element;
273 static int size(
const double&) {
return 1;}
274 static const double& get(
const double& v,
int i) {assert(i==0);
return v;}
275 static double& upd(
double& v,
int i) {assert(i==0);
return v;}
276 static void makeNaNLike(
const double&,
double& nanValue)
277 { nanValue = CNT<double>::getNaN(); }
278 static void makeZeroLike(
const double&,
double& zeroValue) {zeroValue=0.;}
282template <
int M,
class E>
283class Measure_Num< Vec<M,
E,1> > {
284 typedef Vec<M,E,1> T;
287 static int size(
const T&) {
return M;}
288 static const E& get(
const T& v,
int i) {
return v[i];}
289 static E& upd(T& v,
int i) {
return v[i];}
290 static void makeNaNLike (
const T&, T& nanValue) {nanValue.setToNaN();}
291 static void makeZeroLike(
const T&, T& zeroValue) {zeroValue.setToZero();}
295template <
int M,
int N,
class E>
296class Measure_Num< Mat<M,N,
E> > {
297 typedef Mat<M,N,E> T;
300 static int size(
const T&) {
return N;}
301 static const typename T::TCol& get(
const T& m,
int j) {
return m.col(j);}
302 static typename T::TCol& upd(T& m,
int j) {
return m.col(j);}
303 static void makeNaNLike (
const T&, T& nanValue) {nanValue.setToNaN();}
304 static void makeZeroLike(
const T&, T& zeroValue) {zeroValue.setToZero();}
309class Measure_Num< Vector_<
E> > {
310 typedef Vector_<E> T;
313 static int size(
const T& v) {
return v.size();}
314 static const E& get(
const T& v,
int i) {
return v[i];}
315 static E& upd(T& v,
int i) {
return v[i];}
316 static void makeNaNLike(
const T& v, T& nanValue)
317 { nanValue.resize(v.size()); nanValue.setToNaN(); }
318 static void makeZeroLike(
const T& v, T& zeroValue)
319 { zeroValue.resize(v.size()); zeroValue.setToZero(); }
324class Measure_Num< Rotation_<
E> > {
325 typedef Rotation_<E> T;
328 static int size(
const T&) {
return 1;}
329 static const T& get(
const T& v,
int i) {assert(i==0);
return v;}
330 static T& upd(T& v,
int i) {assert(i==0);
return v;}
331 static void makeNaNLike(
const T&, T& nanValue)
332 { nanValue.setRotationToNaN(); }
333 static void makeZeroLike(
const T&, T& zeroValue)
334 { zeroValue.setRotationToIdentityMatrix(); }
338class Measure_Num< Transform_<
E> > {
339 typedef Transform_<E> T;
342 static int size(
const T&) {
return 1;}
343 static const T& get(
const T& v,
int i) {assert(i==0);
return v;}
344 static T& upd(T& v,
int i) {assert(i==0);
return v;}
345 static void makeNaNLike(
const T&, T& nanValue)
346 { nanValue.setToNaN(); }
347 static void makeZeroLike(
const T&, T& zeroValue)
348 { zeroValue.setToZero(); }
367 "Measure_<T>::getValue()",
368 "derivOrder %d was out of range; this Measure allows 0-%d.",
382 "Measure_<T>::getValue()",
383 "Expected State to have been realized to at least stage "
384 "%s but stage was %s.",
390 if (derivOrder < getNumCacheEntries()) {
391 if (!isCacheValueRealized(s,derivOrder)) {
392 T& value = updCacheEntry(s,derivOrder);
393 calcCachedValueVirtual(s, derivOrder, value);
394 markCacheValueRealized(s,derivOrder);
397 return getCacheEntry(s,derivOrder);
402 return getUncachedValueVirtual(s,derivOrder);
408 this->defaultValue = defaultValue;
409 Measure_Num<T>::makeZeroLike(defaultValue, zeroValue);
410 this->invalidateTopologyCache();
419 { presumeValidAtDependsOnStage = presume;
420 this->invalidateTopologyCache(); }
423 {
return presumeValidAtDependsOnStage; }
427 : presumeValidAtDependsOnStage(false),
428 defaultValue(defaultValue),
429 derivIx(numCacheEntries)
431 Measure_Num<T>::makeZeroLike(defaultValue, zeroValue);
438 : presumeValidAtDependsOnStage(false),
440 derivIx(numCacheEntries)
442 Measure_Num<T>::makeZeroLike(defaultValue, zeroValue);
449 : presumeValidAtDependsOnStage(source.presumeValidAtDependsOnStage),
450 defaultValue(source.defaultValue),
451 derivIx(source.derivIx.size())
453 Measure_Num<T>::makeZeroLike(defaultValue, zeroValue);
459 int size()
const {
return Measure_Num<T>::size(defaultValue);}
469 SimTK_ERRCHK2(0 <= derivOrder && derivOrder < getNumCacheEntries(),
470 "Measure_<T>::Implementation::getCacheEntry()",
471 "Derivative order %d is out of range; only %d cache entries"
472 " were allocated.", derivOrder, getNumCacheEntries());
475 this->
getSubsystem().getCacheEntry(s, derivIx[derivOrder]));
482 SimTK_ERRCHK2(0 <= derivOrder && derivOrder < getNumCacheEntries(),
483 "Measure_<T>::Implementation::updCacheEntry()",
484 "Derivative order %d is out of range; only %d cache entries"
485 " were allocated.", derivOrder, getNumCacheEntries());
488 this->
getSubsystem().updCacheEntry(s, derivIx[derivOrder]));
494 SimTK_ERRCHK2(0 <= derivOrder && derivOrder < getNumCacheEntries(),
495 "Measure_<T>::Implementation::isCacheValueRealized()",
496 "Derivative order %d is out of range; only %d cache entries"
497 " were allocated.", derivOrder, getNumCacheEntries());
506 SimTK_ERRCHK2(0 <= derivOrder && derivOrder < getNumCacheEntries(),
507 "Measure_<T>::Implementation::markCacheValueRealized()",
508 "Derivative order %d is out of range; only %d cache entries"
509 " were allocated.", derivOrder, getNumCacheEntries());
519 SimTK_ERRCHK2(0 <= derivOrder && derivOrder < getNumCacheEntries(),
520 "Measure_<T>::Implementation::markCacheValueNotRealized()",
521 "Derivative order %d is out of range; only %d cache entries"
522 " were allocated.", derivOrder, getNumCacheEntries());
538 "Measure_<T>::Implementation::calcCachedValueVirtual()",
539 "This method should have been overridden by the derived"
540 " Measure but was not. It is needed to calculate the"
541 " cached value for derivOrder=%d.", derivOrder); }
551 "Measure_<T>::Implementation::getUncachedValueVirtual()",
552 "This method should have been overridden by the derived"
553 " Measure but was not. It is needed to return the uncached"
554 " value at derivOrder=%d.", derivOrder);
555 return *
reinterpret_cast<T*
>(0);
566 void realizeTopology(
State& s)
const override final {
570 if (getNumCacheEntries()) {
571 derivIx[0] = presumeValidAtDependsOnStage
577 if (getNumCacheEntries() > 1) {
578 T nanValue; Measure_Num<T>::makeNaNLike(defaultValue, nanValue);
579 for (
int i=1; i < getNumCacheEntries(); ++i) {
580 derivIx[i] = presumeValidAtDependsOnStage
590 realizeMeasureTopologyVirtual(s);
596 bool presumeValidAtDependsOnStage;
601 mutable Array_<CacheEntryIndex> derivIx;
629 {
return derivOrder>0 ? this->getValueZero() : this->
getDefaultValue(); }
637 {
return std::numeric_limits<int>::max(); }
647template <
class T>
inline
649template <
class T>
inline
657template <
class T>
inline
659template <
class T>
inline
678:
public Measure_<Real>::Implementation
688 const Real& getUncachedValueVirtual(
const State& s,
int derivOrder)
const
690 {
return derivOrder==0 ? s.
getTime()
695 Implementation* cloneVirtual()
const override
696 {
return new Implementation(*
this); }
697 Stage getDependsOnStageVirtual(
int derivOrder)
const override
698 {
return derivOrder>0 ? Stage::Empty : Stage::Time; }
701 int getNumTimeDerivativesVirtual()
const override
702 {
return std::numeric_limits<int>::max(); }
721 invalidatedStage(
Stage::Empty) {}
725 invalidatedStage(invalidated) {}
730 invalidatedStage(source.invalidatedStage) {}
733 invalidatedStage = invalidates;
734 this->invalidateTopologyCache();
743 { updVarValue(state) = value; }
750 {
return std::numeric_limits<int>::max(); }
755 {
return derivOrder>0 ? Stage::Empty : Stage::Model;}
759 {
return derivOrder>0 ? this->getValueZero() : getVarValue(s); }
764 discreteVarIndex = this->getSubsystem().allocateDiscreteVariable
765 (s, invalidatedStage,
new Value<T>(this->getDefaultValue()));
768 const T& getVarValue(
const State& s)
const {
769 assert(discreteVarIndex.isValid());
771 this->getSubsystem().getDiscreteVariable(s, discreteVarIndex));
773 T& updVarValue(
State& s)
const {
774 assert(discreteVarIndex.isValid());
776 this->getSubsystem().updDiscreteVariable(s, discreteVarIndex));
780 Stage invalidatedStage;
803 dependsOnStage(dependsOn==
Stage::Empty ?
Stage::Topology : dependsOn),
804 invalidatedStage(invalidated)
806 "Got invalidated stage %s and dependsOn stage %s which is illegal "
807 "because the invalidated stage must be later than dependsOn.",
814 dependsOnStage(source.dependsOnStage),
815 invalidatedStage(source.invalidatedStage) {}
818 if (dependsOn == Stage::Empty) dependsOn = Stage::Topology;
820 "Measure::Result::setDependsOnStage()",
821 "The provided dependsOn stage %s is illegal because it is not "
822 "less than the current invalidated stage %s. Change the "
823 "invalidated stage first with setInvalidatedStage().",
825 getInvalidatedStage().getName().c_str());
827 dependsOnStage = dependsOn;
828 this->invalidateTopologyCache();
833 "Measure::Result::setInvalidatedStage()",
834 "The provided invalidated stage %s is illegal because it is not "
835 "greater than the current dependsOn stage %s. Change the "
836 "dependsOn stage first with setDependsOnStage().",
838 getDependsOnStage().getName().c_str());
840 invalidatedStage = invalidated;
841 this->invalidateTopologyCache();
850 {
const Stage subsystemStage = this->getSubsystem().getStage(state);
852 "Measure::Result::markAsValid()",
853 "This Result Measure cannot be marked valid in a State where this "
854 "measure's Subsystem has been realized only to stage %s, because "
855 "its value was declared to depend on stage %s. To mark it valid, "
856 "we require that the State have been realized at least to the "
857 "previous stage (%s in this case); that is, you must at least be "
858 "*working on* the dependsOn stage in order to claim this result is "
860 subsystemStage.
getName().c_str(),
861 getDependsOnStage().getName().c_str(),
862 getDependsOnStage().prev().getName().c_str());
863 this->markCacheValueRealized(state, 0); }
866 {
return this->isCacheValueRealized(state, 0); }
869 { this->markCacheValueNotRealized(state, 0);
873 { markAsNotValid(state);
return this->updCacheEntry(state, 0); }
885 {
return derivOrder>0 ? Stage::Empty : dependsOnStage;}
890 "Measure_<T>::Result::getValue()",
891 "Measure_<T>::Result::getValue() was called when the value was not "
892 "yet valid. For most Measure types, this would have initiated "
893 "computation of the value, but Result measures must have their values "
894 "calculated and set externally, and then marked valid."); }
898 Stage dependsOnStage;
899 Stage invalidatedStage;
911 static const int NumDerivs = 3;
915 a(
CNT<T>::getNaN()), w(
CNT<T>::getNaN()), p(
CNT<T>::getNaN()) {}
921 a(amplitude), w(frequency), p(phase) {}
932 {
return Stage::Time; }
939 using std::sin;
using std::cos;
941 assert(NumDerivs == 3);
943 const T arg = w*t + p;
945 switch (derivOrder) {
946 case 0: value = a*sin(arg);
break;
947 case 1: value = w*a*cos(arg);
break;
948 case 2: value = -w*w*a*sin(arg);
break;
949 case 3: value = -w*w*w*a*cos(arg);
break;
951 "Measure::Sinusoid::Implementation::calcCachedValueVirtual():"
952 " derivOrder %d is out of range 0-3.", derivOrder);
980 : left(left), right(right) {}
998 {
return Stage(std::max(left.getDependsOnStage(order),
999 right.getDependsOnStage(order))); }
1005 value = left.getValue(s,derivOrder) + right.getValue(s,derivOrder);
1033 : left(left), right(right) {}
1051 {
return Stage(std::max(left.getDependsOnStage(order),
1052 right.getDependsOnStage(order))); }
1058 value = left.getValue(s,derivOrder) - right.getValue(s,derivOrder);
1079:
public Measure_<T>::Implementation
1087 : factor(factor), operand(operand) {}
1094 this->invalidateTopologyCache();
1115 {
return operand.getDependsOnStage(order); }
1121 value = factor * operand.getValue(s,derivOrder);
1148:
public Measure_<T>::Implementation {
1157 const T& defaultValue)
1159 derivMeasure(deriv), icMeasure(ic) {}
1165 derivMeasure(source.derivMeasure), icMeasure(source.icMeasure) {}
1171 { assert(zIndex >= 0);
1172 for (
int i=0; i < this->size(); ++i)
1173 this->getSubsystem().updZ(s)[zIndex+i] =
1174 Measure_Num<T>::get(value, i); }
1178 "Measure_<T>::Integrate::getDerivativeMeasure()",
1179 "No derivative measure is available for this integrated measure.");
1180 return derivMeasure; }
1184 "Measure_<T>::Integrate::getInitialConditionMeasure()",
1185 "No initial condition measure is available for this "
1186 "integrated measure.");
1190 { derivMeasure = d; this->invalidateTopologyCache(); }
1192 { icMeasure = ic; this->invalidateTopologyCache(); }
1202 {
int integralDerivs = getDerivativeMeasure().getNumTimeDerivatives();
1204 if (integralDerivs < std::numeric_limits<int>::max())
1206 return integralDerivs; }
1210 { assert(derivOrder == 0);
1211 assert(Measure_Num<T>::size(value) == this->size());
1212 assert(zIndex.isValid());
1213 const Vector& allZ = this->getSubsystem().getZ(s);
1214 for (
int i=0; i < this->size(); ++i)
1215 Measure_Num<T>::upd(value,i) = allZ[zIndex+i];
1220 { assert(derivOrder > 0);
1221 return getDerivativeMeasure().getValue(s, derivOrder-1);
1225 {
return derivOrder>0
1226 ? getDerivativeMeasure().getDependsOnStage(derivOrder-1)
1232 assert(zIndex.isValid());
1233 Vector& allZ = this->getSubsystem().updZ(s);
1234 if (!icMeasure.isEmptyHandle()) {
1235 this->getSubsystem().getSystem()
1236 .realize(s, icMeasure.getDependsOnStage());
1237 const T& ic = icMeasure.getValue(s);
1238 for (
int i=0; i < this->size(); ++i)
1239 allZ[zIndex+i] = Measure_Num<T>::get(ic,i);
1241 for (
int i=0; i < this->size(); ++i)
1242 allZ[zIndex+i] = Measure_Num<T>::get(this->getDefaultValue(),i);
1251 Vector init(this->size());
1252 for (
int i=0; i < this->size(); ++i)
1253 init[i] = Measure_Num<T>::get(this->getDefaultValue(),i);
1254 zIndex = this->getSubsystem().allocateZ(s, init);
1260 assert(zIndex.isValid());
1261 Vector& allZDot = this->getSubsystem().updZDot(s);
1262 if (!derivMeasure.isEmptyHandle()) {
1263 const T& deriv = derivMeasure.getValue(s);
1264 for (
int i=0; i < this->size(); ++i)
1265 allZDot[zIndex+i] = Measure_Num<T>::get(deriv,i);
1267 allZDot(zIndex,this->size()) = 0;
1295class Measure_Differentiate_Result {
1297 Measure_Differentiate_Result() : derivIsGood(false) {}
1306:
public Measure_<T>::Implementation
1308 typedef Measure_Differentiate_Result<T> Result;
1315 operand(operand), forceUseApprox(false), isApproxInUse(false) {}
1321 forceUseApprox = mustApproximate;
1322 this->invalidateTopologyCache();
1326 this->operand = operand;
1327 this->invalidateTopologyCache();
1342 {
if (!isApproxInUse)
return operand.getNumTimeDerivatives()-1;
1346 {
if (!isApproxInUse)
return operand.getDependsOnStage(order+1);
1347 else return operand.getDependsOnStage(order); }
1355 {
if (!isApproxInUse)
1356 return operand.getValue(s, derivOrder+1);
1358 ensureDerivativeIsRealized(s);
1359 const Subsystem& subsys = this->getSubsystem();
1362 return result.operandDot;
1366 if (!isApproxInUse)
return;
1368 assert(resultIx.isValid());
1369 const Subsystem& subsys = this->getSubsystem();
1372 this->getSubsystem().getSystem().realize(s,operand.getDependsOnStage());
1373 result.operand = operand.getValue(s);
1374 result.operandDot = this->getValueZero();
1375 result.derivIsGood =
false;
1379 isApproxInUse = (forceUseApprox || operand.getNumTimeDerivatives()==0);
1383 resultIx = this->getSubsystem()
1384 .allocateAutoUpdateDiscreteVariable(s, operand.getDependsOnStage(0),
1391 ensureDerivativeIsRealized(s);
1395 assert(resultIx.isValid());
1396 const Subsystem& subsys = this->getSubsystem();
1403 const T& f0 = prevResult.operand;
1404 const T& fdot0 = prevResult.operandDot;
1405 const bool good0 = prevResult.derivIsGood;
1410 T& f = result.operand;
1411 T& fdot = result.operandDot;
1412 bool& good = result.derivIsGood;
1414 f = operand.getValue(s);
1417 fdot = this->getValueZero();
1422 fdot = (f-f0)/(t-t0);
1424 fdot =
Real(2)*fdot - fdot0;
1432 bool forceUseApprox;
1435 mutable bool isApproxInUse;
1448 typedef typename Extreme::Operation
Operation;
1467 this->operand = operand;
1468 this->invalidateTopologyCache();
1475 this->operation = op;
1476 this->invalidateTopologyCache();
1489 assert(extremeIx.isValid());
1490 const Subsystem& subsys = this->getSubsystem();
1500 const Subsystem& subsys = this->getSubsystem();
1501 const bool hasNewExtreme = ensureExtremeHasBeenUpdated(s);
1519 {
return operand.getNumTimeDerivatives(); }
1524 {
return operand.getDependsOnStage(order); }
1533 const Subsystem& subsys = this->getSubsystem();
1534 const bool hasNewExtreme = ensureExtremeHasBeenUpdated(s);
1535 if (derivOrder > 0) {
1539 return hasNewExtreme ? operand.getValue(s, derivOrder)
1540 : this->getValueZero();
1542 if (hasNewExtreme) {
1556 this->getSubsystem().getSystem().realize(s,operand.getDependsOnStage());
1557 setValue(s, operand.getValue(s));
1569 T initVal = this->getDefaultValue();
1574 case MaxAbs: initVal = 0;
break;
1577 extremeIx = this->getSubsystem()
1578 .allocateAutoUpdateDiscreteVariable(s, Stage::Dynamics,
1579 new Value<T>(initVal), operand.getDependsOnStage(0));
1581 isNewExtremeIx = this->getSubsystem()
1582 .allocateAutoUpdateDiscreteVariable(s, Stage::Dynamics,
1583 new Value<bool>(
false), operand.getDependsOnStage(0));
1589 ensureExtremeHasBeenUpdated(s);
1598 assert(extremeIx.isValid() && isNewExtremeIx.isValid());
1599 const Subsystem& subsys = this->getSubsystem();
1614 const T& currentVal = operand.getValue(s);
1617 bool foundNewExt =
false;
1618 for (
int i=0; i < this->size() && !foundNewExt; ++i)
1619 foundNewExt = isNewExtreme(Measure_Num<T>::get(currentVal,i),
1620 Measure_Num<T>::get(prevExtreme,i));
1644 for (
int i=0; i < this->size(); ++i)
1645 Measure_Num<T>::upd(newExtreme,i) =
1646 extremeOf(Measure_Num<T>::get(currentVal,i),
1647 Measure_Num<T>::get(prevExtreme,i));
1656 bool isNewExtreme(
const typename Measure_Num<T>::Element& newVal,
1657 const typename Measure_Num<T>::Element& oldExtreme)
const
1659 switch (operation) {
1666 "Measure::Extreme::Implementation::isNewExtreme(): "
1667 "unrecognized operation %d", (
int)operation);
1674 bool isExtremeDir(
const typename Measure_Num<T>::Element& value,
1675 const typename Measure_Num<T>::Element& deriv)
const
1677 const int sv =
sign(value), sd =
sign(deriv);
1678 if (sd == 0)
return false;
1679 switch (operation) {
1680 case Extreme::Maximum:
return sd == 1;
1681 case Extreme::Minimum:
return sd == -1;
1682 case Extreme::MaxAbs:
return sv==0 || sd==sv;
1683 case Extreme::MinAbs:
return sd == -sv;
1686 "Measure::Extreme::Implementation::isExtremeDir(): "
1687 "unrecognized operation %d", (
int)operation);
1691 typename Measure_Num<T>::Element
1692 extremeOf(
const typename Measure_Num<T>::Element& newVal,
1693 const typename Measure_Num<T>::Element& oldExtreme)
const
1695 return isNewExtreme(newVal,oldExtreme) ? newVal : oldExtreme;
1699 Measure_<T> operand;
// Hide from Doxygen.
1748class Measure_Delay_Buffer {
1750 explicit Measure_Delay_Buffer() {initDataMembers();}
1751 void clear() {initDataMembers();}
1752 int size()
const {
return m_size;}
1753 int capacity()
const {
return m_times.size();}
1754 bool empty()
const {
return size()==0;}
1755 bool full()
const {
return size()==capacity();}
1757 double getEntryTime(
int i)
const
1758 { assert(i < size());
return m_times[getArrayIndex(i)];}
1759 const T& getEntryValue(
int i)
const
1760 { assert(i < size());
return m_values[getArrayIndex(i)];}
1763 InitialAllocation = 8,
1765 MaxShrinkProofSize = 16,
1771 void append(
double tEarliest,
double tNow,
const T& valueNow) {
1772 forgetEntriesMuchOlderThan(tEarliest);
1773 removeEntriesLaterOrEq(tNow);
1776 else if (capacity() > std::max((
int)MaxShrinkProofSize,
1777 (
int)TooBigFactor * (size()+1)))
1779 const int nextFree = getArrayIndex(m_size++);
1780 m_times[nextFree] = tNow;
1781 m_values[nextFree] = valueNow;
1782 m_maxSize = std::max(m_maxSize, size());
1786 void prepend(
double tNewOldest,
const T& value) {
1787 assert(empty() || tNewOldest < m_times[m_oldest]);
1788 if (full()) makeMoreRoom();
1789 m_oldest = empty() ? 0 : getArrayIndex(-1);
1790 m_times[m_oldest] = tNewOldest;
1791 m_values[m_oldest] = value;
1793 m_maxSize = std::max(m_maxSize, size());
1802 void copyInAndUpdate(
const Measure_Delay_Buffer& oldBuf,
double tEarliest,
1803 double tNow,
const T& valueNow) {
1805 m_oldest = m_size = 0;
1808 int firstNeeded = oldBuf.countNumUnneededOldEntries(tEarliest);
1809 int lastNeeded = oldBuf.findLastEarlier(tNow);
1810 int numOldEntriesToKeep = lastNeeded-firstNeeded+1;
1811 int newSize = numOldEntriesToKeep+1;
1813 int newSizeRequest = -1;
1814 if (capacity() < newSize) {
1815 newSizeRequest = std::max((
int)InitialAllocation,
1816 (
int)GrowthFactor * newSize);
1818 }
else if (capacity() > std::max((
int)MaxShrinkProofSize,
1819 (
int)TooBigFactor * newSize)) {
1820 newSizeRequest = std::max((
int)MaxShrinkProofSize,
1821 (
int)GrowthFactor * newSize);
1826 if (newSizeRequest != -1) {
1827 const double dNaN = NTraits<double>::getNaN();
1828 m_values.resize(newSizeRequest);
1829 if (m_values.capacity() > m_values.size())
1830 m_values.resize(m_values.capacity());
1831 m_times.resize(m_values.size(), dNaN);
1834 m_maxCapacity = std::max(m_maxCapacity, capacity());
1838 for (
int i=firstNeeded; i<=lastNeeded; ++i, ++nxt) {
1839 m_times[nxt] = oldBuf.getEntryTime(i);
1840 m_values[nxt] = oldBuf.getEntryValue(i);
1843 m_times[nxt] = tNow;
1844 m_values[nxt] = valueNow;
1845 assert(nxt+1==newSize);
1847 m_maxSize = std::max(m_maxSize, size());
1853 T calcValueAtTime(
double tDelay,
double tNow,
const T& valueNow)
const;
1858 void calcValueAtTimeLinearOnly(
double tDelay, T& delayedValue)
const {
1862 Measure_Num<T>::makeNaNLike(T(), delayedValue);
1866 int firstLater = findFirstLaterOrEq(tDelay);
1868 if (firstLater > 0) {
1870 int firstEarlier = firstLater-1;
1871 double t0=getEntryTime(firstEarlier), t1=getEntryTime(firstLater);
1872 const T& v0=getEntryValue(firstEarlier);
1873 const T& v1=getEntryValue(firstLater);
1874 Real fraction =
Real((tDelay-t0)/(t1-t0));
1875 delayedValue = T(v0 + fraction*(v1-v0));
1879 if (firstLater==0) {
1882 delayedValue = getEntryValue(firstLater);
1891 delayedValue = getEntryValue(0);
1896 double t0=getEntryTime(size()-2), t1=getEntryTime(size()-1);
1897 const T& v0=getEntryValue(size()-2);
1898 const T& v1=getEntryValue(size()-1);
1899 Real fraction =
Real((tDelay-t0)/(t1-t0));
1900 assert(fraction > 1.0);
1901 delayedValue = T(v0 + fraction*(v1-v0));
1905 int getNumGrows()
const {
return m_nGrows;}
1908 int getNumShrinks()
const {
return m_nShrinks;}
1910 int getMaxSize()
const {
return m_maxSize;}
1912 int getMaxCapacity()
const {
return m_maxCapacity;}
1917 int getArrayIndex(
int i)
const
1918 { assert(-1<=i && i<=size());
1919 const int rawIndex = m_oldest + i;
1920 if (rawIndex < 0)
return rawIndex + capacity();
1921 else return rawIndex % capacity(); }
1924 void forgetEntriesMuchOlderThan(
double tEarliest) {
1925 const int numToRemove = countNumUnneededOldEntries(tEarliest);
1927 m_oldest = getArrayIndex(numToRemove);
1928 m_size -= numToRemove;
1935 int countNumUnneededOldEntries(
double tEarliest)
const {
1936 const int firstLater = findFirstLaterOrEq(tEarliest);
1937 return std::max(0, firstLater-2);
1942 void removeEntriesLaterOrEq(
double t) {
1943 int lastEarlier = findLastEarlier(t);
1944 m_size = lastEarlier+1;
1945 if (m_size==0) m_oldest=0;
1950 int findFirstLaterOrEq(
double tDelay)
const {
1951 for (
int i=0; i < size(); ++i)
1952 if (getEntryTime(i) >= tDelay)
1959 int findLastEarlier(
double t)
const {
1960 for (
int i=size()-1; i>=0; --i)
1961 if (getEntryTime(i) < t)
1968 void makeMoreRoom() {
1969 const int newSizeRequest = std::max((
int)InitialAllocation,
1970 (
int)GrowthFactor * size());
1971 resize(newSizeRequest);
1973 m_maxCapacity = std::max(m_maxCapacity, capacity());
1978 void makeLessRoom() {
1979 const int targetMaxSize = std::max((
int)MaxShrinkProofSize,
1980 (
int)GrowthFactor * size());
1981 if (capacity() > targetMaxSize) {
1982 resize(targetMaxSize);
1992 void resize(
int newSizeRequest) {
1993 assert(newSizeRequest >= size());
1994 const double dNaN = NTraits<double>::getNaN();
1995 Array_<T,int> newValues(newSizeRequest);
1996 if (newValues.capacity() > newValues.size())
1997 newValues.resize(newValues.capacity());
1998 Array_<double,int> newTimes(newValues.size(), dNaN);
2001 for (
int i=0; i < size(); ++i) {
2002 const int ix = getArrayIndex(i);
2003 newTimes[i] = m_times[ix];
2004 newValues[i] = m_values[ix];
2006 m_times.swap(newTimes);
2007 m_values.swap(newValues);
2012 void initDataMembers() {
2013 m_times.clear(); m_values.clear();
2015 m_nGrows=m_nShrinks=m_maxSize=m_maxCapacity=0;
2019 Array_<double,int> m_times;
2020 Array_<T,int> m_values;
2025 int m_nGrows, m_nShrinks, m_maxSize, m_maxCapacity;
2031 typedef Measure_Delay_Buffer<T> Buffer;
2037 m_canUseCurrentValue(false), m_useLinearInterpolationOnly(false) {}
2041 m_canUseCurrentValue(false), m_useLinearInterpolationOnly(false) {}
2048 this->m_source = source;
2049 this->invalidateTopologyCache();
2054 if (delay != this->m_delay) {
2055 this->m_delay = delay;
2056 this->invalidateTopologyCache();
2061 if (linearOnly != this->m_useLinearInterpolationOnly) {
2062 this->m_useLinearInterpolationOnly = linearOnly;
2063 this->invalidateTopologyCache();
2068 if (canUseCurrentValue != this->m_canUseCurrentValue) {
2069 this->m_canUseCurrentValue = canUseCurrentValue;
2070 this->invalidateTopologyCache();
2077 {
return this->m_useLinearInterpolationOnly; }
2079 {
return this->m_canUseCurrentValue; }
2096 {
return this->m_canUseCurrentValue ? m_source.getDependsOnStage(order)
2103 {
const Subsystem& subsys = this->getSubsystem();
2107 buffer.calcValueAtTimeLinearOnly(s.
getTime()-m_delay, value);
2111 assert(m_bufferIx.isValid());
2112 const Subsystem& subsys = this->getSubsystem();
2116 this->getSubsystem().getSystem().realize(s,m_source.getDependsOnStage());
2117 buffer.append(s.
getTime()-m_delay, s.
getTime(), m_source.getValue(s));
2121 m_bufferIx = this->getSubsystem()
2122 .allocateAutoUpdateDiscreteVariable(s, Stage::Report,
2136 assert(m_bufferIx.isValid());
2137 const Subsystem& subsys = this->getSubsystem();
2146 nextBuffer.copyInAndUpdate(prevBuffer, t-m_delay,
2147 t, m_source.getValue(s));
2155 bool m_canUseCurrentValue;
2156 bool m_useLinearInterpolationOnly;
#define SimTK_ERRCHK3_ALWAYS(cond, whereChecked, fmt, a1, a2, a3)
Definition ExceptionMacros.h:293
#define SimTK_ERRCHK2_ALWAYS(cond, whereChecked, fmt, a1, a2)
Definition ExceptionMacros.h:289
#define SimTK_ERRCHK_ALWAYS(cond, whereChecked, msg)
Definition ExceptionMacros.h:281
#define SimTK_ERRCHK2(cond, whereChecked, fmt, a1, a2)
Definition ExceptionMacros.h:328
#define SimTK_ERRCHK1_ALWAYS(cond, whereChecked, fmt, a1)
Definition ExceptionMacros.h:285
#define SimTK_ASSERT1_ALWAYS(cond, msg, a1)
Definition ExceptionMacros.h:351
#define SimTK_ERRCHK(cond, whereChecked, msg)
Definition ExceptionMacros.h:324
This file declares the base class AbstractMeasure for all derived Measure handle classes,...
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...
Declares the user-visible part of a SimTK::State, the implementation is done in a separate internal c...
Includes internal headers providing declarations for the basic SimTK Core classes.
The abstract parent of all Measure Implementation classes.
Definition MeasureImplementation.h:48
virtual void realizeMeasureAccelerationVirtual(const State &) const
Definition MeasureImplementation.h:143
void invalidateTopologyCache() const
Definition MeasureImplementation.h:125
int decrRefCount() const
Definition MeasureImplementation.h:76
void realizeAcceleration(const State &s) const
Definition MeasureImplementation.h:95
Implementation & operator=(const Implementation &src)
Base class copy assignment operator removes the Subsystem, and sets the reference count to zero.
Definition MeasureImplementation.h:63
virtual void realizeMeasureModelVirtual(State &) const
Definition MeasureImplementation.h:137
virtual Implementation * cloneVirtual() const =0
const Subsystem & getSubsystem() const
Definition MeasureImplementation.h:119
virtual int getNumTimeDerivativesVirtual() const
Definition MeasureImplementation.h:147
Subsystem & updSubsystem()
Definition MeasureImplementation.h:120
Implementation * clone() const
This is a deep copy of the concrete Implementation object, except the Subsystem will have been remove...
Definition MeasureImplementation.h:86
virtual void realizeMeasureTimeVirtual(const State &) const
Definition MeasureImplementation.h:139
void setSubsystem(Subsystem &sub, MeasureIndex mx)
Definition MeasureImplementation.h:114
int incrRefCount() const
Definition MeasureImplementation.h:73
SubsystemIndex getSubsystemIndex() const
Definition MeasureImplementation.h:122
virtual void realizeTopology(State &) const =0
void realizeDynamics(const State &s) const
Definition MeasureImplementation.h:94
virtual ~Implementation()
Definition MeasureImplementation.h:132
void realizeTime(const State &s) const
Definition MeasureImplementation.h:91
void initialize(State &s) const
This should be called at the start of a time stepping study to cause this Measure to set its state va...
Definition MeasureImplementation.h:101
virtual Stage getDependsOnStageVirtual(int order) const =0
void realizeVelocity(const State &s) const
Definition MeasureImplementation.h:93
virtual void realizeMeasurePositionVirtual(const State &) const
Definition MeasureImplementation.h:140
virtual void realizeMeasureReportVirtual(const State &) const
Definition MeasureImplementation.h:144
void realizeReport(const State &s) const
Definition MeasureImplementation.h:96
virtual void initializeVirtual(State &) const
Definition MeasureImplementation.h:146
virtual void realizeMeasureDynamicsVirtual(const State &) const
Definition MeasureImplementation.h:142
bool isInSubsystem() const
Definition MeasureImplementation.h:118
int getCopyNumber() const
Definition MeasureImplementation.h:81
Stage getDependsOnStage(int derivOrder) const
Definition MeasureImplementation.h:105
Stage getStage(const State &s) const
Definition MeasureImplementation.h:128
MeasureIndex getSubsystemMeasureIndex() const
Definition MeasureImplementation.h:121
Implementation(const Implementation &src)
Base class copy constructor removes the Subsystem and sets the reference count to zero.
Definition MeasureImplementation.h:57
Implementation()
This default constructor is for use by concrete measure implementation classes.
Definition MeasureImplementation.h:52
void realizeModel(State &s) const
Definition MeasureImplementation.h:89
int getRefCount() const
Definition MeasureImplementation.h:79
virtual void realizeMeasureInstanceVirtual(const State &) const
Definition MeasureImplementation.h:138
int getNumTimeDerivatives() const
Definition MeasureImplementation.h:103
virtual void realizeMeasureVelocityVirtual(const State &) const
Definition MeasureImplementation.h:141
void realizeInstance(const State &s) const
Definition MeasureImplementation.h:90
void realizePosition(const State &s) const
Definition MeasureImplementation.h:92
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
int getNumTimeDerivatives() const
Every Measure can produce a value, and some can provide one or more total derivatives with respect to...
Definition MeasureImplementation.h:241
MeasureIndex getSubsystemMeasureIndex() const
Return the MeasureIndex by which this Measure is known to the Subsystem that owns it.
Definition MeasureImplementation.h:237
Stage getDependsOnStage(int derivOrder=0) const
At what Stage can we expect the value of this AbstractMeasure or one of its time derivatives to be av...
Definition MeasureImplementation.h:245
bool isSameMeasure(const AbstractMeasure &other) const
There can be multiple handles on the same Measure.
Definition Measure.h:220
int getRefCount() const
Definition MeasureImplementation.h:249
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
const Implementation & getImpl() const
Definition Measure.h:242
AbstractMeasure(Implementation *g=0)
Provide an Implementation for this AbstractMeasure and bump its reference count.
Definition MeasureImplementation.h:171
AbstractMeasure & deepAssign(const AbstractMeasure &source)
Deep assignment clones the Implementation object pointed to by the source handle, so that this handle...
Definition MeasureImplementation.h:208
bool isInSubsystem() const
Test whether this Measure object has been adopted by a Subsystem.
Definition MeasureImplementation.h:225
bool hasImpl() const
Definition Measure.h:244
~AbstractMeasure()
Destructor decrements the Implementation's reference count and deletes the object if the count goes t...
Definition MeasureImplementation.h:221
AbstractMeasure & shallowAssign(const AbstractMeasure &)
Shallow assignment operator destructs the current Implementation object (meaning its reference count ...
Definition MeasureImplementation.h:195
Specialized information about Composite Numerical Types which allows us to define appropriate templat...
Definition CompositeNumericalTypes.h:136
This unique integer type is for selecting discrete variables.
Definition MeasureImplementation.h:612
void setValue(const T &v)
Changing the value of a Constant measure is a topological change; if this is a Vector measure you can...
Definition MeasureImplementation.h:621
Implementation(const T &value)
Definition MeasureImplementation.h:616
const T & getUncachedValueVirtual(const State &, int derivOrder) const override
This is only called when derivOrder >= the number of cache entries we have, but still <= the number o...
Definition MeasureImplementation.h:627
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:636
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:632
Implementation()
Definition MeasureImplementation.h:615
Stage getDependsOnStageVirtual(int derivOrder) const override
Definition MeasureImplementation.h:634
This creates a Measure whose value is a Topology-stage constant of any type T.
Definition Measure.h:341
Definition MeasureImplementation.h:2030
void realizeMeasureAccelerationVirtual(const State &s) const override
In case no one has updated the value of this measure yet, we have to make sure it gets updated before...
Definition MeasureImplementation.h:2128
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:2085
void realizeMeasureTopologyVirtual(State &s) const override
Concrete measures can override this to allocate Topology-stage resources.
Definition MeasureImplementation.h:2120
void setSourceMeasure(const Measure_< T > &source)
Definition MeasureImplementation.h:2046
Implementation()
Definition MeasureImplementation.h:2035
const Measure_< T > & getSourceMeasure() const
Definition MeasureImplementation.h:2074
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:2095
void setCanUseCurrentValue(bool canUseCurrentValue)
Definition MeasureImplementation.h:2067
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:2101
void initializeVirtual(State &s) const override
Definition MeasureImplementation.h:2110
void updateBuffer(const State &s) const
Definition MeasureImplementation.h:2135
bool getUseLinearInterpolationOnly() const
Definition MeasureImplementation.h:2076
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:2089
void setDelay(Real delay)
Definition MeasureImplementation.h:2053
void setUseLinearInterpolationOnly(bool linearOnly)
Definition MeasureImplementation.h:2060
Real getDelay() const
Definition MeasureImplementation.h:2075
bool getCanUseCurrentValue() const
Definition MeasureImplementation.h:2078
Implementation(const Measure_< T > &source, Real delay)
Definition MeasureImplementation.h:2039
Definition MeasureImplementation.h:1307
void initializeVirtual(State &s) const override
Definition MeasureImplementation.h:1365
const Measure_< T > & getOperandMeasure() const
Definition MeasureImplementation.h:1332
void realizeMeasureAccelerationVirtual(const State &s) const override
In case no one has updated the value of this measure yet, we have to make sure it gets updated before...
Definition MeasureImplementation.h:1390
void ensureDerivativeIsRealized(const State &s) const
Definition MeasureImplementation.h:1394
const T & getUncachedValueVirtual(const State &s, int derivOrder) const override
This is only called when derivOrder >= the number of cache entries we have, but still <= the number o...
Definition MeasureImplementation.h:1353
void realizeMeasureTopologyVirtual(State &s) const override
Concrete measures can override this to allocate Topology-stage resources.
Definition MeasureImplementation.h:1378
Implementation()
Definition MeasureImplementation.h:1311
bool getForceUseApproximation() const
Definition MeasureImplementation.h:1330
bool isUsingApproximation() const
Definition MeasureImplementation.h:1331
void setForceUseApproximation(bool mustApproximate)
Definition MeasureImplementation.h:1320
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:1345
Implementation(const Measure_< T > &operand)
Definition MeasureImplementation.h:1313
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:1341
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:1337
void setOperandMeasure(const Measure_< T > &operand)
Definition MeasureImplementation.h:1325
Definition MeasureImplementation.h:1446
int getNumTimeDerivativesVirtual() const override
Extreme(f(t)) has the same number of derivatives as f except that they are all zero unless f(t) is a ...
Definition MeasureImplementation.h:1518
const T & getUncachedValueVirtual(const State &s, int derivOrder) const override
We're not using the Measure_<T> base class cache services, but we do have one of our own.
Definition MeasureImplementation.h:1530
Implementation()
Default constructor leaves the operand measure unspecified; no base class cache entries are allocated...
Definition MeasureImplementation.h:1452
bool ensureExtremeHasBeenUpdated(const State &s) const
Here we make sure that the cache entry is updated if the current value of the operand is more extreme...
Definition MeasureImplementation.h:1597
Implementation(const Measure_< T > &operand, Operation op)
Construct a measure that returns the extreme value taken on by the operand measure during a time step...
Definition MeasureImplementation.h:1457
void setOperation(Operation op)
Set the particular operation to be performed by this Extreme measure; this is a Topology stage change...
Definition MeasureImplementation.h:1474
void setValue(State &s, const T &value) const
Set the current extreme value stored in this Extreme measure's state variable.
Definition MeasureImplementation.h:1488
Operation getOperation() const
Return the particular operation being performed by this Extreme measure.
Definition MeasureImplementation.h:1484
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:1513
void initializeVirtual(State &s) const override
At start of a time stepping study, this should be called to set the current extreme value to the curr...
Definition MeasureImplementation.h:1555
void realizeMeasureAccelerationVirtual(const State &s) const override
In case no one has updated the value of this measure yet, we have to make sure it gets updated before...
Definition MeasureImplementation.h:1588
void setOperandMeasure(const Measure_< T > &operand)
Set the operand measure for this Extreme measure; this is a Topology stage change so you'll have to c...
Definition MeasureImplementation.h:1466
Stage getDependsOnStageVirtual(int order) const override
The depends-on stage for this measure is the same as for its operand.
Definition MeasureImplementation.h:1523
const Measure_< T > & getOperandMeasure() const
Return a reference to the operand measure for this Extreme measure.
Definition MeasureImplementation.h:1480
Real getTimeOfExtremeValue(const State &s) const
Return the time at which the extreme was last updated.
Definition MeasureImplementation.h:1499
void realizeMeasureTopologyVirtual(State &s) const override
Allocate the auto-updated state variable that holds the extreme seen so far.
Definition MeasureImplementation.h:1567
This Measure tracks extreme values attained by the elements of its source operand since the last init...
Definition Measure.h:837
This is the base Implementation class for all Measures whose value type is known.
Definition MeasureImplementation.h:363
int size() const
Return the number of elements in the data type of this Measure; for Vector measures this is determine...
Definition MeasureImplementation.h:459
int getNumCacheEntries() const
Return the number of cache entries allocated for the value and derivatives of this Measure.
Definition MeasureImplementation.h:463
Implementation(int numCacheEntries=1)
Argument numCacheEntries should be one greater than the number of derivatives; that is,...
Definition MeasureImplementation.h:437
Implementation(const T &defaultValue, int numCacheEntries=1)
Definition MeasureImplementation.h:426
bool isCacheValueRealized(const State &s, int derivOrder) const
Determine whether a particular one of this Measure's cache entries has already been realized since th...
Definition MeasureImplementation.h:493
const T & getCacheEntry(const State &s, int derivOrder) const
Get a const reference to the value stored in one of this Measure's cache entries, indexed by the deri...
Definition MeasureImplementation.h:468
T & updCacheEntry(const State &s, int derivOrder) const
Get a writable reference to the value stored in one of this Measure's cache entries,...
Definition MeasureImplementation.h:481
virtual void realizeMeasureTopologyVirtual(State &) const
Concrete measures can override this to allocate Topology-stage resources.
Definition MeasureImplementation.h:531
Implementation(const Implementation &source)
Copy constructor copies the number of cache entries from the source, but not the cache indices themse...
Definition MeasureImplementation.h:448
void setDefaultValue(const T &defaultValue)
Set a new default value for this Measure.
Definition MeasureImplementation.h:407
virtual const T & getUncachedValueVirtual(const State &, int derivOrder) const
This is only called when derivOrder >= the number of cache entries we have, but still <= the number o...
Definition MeasureImplementation.h:549
void markCacheValueNotRealized(const State &s, int derivOrder) const
Invalidate one of this Measure's cache entries.
Definition MeasureImplementation.h:518
const T & getValue(const State &s, int derivOrder) const
Definition MeasureImplementation.h:365
const T & getValueZero() const
Return a reference to a zero of the same type and size as this Measure's value.
Definition MeasureImplementation.h:560
bool getIsPresumedValidAtDependsOnStage() const
Definition MeasureImplementation.h:422
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
void markCacheValueRealized(const State &s, int derivOrder) const
Mark one of this Measure's cache entries up to date; call this after you have calculated a value or d...
Definition MeasureImplementation.h:505
virtual void calcCachedValueVirtual(const State &, int derivOrder, T &value) const
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:536
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:1148
void setValue(State &s, const T &value) const
Set the value of the state variables(s) that hold the integral.
Definition MeasureImplementation.h:1170
Implementation()
The derivative and initialConditions Measures will be empty handles if this is default constructed.
Definition MeasureImplementation.h:1152
void realizeMeasureAccelerationVirtual(const State &s) const override
Set the zdots to the integrand (derivative measure) value.
Definition MeasureImplementation.h:1259
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:1197
void initializeVirtual(State &s) const override
Initialize the state to the current value of the initial condition measure, if there is one,...
Definition MeasureImplementation.h:1231
void realizeMeasureTopologyVirtual(State &s) const override
Allocate one Real continuous state variable z per element of this Measure's data type T,...
Definition MeasureImplementation.h:1250
Implementation(const Measure_< T > &deriv, const Measure_< T > &ic, const T &defaultValue)
Here we're shallow-copying the Measure handles so we'll be referring to the original Measures.
Definition MeasureImplementation.h:1156
const T & getUncachedValueVirtual(const State &s, int derivOrder) const override
This is only called when derivOrder >= the number of cache entries we have, but still <= the number o...
Definition MeasureImplementation.h:1218
int getNumTimeDerivativesVirtual() const override
This measure has one more time derivative than the integrand.
Definition MeasureImplementation.h:1201
const Measure_< T > & getInitialConditionMeasure() const
Definition MeasureImplementation.h:1182
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:1208
void setDerivativeMeasure(const Measure_< T > &d)
Definition MeasureImplementation.h:1189
const Measure_< T > & getDerivativeMeasure() const
Definition MeasureImplementation.h:1176
Stage getDependsOnStageVirtual(int derivOrder) const override
Definition MeasureImplementation.h:1224
Implementation(const Implementation &source)
Copy constructor shallow-copies the referenced measures, but we don't want to share our state variabl...
Definition MeasureImplementation.h:1163
void setInitialConditionMeasure(const Measure_< T > &ic)
Definition MeasureImplementation.h:1191
Track the value of the operand that is of maximum absolute value.
Definition Measure.h:905
Track the maximum value of the operand (signed).
Definition Measure.h:895
Track the value of the operand that is of minimum absolute value (not very useful).
Definition Measure.h:916
Track the minimum value of the operand (signed).
Definition Measure.h:885
Definition MeasureImplementation.h:1025
Implementation(const Measure_< T > &left, const Measure_< T > &right)
Definition MeasureImplementation.h:1031
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:1050
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:1041
Implementation()
Definition MeasureImplementation.h:1029
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:1055
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:1046
One()
Definition MeasureImplementation.h:658
Definition MeasureImplementation.h:972
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:997
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:993
Implementation(const Measure_< T > &left, const Measure_< T > &right)
Definition MeasureImplementation.h:978
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:1002
Implementation()
Definition MeasureImplementation.h:976
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:988
Definition MeasureImplementation.h:794
Stage getDependsOnStageVirtual(int derivOrder) const override
Cache value is available after its "depends on" stage has been realized; but all its derivatives are ...
Definition MeasureImplementation.h:884
void calcCachedValueVirtual(const State &, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:887
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:877
Stage getDependsOnStage() const
Definition MeasureImplementation.h:845
void markAsNotValid(const State &state) const
Definition MeasureImplementation.h:868
bool isValid(const State &state) const
Definition MeasureImplementation.h:865
void markAsValid(const State &state) const
Definition MeasureImplementation.h:849
Implementation()
Definition MeasureImplementation.h:797
void setDependsOnStage(Stage dependsOn)
Definition MeasureImplementation.h:817
T & updValue(const State &state) const
Definition MeasureImplementation.h:872
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:880
Implementation(const Implementation &source)
Definition MeasureImplementation.h:812
Implementation(Stage dependsOn, Stage invalidated)
Definition MeasureImplementation.h:801
void setInvalidatedStage(Stage invalidated)
Definition MeasureImplementation.h:831
Stage getInvalidatedStage() const
Definition MeasureImplementation.h:846
Definition MeasureImplementation.h:1080
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:1114
void setScaleFactor(Real sf)
Definition MeasureImplementation.h:1092
Implementation()
Definition MeasureImplementation.h:1084
Implementation(Real factor, const Measure_< T > &operand)
Definition MeasureImplementation.h:1086
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:1105
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:1110
const Measure_< T > & getOperandMeasure() const
Definition MeasureImplementation.h:1097
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:1118
Definition MeasureImplementation.h:910
Stage getDependsOnStageVirtual(int order) const override
Definition MeasureImplementation.h:931
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:929
Implementation()
Definition MeasureImplementation.h:913
void calcCachedValueVirtual(const State &s, int derivOrder, T &value) const override
Concrete measures must override this if the state cache is used for precalculated values or derivativ...
Definition MeasureImplementation.h:934
Implementation(const T &litude, const T &frequency, const T &phase=T(0))
Definition MeasureImplementation.h:917
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:926
Definition MeasureImplementation.h:673
Definition MeasureImplementation.h:714
void setInvalidatedStage(Stage invalidates)
Definition MeasureImplementation.h:732
Implementation(Stage invalidated, const T &defaultValue)
Definition MeasureImplementation.h:723
void realizeMeasureTopologyVirtual(State &s) const override
Concrete measures can override this to allocate Topology-stage resources.
Definition MeasureImplementation.h:763
Stage getInvalidatedStage() const
Definition MeasureImplementation.h:737
Implementation * cloneVirtual() const override
Definition MeasureImplementation.h:746
Stage getDependsOnStageVirtual(int derivOrder) const override
Definition MeasureImplementation.h:754
Implementation(const Implementation &source)
Definition MeasureImplementation.h:728
const T & getUncachedValueVirtual(const State &s, int derivOrder) const override
This is only called when derivOrder >= the number of cache entries we have, but still <= the number o...
Definition MeasureImplementation.h:757
int getNumTimeDerivativesVirtual() const override
Definition MeasureImplementation.h:749
Implementation()
Definition MeasureImplementation.h:719
void setValue(State &state, const T &value) const
Change the value of this Measure in the given state.
Definition MeasureImplementation.h:742
Zero()
Definition MeasureImplementation.h:648
This is the base handle class for all Measures whose value type is known, including all the Simbody b...
Definition Measure.h:263
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
This class is basically a glorified enumerated type, type-safe and range checked but permitting conve...
Definition Stage.h:66
String getName() const
Return a printable name corresponding to the stage level currently stored in this Stage.
Definition Stage.h:144
Stage prev() const
Return the Stage before this one, with Stage::Empty returned if this Stage is already at its lowest v...
Definition Stage.h:139
@ Topology
System topology realized.
Definition Stage.h:70
@ Empty
Lower than any legitimate Stage.
Definition Stage.h:69
This object is intended to contain all state information for a SimTK::System, except topological info...
Definition State.h:280
const Stage & getSystemStage() const
This returns the global stage for this State.
const Real & getTime() const
You can call these as long as system stage >= Model.
void invalidateAllCacheAtOrAbove(Stage) const
If any subsystem or the system stage is currently at or higher than the passed-in one,...
Provide a unique integer type for identifying Subsystems.
The abstract parent of all Subsystem implementation classes.
Definition SubsystemGuts.h:47
A Subsystem is expected to be part of a larger System and to have interdependencies with other subsys...
Definition Subsystem.h:55
bool isSameSubsystem(const Subsystem &otherSubsystem) const
Determine if this Subsystem handle refers to the same Subsystem::Guts object as handle otherSubsystem...
Definition Subsystem.h:322
MeasureIndex adoptMeasure(AbstractMeasure &)
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition SubsystemGuts.h:509
AbstractValue & updDiscreteVariable(State &s, DiscreteVariableIndex index) const
Definition Subsystem.h:247
CacheEntryIndex allocateCacheEntry(const State &s, Stage dependsOn, Stage computedBy, AbstractValue *v) const
Definition Subsystem.h:103
AbstractValue & updDiscreteVarUpdateValue(const State &s, DiscreteVariableIndex dx) const
Definition Subsystem.h:262
void markDiscreteVarUpdateValueRealized(const State &s, DiscreteVariableIndex dx) const
Definition Subsystem.h:268
void markCacheValueNotRealized(const State &s, CacheEntryIndex cx) const
Definition Subsystem.h:275
CacheEntryIndex allocateLazyCacheEntry(const State &state, Stage earliest, AbstractValue *v) const
Definition Subsystem.h:111
bool isDiscreteVarUpdateValueRealized(const State &s, DiscreteVariableIndex dx) const
Definition Subsystem.h:265
const AbstractValue & getDiscreteVariable(const State &s, DiscreteVariableIndex index) const
Definition Subsystem.h:245
bool isCacheValueRealized(const State &s, CacheEntryIndex cx) const
Definition Subsystem.h:271
Real getDiscreteVarLastUpdateTime(const State &s, DiscreteVariableIndex dx) const
Definition Subsystem.h:253
const AbstractValue & getDiscreteVarUpdateValue(const State &s, DiscreteVariableIndex dx) const
Definition Subsystem.h:259
void markCacheValueRealized(const State &s, CacheEntryIndex cx) const
Definition Subsystem.h:273
Concrete templatized class derived from AbstractValue, adding generic value type-specific functionali...
Definition Value.h:107
static const Value & downcast(const AbstractValue &value)
Downcast a const reference to an AbstractValue to a const reference to this type Value<T>.
Definition Value.h:219
static Value & updDowncast(AbstractValue &value)
Downcast a writable reference to an AbstractValue to a writable reference to this type Value<T>.
Definition Value.h:225
Unique integer type for Subsystem-local z indexing.
constexpr Real NaN
This is the IEEE "not a number" constant for this implementation of the default-precision Real type; ...
Definition Scalar.h:85
constexpr Real Zero
Real(0)
Definition Scalar.h:138
constexpr Real One
Real(1)
Definition Scalar.h:139
constexpr Real E
e = Real(exp(1))
Definition Scalar.h:154
constexpr Real Infinity
This is the IEEE positive infinity constant for this implementation of the default-precision Real typ...
Definition Scalar.h:89
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
unsigned int sign(unsigned char u)
Definition Scalar.h:301
bool isFinite(const negator< float > &x)
Definition negator.h:285
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:626