From 789ea6abe9cbf3398e1a3af544a6a5f1a74d305a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 12 Mar 2014 19:23:22 +0000 Subject: [PATCH] sample type (and specialisations) dispatched in different files --- latan/AsciiFile.hpp | 2 +- latan/AsciiLexer.lpp | 2 +- latan/AsciiParser.ypp | 6 +- latan/Dataset.hpp | 2 +- latan/Makefile.am | 6 +- latan/MatSample.cpp | 117 +++++++++++++++++++++++++++ latan/MatSample.hpp | 181 ++++++++++++++++++++++++++++++++++++++++++ latan/StatArray.hpp | 10 +++ 8 files changed, 317 insertions(+), 9 deletions(-) create mode 100644 latan/MatSample.cpp create mode 100644 latan/MatSample.hpp diff --git a/latan/AsciiFile.hpp b/latan/AsciiFile.hpp index e419351..5085a27 100644 --- a/latan/AsciiFile.hpp +++ b/latan/AsciiFile.hpp @@ -23,8 +23,8 @@ #include #include #include +#include #include -#include #include BEGIN_NAMESPACE diff --git a/latan/AsciiLexer.lpp b/latan/AsciiLexer.lpp index ae34eff..adae707 100644 --- a/latan/AsciiLexer.lpp +++ b/latan/AsciiLexer.lpp @@ -27,7 +27,7 @@ %{ #include #include - #include + #include #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/latan/AsciiParser.ypp b/latan/AsciiParser.ypp index 3803564..a53dd96 100644 --- a/latan/AsciiParser.ypp +++ b/latan/AsciiParser.ypp @@ -21,8 +21,8 @@ #include #include #include + #include #include - #include #include #include #include @@ -134,9 +134,9 @@ mat: sample: OPEN SAMPLE ID INT mats CLOSE SAMPLE { - const unsigned int nSample = $INT + 1; + const unsigned int nSample = $INT; - if (state->dMatQueue.size() != nSample) + if (state->dMatQueue.size() != nSample + DMatSample::offset) { LATAN_ERROR(Size, "sample '" + *state->streamName + ":" + $ID + "' has a wrong size"); diff --git a/latan/Dataset.hpp b/latan/Dataset.hpp index 5086504..0ae980b 100644 --- a/latan/Dataset.hpp +++ b/latan/Dataset.hpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include diff --git a/latan/Makefile.am b/latan/Makefile.am index 2813509..ce5574e 100644 --- a/latan/Makefile.am +++ b/latan/Makefile.am @@ -41,11 +41,11 @@ liblatan_la_SOURCES = \ MathInterpreter.cpp \ MathParser.ypp \ MathLexer.lpp \ + MatSample.cpp \ Minimizer.cpp \ Model.cpp \ Plot.cpp \ RandGen.cpp \ - Sample.cpp \ XYStatData.cpp \ ../config.h liblatan_ladir = $(pkgincludedir) @@ -62,13 +62,13 @@ liblatan_la_HEADERS = \ Mat.hpp \ Math.hpp \ MathInterpreter.hpp \ + MatSample.hpp \ Minimizer.hpp \ Model.hpp \ ParserState.hpp \ Plot.hpp \ RandGen.hpp \ - Sample.hpp \ - StatArray.hpp \ + StatArray.hpp XYStatData.hpp if HAVE_MINUIT liblatan_la_SOURCES += MinuitMinimizer.cpp diff --git a/latan/MatSample.cpp b/latan/MatSample.cpp new file mode 100644 index 0000000..09307a1 --- /dev/null +++ b/latan/MatSample.cpp @@ -0,0 +1,117 @@ +/* + * MatSample.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; + +/****************************************************************************** + * DMatSample implementation * + ******************************************************************************/ +// constructors //////////////////////////////////////////////////////////////// +DMatSample::DMatSample(const Index nSample, const Index nRow, + const Index nCol) +: Sample(nSample) +{ + resizeMat(nRow, nCol); +} + +DMatSample::DMatSample(ConstBlock &sampleBlock) +: DMatSample(sampleBlock.getSample().size(), sampleBlock.getNRow(), + sampleBlock.getNCol()) +{ + const DMatSample &sample = sampleBlock.getSample(); + + this->resize(sample.size()); + FOR_STAT_ARRAY(*this, s) + { + (*this)[s] = sample[s].block(sampleBlock.getStartRow(), + sampleBlock.getStartCol(), + sampleBlock.getNRow(), + sampleBlock.getNCol()); + } +} + +DMatSample::DMatSample(ConstBlock &&sampleBlock) +: DMatSample(sampleBlock) +{} + +// assignement operator //////////////////////////////////////////////////////// +DMatSample & DMatSample::operator=(Block &sampleBlock) +{ + DMatSample tmp(sampleBlock); + + this->swap(tmp); + + return *this; +} + +DMatSample & DMatSample::operator=(Block &&sampleBlock) +{ + *this = sampleBlock; + + return *this; +} + +DMatSample & DMatSample::operator=(ConstBlock &sampleBlock) +{ + DMatSample tmp(sampleBlock); + + this->swap(tmp); + + return *this; +} + +DMatSample & DMatSample::operator=(ConstBlock &&sampleBlock) +{ + *this = sampleBlock; + + return *this; +} + +// block access //////////////////////////////////////////////////////////////// +DMatSample::ConstBlock DMatSample::block(const Index i, const Index j, + const Index nRow, + const Index nCol) const +{ + return ConstBlock(*this, i, j, nRow, nCol); +} + +DMatSample::Block DMatSample::block(const Index i, const Index j, + const Index nRow, const Index nCol) +{ + return Block(*this, i, j, nRow, nCol); +} + +// resize all matrices ///////////////////////////////////////////////////////// +void DMatSample::resizeMat(const Index nRow, const Index nCol) +{ + FOR_STAT_ARRAY(*this, s) + { + (*this)[s].resize(nRow, nCol); + } +} + +// IO type ///////////////////////////////////////////////////////////////////// +IoObject::IoType DMatSample::getType(void) const +{ + return IoType::dMatSample; +} diff --git a/latan/MatSample.hpp b/latan/MatSample.hpp new file mode 100644 index 0000000..f5f117c --- /dev/null +++ b/latan/MatSample.hpp @@ -0,0 +1,181 @@ +/* + * MatSample.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_MatSample_hpp_ +#define Latan_MatSample_hpp_ + +#include +#include +#include + +BEGIN_NAMESPACE + +/****************************************************************************** + * DMat sample class * + ******************************************************************************/ +class DMatSample: public Sample, public IoObject +{ +public: + // block type template + template + class BlockTemplate + { + private: + typedef typename std::remove_const::type NonConstType; + public: + // constructors + BlockTemplate(S &sample, const Index i, const Index j, const Index nRow, + const Index nCol); + BlockTemplate(BlockTemplate &b); + BlockTemplate(BlockTemplate &&b); + // destructor + ~BlockTemplate(void) = default; + // access + S & getSample(void); + const S & getSample(void) const; + Index getStartRow(void) const; + Index getStartCol(void) const; + Index getNRow(void) const; + Index getNCol(void) const; + // assignement operators + BlockTemplate & operator=(const S &sample); + BlockTemplate & operator=(const S &&sample); + private: + S &sample_; + const Index i_, j_, nRow_, nCol_; + }; + // block types + typedef BlockTemplate Block; + typedef const BlockTemplate ConstBlock; +public: + // constructors + using Sample::Sample; + DMatSample(void) = default; + DMatSample(const Index nSample, const Index nRow, const Index nCol); + DMatSample(ConstBlock &sampleBlock); + DMatSample(ConstBlock &&sampleBlock); + // destructor + virtual ~DMatSample(void) = default; + // assignement operator + DMatSample & operator=(Block &sampleBlock); + DMatSample & operator=(Block &&sampleBlock); + DMatSample & operator=(ConstBlock &sampleBlock); + DMatSample & operator=(ConstBlock &&sampleBlock); + // block access + ConstBlock block(const Index i, const Index j, const Index nRow, + const Index nCol) const; + Block block(const Index i, const Index j, const Index nRow, + const Index nCol); + // resize all matrices + void resizeMat(const Index nRow, const Index nCol); + // IO type + virtual IoType getType(void) const; +}; + +/****************************************************************************** + * Block template implementation * + ******************************************************************************/ +// constructors //////////////////////////////////////////////////////////////// +template +DMatSample::BlockTemplate::BlockTemplate(S &sample, const Index i, + const Index j, const Index nRow, + const Index nCol) +: sample_(sample) +, i_(i) +, j_(j) +, nRow_(nRow) +, nCol_(nCol) +{} + +template +DMatSample::BlockTemplate::BlockTemplate(BlockTemplate &b) +: sample_(b.getSample()) +, i_(b.getStartRow()) +, j_(b.getStartCol()) +, nRow_(b.getNRow()) +, nCol_(b.getNCol()) +{} + +template +DMatSample::BlockTemplate::BlockTemplate(BlockTemplate &&b) +: BlockTemplate(b) +{} + +// access ////////////////////////////////////////////////////////////////////// +template +S & DMatSample::BlockTemplate::getSample(void) +{ + return sample_; +} + +template +const S & DMatSample::BlockTemplate::getSample(void) const +{ + return sample_; +} + +template +Index DMatSample::BlockTemplate::getStartRow(void) const +{ + return i_; +} + +template +Index DMatSample::BlockTemplate::getStartCol(void) const +{ + return j_; +} + +template +Index DMatSample::BlockTemplate::getNRow(void) const +{ + return nRow_; +} + +template +Index DMatSample::BlockTemplate::getNCol(void) const +{ + return nCol_; +} + +// assignement operators /////////////////////////////////////////////////////// +template +DMatSample::BlockTemplate & +DMatSample::BlockTemplate::operator=(const S &sample) +{ + FOR_STAT_ARRAY(sample_, s) + { + sample_[s].block(i_, j_, nRow_, nCol_) = sample[s]; + } + + return *this; +} + +template +DMatSample::BlockTemplate & +DMatSample::BlockTemplate::operator=(const S &&sample) +{ + *this = sample; + + return *this; +} + +END_NAMESPACE + +#endif // Latan_MatSample_hpp_ diff --git a/latan/StatArray.hpp b/latan/StatArray.hpp index d976bc3..70508f0 100644 --- a/latan/StatArray.hpp +++ b/latan/StatArray.hpp @@ -81,6 +81,16 @@ namespace ReducOp inline DMat tensProd(const DMat &v1, const DMat &v2); } +// Sample types +#define SAMPLE_OFFSET 1 + +const int central = -SAMPLE_OFFSET; + +template +using Sample = StatArray; + +typedef Sample DSample; + /****************************************************************************** * StatArray class template implementation * ******************************************************************************/