// -*- C++ -*- #include "test_header.h" namespace { class OpTest_1Dim : public ::testing::Test { protected: typedef SingleRangeFactory SRF; typedef SRF::oType SRange; OpTest_1Dim() { swapFactory(rfbptr, {'a', 'l', 'f', 'g'} ); srptr = std::dynamic_pointer_cast( rfbptr->create() ); } std::shared_ptr rfbptr; std::shared_ptr srptr; vector v1 = { 2.917, 9.436, 0.373, 7.192 }; vector v2 = { 8.870, 4.790, 8.215, 5.063 }; }; class OpTest_MDim : public ::testing::Test { protected: typedef SingleRangeFactory SRF; typedef SRF::oType SRange; typedef MultiRangeFactory MRF; typedef MRF::oType MRange; typedef AnonymousRange ANO; typedef MultiArray AMA; OpTest_MDim() { swapFactory(rfbptr, {'x', 'l', 'f', 'g'} ); sr1ptr = std::dynamic_pointer_cast( rfbptr->create() ); swapFactory(rfbptr, {'1', '2', '3'} ); sr2ptr = std::dynamic_pointer_cast( rfbptr->create() ); swapFactory(rfbptr, {'a', 'b'} ); sr3ptr = std::dynamic_pointer_cast( rfbptr->create() ); swapFactory(rfbptr, {'A', 'B'} ); sr4ptr = std::dynamic_pointer_cast( rfbptr->create() ); swapMFactory(rfbptr, sr2ptr, sr3ptr); mr1ptr = std::dynamic_pointer_cast( rfbptr->create() ); swapMFactory(rfbptr, sr2ptr, sr4ptr); mr2ptr = std::dynamic_pointer_cast( rfbptr->create() ); } std::shared_ptr rfbptr; std::shared_ptr sr1ptr; std::shared_ptr sr2ptr; std::shared_ptr sr3ptr; std::shared_ptr sr4ptr; std::shared_ptr mr1ptr; std::shared_ptr mr2ptr; vector v1 = { 2.917, 9.436, 0.373 }; vector v2 = { 8.870, 4.790 }; vector v3 = { 0.353, 4.005, 1.070, 2.310, 9.243, 2.911 }; vector v4 = { 1.470, 2.210 }; vector v5 = { 30.932, -33.693, -26.205, -15.504, 21.227, 17.829, -14.364, -1.868, -25.703, 13.836, 23.563, 41.339 }; }; TEST_F(OpTest_1Dim, ExecOp) { MultiArray ma1(srptr, v1); MultiArray ma2(srptr, v2); MultiArray res(srptr); auto i = MAT::getIndex( srptr ); res(i) = ma1(i) + ma2(i); EXPECT_EQ( fabs( res.at('a') - (2.917+8.870) ) < 0.0001, true); EXPECT_EQ( fabs( res.at('l') - (9.436+4.790) ) < 0.0001, true ); EXPECT_EQ( fabs( res.at('f') - (0.373+8.215) ) < 0.0001, true ); EXPECT_EQ( fabs( res.at('g') - (7.192+5.063) ) < 0.0001, true ); } TEST_F(OpTest_MDim, ExecOp1) { MultiArray res(sr2ptr,sr4ptr); MultiArray res2(sr2ptr,sr4ptr); const MultiArray ma1(sr2ptr, v1); const MultiArray ma2(sr4ptr, v2); auto i1 = MAT::getIndex( sr2ptr ); auto i2 = MAT::getIndex( sr4ptr ); res(i1,i2) = ma1(i1) * ma2(i2); EXPECT_EQ( xround( res.at(mkt('1','A')) ), xround(2.917 * 8.870) ); EXPECT_EQ( xround( res.at(mkt('1','B')) ), xround(2.917 * 4.790) ); EXPECT_EQ( xround( res.at(mkt('2','A')) ), xround(9.436 * 8.870) ); EXPECT_EQ( xround( res.at(mkt('2','B')) ), xround(9.436 * 4.790) ); EXPECT_EQ( xround( res.at(mkt('3','A')) ), xround(0.373 * 8.870) ); EXPECT_EQ( xround( res.at(mkt('3','B')) ), xround(0.373 * 4.790) ); res2(i1,i2) = (ma1(i1) + 3.14 ) * ma2(i2); EXPECT_EQ( xround( res2.at(mkt('1','A')) ), xround( (2.917 + 3.14) * 8.870) ); EXPECT_EQ( xround( res2.at(mkt('1','B')) ), xround( (2.917 + 3.14) * 4.790) ); EXPECT_EQ( xround( res2.at(mkt('2','A')) ), xround( (9.436 + 3.14) * 8.870) ); EXPECT_EQ( xround( res2.at(mkt('2','B')) ), xround( (9.436 + 3.14) * 4.790) ); EXPECT_EQ( xround( res2.at(mkt('3','A')) ), xround( (0.373 + 3.14) * 8.870) ); EXPECT_EQ( xround( res2.at(mkt('3','B')) ), xround( (0.373 + 3.14) * 4.790) ); } TEST_F(OpTest_MDim, ExecContract) { MultiArray res(sr2ptr); const MultiArray ma1(sr2ptr, v1); const MultiArray ma2(sr4ptr, v2); auto i1 = MAT::getIndex( sr2ptr ); auto i2 = MAT::getIndex( sr4ptr ); res(i1) += (ma1(i1) * ma2(i2)).c(i2); EXPECT_EQ( xround( res.at('1') ), xround(2.917 * 8.870 + 2.917 * 4.790) ); EXPECT_EQ( xround( res.at('2') ), xround(9.436 * 8.870 + 9.436 * 4.790) ); EXPECT_EQ( xround( res.at('3') ), xround(0.373 * 8.870 + 0.373 * 4.790) ); } TEST_F(OpTest_MDim, ExecOp2) { MultiArray res(mr1ptr,sr4ptr); MultiArray ma1(mr1ptr, v3); MultiArray ma2(sr4ptr, v2); MultiArray ma3(sr4ptr, v4); auto i1 = MAT::getIndex( mr1ptr ); auto i2 = MAT::getIndex( sr4ptr ); res(i1,i2) = ( ma1(i1) + ma2(i2) ).p(i1,i2) - ma3(i2); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'A')) ), xround(0.353 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'B')) ), xround(0.353 + 4.790 - 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'A')) ), xround(4.005 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'B')) ), xround(4.005 + 4.790 - 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'A')) ), xround(1.070 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'B')) ), xround(1.070 + 4.790 - 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'A')) ), xround(2.310 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'B')) ), xround(2.310 + 4.790 - 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'A')) ), xround(9.243 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'B')) ), xround(9.243 + 4.790 - 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'A')) ), xround(2.911 + 8.870 - 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'B')) ), xround(2.911 + 4.790 - 2.210) ); } TEST_F(OpTest_MDim, ExecOpAnon) { MultiArray ma1(mr1ptr, v3); MultiArray maa = *std::dynamic_pointer_cast>( ma1.anonymous() ); MultiArray maa2( maa.template getRangePtr<0>() ); auto ar = maa.template getRangePtr<0>(); auto i1 = MAT::getIndex( ar ); maa2(i1) = maa(i1) * maa(i1); EXPECT_EQ( xround( maa2.at(0) ), xround( v3[0]*v3[0] ) ); for((*i1) = 0; i1->pos() != i1->max(); ++(*i1) ){ EXPECT_EQ( xround( maa2.at(i1->meta()) ), xround( maa.at(i1->meta()) * maa.at(i1->meta()) ) ); } } TEST_F(OpTest_MDim, ExecFOp) { MultiArray res(mr1ptr,sr4ptr); MultiArray ma1(mr1ptr, v3); MultiArray ma2(sr4ptr, v2); MultiArray ma3(sr4ptr, v4); auto i1 = MAT::getIndex( mr1ptr ); auto i2 = MAT::getIndex( sr4ptr ); res(i1,i2) = Monopole::mk( ma1(i1) , ma2(i2) , ma3(i2) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'A')) ), xround(0.353 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'B')) ), xround(0.353 / ( 1 + 4.790 / 2.210) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'A')) ), xround(4.005 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'B')) ), xround(4.005 / ( 1 + 4.790 / 2.210) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'A')) ), xround(1.070 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'B')) ), xround(1.070 / ( 1 + 4.790 / 2.210) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'A')) ), xround(2.310 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'B')) ), xround(2.310 / ( 1 + 4.790 / 2.210) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'A')) ), xround(9.243 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'B')) ), xround(9.243 / ( 1 + 4.790 / 2.210) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'A')) ), xround(2.911 / ( 1 + 8.870 / 1.470) ) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'B')) ), xround(2.911 / ( 1 + 4.790 / 2.210) ) ); } TEST_F(OpTest_MDim, ExecDOp) { //typedef MultiArray AMA; typedef MultiArray DMA; MultiArray ma1(mr1ptr,sr4ptr,v5); MultiArray ma2(sr2ptr,v1); MultiArray res(sr4ptr,mr1ptr); MultiArray res2(mr1ptr,sr4ptr); DMA dma1 = *std::dynamic_pointer_cast( dynamic( ma1 ) ); DMA dma2 = *std::dynamic_pointer_cast( dynamic( ma2 ) ); DMA dres = *std::dynamic_pointer_cast( dynamic( res ) ); DMA dres2 = *std::dynamic_pointer_cast( dynamic( res2 ) ); auto si2 = MAT::getIndex( sr2ptr ); auto si3 = MAT::getIndex( sr3ptr ); auto si4 = MAT::getIndex( sr4ptr ); auto mi = MAT::getIndex( mr1ptr ); (*mi)(si2,si3); auto di1 = MAT::getIndex( MAT::rptr<0>( dma1 ) ); auto di2 = MAT::getIndex( MAT::rptr<0>( dma2 ) ); auto dir = MAT::getIndex( MAT::rptr<0>( dres ) ); //auto dirx = MAT::getIndex( MAT::rptr<0>( dres ) ); auto dir2 = MAT::getIndex( MAT::rptr<0>( dres2 ) ); (*di1)(mi,si4); (*di2)(si2); (*dir)(si4,mi); (*dir2)(mi,si4); dres(dir) = dma1(di1) + dma2(di2); res = dres.format(sr4ptr,mr1ptr); EXPECT_EQ( xround( res.at( mkt('A',mkt('1','a')) ) ), xround( 30.932 + 2.917 ) ); EXPECT_EQ( xround( res.at( mkt('A',mkt('1','b')) ) ), xround( -26.205 + 2.917 ) ); EXPECT_EQ( xround( res.at( mkt('A',mkt('2','a')) ) ), xround( 21.227 + 9.436 ) ); EXPECT_EQ( xround( res.at( mkt('A',mkt('2','b')) ) ), xround( -14.364 + 9.436 ) ); EXPECT_EQ( xround( res.at( mkt('A',mkt('3','a')) ) ), xround( -25.703 + 0.373 ) ); EXPECT_EQ( xround( res.at( mkt('A',mkt('3','b')) ) ), xround( 23.563 + 0.373 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('1','a')) ) ), xround( -33.693 + 2.917 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('1','b')) ) ), xround( -15.504 + 2.917 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('2','a')) ) ), xround( 17.829 + 9.436 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('2','b')) ) ), xround( -1.868 + 9.436 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('3','a')) ) ), xround( 13.836 + 0.373 ) ); EXPECT_EQ( xround( res.at( mkt('B',mkt('3','b')) ) ), xround( 41.339 + 0.373 ) ); //dres = *std::dynamic_pointer_cast( dynamic( res ) ); dres2(dir2) = dres(dir); res2 = dres2.format(mr1ptr,sr4ptr); EXPECT_EQ( xround( res2.at( mkt(mkt('1','a'),'A') ) ), xround( 30.932 + 2.917 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('1','b'),'A') ) ), xround( -26.205 + 2.917 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('2','a'),'A') ) ), xround( 21.227 + 9.436 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('2','b'),'A') ) ), xround( -14.364 + 9.436 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('3','a'),'A') ) ), xround( -25.703 + 0.373 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('3','b'),'A') ) ), xround( 23.563 + 0.373 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('1','a'),'B') ) ), xround( -33.693 + 2.917 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('1','b'),'B') ) ), xround( -15.504 + 2.917 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('2','a'),'B') ) ), xround( 17.829 + 9.436 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('2','b'),'B') ) ), xround( -1.868 + 9.436 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('3','a'),'B') ) ), xround( 13.836 + 0.373 ) ); EXPECT_EQ( xround( res2.at( mkt(mkt('3','b'),'B') ) ), xround( 41.339 + 0.373 ) ); } TEST_F(OpTest_MDim, ExecOp3) { MultiArray res(mr1ptr,sr4ptr); MultiArray ma1(mr1ptr, v3); MultiArray ma2(sr2ptr, v1); MultiArray ma3(sr4ptr, v4); MultiArray ma4(sr1ptr,sr2ptr,sr3ptr,sr4ptr); MultiArray ma5(sr1ptr, v3); MultiArray ma6(sr3ptr, v2); auto si0 = MAT::getIndex( sr1ptr ); // 'x' auto si1 = MAT::getIndex( sr2ptr ); // '1' auto si2 = MAT::getIndex( sr3ptr ); // 'a' auto si3 = MAT::getIndex( sr4ptr ); // 'A' auto mi = MAT::getIndex( mr1ptr ); mi->operator()(si1,si2); res(mi,si3) = ma1(mi) + ma2(si1) + ma3(si3); ma4(si0,si1,si2,si3) = ma5(si0)*ma2(si1)*ma6(si2)*ma3(si3); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'A')) ), xround(0.353 + 2.917 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','a'),'B')) ), xround(0.353 + 2.917 + 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'A')) ), xround(4.005 + 2.917 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('1','b'),'B')) ), xround(4.005 + 2.917 + 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'A')) ), xround(1.070 + 9.436 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','a'),'B')) ), xround(1.070 + 9.436 + 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'A')) ), xround(2.310 + 9.436 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('2','b'),'B')) ), xround(2.310 + 9.436 + 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'A')) ), xround(9.243 + 0.373 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','a'),'B')) ), xround(9.243 + 0.373 + 2.210) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'A')) ), xround(2.911 + 0.373 + 1.470) ); EXPECT_EQ( xround( res.at(mkt(mkt('3','b'),'B')) ), xround(2.911 + 0.373 + 2.210) ); si1->at('1'); si0->at('x'); (*si2) = 0; (*si3) = 0; Slice sl(sr4ptr,sr3ptr); sl.define(si3,si2) = ma4(si0,si1,si2,si3); MultiArrayBase& slb = sl; MultiArray ma8(sr3ptr,sr4ptr); //ma8(si2,si3) = ma4(si0,si1,si2,si3); ma8(si2,si3) = slb(si3,si2); EXPECT_EQ( xround( ma8.at(mkt('a','A')) ), xround( sl.at(mkt('A','a')) ) ); EXPECT_EQ( xround( ma8.at(mkt('b','A')) ), xround( sl.at(mkt('A','b')) ) ); } } // anonymous namspace int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }