1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2024-11-10 00:45:36 +00:00

FitInterface (new): covariance matrix interface & layout

This commit is contained in:
Antonin Portelli 2016-03-10 18:43:53 +00:00
parent 624fb36957
commit a4b1584645
3 changed files with 261 additions and 9 deletions

View File

@ -21,14 +21,15 @@ int main(void)
f.registerDataPoint(f.dataIndex(1,1,1), 1);
f.registerDataPoint(f.dataIndex(2,2,3), 1);
f.fitPoint(false, f.dataIndex(1,1,1), 1);
f.assumeXXCorrelated(true, 0, 0, 0, 1);
f.assumeXXCorrelated(true, 1, 1, 0, 1);
f.assumeXXCorrelated(true, 2, 2, 0, 1);
f.assumeYYCorrelated(true, 0, 0, f.dataIndex(0,0,0), f.dataIndex(1,1,1));
f.assumeYYCorrelated(true, 1, 1, f.dataIndex(0,0,0), f.dataIndex(2,2,3));
f.assumeXYCorrelated(true, 0, 0, 0, f.dataIndex(1,1,1));
cout << f << endl;
DEBUG_VAR(f.getYFitSize());
DEBUG_VAR(f.getYFitSize(0));
DEBUG_VAR(f.getYFitSize(1));
DEBUG_VAR(f.getXFitSize());
DEBUG_VAR(f.getXFitSize(0));
DEBUG_VAR(f.getXFitSize(1));
DEBUG_VAR(f.getXFitSize(2));
f.updateLayout();
DEBUG_MAT(f.makeCorrFilter());
return EXIT_SUCCESS;
}

View File

@ -75,7 +75,8 @@ FitInterface::FitInterface(void)
{}
// add dimensions //////////////////////////////////////////////////////////////
void FitInterface::addXDim(const string name, const Index nData)
void FitInterface::addXDim(const string name, const Index nData,
const bool isExact)
{
if (getYSize() != 0)
{
@ -86,6 +87,7 @@ void FitInterface::addXDim(const string name, const Index nData)
{
xDimName_.push_back(name);
xSize_.push_back(nData);
xIsExact_.push_back(isExact);
xDimIndex_[name] = xDimName_.size();
maxDataIndex_ *= nData;
updateDataSize();
@ -248,6 +250,70 @@ void FitInterface::fitPoint(const bool isFitPoint, const Index k, const Index j)
yDataIndex_[j][k] = isFitPoint;
}
// variance interface //////////////////////////////////////////////////////////
void FitInterface::assumeXExact(const bool isExact, const Index i)
{
checkXDim(i);
xIsExact_[i] = isExact;
}
void FitInterface::addCorr(set<array<Index, 4>> &s, const bool isCorr,
const array<Index, 4> &c)
{
if (isCorr)
{
s.insert(c);
}
else
{
auto it = s.find(c);
if (it != s.end())
{
s.erase(it);
}
}
}
void FitInterface::assumeXXCorrelated(const bool isCorr, const Index i1,
const Index i2, const Index vi1,
const Index vi2)
{
array<Index, 4> c{{i1, i2, vi1, vi2}};
checkXIndex(vi1, i1);
checkXIndex(vi2, i2);
if ((i1 != i2) or (vi1 != vi2))
{
addCorr(xxCorr_, isCorr, c);
}
}
void FitInterface::assumeYYCorrelated(const bool isCorr, const Index j1,
const Index j2, const Index k1,
const Index k2)
{
array<Index, 4> c{{j1, j2, k1, k2}};
checkPoint(k1, j1);
checkPoint(k2, j2);
if ((j1 != j2) or (k1 != k2))
{
addCorr(yyCorr_, isCorr, c);
}
}
void FitInterface::assumeXYCorrelated(const bool isCorr, const Index i,
const Index j, const Index vi,
const Index k)
{
array<Index, 4> c{{i, j, vi, k}};
checkXIndex(vi, i);
checkPoint(k, j);
addCorr(xyCorr_, isCorr, c);
}
// tests ///////////////////////////////////////////////////////////////////////
bool FitInterface::isXUsed(const Index k) const
{
@ -282,6 +348,108 @@ void FitInterface::registerDataPoint(const Index k, const Index j)
yDataIndex_[j][k] = true;
}
// global layout management ////////////////////////////////////////////////////
void FitInterface::updateLayout(void)
{
Index size;
layout_.totalSize = 0;
layout_.totalXSize = 0;
layout_.totalYSize = 0;
layout_.xSize.clear();
layout_.ySize.clear();
layout_.dataIndex.clear();
layout_.xTrans.clear();
layout_.dataTrans.clear();
for (Index i = 0; i < getNXDim(); ++i)
{
if (!xIsExact_[i])
{
size = getXFitSize(i);
layout_.xSize.push_back(size);
layout_.totalXSize += size;
layout_.xTrans[i] = static_cast<Index>(layout_.xSize.size() - 1);
}
}
for (Index j = 0; j < getNYDim(); ++j)
{
size = getYFitSize(j);
layout_.ySize.push_back(size);
layout_.totalYSize += size;
}
layout_.totalSize = layout_.totalXSize + layout_.totalYSize;
layout_.dataIndex.resize(layout_.ySize.size());
for (Index j = 0; j < getNYDim(); ++j)
{
for (auto &p: yDataIndex_[j])
{
if (p.second)
{
layout_.dataIndex[j].push_back(p.first);
layout_.dataTrans[p.first] = layout_.dataIndex[j].size() - 1;
}
}
}
}
// WARNING: NO INDEX CHECKS IN INDEXING FUNCTIONS
Index FitInterface::indX(const Index vi, const Index i) const
{
Index ind, iTrans;
iTrans = layout_.xTrans.at(i);
ind = layout_.totalYSize;
for (Index a = 0; a < iTrans; ++a)
{
ind += layout_.xSize[a];
}
ind += vi;
return ind;
}
Index FitInterface::indY(const Index k, const Index j) const
{
Index ind = 0;
for (Index a = 0; a < j; ++a)
{
ind += layout_.ySize[a];
}
ind += layout_.dataTrans.at(k);
return ind;
}
DMat FitInterface::makeCorrFilter(void) const
{
DMat f = DMat::Identity(layout_.totalSize, layout_.totalSize);
for (auto &c: xxCorr_)
{
f(indX(c[2], c[0]), indX(c[3], c[1])) = 1.;
f(indX(c[3], c[1]), indX(c[2], c[0])) = 1.;
}
for (auto &c: yyCorr_)
{
if (isFitPoint(c[2], c[0]) and isFitPoint(c[3], c[1]))
{
f(indY(c[2], c[0]), indY(c[3], c[1])) = 1.;
f(indY(c[3], c[1]), indY(c[2], c[0])) = 1.;
}
}
for (auto &c: xyCorr_)
{
if (isFitPoint(c[3], c[1]))
{
f(indX(c[2], c[0]), indY(c[3], c[1])) = 1.;
f(indY(c[3], c[1]), indX(c[2], c[0])) = 1.;
}
}
return f;
}
// IO //////////////////////////////////////////////////////////////////////////
ostream & Latan::operator<<(ostream &out, FitInterface &f)
{
@ -306,6 +474,60 @@ ostream & Latan::operator<<(ostream &out, FitInterface &f)
out << "\b) fit: " << (p.second ? "true" : "false") << endl;
}
}
out << "X/X correlations (i1 i2 vi1 vi2): ";
if (f.xxCorr_.empty())
{
out << "no" << endl;
}
else
{
out << endl;
for (auto &c: f.xxCorr_)
{
out << " * ";
for (auto i: c)
{
out << i << " ";
}
out << endl;
}
}
out << "Y/Y correlations (j1 j2 k1 k2): ";
if (f.yyCorr_.empty())
{
out << "no" << endl;
}
else
{
out << endl;
for (auto &c: f.yyCorr_)
{
out << " * ";
for (auto i: c)
{
out << i << " ";
}
out << endl;
}
}
out << "X/Y correlations (i j vi k): ";
if (f.xyCorr_.empty())
{
out << "no";
}
else
{
out << endl;
for (auto &c: f.xyCorr_)
{
out << " * ";
for (auto i: c)
{
out << i << " ";
}
out << endl;
}
}
return out;
}

View File

@ -21,6 +21,7 @@
#define Latan_FitInterface_hpp_
#include <LatAnalyze/Global.hpp>
#include <LatAnalyze/Mat.hpp>
BEGIN_LATAN_NAMESPACE
@ -29,13 +30,22 @@ BEGIN_LATAN_NAMESPACE
******************************************************************************/
class FitInterface
{
private:
typedef struct
{
Index totalSize, totalXSize, totalYSize;
std::vector<Index> xSize, ySize;
std::vector<std::vector<Index>> dataIndex;
std::map<Index, Index> xTrans, dataTrans;
} Layout;
public:
// constructor
FitInterface(void);
// destructor
virtual ~FitInterface(void) = default;
// add dimensions
void addXDim(const std::string name, const Index nData);
void addXDim(const std::string name, const Index nData,
const bool isExact = false);
void addYDim(const std::string name);
// size access
Index getNXDim(void) const;
@ -55,6 +65,14 @@ public:
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
void assumeXExact(const bool isExact, const Index i);
void assumeXXCorrelated(const bool isCorr, const Index i1, const Index i2,
const Index vi1, const Index vi2);
void assumeYYCorrelated(const bool isCorr, const Index j1, const Index j2,
const Index k1, const Index k2);
void assumeXYCorrelated(const bool isCorr, const Index i, const Index j,
const Index vi, const Index k);
// tests
bool isXUsed(const Index k) const;
bool isXUsed(const Index k, const Index j) const;
@ -65,14 +83,25 @@ protected:
public:
// register a data point
void registerDataPoint(const Index k, const Index j = 0);
// add correlation to a set
static void addCorr(std::set<std::array<Index, 4>> &s, const bool isCorr,
const std::array<Index, 4> &c);
// abstract method to update data container size
virtual void updateDataSize(void) {};
// global layout management
void updateLayout(void);
Index indX(const Index vi, const Index i) const;
Index indY(const Index k, const Index j) const;
DMat makeCorrFilter(void) const;
private:
std::vector<std::string> xDimName_, yDimName_;
std::map<std::string, Index> xDimIndex_, yDimIndex_;
std::vector<Index> xSize_;
std::vector<bool> xIsExact_;
std::vector<std::map<Index, bool>> yDataIndex_;
std::set<std::array<Index, 4>> xxCorr_, yyCorr_, xyCorr_;
Index maxDataIndex_{1};
Layout layout_;
};
std::ostream & operator<<(std::ostream &out, FitInterface &f);