fix copyInst <-> copy -- bug -> first mdim op test works

This commit is contained in:
Christian Zimmermann 2017-08-25 22:03:20 +02:00
parent f99e55d4fd
commit 8a1cc35089
7 changed files with 96 additions and 9 deletions

View file

@ -13,7 +13,7 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
template <class... Indices> template <class... Indices>
class ContainerIndex : public IndexInterface<std::tuple<typename Indices::MetaType...> > class ContainerIndex : public IndexInterface<std::tuple<typename Indices::MetaType...> >
{ {
@ -63,6 +63,7 @@ namespace MultiArrayTools
ContainerIndex& operator()(); // -> sync; just to shorten the code ContainerIndex& operator()(); // -> sync; just to shorten the code
std::shared_ptr<RangeType> range() const; std::shared_ptr<RangeType> range() const;
virtual std::string id() const override { return std::string("con") + std::to_string(IB::mId); }
}; };

View file

@ -9,7 +9,10 @@ namespace MultiArrayTools
IndexBase::IndexBase(const std::shared_ptr<RangeBase>& range, IndexBase::IndexBase(const std::shared_ptr<RangeBase>& range,
size_t pos) : mRangePtr(range), size_t pos) : mRangePtr(range),
mPos(pos) {} mPos(pos)
{
mId = indexId();
}
bool IndexBase::operator==(const IndexBase& in) const bool IndexBase::operator==(const IndexBase& in) const
{ {

View file

@ -13,11 +13,22 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
size_t indexId()
{
static size_t id = 0;
++id;
return id;
}
class IndexBase class IndexBase
{ {
public: public:
DEFAULT_MEMBERS(IndexBase); //DEFAULT_MEMBERS(IndexBase);
IndexBase() { mId = indexId(); }
IndexBase(IndexBase&& in) = default;
IndexBase& operator=(IndexBase&& in) = default;
IndexBase(const std::shared_ptr<RangeBase>& range, size_t pos); IndexBase(const std::shared_ptr<RangeBase>& range, size_t pos);
virtual ~IndexBase() = default; virtual ~IndexBase() = default;
@ -36,11 +47,13 @@ namespace MultiArrayTools
virtual bool first() const = 0; virtual bool first() const = 0;
virtual operator size_t() const; virtual operator size_t() const;
virtual std::string id() const { return std::to_string( mId ); }
protected: protected:
std::shared_ptr<RangeBase> mRangePtr; std::shared_ptr<RangeBase> mRangePtr;
size_t mPos; size_t mPos;
size_t mId;
}; };
template <typename MetaType> template <typename MetaType>

View file

@ -66,6 +66,8 @@ namespace MultiArrayTools
virtual size_t dim() const override; virtual size_t dim() const override;
std::shared_ptr<RangeType> range() const; std::shared_ptr<RangeType> range() const;
virtual std::string id() const override { return std::string("mul") + std::to_string(IB::mId); }
}; };
/************************* /*************************

View file

@ -51,6 +51,48 @@ namespace {
std::vector<double> v1 = { 2.917, 9.436, 0.373, 7.192 }; std::vector<double> v1 = { 2.917, 9.436, 0.373, 7.192 };
std::vector<double> v2 = { 8.870, 4.790, 8.215, 5.063 }; std::vector<double> v2 = { 8.870, 4.790, 8.215, 5.063 };
}; };
class OpTest_MDim : public ::testing::Test
{
protected:
typedef SingleRangeFactory<char,RangeType::ANY> SRF;
typedef SRF::oType SRange;
typedef MultiRangeFactory<SRange,SRange> MRF;
typedef MRF::oType MRange;
OpTest_MDim()
{
swapFactory<SRF>(rfbptr, {'x', 'l', 'f', 'g'} );
sr1ptr = std::dynamic_pointer_cast<SRange>( rfbptr->create() );
swapFactory<SRF>(rfbptr, {'1', '2', '3'} );
sr2ptr = std::dynamic_pointer_cast<SRange>( rfbptr->create() );
swapFactory<SRF>(rfbptr, {'a', 'b'} );
sr3ptr = std::dynamic_pointer_cast<SRange>( rfbptr->create() );
swapFactory<SRF>(rfbptr, {'A', 'B'} );
sr4ptr = std::dynamic_pointer_cast<SRange>( rfbptr->create() );
swapMFactory<MRF>(rfbptr, sr2ptr, sr3ptr);
mr1ptr = std::dynamic_pointer_cast<MRange>( rfbptr->create() );
swapMFactory<MRF>(rfbptr, sr2ptr, sr4ptr);
mr2ptr = std::dynamic_pointer_cast<MRange>( rfbptr->create() );
}
std::shared_ptr<RangeFactoryBase> rfbptr;
std::shared_ptr<SRange> sr1ptr;
std::shared_ptr<SRange> sr2ptr;
std::shared_ptr<SRange> sr3ptr;
std::shared_ptr<SRange> sr4ptr;
std::shared_ptr<MRange> mr1ptr;
std::shared_ptr<MRange> mr2ptr;
std::vector<double> v1 = { 2.917, 9.436, 0.373 };
std::vector<double> v2 = { 8.870, 4.790 };
};
TEST_F(OpTest_1Dim, ExecOp) TEST_F(OpTest_1Dim, ExecOp)
{ {
@ -67,6 +109,28 @@ namespace {
EXPECT_EQ( fabs( res.at('g') - (7.192+5.063) ) < 0.0001, true ); EXPECT_EQ( fabs( res.at('g') - (7.192+5.063) ) < 0.0001, true );
} }
TEST_F(OpTest_MDim, ExecOp1)
{
MultiArray<double,SRange,SRange> res(sr2ptr,sr4ptr);
MultiArray<double,SRange> ma1(sr2ptr, v1);
MultiArray<double,SRange> ma2(sr4ptr, v2);
auto i1 = std::dynamic_pointer_cast<SRange::IndexType>( sr2ptr->index() );
auto i2 = std::dynamic_pointer_cast<SRange::IndexType>( sr4ptr->index() );
res(i1,i2) = ma1(i1) + ma2(i2);
EXPECT_EQ( fabs( res.at(mkt('1','A')) - (2.917 + 8.870) ) < 0.0001, true );
EXPECT_EQ( fabs( res.at(mkt('1','B')) - (2.917 + 4.790) ) < 0.0001, true );
EXPECT_EQ( fabs( res.at(mkt('2','A')) - (9.436 + 8.870) ) < 0.0001, true );
EXPECT_EQ( fabs( res.at(mkt('2','B')) - (9.436 + 4.790) ) < 0.0001, true );
EXPECT_EQ( fabs( res.at(mkt('3','A')) - (0.373 + 8.870) ) < 0.0001, true );
EXPECT_EQ( fabs( res.at(mkt('3','B')) - (0.373 + 4.790) ) < 0.0001, true );
}
} // anonymous namspace } // anonymous namspace
int main(int argc, char** argv) int main(int argc, char** argv)

View file

@ -109,7 +109,7 @@ namespace MultiArrayHelper
std::get<N>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( range.template getPtr<N>() ) ); std::get<N>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( range.template getPtr<N>() ) );
PackNum<N-1>::construct(ip, range); PackNum<N-1>::construct(ip, range);
} }
/*
template <template<class...> class IndexType, class... Indices> template <template<class...> class IndexType, class... Indices>
static void copy(std::tuple<std::shared_ptr<Indices>...>& ip, static void copy(std::tuple<std::shared_ptr<Indices>...>& ip,
const IndexType<Indices...>& ind) const IndexType<Indices...>& ind)
@ -118,18 +118,19 @@ namespace MultiArrayHelper
std::get<N>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( ind.template get<N>() ) ); std::get<N>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( ind.template get<N>() ) );
PackNum<N-1>::copy(ip, ind); PackNum<N-1>::copy(ip, ind);
} }
*/
template <template<class...> class IndexType, class... Indices> template <template<class...> class IndexType, class... Indices>
static void copyInst(std::tuple<std::shared_ptr<Indices>...>& ip, static void copyInst(std::tuple<std::shared_ptr<Indices>...>& ip,
const IndexType<Indices...>& ind) const IndexType<Indices...>& ind)
{ {
std::get<N>(ip) = ind.template getPtr<N>() ; std::get<N>(ip) = ind.template getPtr<N>() ;
PackNum<N-1>::copy(ip, ind); PackNum<N-1>::copyInst(ip, ind);
} }
template <class... Indices> template <class... Indices>
static size_t makePos(const std::tuple<std::shared_ptr<Indices>...>& iPtrTup) static size_t makePos(const std::tuple<std::shared_ptr<Indices>...>& iPtrTup)
{ {
auto ID = std::get<N>(iPtrTup)->id();
return std::get<N>(iPtrTup)->pos() + return std::get<N>(iPtrTup)->pos() +
PackNum<N-1>::makePos(iPtrTup) * std::get<N>(iPtrTup)->max(); PackNum<N-1>::makePos(iPtrTup) * std::get<N>(iPtrTup)->max();
} }
@ -225,7 +226,7 @@ namespace MultiArrayHelper
std::get<0>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( range.template getPtr<0>() ) ); std::get<0>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( range.template getPtr<0>() ) );
} }
/*
template <template<class...> class IndexType, class... Indices> template <template<class...> class IndexType, class... Indices>
static void copy(std::tuple<std::shared_ptr<Indices>...>& ip, static void copy(std::tuple<std::shared_ptr<Indices>...>& ip,
const IndexType<Indices...>& ind) const IndexType<Indices...>& ind)
@ -233,7 +234,7 @@ namespace MultiArrayHelper
typedef typename std::remove_reference<decltype(ind.template get<0>())>::type SubIndexType; typedef typename std::remove_reference<decltype(ind.template get<0>())>::type SubIndexType;
std::get<0>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( ind.template get<0>() ) ); std::get<0>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( ind.template get<0>() ) );
} }
*/
template <template<class...> class IndexType, class... Indices> template <template<class...> class IndexType, class... Indices>
static void copyInst(std::tuple<std::shared_ptr<Indices>...>& ip, static void copyInst(std::tuple<std::shared_ptr<Indices>...>& ip,
const IndexType<Indices...>& ind) const IndexType<Indices...>& ind)
@ -244,6 +245,7 @@ namespace MultiArrayHelper
template <class... Indices> template <class... Indices>
static size_t makePos(const std::tuple<std::shared_ptr<Indices>...>& iPtrTup) static size_t makePos(const std::tuple<std::shared_ptr<Indices>...>& iPtrTup)
{ {
auto ID = std::get<0>(iPtrTup)->id();
return std::get<0>(iPtrTup)->pos(); return std::get<0>(iPtrTup)->pos();
} }

View file

@ -37,6 +37,8 @@ namespace MultiArrayTools
virtual size_t dim() const override; // = 1 virtual size_t dim() const override; // = 1
virtual bool last() const override; virtual bool last() const override;
virtual bool first() const override; virtual bool first() const override;
virtual std::string id() const override { return std::string("sin") + std::to_string(IB::mId); }
}; };
template <typename U, RangeType TYPE> template <typename U, RangeType TYPE>