88 if (BaseClass::EnsureCacheValid()){
89 typename BaseClass::FulcrumIndex index = this->FindIndices(argument);
91 typename BaseClass::FulcrumSizes gridSize = BaseClass::GetGridSize();
93 if (index.IsInside(gridSize)){
94 int dimensionsCount = BaseClass::GetDimensionsCount();
96 degree.SetDimensionsCount(dimensionsCount);
98 CumulateRecursiveValueAt(argument, dimensionsCount - 1, gridSize, index, degree, 1.0, result);
123 const Argument& argument,
125 const typename BaseClass::FulcrumSizes& sizes,
126 typename BaseClass::FulcrumIndex& index,
128 double cumulationFactor,
129 Result& result)
const
131 Q_ASSERT(dimension < BaseClass::GetDimensionsCount());
132 Q_ASSERT(sizes.GetDimensionsCount() == BaseClass::GetDimensionsCount());
133 Q_ASSERT(index.GetDimensionsCount() == BaseClass::GetDimensionsCount());
136 result.ScaledCumulate(GetFulcrumDerivativeAtIndex(index, derivativeDegree), cumulationFactor);
141 int& indexElement = index[dimension];
143 if (indexElement >= 0){
144 if (indexElement < sizes[dimension] - 1){
145 double firstPosition = BaseClass::GetLayerPosition(dimension, indexElement);
146 double secondPosition = BaseClass::GetLayerPosition(dimension, indexElement + 1);
147 double layersDistance = secondPosition - firstPosition;
148 Q_ASSERT(layersDistance >= 0);
149 Q_ASSERT(argument[dimension] >= firstPosition);
150 Q_ASSERT(argument[dimension] <= secondPosition);
151 Q_ASSERT(derivativeDegree[dimension] == 0);
153 bool useDerivative =
false;
154 if (derivativeDegree.IncreaseAt(dimension)){
155 useDerivative = IsDerivativeDegreeSupported(derivativeDegree);
156 derivativeDegree.DecreaseAt(dimension);
159 double alpha = (argument[dimension] - firstPosition) / layersDistance;
163 CumulateRecursiveValueAt(
169 cumulationFactor * firstValueFactor,
177 CumulateRecursiveValueAt(
183 cumulationFactor * secondValueFactor,
189 derivativeDegree.IncreaseAt(dimension);
193 CumulateRecursiveValueAt(
199 cumulationFactor * firstDerivativeFactor,
207 CumulateRecursiveValueAt(
213 cumulationFactor * secondDerivativeFactor,
219 derivativeDegree.DecreaseAt(dimension);
224 Q_ASSERT(indexElement == sizes[dimension] - 1);
226 CumulateRecursiveValueAt(
238 Q_ASSERT(indexElement == -1);
241 CumulateRecursiveValueAt(
void CumulateRecursiveValueAt(const Argument &argument, int dimension, const typename BaseClass::FulcrumSizes &sizes, typename BaseClass::FulcrumIndex &index, DerivativeDegreeType °ree, double cumulationFactor, Result &result) const
Cumulate interpolated value or derivative at specified recursion level.