casa
$Rev:20696$
|
00001 //# ChebyshevParam.h: Parameter handling for Chebyshev polynomial 00002 //# Copyright (C) 2000,2001,2002,2003,2005 00003 //# Associated Universities, Inc. Washington DC, USA. 00004 //# 00005 //# This library is free software; you can redistribute it and/or modify it 00006 //# under the terms of the GNU Library General Public License as published by 00007 //# the Free Software Foundation; either version 2 of the License, or (at your 00008 //# option) any later version. 00009 //# 00010 //# This library is distributed in the hope that it will be useful, but WITHOUT 00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00012 //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 00013 //# License for more details. 00014 //# 00015 //# You should have received a copy of the GNU Library General Public License 00016 //# along with this library; if not, write to the Free Software Foundation, 00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. 00018 //# 00019 //# Correspondence concerning AIPS++ should be addressed as follows: 00020 //# Internet email: aips2-request@nrao.edu. 00021 //# Postal address: AIPS++ Project Office 00022 //# National Radio Astronomy Observatory 00023 //# 520 Edgemont Road 00024 //# Charlottesville, VA 22903-2475 USA 00025 //# 00026 //#! ======================================================================== 00027 //# $Id: ChebyshevParam.h 21024 2011-03-01 11:46:18Z gervandiepen $ 00028 00029 #ifndef SCIMATH_CHEBYSHEVPARAM_H 00030 #define SCIMATH_CHEBYSHEVPARAM_H 00031 00032 #include <casa/aips.h> 00033 #include <casa/BasicSL/String.h> 00034 #include <scimath/Functionals/Function1D.h> 00035 00036 namespace casa { //# NAMESPACE CASA - BEGIN 00037 00038 //# Forward Declarations 00039 template<class T> class Vector; 00040 class RecordInterface; 00041 00042 // <summary> 00043 // Define enums for Chebyshev classes 00044 // </summary> 00045 class ChebyshevEnums 00046 { 00047 public: 00048 // Modes that identify how this function behaves outside its Chebyshev 00049 // interval (see setInterval()). 00050 enum OutOfIntervalMode { 00051 00052 // return a constant, default value. The value returned is 00053 // set with setDefault(). 00054 CONSTANT, 00055 00056 // return a constant value equal to the zero-th order coefficient 00057 ZEROTH, 00058 00059 // evaluate the polynomial based on its coefficients just as it 00060 // would be inside the interval. Thus, the function's range is not 00061 // guaranteed to remain within the characteristic bounds of the 00062 // Chebyshev interval. 00063 EXTRAPOLATE, 00064 00065 // evaluate the function as if the range is cyclic, repeating the 00066 // range values from its canonical domain. The period of the cycle 00067 // will be equal to getIntervalMax()-getIntervalMin(). When the 00068 // function is evaluated outside this interval, the input value will 00069 // shifted an integer number of periods until it falls within the 00070 // Chebyshev interval; the value returned is the polynomial evaluated 00071 // at the shifted (x-axis) value. Obviously, this mode is most 00072 // expensive computationally when evaluating outside the range. 00073 CYCLIC, 00074 00075 // evaluate the function at nearest interval edge 00076 EDGE, 00077 00078 // number of enumerators 00079 NOutOfIntervalModes }; 00080 }; 00081 00082 00083 // <summary> Parameter handling for Chebyshev polynomial parameters 00084 // </summary> 00085 00086 // <use visibility=local> 00087 00088 // <reviewed reviewer="wbrouw" date="2001/11/12" tests="tChebyshev" demos=""> 00089 // </reviewed> 00090 00091 // <prerequisite> 00092 // <li> <linkto class="FunctionParam">FunctionParam</linkto> class 00093 // <li> <linkto class="Function1D">Function1D</linkto> 00094 // <li> <linkto class="Chebyshev">Chebyshev</linkto> 00095 // </prerequisite> 00096 // 00097 // <etymology> 00098 // This class is named after Chebyshev Type I polynomials; it handles the 00099 // "fixed" parameters for the function. 00100 // </etymology> 00101 // 00102 // <synopsis> 00103 // This class assists in forming and evaluating a function as a 00104 // Chebyshev series, a linear combination of so-called Chebyshev 00105 // polynomials. Users do not instantiate this abstract class directly; 00106 // instead they instantiate the child class 00107 // <linkto class="Chebyshev">Chebyshev</linkto>. This class holds the part 00108 // of the implementation used by the 00109 // <linkto class="Chebyshev">Chebyshev</linkto> class that manages the "fixed" 00110 // parameters of the function (e.g. the polynomial coefficients, interval of 00111 // interest, etc.) 00112 // 00113 // For a full description, see the 00114 // <linkto class="Chebyshev">Chebyshev</linkto> class. 00115 // 00116 // </synopsis> 00117 // 00118 // <example> 00119 // In this example, a 2nd order Chebyshev polynomial series is 00120 // created. 00121 // <srcblock> 00122 // // set coeffs to desired values 00123 // Vector<Double> coeffs(3, 1); 00124 // 00125 // // configure the function 00126 // Chebyshev<Double> cheb; 00127 // cheb.setInterval(-0.8, 7.2); 00128 // cheb.setDefault(1.0); 00129 // cheb.setCoefficients(coeffs); 00130 // 00131 // // evaluate the function as necessary 00132 // Double z = cheb(-0.5); // -0.5 is within range, z = 0.78625 00133 // z = cheb(4.2); // 4.2 is within range, z = 0.375 00134 // z = cheb(-3); // -3 is out of the interval, z = 1 00135 // </srcblock> 00136 // </example> 00137 // 00138 // <motivation> 00139 // This class was created to support systematic errors in the simulator tool. 00140 // It can be used by Jones matrix classes to vary gains in a predictable way, 00141 // mimicing natural processes of the atmosphere or instrumental effects. 00142 // 00143 // The Chebyshev implementation is split between this class, 00144 // <src>ChebyshevParam</src> and its child 00145 // <linkto class="Chebyshev">Chebyshev</linkto> to better support the 00146 // <linkto class="AutoDiff">AutoDiff framework</linkto> for evaluating 00147 // derivatives. 00148 // </motivation> 00149 // 00150 // <templating arg=T> 00151 // <li> T should have standard numerical operators. Current 00152 // implementation only tested for real types (and their AutoDiffs). 00153 // </templating> 00154 // 00155 // <thrown> 00156 // <li> Assertion if indices out-of-range 00157 // </thrown> 00158 // 00159 // <todo asof="2001/08/22"> 00160 // <li> It would be helpful to be able to convert to and from the 00161 // Polynomial<T> type; this would be supported via a function, 00162 // Polynomial<T> polynomial(), and constructor, 00163 // Chebyshev(Polynomial<T>) 00164 // </todo> 00165 00166 template<class T> 00167 class ChebyshevParam : public Function1D<T> 00168 { 00169 public: 00170 00171 //# Constructors 00172 // create a zero-th order Chebyshev polynomial with the first coefficient 00173 // equal to zero. The bounded domain is [T(-1), T(1)]. The 00174 // OutOfDomainMode is CONSTANT, and the default value is T(0). 00175 ChebyshevParam(); 00176 00177 // create an n-th order Chebyshev polynomial with the coefficients 00178 // equal to zero. The bounded domain is [T(-1), T(1)]. The 00179 // OutOfDomainMode is CONSTANT, and the default value is T(0). 00180 explicit ChebyshevParam(const uInt n); 00181 00182 // create a zero-th order Chebyshev polynomical with the first coefficient 00183 // equal to one. 00184 // min is the minimum value of its Chebyshev interval, and 00185 // max is the maximum value. 00186 // mode sets the behavior of the function outside the Chebyshev interval 00187 // (see setOutOfIntervalMode() and OutOfIntervalMode enumeration 00188 // definition for details). 00189 // defval is the value returned when the function is evaluated outside 00190 // the Chebyshev interval and mode=CONSTANT. 00191 ChebyshevParam(const T &min, const T &max, 00192 ChebyshevEnums::OutOfIntervalMode 00193 mode=ChebyshevEnums::CONSTANT, const T &defval=T(0)); 00194 00195 // create a fully specified Chebyshev polynomial. 00196 // coeffs holds the coefficients of the Chebyshev polynomial (see 00197 // setCoefficients() for details). 00198 // min is the minimum value of its canonical range, and 00199 // max is the maximum value. 00200 // mode sets the behavior of the function outside the Chebyshev interval 00201 // (see setOutOfIntervalMode() and OutOfIntervalMode enumeration 00202 // definition for details). 00203 // defval is the value returned when the function is evaluated outside 00204 // the canonical range and mode=CONSTANT. 00205 ChebyshevParam(const Vector<T> &coeffs, const T &min, const T &max, 00206 ChebyshevEnums::OutOfIntervalMode 00207 mode=ChebyshevEnums::CONSTANT, const T &defval=T(0)); 00208 00209 // create a fully specified Chebyshev polynomial. 00210 // config is a record that contains the non-coefficient data 00211 // that configures this class. 00212 // The fields recognized by this class are those documented for the 00213 // setMode() function below. 00214 // <group> 00215 ChebyshevParam(uInt order, const RecordInterface& mode); 00216 ChebyshevParam(const Vector<T> &coeffs, const RecordInterface& mode); 00217 // </group> 00218 00219 // create a deep copy of another Chebyshev polynomial 00220 // <group> 00221 ChebyshevParam(const ChebyshevParam &other); 00222 template <class W> 00223 ChebyshevParam(const ChebyshevParam<W> &other) : 00224 Function1D<T>(other), def_p(other.getDefault()), 00225 minx_p(other.getIntervalMin()), maxx_p(other.getIntervalMax()), 00226 mode_p(other.getOutOfIntervalMode()) {} 00227 // </group> 00228 00229 // make a (deep) copy of another Chebyshev polynomial 00230 ChebyshevParam<T> &operator=(const ChebyshevParam<T> &other); 00231 00232 // Destructor 00233 virtual ~ChebyshevParam(); 00234 00235 // set the Chebyshev coefficients. 00236 // coeffs holds the coefficients in order, beginning with the zero-th 00237 // order term. The order of the polynomial, then, would be the size 00238 // of the Vector minus one. 00239 void setCoefficients(const Vector<T> &coeffs); 00240 00241 // set a particular Chebyshev coefficient. 00242 // which is the coefficient order (i.e. 0 refers to the constant offset). 00243 // value is the coefficient value. 00244 // If which is larger than current order of the function, the order will 00245 // be increased to the value of which, and that coefficient is set to 00246 // value; missing coefficients less than this value will be set to zero. 00247 // Thus, the order can be increased with this function; however, it cannot 00248 // be decreased (even if the highest order coefficient is set to zero). 00249 // To lower the order, use setCoefficients() with a Vector having the 00250 // desired number of coefficients. 00251 void setCoefficient(const uInt which, const T &value); 00252 00253 // return the current set of coefficients into a given Vector. 00254 const Vector<T> &getCoefficients() const; 00255 00256 // return a particular coefficient. 00257 // which is the coefficient order (i.e. 0 refers to the constant offset). 00258 // If which is out of range, zero is returned. 00259 T getCoefficient(const uInt which) const { 00260 return ((which < nparameters()) ? param_p[which] : T(0)); } 00261 00262 // return the number of coeefficients currently loaded. This does not 00263 // guarantee that the coefficients are non-zero 00264 uInt nCoefficients() const { return nparameters(); } 00265 00266 // set the Chebyshev interval for this function. The function will 00267 // be scaled and shifted to such that the central bounded range of the 00268 // Chebyshev polynomials ([-1, 1] in untransformed space) spans the 00269 // given range. 00270 // min is the minimum value for the interval, and 00271 // max is the maximum value. See setOutOfIntervalMode() for the behavior 00272 // of this function outside the set range. 00273 void setInterval(T xmin, T xmax) { 00274 if (xmin < xmax) { minx_p = xmin; maxx_p = xmax; 00275 } else { minx_p = xmax; maxx_p = xmin; } } 00276 00277 // return the minimum value for the currently Chebyshev interval. 00278 // See setInterval() for additional details. 00279 T getIntervalMin() const { return minx_p; } 00280 00281 // return the maximum value for the currently Chebyshev interval. 00282 // See setInterval() for additional details. 00283 T getIntervalMax() const { return maxx_p; } 00284 00285 // set the behavior of this function when it is evaluated outside its 00286 // Chebyshev interval 00287 void setOutOfIntervalMode(ChebyshevEnums::OutOfIntervalMode mode) 00288 { mode_p = mode; } 00289 00290 // return the behavior of this function when it is evaluated outside of 00291 // its Chebyshev interval. 00292 ChebyshevEnums::OutOfIntervalMode getOutOfIntervalMode() const 00293 { return mode_p; } 00294 00295 // set the default value of this function. This value is used when 00296 // the getOutOfIntervalMode() returns Chebyshev::CONSTANT; it is returned 00297 // when the a value outside of the Chebyshev interval is passed to 00298 // the () operator. 00299 void setDefault(const T &val) { def_p = val; } 00300 00301 // return the currently set default value. See setDefault() for details 00302 // on the use of this value. 00303 const T &getDefault() const { return def_p; } 00304 00305 // return the order of this polynomial. This returns the value of 00306 // nCoefficients()-1; 00307 uInt order() const { return param_p.nelements() - 1; } 00308 00309 // transform a set of Chebyshev polynomial coefficients into a set 00310 // representing the series' derivative. coeffs should be assuming 00311 // an interval of [-1, 1]. xmin and xmax can be provided to transform 00312 // the series to another interval. 00313 static void derivativeCoeffs(Vector<T> &coeffs, const T &xmin=T(-1), 00314 const T &xmax=T(1)); 00315 00316 // convert a set of Chebyshev polynomial coefficients to power series 00317 // coefficients. The values passed in coeffs are taken to 00318 // be chebyshev coefficients; these values will be replaced with the 00319 // power series coefficients. They should be ordered beginning 00320 // with the zero-th order coefficient. 00321 static void chebyshevToPower(Vector<T> &coeffs); 00322 00323 // convert a set of power series coefficients to Chebyshev 00324 // polynomial coefficients. The values passed in coeffs are taken to 00325 // be power series coefficients; these values will be replaced with the 00326 // Chebyshev polynomial coefficients. They should be ordered beginning 00327 // with the zero-th order coefficient. 00328 static void powerToChebyshev(Vector<T> &coeffs); 00329 00330 // Give name of function 00331 virtual const String &name() const { static String x("chebyshev"); 00332 return x; } 00333 00334 protected: 00335 00336 // Default value if outside interval 00337 T def_p; 00338 // Lowest interval bound 00339 T minx_p; 00340 // Highest inetrval bound 00341 T maxx_p; 00342 // Out-of-interval handling type 00343 ChebyshevEnums::OutOfIntervalMode mode_p; 00344 00345 static Vector<String> modes_s; 00346 00347 //# Make members of parent classes known. 00348 protected: 00349 using Function1D<T>::param_p; 00350 public: 00351 using Function1D<T>::nparameters; 00352 using Function1D<T>::setMode; 00353 }; 00354 00355 00356 // <summary> A ChebyshevParam with the get/setMode implementation </summary> 00357 // 00358 // <synopsis> 00359 // The get/setMode() implementation is separated from ChebyshevParam 00360 // to enable simple specialization for AutoDiff. See 00361 // <linkto class="ChebyshevParam">ChebyshevParam</linkto> for documentation 00362 // </synopsis> 00363 template <class T> 00364 class ChebyshevParamModeImpl : public ChebyshevParam<T> 00365 { 00366 public: 00367 ChebyshevParamModeImpl() : ChebyshevParam<T>() { } 00368 00369 explicit ChebyshevParamModeImpl(const uInt n) : ChebyshevParam<T>(n) {} 00370 00371 ChebyshevParamModeImpl(const T &min, const T &max, 00372 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00373 const T &defval=T(0)) 00374 : ChebyshevParam<T>(min, max, mode, defval) {} 00375 00376 ChebyshevParamModeImpl(const Vector<T> &coeffs, 00377 const T &min, const T &max, 00378 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00379 const T &defval=T(0)) 00380 : ChebyshevParam<T>(coeffs, min, max, mode, defval) {} 00381 00382 ChebyshevParamModeImpl(uInt order, const RecordInterface& mode) 00383 : ChebyshevParam<T>(order, mode) { setMode(mode); } 00384 ChebyshevParamModeImpl(const Vector<T> &coeffs, 00385 const RecordInterface& mode) 00386 : ChebyshevParam<T>(coeffs, mode) { setMode(mode); } 00387 00388 ChebyshevParamModeImpl(const ChebyshevParamModeImpl &other) 00389 : ChebyshevParam<T>(other) {} 00390 00391 // get/set the function mode. This is an alternate way to get/set the 00392 // non-coefficient data for this function. The supported record fields 00393 // are as follows: 00394 // <pre> 00395 // Field Name Type Role 00396 // ------------------------------------------------------------------- 00397 // min template type the minimum value of the Chebyshev 00398 // interval of interest 00399 // max template type the maximum value of the Chebyshev 00400 // interval of interest 00401 // intervalMode TpString the out-of-interval mode; recognized 00402 // values are "constant", "zeroth", 00403 // "extrapolate", "cyclic", and "edge". 00404 // setMode() recognizes a 00405 // case-insensitive, minimum match. 00406 // default template type the out-of-range value that is returned 00407 // when the out-of-interval mode is 00408 // "constant". 00409 // </pre> 00410 // An exception is thrown if interval mode is unrecognized. 00411 // <group> 00412 virtual void setMode(const RecordInterface& mode); 00413 virtual void getMode(RecordInterface& mode) const; 00414 // </group> 00415 00416 // return True if the implementing function supports a mode. This 00417 // implementation always returns True. 00418 virtual Bool hasMode() const; 00419 00420 //# Make members of parent classes known. 00421 protected: 00422 using ChebyshevParam<T>::modes_s; 00423 public: 00424 using ChebyshevParam<T>::setOutOfIntervalMode; 00425 using ChebyshevParam<T>::getOutOfIntervalMode; 00426 using ChebyshevParam<T>::getIntervalMin; 00427 using ChebyshevParam<T>::getIntervalMax; 00428 using ChebyshevParam<T>::getDefault; 00429 }; 00430 00431 #define ChebyshevParamModeImpl_PS ChebyshevParamModeImpl 00432 00433 // <summary> Partial specialization of ChebyshevParamModeImpl for 00434 // <src>AutoDiff</src> 00435 // </summary> 00436 // <synopsis> 00437 // <note role=warning> The name <src>ChebyshevParamModeImpl_PS</src> is only 00438 // for cxx2html limitations. 00439 // </note> 00440 // </synopsis> 00441 template <class T> 00442 class ChebyshevParamModeImpl_PS<AutoDiff<T> > 00443 : public ChebyshevParam<AutoDiff<T> > 00444 { 00445 public: 00446 ChebyshevParamModeImpl_PS() : ChebyshevParam<AutoDiff<T> >() { } 00447 00448 explicit ChebyshevParamModeImpl_PS(const uInt n) 00449 : ChebyshevParam<AutoDiff<T> >(n) {} 00450 00451 ChebyshevParamModeImpl_PS(const AutoDiff<T> &min, const AutoDiff<T> &max, 00452 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00453 const AutoDiff<T> &defval=AutoDiff<T>(0)) 00454 : ChebyshevParam<AutoDiff<T> >(min, max, mode, defval) {} 00455 00456 ChebyshevParamModeImpl_PS(const Vector<AutoDiff<T> > &coeffs, 00457 const AutoDiff<T> &min, const AutoDiff<T> &max, 00458 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00459 const AutoDiff<T> &defval=AutoDiff<T>(0)) 00460 : ChebyshevParam<AutoDiff<T> >(coeffs, min, max, mode, defval) {} 00461 00462 ChebyshevParamModeImpl_PS(uInt order, const RecordInterface& mode) 00463 : ChebyshevParam<AutoDiff<T> >(order, mode) {} 00464 ChebyshevParamModeImpl_PS(const Vector<AutoDiff<T> > &coeffs, 00465 const RecordInterface& mode) 00466 : ChebyshevParam<AutoDiff<T> >(coeffs, mode) {} 00467 00468 ChebyshevParamModeImpl_PS(const ChebyshevParamModeImpl_PS &other) 00469 : ChebyshevParam<AutoDiff<T> >(other) {} 00470 00471 virtual void setMode(const RecordInterface& mode); 00472 virtual void getMode(RecordInterface& mode) const; 00473 00474 //# Make members of parent classes known. 00475 protected: 00476 using ChebyshevParam<AutoDiff<T> >::modes_s; 00477 public: 00478 using ChebyshevParam<AutoDiff<T> >::setOutOfIntervalMode; 00479 using ChebyshevParam<AutoDiff<T> >::getOutOfIntervalMode; 00480 using ChebyshevParam<AutoDiff<T> >::getIntervalMin; 00481 using ChebyshevParam<AutoDiff<T> >::getIntervalMax; 00482 using ChebyshevParam<AutoDiff<T> >::getDefault; 00483 }; 00484 00485 00486 #define ChebyshevParamModeImpl_PSA ChebyshevParamModeImpl 00487 00488 // <summary> Partial specialization of ChebyshevParamModeImpl for 00489 // <src>AutoDiff</src> 00490 // </summary> 00491 // <synopsis> 00492 // <note role=warning> The name <src>ChebyshevParamModeImpl_PS</src> is only 00493 // for cxx2html limitations. 00494 // </note> 00495 // </synopsis> 00496 template <class T> 00497 class ChebyshevParamModeImpl_PSA<AutoDiffA<T> > 00498 : public ChebyshevParam<AutoDiffA<T> > 00499 { 00500 public: 00501 ChebyshevParamModeImpl_PSA() : ChebyshevParam<AutoDiffA<T> >() { } 00502 00503 explicit ChebyshevParamModeImpl_PSA(const uInt n) 00504 : ChebyshevParam<AutoDiffA<T> >(n) {} 00505 00506 ChebyshevParamModeImpl_PSA(const AutoDiffA<T> &min, 00507 const AutoDiffA<T> &max, 00508 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00509 const AutoDiffA<T> &defval=AutoDiffA<T>(0)) 00510 : ChebyshevParam<AutoDiffA<T> >(min, max, mode, defval) {} 00511 00512 ChebyshevParamModeImpl_PSA(const Vector<AutoDiffA<T> > &coeffs, 00513 const AutoDiffA<T> &min, 00514 const AutoDiffA<T> &max, 00515 typename ChebyshevEnums::OutOfIntervalMode mode=ChebyshevEnums::CONSTANT, 00516 const AutoDiffA<T> &defval=AutoDiffA<T>(0)) 00517 : ChebyshevParam<AutoDiffA<T> >(coeffs, min, max, mode, defval) {} 00518 00519 ChebyshevParamModeImpl_PSA(uInt order, const RecordInterface& mode) 00520 : ChebyshevParam<AutoDiffA<T> >(order, mode) {} 00521 ChebyshevParamModeImpl_PSA(const Vector<AutoDiffA<T> > &coeffs, 00522 const RecordInterface& mode) 00523 : ChebyshevParam<AutoDiffA<T> >(coeffs, mode) {} 00524 00525 ChebyshevParamModeImpl_PSA(const ChebyshevParamModeImpl_PSA &other) 00526 : ChebyshevParam<AutoDiffA<T> >(other) {} 00527 00528 virtual void setMode(const RecordInterface& mode); 00529 virtual void getMode(RecordInterface& mode) const; 00530 00531 //# Make members of parent classes known. 00532 protected: 00533 using ChebyshevParam<AutoDiffA<T> >::modes_s; 00534 public: 00535 using ChebyshevParam<AutoDiffA<T> >::setOutOfIntervalMode; 00536 using ChebyshevParam<AutoDiffA<T> >::getOutOfIntervalMode; 00537 using ChebyshevParam<AutoDiffA<T> >::getIntervalMin; 00538 using ChebyshevParam<AutoDiffA<T> >::getIntervalMax; 00539 using ChebyshevParam<AutoDiffA<T> >::getDefault; 00540 }; 00541 00542 00543 00544 00545 } //# NAMESPACE CASA - END 00546 00547 #ifndef CASACORE_NO_AUTO_TEMPLATES 00548 #include <scimath/Functionals/ChebyshevParam.tcc> 00549 #endif //# CASACORE_NO_AUTO_TEMPLATES 00550 #endif 00551 00552