mirror of
				https://github.com/aportelli/LatAnalyze.git
				synced 2025-10-24 21:34:48 +01:00 
			
		
		
		
	XY*Data: variadic functions for fit
This commit is contained in:
		| @@ -203,21 +203,28 @@ XYSampleData::ConstSampleBlock XYSampleData::y(const Index j, const Index k) | |||||||
| } | } | ||||||
|  |  | ||||||
| // fit ///////////////////////////////////////////////////////////////////////// | // fit ///////////////////////////////////////////////////////////////////////// | ||||||
| SampleFitResult XYSampleData::fit( | SampleFitResult XYSampleData::fit(Minimizer &minimizer, const DVec &init, | ||||||
|                     const std::vector<const DoubleModel *> &modelVector, |                             const std::vector<const DoubleModel *> &modelVector) | ||||||
|                     Minimizer &minimizer, const DVec &init, |  | ||||||
|                     const FitVerbosity verbosity) |  | ||||||
| { | { | ||||||
|     const Index     nSample = x_.size(); |     const Index     nSample = x_.size(); | ||||||
|     FitResult       sampleResult; |     FitResult       sampleResult; | ||||||
|     SampleFitResult result; |     SampleFitResult result; | ||||||
|     bool            initChi2; |     bool            initChi2; | ||||||
|      |      | ||||||
|     // sample loop |  | ||||||
|     result.resize(nSample); |     result.resize(nSample); | ||||||
|     result.chi2_.resize(nSample); |     result.chi2_.resize(nSample); | ||||||
|     FOR_STAT_ARRAY(x_, s) |     FOR_STAT_ARRAY(x_, s) | ||||||
|     { |     { | ||||||
|  |         // reinit chi^2 for central value only | ||||||
|  |         if (s == central) | ||||||
|  |         { | ||||||
|  |             data_.reinitChi2(true); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             data_.reinitChi2(false); | ||||||
|  |         } | ||||||
|  |          | ||||||
|         // set data |         // set data | ||||||
|         setDataToSample(s); |         setDataToSample(s); | ||||||
|          |          | ||||||
| @@ -225,8 +232,7 @@ SampleFitResult XYSampleData::fit( | |||||||
|         initChi2 = (s == central); |         initChi2 = (s == central); | ||||||
|          |          | ||||||
|         // fit |         // fit | ||||||
|         sampleResult = data_.fit(modelVector, minimizer, init, initChi2, |         sampleResult = data_.fit(minimizer, init, modelVector); | ||||||
|                                  verbosity); |  | ||||||
|          |          | ||||||
|         // store result |         // store result | ||||||
|         result[s]       = sampleResult; |         result[s]       = sampleResult; | ||||||
| @@ -243,18 +249,6 @@ SampleFitResult XYSampleData::fit( | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| SampleFitResult XYSampleData::fit(const DoubleModel &model, |  | ||||||
|                                   Minimizer &minimizer, |  | ||||||
|                                   const DVec &init, |  | ||||||
|                                   const FitVerbosity verbosity) |  | ||||||
| { |  | ||||||
|     vector<const DoubleModel *> modelVector(1); |  | ||||||
|      |  | ||||||
|     modelVector[0] = &model; |  | ||||||
|      |  | ||||||
|     return fit(modelVector, minimizer, init, verbosity); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void XYSampleData::setDataToSample(const Index s) | void XYSampleData::setDataToSample(const Index s) | ||||||
| { | { | ||||||
|     // compute covariance matrices if necessary |     // compute covariance matrices if necessary | ||||||
|   | |||||||
| @@ -94,12 +94,11 @@ public: | |||||||
|     SampleBlock      y(const Index i, const Index k); |     SampleBlock      y(const Index i, const Index k); | ||||||
|     ConstSampleBlock y(const Index i, const Index k) const; |     ConstSampleBlock y(const Index i, const Index k) const; | ||||||
|     // fit |     // fit | ||||||
|     SampleFitResult fit(const std::vector<const DoubleModel *> &modelVector, |     SampleFitResult fit(Minimizer &minimizer, const DVec &init, | ||||||
|                         Minimizer &minimizer, const DVec &init, |                         const std::vector<const DoubleModel *> &modelVector); | ||||||
|                         const FitVerbosity verbosity = FitVerbosity::Silent); |     template <typename... Mods> | ||||||
|     SampleFitResult fit(const DoubleModel &model, Minimizer &minimizer, |     SampleFitResult fit(Minimizer &minimizer, const DVec &init, | ||||||
|                         const DVec &init,  |                         const DoubleModel &model, const Mods... models); | ||||||
|                         const FitVerbosity verbosity = FitVerbosity::Silent); |  | ||||||
| private: | private: | ||||||
|     void setDataToSample(const Index s); |     void setDataToSample(const Index s); | ||||||
| private: | private: | ||||||
| @@ -108,6 +107,21 @@ private: | |||||||
|     XYStatData data_; |     XYStatData data_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                    XYSampleData template implementation                    * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | template <typename... Ts> | ||||||
|  | SampleFitResult XYSampleData::fit(Minimizer &minimizer, const DVec &init, | ||||||
|  |                                   const DoubleModel &model, const Ts... models) | ||||||
|  | { | ||||||
|  |     static_assert(static_or<std::is_assignable<DoubleModel &, Ts>::value...>::value, | ||||||
|  |                   "model arguments are not compatible with DoubleModel &"); | ||||||
|  |      | ||||||
|  |     std::vector<const DoubleModel *> modelVector{&model, &models...}; | ||||||
|  |      | ||||||
|  |     return fit(minimizer, init, modelVector); | ||||||
|  | } | ||||||
|  |  | ||||||
| END_NAMESPACE | END_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Latan_XYSampleData_hpp_ | #endif // Latan_XYSampleData_hpp_ | ||||||
|   | |||||||
| @@ -84,6 +84,11 @@ void XYStatData::resize(const Index nData, const Index xDim, const Index yDim) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void XYStatData::reinitChi2(const bool doReinit) | ||||||
|  | { | ||||||
|  |     reinitChi2_ = doReinit; | ||||||
|  | } | ||||||
|  |  | ||||||
| Block<DMatBase> XYStatData::x(const PlaceHolder ph1 __unused, | Block<DMatBase> XYStatData::x(const PlaceHolder ph1 __unused, | ||||||
|                               const PlaceHolder ph2 __unused) |                               const PlaceHolder ph2 __unused) | ||||||
| { | { | ||||||
| @@ -205,18 +210,15 @@ ConstBlock<DMatBase> XYStatData::yxVar(const Index j, const Index i) const | |||||||
| } | } | ||||||
|  |  | ||||||
| // fit ///////////////////////////////////////////////////////////////////////// | // fit ///////////////////////////////////////////////////////////////////////// | ||||||
| FitResult XYStatData::fit(const vector<const DoubleModel *> &modelVector, | FitResult XYStatData::fit(Minimizer &minimizer, const DVec &init, | ||||||
|                           Minimizer &minimizer, const DVec &init, |                           const vector<const DoubleModel *> &modelVector) | ||||||
|                           const bool reinitChi2, |  | ||||||
|                           const FitVerbosity verbosity) |  | ||||||
| { | { | ||||||
|     // initialization |     // initialization | ||||||
|     chi2_.setModel(modelVector); |     chi2_.setModel(modelVector); | ||||||
|     if (reinitChi2) |     if (reinitChi2_) | ||||||
|     { |     { | ||||||
|         chi2_.requestInit(); |         chi2_.requestInit(); | ||||||
|     } |     } | ||||||
|     minimizer.setVerbosity(verbosity); |  | ||||||
|      |      | ||||||
|     // initial parameters |     // initial parameters | ||||||
|     const Index nPoint = getNFitPoint(); |     const Index nPoint = getNFitPoint(); | ||||||
| @@ -251,14 +253,3 @@ FitResult XYStatData::fit(const vector<const DoubleModel *> &modelVector, | |||||||
|      |      | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| FitResult XYStatData::fit(const DoubleModel &model, Minimizer &minimizer, |  | ||||||
|                           const DVec &init, const bool reinitChi2, |  | ||||||
|                           const FitVerbosity verbosity) |  | ||||||
| { |  | ||||||
|     vector<const DoubleModel *> modelVector(1); |  | ||||||
|      |  | ||||||
|     modelVector[0] = &model; |  | ||||||
|      |  | ||||||
|     return fit(modelVector, minimizer, init, reinitChi2, verbosity); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -75,6 +75,7 @@ public: | |||||||
|     // access |     // access | ||||||
|     void                 resize(const Index nData, const Index xDim, |     void                 resize(const Index nData, const Index xDim, | ||||||
|                                 const Index yDim); |                                 const Index yDim); | ||||||
|  |     void                 reinitChi2(const bool doReinit = true); | ||||||
|     Block<DMatBase>      x(const PlaceHolder ph1 = _, |     Block<DMatBase>      x(const PlaceHolder ph1 = _, | ||||||
|                            const PlaceHolder ph2 = _); |                            const PlaceHolder ph2 = _); | ||||||
|     ConstBlock<DMatBase> x(const PlaceHolder ph1 = _, |     ConstBlock<DMatBase> x(const PlaceHolder ph1 = _, | ||||||
| @@ -102,21 +103,36 @@ public: | |||||||
|     Block<DMatBase>      yxVar(const Index j,  const Index i); |     Block<DMatBase>      yxVar(const Index j,  const Index i); | ||||||
|     ConstBlock<DMatBase> yxVar(const Index j,  const Index i) const; |     ConstBlock<DMatBase> yxVar(const Index j,  const Index i) const; | ||||||
|     // fit |     // fit | ||||||
|     FitResult fit(const std::vector<const DoubleModel *> &modelVector, |     FitResult fit(Minimizer &minimizer, const DVec &init, | ||||||
|                   Minimizer &minimizer, const DVec &init, |                   const std::vector<const DoubleModel *> &modelVector); | ||||||
|                   const bool reinitChi2 = true, |     template <typename... Ts> | ||||||
|                   const FitVerbosity verbosity = FitVerbosity::Silent); |     FitResult fit(Minimizer &minimizer, const DVec &init, | ||||||
|     FitResult fit(const DoubleModel &model, Minimizer &minimizer, |                   const DoubleModel &model, const Ts... models); | ||||||
|                   const DVec &init, const bool reinitChi2 = true, |  | ||||||
|                   const FitVerbosity verbosity = FitVerbosity::Silent); |  | ||||||
|                    |                    | ||||||
| private: | private: | ||||||
|     DMat         x_, y_; |     DMat         x_, y_; | ||||||
|     Mat<DMat>    var_[3]; |     Mat<DMat>    var_[3]; | ||||||
|     IVec         isXExact_, isFitPoint_; |     IVec         isXExact_, isFitPoint_; | ||||||
|     Chi2Function chi2_; |     Chi2Function chi2_; | ||||||
|  |     bool         reinitChi2_{true}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                     XYStatData template implementation                     * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | template <typename... Ts> | ||||||
|  | FitResult XYStatData::fit(Minimizer &minimizer, const DVec &init, | ||||||
|  |                           const DoubleModel &model, const Ts... models) | ||||||
|  | { | ||||||
|  |     static_assert(static_or<std::is_assignable<DoubleModel &, Ts>::value...>::value, | ||||||
|  |                   "model arguments are not compatible with DoubleModel &"); | ||||||
|  |      | ||||||
|  |     std::vector<const DoubleModel *> modelVector{&model, &models...}; | ||||||
|  |      | ||||||
|  |     return fit(minimizer, init, modelVector); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| END_NAMESPACE | END_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Latan_XYData_hpp_ | #endif // Latan_XYData_hpp_ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user