mirror of
				https://github.com/aportelli/LatAnalyze.git
				synced 2025-11-04 08:04:32 +00:00 
			
		
		
		
	fit: coordinate buffering forced to be const
This commit is contained in:
		@@ -122,7 +122,7 @@ Index FitInterface::getYSize(const Index j) const
 | 
			
		||||
    return static_cast<Index>(yDataIndex_[j].size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Index FitInterface::getXFitSize(void)
 | 
			
		||||
Index FitInterface::getXFitSize(void) const
 | 
			
		||||
{
 | 
			
		||||
    Index size = 0;
 | 
			
		||||
    
 | 
			
		||||
@@ -134,7 +134,7 @@ Index FitInterface::getXFitSize(void)
 | 
			
		||||
    return size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Index FitInterface::getXFitSize(const Index i)
 | 
			
		||||
Index FitInterface::getXFitSize(const Index i) const
 | 
			
		||||
{
 | 
			
		||||
    set<Index>    fitCoord;
 | 
			
		||||
    vector<Index> v;
 | 
			
		||||
@@ -227,7 +227,7 @@ Index FitInterface::dataIndex(const vector<Index> &v) const
 | 
			
		||||
    return k;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const vector<Index> & FitInterface::dataCoord(const Index k)
 | 
			
		||||
const vector<Index> & FitInterface::dataCoord(const Index k) const
 | 
			
		||||
{
 | 
			
		||||
    checkDataIndex(k);
 | 
			
		||||
    
 | 
			
		||||
@@ -370,7 +370,7 @@ bool FitInterface::isXExact(const Index i) const
 | 
			
		||||
    return xIsExact_[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool FitInterface::isXUsed(const Index r, const Index i, const bool inFit)
 | 
			
		||||
bool FitInterface::isXUsed(const Index r, const Index i, const bool inFit) const
 | 
			
		||||
{
 | 
			
		||||
    vector<Index> v;
 | 
			
		||||
    
 | 
			
		||||
@@ -463,16 +463,18 @@ void FitInterface::scheduleDataCoordInit(void)
 | 
			
		||||
    initDataCoord_ = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FitInterface::updateDataCoord(void)
 | 
			
		||||
void FitInterface::updateDataCoord(void) const
 | 
			
		||||
{
 | 
			
		||||
    FitInterface * modThis = const_cast<FitInterface *>(this);
 | 
			
		||||
    
 | 
			
		||||
    if (initDataCoord_)
 | 
			
		||||
    {
 | 
			
		||||
        dataCoord_.clear();
 | 
			
		||||
        modThis->dataCoord_.clear();
 | 
			
		||||
        for (auto k: getDataIndexSet())
 | 
			
		||||
        {
 | 
			
		||||
            dataCoord_[k] = rowMajToCoord(k);
 | 
			
		||||
            modThis->dataCoord_[k] = rowMajToCoord(k);
 | 
			
		||||
        }
 | 
			
		||||
        initDataCoord_ = false;
 | 
			
		||||
        modThis->initDataCoord_ = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -483,68 +485,70 @@ void FitInterface::scheduleLayoutInit(void)
 | 
			
		||||
    scheduleFitVarMatInit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool FitInterface::initVarMat(void)
 | 
			
		||||
bool FitInterface::initVarMat(void) const
 | 
			
		||||
{
 | 
			
		||||
    return initVarMat_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FitInterface::updateLayout(void)
 | 
			
		||||
void FitInterface::updateLayout(void) const
 | 
			
		||||
{
 | 
			
		||||
    if (initLayout_)
 | 
			
		||||
    {
 | 
			
		||||
        Index         size, ifit;
 | 
			
		||||
        vector<Index> v;
 | 
			
		||||
        FitInterface * modThis = const_cast<FitInterface *>(this);
 | 
			
		||||
        Layout &       l = modThis->layout;
 | 
			
		||||
        Index          size, ifit;
 | 
			
		||||
        vector<Index>  v;
 | 
			
		||||
        
 | 
			
		||||
        layout.nXFitDim   = 0;
 | 
			
		||||
        layout.nYFitDim   = 0;
 | 
			
		||||
        layout.totalSize  = 0;
 | 
			
		||||
        layout.totalXSize = 0;
 | 
			
		||||
        layout.totalYSize = 0;
 | 
			
		||||
        layout.xSize.clear();
 | 
			
		||||
        layout.ySize.clear();
 | 
			
		||||
        layout.dataIndexSet.clear();
 | 
			
		||||
        layout.xDim.clear();
 | 
			
		||||
        layout.yDim.clear();
 | 
			
		||||
        layout.xFitDim.clear();
 | 
			
		||||
        layout.yFitDim.clear();
 | 
			
		||||
        layout.x.clear();
 | 
			
		||||
        layout.y.clear();
 | 
			
		||||
        layout.xFit.clear();
 | 
			
		||||
        layout.yFit.clear();
 | 
			
		||||
        l.nXFitDim   = 0;
 | 
			
		||||
        l.nYFitDim   = 0;
 | 
			
		||||
        l.totalSize  = 0;
 | 
			
		||||
        l.totalXSize = 0;
 | 
			
		||||
        l.totalYSize = 0;
 | 
			
		||||
        l.xSize.clear();
 | 
			
		||||
        l.ySize.clear();
 | 
			
		||||
        l.dataIndexSet.clear();
 | 
			
		||||
        l.xDim.clear();
 | 
			
		||||
        l.yDim.clear();
 | 
			
		||||
        l.xFitDim.clear();
 | 
			
		||||
        l.yFitDim.clear();
 | 
			
		||||
        l.x.clear();
 | 
			
		||||
        l.y.clear();
 | 
			
		||||
        l.xFit.clear();
 | 
			
		||||
        l.yFit.clear();
 | 
			
		||||
        ifit = 0;
 | 
			
		||||
        for (Index i = 0; i < getNXDim(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            if (!xIsExact_[i])
 | 
			
		||||
            {
 | 
			
		||||
                layout.nXFitDim++;
 | 
			
		||||
                l.nXFitDim++;
 | 
			
		||||
                size = getXFitSize(i);
 | 
			
		||||
                layout.xSize.push_back(size);
 | 
			
		||||
                layout.totalXSize += size;
 | 
			
		||||
                layout.xDim.push_back(i);
 | 
			
		||||
                layout.xFitDim.push_back(layout.xDim.size() - 1);
 | 
			
		||||
                layout.x.push_back(vector<Index>());
 | 
			
		||||
                layout.xFit.push_back(vector<Index>());
 | 
			
		||||
                l.xSize.push_back(size);
 | 
			
		||||
                l.totalXSize += size;
 | 
			
		||||
                l.xDim.push_back(i);
 | 
			
		||||
                l.xFitDim.push_back(layout.xDim.size() - 1);
 | 
			
		||||
                l.x.push_back(vector<Index>());
 | 
			
		||||
                l.xFit.push_back(vector<Index>());
 | 
			
		||||
                for (Index r = 0; r < getXSize(i); ++r)
 | 
			
		||||
                {
 | 
			
		||||
                    if (isXUsed(r, i))
 | 
			
		||||
                    {
 | 
			
		||||
                        layout.x[ifit].push_back(r);
 | 
			
		||||
                        layout.xFit[i].push_back(layout.x[ifit].size() - 1);
 | 
			
		||||
                        l.x[ifit].push_back(r);
 | 
			
		||||
                        l.xFit[i].push_back(layout.x[ifit].size() - 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        layout.xFit[i].push_back(-1);
 | 
			
		||||
                        l.xFit[i].push_back(-1);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                ifit++;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                layout.xFitDim.push_back(-1);
 | 
			
		||||
                layout.xFit.push_back(vector<Index>());
 | 
			
		||||
                l.xFitDim.push_back(-1);
 | 
			
		||||
                l.xFit.push_back(vector<Index>());
 | 
			
		||||
                for (Index r = 0; r < getXSize(i); ++r)
 | 
			
		||||
                {
 | 
			
		||||
                    layout.xFit[i].push_back(-1);
 | 
			
		||||
                    l.xFit[i].push_back(-1);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -552,46 +556,46 @@ void FitInterface::updateLayout(void)
 | 
			
		||||
        {
 | 
			
		||||
            Index s = 0;
 | 
			
		||||
            
 | 
			
		||||
            layout.nYFitDim++;
 | 
			
		||||
            l.nYFitDim++;
 | 
			
		||||
            size = getYFitSize(j);
 | 
			
		||||
            layout.ySize.push_back(size);
 | 
			
		||||
            layout.totalYSize += size;
 | 
			
		||||
            layout.yDim.push_back(j);
 | 
			
		||||
            layout.yFitDim.push_back(layout.yDim.size() - 1);
 | 
			
		||||
            layout.y.push_back(vector<Index>());
 | 
			
		||||
            layout.yFit.push_back(vector<Index>());
 | 
			
		||||
            layout.data.push_back(vector<Index>());
 | 
			
		||||
            layout.yFitFromData.push_back(map<Index, Index>());
 | 
			
		||||
            l.ySize.push_back(size);
 | 
			
		||||
            l.totalYSize += size;
 | 
			
		||||
            l.yDim.push_back(j);
 | 
			
		||||
            l.yFitDim.push_back(layout.yDim.size() - 1);
 | 
			
		||||
            l.y.push_back(vector<Index>());
 | 
			
		||||
            l.yFit.push_back(vector<Index>());
 | 
			
		||||
            l.data.push_back(vector<Index>());
 | 
			
		||||
            l.yFitFromData.push_back(map<Index, Index>());
 | 
			
		||||
            for (auto &p: yDataIndex_[j])
 | 
			
		||||
            {
 | 
			
		||||
                if (p.second)
 | 
			
		||||
                {
 | 
			
		||||
                    layout.dataIndexSet.insert(p.first);
 | 
			
		||||
                    layout.y[j].push_back(s);
 | 
			
		||||
                    layout.yFit[j].push_back(layout.y[j].size() - 1);
 | 
			
		||||
                    layout.data[j].push_back(p.first);
 | 
			
		||||
                    layout.yFitFromData[j][p.first] = layout.y[j].size() - 1;
 | 
			
		||||
                    l.dataIndexSet.insert(p.first);
 | 
			
		||||
                    l.y[j].push_back(s);
 | 
			
		||||
                    l.yFit[j].push_back(layout.y[j].size() - 1);
 | 
			
		||||
                    l.data[j].push_back(p.first);
 | 
			
		||||
                    l.yFitFromData[j][p.first] = layout.y[j].size() - 1;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    layout.yFit[j].push_back(-1);
 | 
			
		||||
                    layout.yFitFromData[j][p.first] = -1;
 | 
			
		||||
                    l.yFit[j].push_back(-1);
 | 
			
		||||
                    l.yFitFromData[j][p.first] = -1;
 | 
			
		||||
                }
 | 
			
		||||
                s++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        layout.totalSize = layout.totalXSize + layout.totalYSize;
 | 
			
		||||
        layout.nXFitDim  = static_cast<Index>(layout.xSize.size());
 | 
			
		||||
        layout.nYFitDim  = static_cast<Index>(layout.ySize.size());
 | 
			
		||||
        l.totalSize = layout.totalXSize + layout.totalYSize;
 | 
			
		||||
        l.nXFitDim  = static_cast<Index>(layout.xSize.size());
 | 
			
		||||
        l.nYFitDim  = static_cast<Index>(layout.ySize.size());
 | 
			
		||||
        for (Index k: layout.dataIndexSet)
 | 
			
		||||
        {
 | 
			
		||||
            v = dataCoord(k);
 | 
			
		||||
            for (Index i = 0; i < getNXDim(); ++i)
 | 
			
		||||
            {
 | 
			
		||||
                layout.xIndFromData[k].push_back(indX(v[i], i));
 | 
			
		||||
                l.xIndFromData[k].push_back(indX(v[i], i));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        initLayout_ = false;
 | 
			
		||||
        modThis->initLayout_ = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -71,8 +71,8 @@ public:
 | 
			
		||||
          Index             getXSize(const Index i) const;
 | 
			
		||||
          Index             getYSize(void) const;
 | 
			
		||||
          Index             getYSize(const Index j) const;
 | 
			
		||||
          Index             getXFitSize(void);
 | 
			
		||||
          Index             getXFitSize(const Index i);
 | 
			
		||||
          Index             getXFitSize(void) const;
 | 
			
		||||
          Index             getXFitSize(const Index i) const;
 | 
			
		||||
          Index             getYFitSize(void) const;
 | 
			
		||||
          Index             getYFitSize(const Index j) const;
 | 
			
		||||
          Index             getMaxDataIndex(void) const;
 | 
			
		||||
@@ -81,11 +81,12 @@ public:
 | 
			
		||||
    const VarName &         xName(void) const;
 | 
			
		||||
          VarName &         yName(void);
 | 
			
		||||
    const VarName &         yName(void) const;
 | 
			
		||||
    
 | 
			
		||||
    // Y dimension index helper
 | 
			
		||||
    template <typename... Ts>
 | 
			
		||||
    Index                      dataIndex(const Ts... is) const;
 | 
			
		||||
    Index                      dataIndex(const std::vector<Index> &v) const;
 | 
			
		||||
    const std::vector<Index> & dataCoord(const Index k);
 | 
			
		||||
    const std::vector<Index> & dataCoord(const Index k) const;
 | 
			
		||||
    // enable fit points
 | 
			
		||||
    void fitPoint(const bool isFitPoint, const Index k, const Index j = 0);
 | 
			
		||||
    // variance interface
 | 
			
		||||
@@ -103,7 +104,7 @@ public:
 | 
			
		||||
    bool pointExists(const Index k) const;
 | 
			
		||||
    bool pointExists(const Index k, const Index j) const;
 | 
			
		||||
    bool isXExact(const Index i) const;
 | 
			
		||||
    bool isXUsed(const Index r, const Index i, const bool inFit = true);
 | 
			
		||||
    bool isXUsed(const Index r, const Index i, const bool inFit = true) const;
 | 
			
		||||
    bool isFitPoint(const Index k, const Index j) const;
 | 
			
		||||
    // make correlation filter for fit variance matrix
 | 
			
		||||
    DMat makeCorrFilter(void);
 | 
			
		||||
@@ -122,11 +123,11 @@ protected:
 | 
			
		||||
    virtual void createYData(const std::string name) = 0;
 | 
			
		||||
    // coordinate buffering
 | 
			
		||||
    void scheduleDataCoordInit(void);
 | 
			
		||||
    void updateDataCoord(void);
 | 
			
		||||
    void updateDataCoord(void) const;
 | 
			
		||||
    // global layout management
 | 
			
		||||
    void  scheduleLayoutInit(void);
 | 
			
		||||
    bool  initVarMat(void);
 | 
			
		||||
    void  updateLayout(void);
 | 
			
		||||
    bool  initVarMat(void) const;
 | 
			
		||||
    void  updateLayout(void) const;
 | 
			
		||||
    Index indX(const Index r, const Index i) const;
 | 
			
		||||
    Index indY(const Index k, const Index j) const;
 | 
			
		||||
private:
 | 
			
		||||
@@ -143,7 +144,8 @@ private:
 | 
			
		||||
    std::vector<std::map<Index, bool>>  yDataIndex_;
 | 
			
		||||
    std::set<std::array<Index, 4>>      xxCorr_, yyCorr_, xyCorr_;
 | 
			
		||||
    Index                               maxDataIndex_{1};
 | 
			
		||||
    bool                                initLayout_{true}, initVarMat_{true};
 | 
			
		||||
    bool                                initLayout_{true};
 | 
			
		||||
    bool                                initVarMat_{true};
 | 
			
		||||
    bool                                initDataCoord_{true};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -167,7 +167,7 @@ PlotData::PlotData(const DMatSample &x, const DVec &y)
 | 
			
		||||
    setCommand("'" + tmpFileName + "' u 1:3:2 w xerr");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PlotData::PlotData(XYStatData &data, const Index i, const Index j)
 | 
			
		||||
PlotData::PlotData(const XYStatData &data, const Index i, const Index j)
 | 
			
		||||
{
 | 
			
		||||
    string usingCmd, tmpFileName;
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ public:
 | 
			
		||||
    PlotData(const DMatSample &x, const DMatSample &y);
 | 
			
		||||
    PlotData(const DVec       &x, const DMatSample &y);
 | 
			
		||||
    PlotData(const DMatSample &x, const DVec       &y);
 | 
			
		||||
    PlotData(XYStatData &data, const Index i = 0, const Index j = 0);
 | 
			
		||||
    PlotData(const XYStatData &data, const Index i = 0, const Index j = 0);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~PlotData(void) = default;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ const double & XYStatData::x(const Index r, const Index i) const
 | 
			
		||||
    return xData_[i](r);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const DVec & XYStatData::x(const Index k)
 | 
			
		||||
const DVec & XYStatData::x(const Index k) const
 | 
			
		||||
{
 | 
			
		||||
    checkDataIndex(k);
 | 
			
		||||
    
 | 
			
		||||
@@ -215,7 +215,7 @@ DVec XYStatData::getYError(const Index j) const
 | 
			
		||||
    return yyVar_(j, j).diagonal().cwiseSqrt();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DMat XYStatData::getTable(const Index i, const Index j)
 | 
			
		||||
DMat XYStatData::getTable(const Index i, const Index j) const
 | 
			
		||||
{
 | 
			
		||||
    checkXDim(i);
 | 
			
		||||
    checkYDim(j);
 | 
			
		||||
@@ -510,26 +510,28 @@ void XYStatData::updateFitVarMat(void)
 | 
			
		||||
        chi2ModVec_.resize(layout.totalSize);
 | 
			
		||||
        chi2Vec_.resize(layout.totalSize);
 | 
			
		||||
        fitVar_    = fitVar_.cwiseProduct(makeCorrFilter());
 | 
			
		||||
        fitVarInv_ = fitVar_.pInverse();
 | 
			
		||||
        fitVarInv_ = fitVar_.pInverse(getSvdTolerance());
 | 
			
		||||
        scheduleFitVarMatInit(false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// buffer list of x vectors ////////////////////////////////////////////////////
 | 
			
		||||
void XYStatData::updateXMap(void)
 | 
			
		||||
void XYStatData::updateXMap(void) const
 | 
			
		||||
{
 | 
			
		||||
    if (initXMap_)
 | 
			
		||||
    {
 | 
			
		||||
        xMap_.clear();
 | 
			
		||||
        XYStatData * modThis = const_cast<XYStatData *>(this);
 | 
			
		||||
        
 | 
			
		||||
        modThis->xMap_.clear();
 | 
			
		||||
        for (auto k: getDataIndexSet())
 | 
			
		||||
        {
 | 
			
		||||
            xMap_[k]      = DVec(getNXDim());
 | 
			
		||||
            modThis->xMap_[k] = DVec(getNXDim());
 | 
			
		||||
            for (Index i = 0; i < getNXDim(); ++i)
 | 
			
		||||
            {
 | 
			
		||||
                xMap_[k](i) = xData_[i](dataCoord(k)[i]);
 | 
			
		||||
                modThis->xMap_[k](i) = xData_[i](dataCoord(k)[i]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        initXMap_ = false;
 | 
			
		||||
        modThis->initXMap_ = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -69,11 +69,11 @@ public:
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~XYStatData(void) = default;
 | 
			
		||||
    // data access
 | 
			
		||||
    double &       x(const Index r, const Index);
 | 
			
		||||
    const double & x(const Index r, const Index) const;
 | 
			
		||||
    const DVec &   x(const Index k);
 | 
			
		||||
    double &       y(const Index k, const Index);
 | 
			
		||||
    const double & y(const Index k, const Index) const;
 | 
			
		||||
    double &       x(const Index r, const Index i);
 | 
			
		||||
    const double & x(const Index r, const Index i) const;
 | 
			
		||||
    const DVec &   x(const Index k) const;
 | 
			
		||||
    double &       y(const Index k, const Index j);
 | 
			
		||||
    const double & y(const Index k, const Index j) const;
 | 
			
		||||
    void           setXXVar(const Index i1, const Index i2, const DMat &m);
 | 
			
		||||
    void           setYYVar(const Index j1, const Index j2, const DMat &m);
 | 
			
		||||
    void           setXYVar(const Index i, const Index j, const DMat &m);
 | 
			
		||||
@@ -84,7 +84,7 @@ public:
 | 
			
		||||
    const DMat &   getXYVar(const Index i, const Index j) const;
 | 
			
		||||
    DVec           getXError(const Index i) const;
 | 
			
		||||
    DVec           getYError(const Index j) const;
 | 
			
		||||
    DMat           getTable(const Index i, const Index j);
 | 
			
		||||
    DMat           getTable(const Index i, const Index j) const;
 | 
			
		||||
    // get total fit variance matrix and its pseudo-inverse
 | 
			
		||||
    const DMat & getFitVarMat(void);
 | 
			
		||||
    const DMat & getFitVarMatPInv(void);
 | 
			
		||||
@@ -115,7 +115,7 @@ private:
 | 
			
		||||
    // buffer total fit variance matrix
 | 
			
		||||
    void updateFitVarMat(void);
 | 
			
		||||
    // buffer list of x vectors
 | 
			
		||||
    void updateXMap(void);
 | 
			
		||||
    void updateXMap(void) const;
 | 
			
		||||
    // buffer chi^2 vectors
 | 
			
		||||
    void updateChi2DataVec(void);
 | 
			
		||||
    void updateChi2ModVec(const DVec p,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user