50#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_SPLINE_H
51#define LASS_GUARDIAN_OF_INCLUSION_NUM_SPLINE_H
70 typedef ScalarType TScalar;
71 typedef DataType TData;
76 ControlRange(TScalar begin, TScalar end): begin_(begin), end_(end) {}
77 const TScalar begin()
const {
return begin_; }
78 const TScalar end()
const {
return end_; }
86 virtual const TData operator()(TScalar iX)
const = 0;
87 virtual const TData derivative(TScalar iX)
const = 0;
88 virtual const TData
derivative2(TScalar iX)
const = 0;
89 virtual const TData integral(TScalar iA, TScalar iB)
const = 0;
91 virtual bool isEmpty()
const = 0;
92 virtual const ControlRange controlRange()
const = 0;
129template <
typename SequenceType>
130struct DataTraitsSequence
132 typedef SequenceType TData;
133 typedef typename SequenceType::value_type TScalar;
134 static size_t dimension(
const TData& iY) {
return std::distance(iY.begin(), iY.end()); }
135 static void zero(TData& ioY,
size_t iDim) { ioY = TData(iDim); }
136 static TScalar get(
const TData& iY,
size_t iIndex) {
return *stde::next(iY.begin(), iIndex); }
137 static void set(TData& ioY,
size_t iIndex, TScalar iV) { *stde::next(ioY.begin(), iIndex) = iV; }
138 static void scale(TData& ioAcc, TScalar iS)
140 std::transform(ioAcc.begin(), ioAcc.end(), ioAcc.begin(), [iS](TScalar a) { return a * iS; });
142 static void multiplyAccumulate(TData& ioAcc,
const TData& iY, TScalar iS)
144 std::transform(ioAcc.begin(), ioAcc.end(), iY.begin(), ioAcc.begin(), [iS](TScalar a, TScalar b) { return a + iS * b; });
150template <
typename ScalarType>
151struct DataTraitsScalar
153 typedef ScalarType TData;
154 typedef ScalarType TScalar;
155 static size_t dimension(TScalar ) {
return 1; }
156 static void zero(TScalar& ioY,
size_t ) { ioY = TScalar(); }
157 static TScalar get(TScalar iY,
size_t ) {
return iY; }
158 static void set(TScalar& ioY,
size_t , TScalar iV) { ioY = iV; }
159 static void scale(TScalar& ioAcc, TScalar iS) { ioAcc *= iS; }
160 static void multiplyAccumulate(TScalar& ioAcc, TScalar iY, TScalar iS) { ioAcc += iY * iS; }
166template <
typename DataType>
167struct DataTraitsDynamicVector
169 typedef DataType TData;
170 typedef typename DataType::TValue TScalar;
171 static size_t dimension(
const TData& iY) {
return iY.size(); }
172 static void zero(TData& ioY,
size_t iDim) { ioY = TData(iDim); }
173 static TScalar get(
const TData& iY,
size_t iIndex) {
return iY[iIndex]; }
174 static void set(TData& ioY,
size_t iIndex, TScalar iV) { ioY[iIndex] = iV; }
175 static void scale(TData& ioAcc, TScalar iS) { ioAcc *= iS; }
176 static void multiplyAccumulate(TData& ioAcc,
const TData& iY, TScalar iS) { ioAcc += iY * iS; }
181template <
typename DataType>
182struct DataTraitsStaticVector
184 typedef DataType TData;
185 typedef typename DataType::TValue TScalar;
186 static size_t dimension(
const TData& ) {
return TData::dimension; }
187 static void zero(TData& ioY,
size_t ) { ioY = TData(); }
188 static TScalar get(
const TData& iY,
size_t iIndex) {
return iY[iIndex]; }
189 static void set(TData& ioY,
size_t iIndex, TScalar iV) { ioY[iIndex] = iV; }
190 static void scale(TData& ioAcc, TScalar iS) { ioAcc *= iS; }
191 static void multiplyAccumulate(TData& ioAcc,
const TData& iY, TScalar iS) { ioAcc += iY * iS; }
abstract base class of splines.
numeric types and traits.
const SplineLinear< S, D, T >::TData SplineLinear< S, D, T >::derivative2(TScalar) const
Get the second derivative of data value that corresponds with constrol value iX.
Library for Assembled Shared Sources.