diff --git a/latan/FitInterface.cpp b/latan/FitInterface.cpp new file mode 100644 index 0000000..f11dec5 --- /dev/null +++ b/latan/FitInterface.cpp @@ -0,0 +1,178 @@ +/* + * FitInterface.cpp, part of LatAnalyze 3 + * + * Copyright (C) 2013 - 2014 Antonin Portelli + * + * LatAnalyze 3 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LatAnalyze 3 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LatAnalyze 3. If not, see . + */ + +#include +#include + +using namespace std; +using namespace Latan; + +/****************************************************************************** + * FitInterface implementation * + ******************************************************************************/ +// constructors //////////////////////////////////////////////////////////////// +FitInterface::FitInterface(const Index nData, const Index xDim, + const Index yDim) +{ + resize(nData, xDim, yDim); +} + +// access ////////////////////////////////////////////////////////////////////// +void FitInterface::assumeXExact(const Index i, const bool isExact) +{ + isXExact_(i) = (isExact) ? 1 : 0; +} + +void FitInterface::assumeXXCorrelated(const Index i1, const Index i2, + const bool isCorrelated) +{ + isXXCorr_(i1, i2) = (isCorrelated) ? 1 : 0; +} + +void FitInterface::assumeYYCorrelated(const Index j1, const Index j2, + const bool isCorrelated) +{ + isYYCorr_(j1, j2) = (isCorrelated) ? 1 : 0; +} + +void FitInterface::assumeYXCorrelated(const Index j, const Index i, + const bool isCorrelated) +{ + isYXCorr_(j, i) = (isCorrelated) ? 1 : 0; +} + +void FitInterface::assumeDataCorrelated(const Index k1, const Index k2, + const bool isCorrelated) +{ + isDataCorr_(k1, k2) = (isCorrelated) ? 1 : 0; +} + +void FitInterface::fitPoint(const Index i, const bool isFitPoint) +{ + isFitPoint_(i) = (isFitPoint) ? 1 : 0; +} + +void FitInterface::fitPointRange(const Index k1, const Index k2, + const bool isFitPoint) +{ + int size = static_cast(k2-k1+1); + + isFitPoint_.segment(k1, size) = IVec::Constant(size, (isFitPoint) ? 1 : 0); +} + +void FitInterface::fitAllPoints(const bool isFitPoint) +{ + fitPointRange(0, getNData()-1, isFitPoint); +} + +Index FitInterface::getNData(void) const +{ + return isFitPoint_.size(); +} + +Index FitInterface::getNFitPoint(void) const +{ + return isFitPoint_.sum(); +} + +Index FitInterface::getXDim(void) const +{ + return isXXCorr_.rows(); +} + +Index FitInterface::getYDim(void) const +{ + return isYYCorr_.rows(); +} + +Index FitInterface::getStatXDim(void) const +{ + return isXExact_.size() - isXExact_.sum(); +} + +void FitInterface::setFitInterface(const FitInterface &fitInterface) +{ + if (&fitInterface != this) + { + resize(fitInterface.getNData(), fitInterface.getXDim(), + fitInterface.getYDim()); + isXExact_ = fitInterface.isXExact_; + isFitPoint_ = fitInterface.isFitPoint_; + isXXCorr_ = fitInterface.isXXCorr_; + isYYCorr_ = fitInterface.isYYCorr_; + isYXCorr_ = fitInterface.isYXCorr_; + isDataCorr_ = fitInterface.isDataCorr_; + } +} + +void FitInterface::setNData(const Index nData) +{ + resize(nData, getXDim(), getYDim()); +} + +void FitInterface::setXDim(const Index xDim) +{ + resize(getNData(), xDim, getYDim()); +} + +void FitInterface::setYDim(const Index yDim) +{ + resize(getNData(), getXDim(), yDim); +} + +void FitInterface::resize(const Index nData, const Index xDim, const Index yDim) +{ + isXExact_.setConstant(xDim, 0); + isFitPoint_.setConstant(nData, 0); + isXXCorr_.setIdentity(xDim, xDim); + isYYCorr_.setIdentity(xDim, xDim); + isYXCorr_.setConstant(yDim, xDim, 0); + isDataCorr_.setIdentity(nData, nData); +} + +// test //////////////////////////////////////////////////////////////////////// +bool FitInterface::isFitPoint(const Index k) const +{ + return (isFitPoint_[k] == 1); +} + +bool FitInterface::isXExact(const Index i) const +{ + return (isXExact_[i] == 1); +} + +bool FitInterface::isXXCorrelated(const Index i1, const Index i2) const +{ + return (isXXCorr_(i1, i2) == 1); +} + +bool FitInterface::isYYCorrelated(const Index j1, const Index j2) const +{ + return (isYYCorr_(j1, j2) == 1); +} + +bool FitInterface::isYXCorrelated(const Index j, const Index i) const +{ + return (isYXCorr_(j, i) == 1); +} + +bool FitInterface::isDataCorrelated(const Index k1, const Index k2) const +{ + return (isDataCorr_(k1, k2) == 1); +} diff --git a/latan/FitInterface.hpp b/latan/FitInterface.hpp new file mode 100644 index 0000000..c746c26 --- /dev/null +++ b/latan/FitInterface.hpp @@ -0,0 +1,79 @@ +/* + * FitInterface.hpp, part of LatAnalyze 3 + * + * Copyright (C) 2013 - 2014 Antonin Portelli + * + * LatAnalyze 3 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LatAnalyze 3 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LatAnalyze 3. If not, see . + */ + +#ifndef Latan_FitInterface_hpp_ +#define Latan_FitInterface_hpp_ + +#include +#include + +BEGIN_NAMESPACE + +/****************************************************************************** + * base class for data fit * + ******************************************************************************/ +class FitInterface +{ +public: + typedef Minimizer::Verbosity FitVerbosity; +public: + // constructors + FitInterface(void) = default; + FitInterface(const Index nData, const Index xDim, const Index yDim); + // destructor + virtual ~FitInterface(void) = default; + // access + void assumeXExact(const Index i, const bool isExact = true); + void assumeXXCorrelated(const Index i1, const Index i2, + const bool isCorrelated = true); + void assumeYYCorrelated(const Index j1, const Index j2, + const bool isCorrelated = true); + void assumeYXCorrelated(const Index j, const Index i, + const bool isCorrelated = true); + void assumeDataCorrelated(const Index k1, const Index k2, + const bool isCorrelated = true); + void fitPoint(const Index k, const bool isFitPoint = true); + void fitPointRange(const Index k1, const Index k2, + const bool isFitPoint = true); + void fitAllPoints(const bool isFitPoint = true); + Index getNData(void) const; + Index getNFitPoint(void) const; + Index getXDim(void) const; + Index getYDim(void) const; + Index getStatXDim(void) const; + void setFitInterface(const FitInterface &fitInterface); + void setNData(const Index nData); + void setXDim(const Index xDim); + void setYDim(const Index yDim); + void resize(const Index nData, const Index xDim, const Index yDim); + // test + bool isFitPoint(const Index k) const; + bool isXExact(const Index i) const; + bool isXXCorrelated(const Index i1, const Index i2) const; + bool isYYCorrelated(const Index j1, const Index j2) const; + bool isYXCorrelated(const Index j, const Index i) const; + bool isDataCorrelated(const Index k1, const Index k2) const; +private: + IVec isXExact_, isFitPoint_; + IMat isXXCorr_, isYYCorr_, isYXCorr_, isDataCorr_; +}; + +END_NAMESPACE + +#endif // Latan_FitInterface_hpp_ diff --git a/latan/Makefile.am b/latan/Makefile.am index ec97a26..2813509 100644 --- a/latan/Makefile.am +++ b/latan/Makefile.am @@ -35,6 +35,7 @@ liblatan_la_SOURCES = \ Global.cpp \ includes.hpp \ File.cpp \ + FitInterface.cpp \ Mat.cpp \ Math.cpp \ MathInterpreter.cpp \ @@ -53,6 +54,7 @@ liblatan_la_HEADERS = \ Chi2Function.hpp \ CompiledFunction.hpp\ Dataset.hpp \ + FitInterface.hpp \ Function.hpp \ Global.hpp \ File.hpp \ diff --git a/latan/XYStatData.cpp b/latan/XYStatData.cpp index 35b8de5..7ac54d1 100644 --- a/latan/XYStatData.cpp +++ b/latan/XYStatData.cpp @@ -32,6 +32,11 @@ double FitResult::getChi2(void) const return chi2_; } +Index FitResult::getNDof(void) const +{ + return nDof_; +} + double FitResult::getChi2PerDof(void) const { return chi2_/static_cast(nDof_); @@ -57,69 +62,6 @@ XYStatData::XYStatData(const Index nData, const Index xDim, const Index yDim) } // access ////////////////////////////////////////////////////////////////////// -void XYStatData::assumeXExact(const Index i, const bool isExact) -{ - isXExact_[i] = (isExact) ? 1 : 0; -} - -void XYStatData::fitPoint(const Index i, const bool isFitPoint) -{ - isFitPoint_[i] = (isFitPoint) ? 1 : 0; -} - -void XYStatData::fitPointRange(const Index k1, const Index k2, - const bool isFitPoint) -{ - int size = static_cast(k2-k1+1); - - isFitPoint_.segment(k1, size) = IVec::Constant(size, (isFitPoint) ? 1 : 0); -} - -void XYStatData::fitAllPoints(const bool isFitPoint) -{ - fitPointRange(0, getNData()-1, isFitPoint); -} - -Index XYStatData::getNData(void) const -{ - return x_.rows(); -} - -Index XYStatData::getNFitPoint(void) const -{ - return isFitPoint_.sum(); -} - -Index XYStatData::getXDim(void) const -{ - return x_.cols(); -} - -Index XYStatData::getYDim(void) const -{ - return y_.cols(); -} - -Index XYStatData::getStatXDim(void) const -{ - return isXExact_.size() - isXExact_.sum(); -} - -void XYStatData::setNData(const Index nData) -{ - resize(nData, getXDim(), getYDim()); -} - -void XYStatData::setXDim(const Index xDim) -{ - resize(getNData(), xDim, getYDim()); -} - -void XYStatData::setYDim(const Index yDim) -{ - resize(getNData(), getXDim(), yDim); -} - void XYStatData::resize(const Index nData, const Index xDim, const Index yDim) { x_.conservativeResize(nData, xDim); @@ -263,17 +205,6 @@ ConstBlock XYStatData::yxVar(const Index j, const Index i) const return FULL_BLOCK(var_[yx](j, i)); } -// test //////////////////////////////////////////////////////////////////////// -bool XYStatData::isFitPoint(const Index k) const -{ - return (isFitPoint_[k] == 1); -} - -bool XYStatData::isXExact(const Index i) const -{ - return (isXExact_[i] == 1); -} - // fit ///////////////////////////////////////////////////////////////////////// FitResult XYStatData::fit(const vector &modelVector, Minimizer &minimizer, const DVec &init, diff --git a/latan/XYStatData.hpp b/latan/XYStatData.hpp index e2da320..84c70a3 100644 --- a/latan/XYStatData.hpp +++ b/latan/XYStatData.hpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -44,6 +45,7 @@ public: virtual ~FitResult(void) = default; // access double getChi2(void) const; + Index getNDof(void) const; double getChi2PerDof(void) const; const DoubleFunction & getModel(const Index j = 0) const; private: @@ -64,7 +66,6 @@ public: yy = 1, yx = 2 }; - typedef Minimizer::Verbosity FitVerbosity; public: // constructors XYStatData(void); @@ -72,19 +73,6 @@ public: // destructor virtual ~XYStatData(void) = default; // access - void assumeXExact(const Index i, const bool isExact = true); - void fitPoint(const Index k, const bool isFitPoint = true); - void fitPointRange(const Index k1, const Index k2, - const bool isFitPoint = true); - void fitAllPoints(const bool isFitPoint = true); - Index getNData(void) const; - Index getNFitPoint(void) const; - Index getXDim(void) const; - Index getYDim(void) const; - Index getStatXDim(void) const; - void setNData(const Index nData); - void setXDim(const Index xDim); - void setYDim(const Index yDim); void resize(const Index nData, const Index xDim, const Index yDim); Block x(const PlaceHolder ph1, const PlaceHolder ph2); @@ -109,9 +97,6 @@ public: ConstBlock yyVar(const Index j1, const Index j2) const; Block yxVar(const Index j, const Index i); ConstBlock yxVar(const Index j, const Index i) const; - // test - bool isFitPoint(const Index k) const; - bool isXExact(const Index i) const; // fit FitResult fit(const std::vector &modelVector, Minimizer &minimizer, const DVec &init, @@ -120,6 +105,7 @@ public: FitResult fit(const DoubleModel &model, Minimizer &minimizer, const DVec &init, const bool reinitChi2 = true, const FitVerbosity verbosity = FitVerbosity::Silent); + private: DMat x_, y_; Mat var_[3];