From 83a712a772ba873f60889c2d47d5632b2d05120a Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Mon, 27 Mar 2017 19:29:51 +0200 Subject: [PATCH] finished first draft of index mapping (TO BE TESTED AND REFACTORED) --- src/base_def.h | 11 +++++ src/ma_functional.cc | 67 +++++++++++++++-------------- src/ma_functional.h | 41 ++++++++++++++---- src/multi_array.cc | 4 +- src/multi_array.h | 5 ++- src/multi_array_header.h | 2 + src/multi_array_operation.cc | 81 +++++++++++++++++++++++++++--------- src/multi_array_operation.h | 20 +++++---- src/range_base.h | 3 +- src/single_range.cc | 22 +++++----- src/single_range.h | 8 ++-- 11 files changed, 176 insertions(+), 88 deletions(-) diff --git a/src/base_def.h b/src/base_def.h index 6552a4b..8e77542 100644 --- a/src/base_def.h +++ b/src/base_def.h @@ -108,6 +108,10 @@ namespace MultiArrayTools // multi_array_operation.h template class ConstMultiArrayOperationRoot; + + // multi_array_operation.h + template + class MultiArrayOperationMap; // multi_array_operation.h template @@ -132,6 +136,13 @@ namespace MultiArrayTools // manipulator.h template class BinReader; + + // ma_functional.h + template + class IndexMapFunction; + + // ma_functional.h + class vec3d2Function; } #endif diff --git a/src/ma_functional.cc b/src/ma_functional.cc index c86247a..5d5e3b8 100644 --- a/src/ma_functional.cc +++ b/src/ma_functional.cc @@ -4,49 +4,48 @@ namespace MultiArrayTools { - namespace + + template + IndexMapFunction:: + IndexMapFunction(const MultiArrayBase& ma, + const OutRange& outRange, + const Name& inName, const Name& outName) : mMap(ma, inName), + mOutRange(new OutRange( outRange )), + mOIndex(mOutRange->begin()) { - - template - struct MapEvaluation - { - template - static void eval(OutIndex& oi, const MapTuple& mt) - { - oi.template getIndex() = std::get(mt); - MapEvaluation::eval(oi, mt); - } - }; - - template <> - struct MapEvaluation<0> - { - template - static void eval(OutIndex& oi, const MapTuple& mt) - { - oi.template getIndex<0>() = std::get<0>(mt); - } - }; - - } // anonymous namespace - + mOIndex.name(outName); + } - template - void IndexMapFunction::linkIndicesTo(IndefinitIndexBase* target) + template + void IndexMapFunction::linkIndicesTo(IndefinitIndexBase* target) { - /*!!!!*/ + mMap.linkIndicesTo(target); } - template - void IndexMapFunction::eval() + template + void IndexMapFunction::eval() const { - MapEvaluation::eval(mOIndex, mMap); + mOIndex.copyPos( mMap.get() ); } - template - IndefinitIndexBase& IndexMapFunction::index() + template + IndefinitIndexBase& IndexMapFunction::index() const { return mOIndex; } - + + + /* + vec3d2Function::vec3d2Function(std::shared_ptr& outRange) : mOutRange(outRange), + out(mOutRange->begin()) {} + */ + vec3d2Function::OutIndex vec3d2Function::operator()(const InIndex& i) const + { + OutSubIndex& osi = out.template getIndex<0>(); + + osi.atMeta( i.template getIndex<0>().getMetaPos() * i.template getIndex<0>().getMetaPos() + + i.template getIndex<1>().getMetaPos() * i.template getIndex<1>().getMetaPos() + + i.template getIndex<2>().getMetaPos() * i.template getIndex<2>().getMetaPos() ); + return out; + } } diff --git a/src/ma_functional.h b/src/ma_functional.h index ca87bb6..4b86de6 100644 --- a/src/ma_functional.h +++ b/src/ma_functional.h @@ -12,25 +12,52 @@ namespace MultiArrayTools { - // Maps... are ConstMultiArrayOperationRoots where the corresponding MultiArray defines the map - template + // Map is a ConstMultiArrayOperationRoot where the corresponding MultiArray defines the map + template class IndexMapFunction { public: - typedef std::tuple MapType; + typedef OutRange OR; + typedef typename OutRange::IndexType OutIndex; + + IndexMapFunction(const MultiArrayBase& ma, + const OutRange& outRange, + const Name& inName, const Name& outName); void linkIndicesTo(IndefinitIndexBase* target); - void eval(); + void eval() const; - IndefinitIndexBase& index(); + IndefinitIndexBase& index() const; private: - MapType mMap; - OutIndex mOIndex; + ConstMultiArrayOperationRoot mMap; + std::shared_ptr mOutRange; + mutable typename OutRange::IndexType mOIndex; }; + class vec3d2Function + { + public: + + typedef SingleIndex CoordIndex; + typedef MultiIndex InIndex; + typedef SingleIndex OutSubIndex; + typedef MultiIndex OutIndex; + + vec3d2Function() = default; + //vec3d2Function(std::shared_ptr& outRange); + vec3d2Function(const vec3d2Function& in) = default; + vec3d2Function& operator=(const vec3d2Function& in) = default; + + OutIndex operator()(const InIndex& i) const; + + private: + //std::shared_ptr mOutRange; + mutable OutIndex out; + }; + } #include "ma_functional.cc" diff --git a/src/multi_array.cc b/src/multi_array.cc index 779a24f..91c8ab0 100644 --- a/src/multi_array.cc +++ b/src/multi_array.cc @@ -563,12 +563,12 @@ namespace MultiArrayTools template FunctionalMultiArray::FunctionalMultiArray(const Range& range) : - MultiArrayBase(range), mFunc() {} + MultiArrayBase(range), mFunc() {} template FunctionalMultiArray::FunctionalMultiArray(const Range& range, const Function& func) : - MultiArrayBase(range), mFunc(func) {} + MultiArrayBase(range), mFunc(func) {} template const T& FunctionalMultiArray::operator[](const typename Range::IndexType& i) const diff --git a/src/multi_array.h b/src/multi_array.h index 0fb9f4d..fe2ffa2 100644 --- a/src/multi_array.h +++ b/src/multi_array.h @@ -22,6 +22,8 @@ namespace MultiArrayTools { public: + typedef T value_type; + class const_iterator : public std::iterator { public: @@ -234,7 +236,7 @@ namespace MultiArrayTools }; template - class FunctionalMultiArray : public MultiArrayBase + class FunctionalMultiArray : public MultiArrayBase { public: typedef MultiArrayBase MAB; @@ -252,7 +254,6 @@ namespace MultiArrayTools protected: mutable T mVal; Function mFunc; - // FUNCTION !!!! }; } diff --git a/src/multi_array_header.h b/src/multi_array_header.h index bcac116..9b50760 100644 --- a/src/multi_array_header.h +++ b/src/multi_array_header.h @@ -14,6 +14,7 @@ #include "slice.h" #include "manipulator.h" #include "range_transformer.h" +#include "ma_functional.h" namespace MultiArrayTools { @@ -38,6 +39,7 @@ namespace MultiArrayTools typedef SingleRange GenericFR; typedef SingleRange LorentzR; typedef SingleRange Space1dNR; + typedef SingleRange DistanceNR; typedef SingleRange Mom1dNR; typedef SingleRange EnsR; typedef MultiRange Space3dNR; diff --git a/src/multi_array_operation.cc b/src/multi_array_operation.cc index 6fadf0b..d649d3f 100644 --- a/src/multi_array_operation.cc +++ b/src/multi_array_operation.cc @@ -175,6 +175,13 @@ namespace MultiArrayTools MAOps...>(cop, *ind, begin, end, *this, mao...); } + template + template + MultiArrayOperationMap + MultiArrayOperationRoot::map(const IndexMapFunction& imf) + { + return MultiArrayOperationMap(*this, imf); + } template template @@ -517,10 +524,11 @@ namespace MultiArrayTools * MultiArrayOperationMap * ********************************/ - template - MultiArrayOperationMap:: - MultiArrayOperationMap(MultiArrayOperationRoot& root, const MapFunction mf) : - MultiArrayOperationBase(), + template + MultiArrayOperationMap:: + MultiArrayOperationMap(MultiArrayOperationRoot& root, + const IndexMapFunction& mf) : + MutableMultiArrayOperationBase(), mMF(mf), mRoot(root) //mIndex(mArrayRef.beginIndex()), @@ -531,11 +539,41 @@ namespace MultiArrayTools //mIndex.name(nm); } - template - MultiArrayOperationMap& MultiArrayOperationMap:: - operator=(const ConstMultiArrayOperationRoot& in) + template + MultiArrayOperationMap& + MultiArrayOperationMap:: + operator=(const MultiArrayOperationRoot& in) { - mIndex = dynamic_cast( in.getIndex() ); + mIndex = dynamic_cast( in.index() ); + MAOB::mIibPtr = &mIndex; + mNm = in.name(); + mIndex.name(mNm); // to be sure... + mIndex.setPos( mIndex.max() ); + typename TotalInRange::IndexType endIndex = mIndex; + + // Implement Map Functions !!!! + mRoot.linkIndicesTo( &mMF.index() ); + mMF.linkIndicesTo( &mIndex ); + + MultiArray cnt(mRoot->range()); + auto cnto = cnt(mRoot.name(), true); + cnto.linkIndicesTo( &mMF.index() ); + + for(mIndex.setPos(0), mMF.eval(); mIndex != endIndex; ++mIndex, mMF.eval()){ + get() += in.get(); + ++cnto.get(); + } + // CHECK whether T / size_t mixture works!! + mRoot /= cnto; + return *this; + } + + template + MultiArrayOperationMap& + MultiArrayOperationMap:: + operator=(const ConstMultiArrayOperationRoot& in) + { + mIndex = dynamic_cast( in.index() ); MAOB::mIibPtr = &mIndex; mNm = in.name(); mIndex.name(mNm); // to be sure... @@ -556,39 +594,42 @@ namespace MultiArrayTools } // CHECK whether T / size_t mixture works!! mRoot /= cnto; + return *this; } - template - size_t MultiArrayOperationMap::argNum() const + + template + size_t MultiArrayOperationMap::argNum() const { return 1; } - template - IndefinitIndexBase* MultiArrayOperationMap:: + template + IndefinitIndexBase* MultiArrayOperationMap:: getLinked(const std::string& name) const { return mRoot.getLinked(name); } - template - void MultiArrayOperationMap::linkIndicesTo(IndefinitIndexBase* target) const + template + void MultiArrayOperationMap:: + linkIndicesTo(IndefinitIndexBase* target) const { mRoot.linkIndicesTo(target); } - template - void MultiArrayOperationMap::setInternalLinks() const + template + void MultiArrayOperationMap::setInternalLinks() const { } - template - const T& MultiArrayOperationMap::get() const + template + const T& MultiArrayOperationMap::get() const { return mRoot.get(); } - template - T& MultiArrayOperationMap::get() + template + T& MultiArrayOperationMap::get() { return mRoot.get(); } diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index 896207a..bc79481 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -18,7 +18,7 @@ namespace MultiArrayTools { public: - typedef T ValType; + typedef T value_type; MultiArrayOperationBase() /*{ CHECK; }*/ = default; virtual ~MultiArrayOperationBase(); @@ -97,6 +97,9 @@ namespace MultiArrayTools size_t end, const MAOps&... mao) const; + template + MultiArrayOperationMap + map(const IndexMapFunction& imf); template auto operator+(const MAOp& sec) -> decltype(operator()(std::plus(), sec)); @@ -238,15 +241,18 @@ namespace MultiArrayTools Name mNm; }; - template + template class MultiArrayOperationMap : public MutableMultiArrayOperationBase { public: typedef MultiArrayOperationBase MAOB; - MultiArrayOperationMap(MultiArrayOperationRoot& root, const MapFunction mf); - MultiArrayOperationMap& operator=(const ConstMultiArrayOperationRoot& in); + MultiArrayOperationMap(MultiArrayOperationRoot& root, + const IndexMapFunction& mf); + MultiArrayOperationMap& operator=(const MultiArrayOperationRoot& in); + MultiArrayOperationMap& operator=(const ConstMultiArrayOperationRoot& in); + virtual size_t argNum() const override; virtual IndefinitIndexBase* getLinked(const std::string& name) const override; @@ -258,9 +264,9 @@ namespace MultiArrayTools virtual T& get() override; // !!!! protected: - MapFunction mMF; - MultiArrayOperationRoot& mRoot; - mutable IndexType mIndex; // Index of incoming range + IndexMapFunction mMF; + MultiArrayOperationRoot& mRoot; + mutable typename TotalInRange::IndexType mIndex; // Index of incoming range Name mNm; // Name of incoming range }; diff --git a/src/range_base.h b/src/range_base.h index a96c88d..6c63d13 100644 --- a/src/range_base.h +++ b/src/range_base.h @@ -21,7 +21,8 @@ namespace MultiArrayTools LORENTZ = 4, SPIN = 5, ENSEMBLE = 6, - VALUE_ERROR = 7 + VALUE_ERROR = 7, + DISTANCE = 8 }; class MultiRangeType diff --git a/src/single_range.cc b/src/single_range.cc index 19c29ff..aab76a8 100644 --- a/src/single_range.cc +++ b/src/single_range.cc @@ -96,38 +96,38 @@ namespace MultiArrayTools // - SingleRange::SingleRange(size_t ext) : - RangeBase >(), + SingleRange::SingleRange(size_t ext) : + RangeBase >(), mExt(ext) {} - size_t SingleRange::get(size_t pos) const + size_t SingleRange::get(size_t pos) const { return pos; } - size_t SingleRange::getMeta(size_t metaPos) const + size_t SingleRange::getMeta(size_t metaPos) const { return metaPos; } - size_t SingleRange::size() const + size_t SingleRange::size() const { return mExt; } - MultiRangeType SingleRange::type() const + MultiRangeType SingleRange::type() const { - return MultiRangeType(RangeType::SPACE); + return MultiRangeType(RangeType::DISTANCE); } - SingleIndex SingleRange::begin() const + SingleIndex SingleRange::begin() const { - return SingleIndex(this, 0); + return SingleIndex(this, 0); } - SingleIndex SingleRange::end() const + SingleIndex SingleRange::end() const { - return SingleIndex(this, size()); + return SingleIndex(this, size()); } // diff --git a/src/single_range.h b/src/single_range.h index 8971e2e..b1ca52e 100644 --- a/src/single_range.h +++ b/src/single_range.h @@ -113,10 +113,10 @@ namespace MultiArrayTools }; template <> - class SingleRange : public RangeBase > + class SingleRange : public RangeBase > { public: - typedef typename RangeBase >::IndexType IndexType; + typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); @@ -129,8 +129,8 @@ namespace MultiArrayTools virtual MultiRangeType type() const override; - SingleIndex begin() const override; - SingleIndex end() const override; + SingleIndex begin() const override; + SingleIndex end() const override; protected: size_t mExt;