cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
nmrBernsteinPolynomialLineIntegral.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Ofri Sadowsky
7  Created on: 2003-05-06
8 
9  (C) Copyright 2003-2007 Johns Hopkins University (JHU), All Rights
10  Reserved.
11 
12 --- begin cisst license - do not edit ---
13 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 
22 #ifndef _nmrBernsteinPolynomialLineIntegral_h
23 #define _nmrBernsteinPolynomialLineIntegral_h
24 
27 
29 
37 #define CACHE_POWER_BASIS 1
38 
39 
44 #define USE_INTEGRAND_TABLEAU 1
45 
129 {
130 public:
131  // The value evaluated by the integral
133 
134  // The type of value of a variable of the integrand function.
136 
138 
139  // The type of a coefficient in the integrand function
141 
143 
145 
147 
148 
149  // See the usage of roundoff tolerance to reduce the number of iterations.
150  static const double DefaultRoundoffTolerance;
151 
152  // Profiling information that's accumulated during the integration.
153  // Counts the invocations of different operations.
154  // \note deprecated
155  struct ProfilingInfo {
156  unsigned long IntegrandTermCounter;
159 
161  : IntegrandTermCounter(0)
162  , EvaluatePowerProductCounter(0)
163  , TimeOfSingleTermIntegration(0)
164  {}
165  };
166 
167  // Initialize the integrator for a specific polynomial.
169  : Integrand(integrand)
171  , PowersAtP0(Integrand.GetNumVariables(), Integrand.GetMaxDegree())
172  , PowersAtP1(Integrand.GetNumVariables(), Integrand.GetMaxDegree())
173 #endif // CACHE_POWER_BASIS
174  {
175 #if USE_INTEGRAND_TABLEAU
176  InitializePolynomialIntegrationTableau(Integrand, IntegrationTableau);
177 #endif
178  }
179 
185  {
186  InitializePolynomialIntegrationTableau(Integrand, IntegrationTableau);
187  }
188 
209  ValueType EvaluateForSegment(
210  const VariableType p0[], const VariableType p1[],
211  const VariableType gradientNorm,
212  const double roundoffTolerance = DefaultRoundoffTolerance,
213  CoefficientType const * coefficients = NULL)
214 #if !CACHE_POWER_BASIS
215  const
216 #endif
217  ;
218 
219  const IntegrandType & GetIntegrand() const
220  {
221  return Integrand;
222  }
223 
224 protected:
225  // The integrand polynomial
227 
228 #if CACHE_POWER_BASIS
229  // Auxiliary objects to compute and contain the power basis of the variables
232 #endif // CACHE_POWER_BASIS
233 
234  typedef std::vector<PowerType> PowerIndexType;
235  typedef struct {
241  typedef std::vector<TermSummationElement> SingleTermIntegrationTableau;
242 
243  typedef std::vector<SingleTermIntegrationTableau> PolynomialIntegrationTableau;
244 
246 
247 
265  static ValueType IntegrateSingleTerm(
266  const CoefficientType termCoefficient,
267  const CoefficientType gradientNorm,
268  const nmrPolynomialTermPowerIndex & termIndex,
269  const nmrMultiVariablePowerBasis & powersAtP0,
270  const nmrMultiVariablePowerBasis & powersAtP1,
271  const double roundoffTolerance = DefaultRoundoffTolerance);
272 
273 
274 
275  typedef std::vector<VariableIndexType> IndexContainerForZeroVariables;
276 
298  static ValueType IntegrateSingleTerm(
299  const CoefficientType termCoefficient,
300  const CoefficientType gradientNorm,
301  const PowerType termDegree,
302  const SingleTermIntegrationTableau & termIntegrationTableau,
303  const nmrMultiVariablePowerBasis & powersAtP0,
304  const nmrMultiVariablePowerBasis & powersAtP1,
305  const IndexContainerForZeroVariables & zerosOfP0,
306  const IndexContainerForZeroVariables & zerosOfP1);
307 
308  static void InitializePolynomialIntegrationTableau(
309  const IntegrandType & integrand,
310  PolynomialIntegrationTableau & tableau );
311 
312  static void InitializeSingleTermIntegrationTableau(
313  const nmrPolynomialTermPowerIndex & termIndex,
314  SingleTermIntegrationTableau & termTableau );
315 
316 };
317 
318 #endif
#define CISST_EXPORT
Definition: cmnExportMacros.h:50
#define CACHE_POWER_BASIS
Definition: nmrBernsteinPolynomialLineIntegral.h:37
StandardPowerBasis(VariableIndexType numVariables, PowerType maxPower)
Definition: nmrMultiVariablePowerBasis.h:146
Definition: nmrBernsteinPolynomial.h:66
void UpdateIntegrationTableau()
Definition: nmrBernsteinPolynomialLineIntegral.h:184
double ValueType
Definition: nmrPolynomialBase.h:54
nmrBernsteinPolynomial IntegrandType
Definition: nmrBernsteinPolynomialLineIntegral.h:144
std::vector< VariableIndexType > IndexContainerForZeroVariables
Definition: nmrBernsteinPolynomialLineIntegral.h:275
PolynomialIntegrationTableau IntegrationTableau
Definition: nmrBernsteinPolynomialLineIntegral.h:245
Definition: nmrBernsteinPolynomialLineIntegral.h:155
nmrPolynomialTermPowerIndex::PowerType PowerType
Definition: nmrPolynomialBase.h:58
std::vector< PowerType > PowerIndexType
Definition: nmrBernsteinPolynomialLineIntegral.h:234
nmrMultiVariablePowerBasis::StandardPowerBasis PowersAtP1
Definition: nmrBernsteinPolynomialLineIntegral.h:231
Definition: nmrBernsteinPolynomialLineIntegral.h:128
nmrPolynomialBase::CoefficientType CoefficientType
Definition: nmrBernsteinPolynomialLineIntegral.h:140
MultinomialType P0MultinomialFactor
Definition: nmrBernsteinPolynomialLineIntegral.h:237
Definition: nmrBernsteinPolynomialLineIntegral.h:235
nmrPolynomialBase::VariableType VariableType
Definition: nmrBernsteinPolynomialLineIntegral.h:135
std::vector< TermSummationElement > SingleTermIntegrationTableau
Definition: nmrBernsteinPolynomialLineIntegral.h:241
double VariableType
Definition: nmrPolynomialBase.h:55
const IntegrandType & Integrand
Definition: nmrBernsteinPolynomialLineIntegral.h:226
unsigned long IntegrandTermCounter
Definition: nmrBernsteinPolynomialLineIntegral.h:156
unsigned long EvaluatePowerProductCounter
Definition: nmrBernsteinPolynomialLineIntegral.h:157
nmrMultiVariablePowerBasis::StandardPowerBasis PowersAtP0
Definition: nmrBernsteinPolynomialLineIntegral.h:230
nmrPolynomialBase::ValueType ValueType
Definition: nmrBernsteinPolynomialLineIntegral.h:132
std::vector< SingleTermIntegrationTableau > PolynomialIntegrationTableau
Definition: nmrBernsteinPolynomialLineIntegral.h:243
double CoefficientType
Definition: nmrPolynomialBase.h:56
nmrPolynomialBase::PowerType PowerType
Definition: nmrBernsteinPolynomialLineIntegral.h:142
nmrPolynomialTermPowerIndex::MultinomialCoefficientType MultinomialType
Definition: nmrBernsteinPolynomialLineIntegral.h:146
nmrPolynomialTermPowerIndex::VariableIndexType VariableIndexType
Definition: nmrPolynomialBase.h:57
ProfilingInfo()
Definition: nmrBernsteinPolynomialLineIntegral.h:160
unsigned long TimeOfSingleTermIntegration
Definition: nmrBernsteinPolynomialLineIntegral.h:158
static const double DefaultRoundoffTolerance
Definition: nmrBernsteinPolynomialLineIntegral.h:150
PowerIndexType P1PowerIndex
Definition: nmrBernsteinPolynomialLineIntegral.h:238
PowerIndexType P0PowerIndex
Definition: nmrBernsteinPolynomialLineIntegral.h:236
unsigned long MultinomialCoefficientType
Definition: nmrPolynomialTermPowerIndex.h:101
Definition: nmrMultiVariablePowerBasis.h:37
MultinomialType P1MultinomialFactor
Definition: nmrBernsteinPolynomialLineIntegral.h:239
const IntegrandType & GetIntegrand() const
Definition: nmrBernsteinPolynomialLineIntegral.h:219
Represents the power index of a single term in a multi-variable polynomial.
Definition: nmrPolynomialTermPowerIndex.h:89
Rules of exporting.
nmrPolynomialBase::VariableIndexType VariableIndexType
Definition: nmrBernsteinPolynomialLineIntegral.h:137
nmrBernsteinPolynomialLineIntegral(const IntegrandType &integrand)
Definition: nmrBernsteinPolynomialLineIntegral.h:168