35#include <boost/test/unit_test.hpp> 
   40#include <boost/test/tools/floating_point_comparison.hpp> 
   41#include <boost/test/unit_test.hpp> 
   50    double m1_buf[] = {1.0 / 2.0, 6.0 / 2.0, 2.0 / 2.0,
 
   51                       7.0 / 2.0, 3.0 / 2.0, 8.0 / 2.0};
 
   52    double m2_buf[] = {4.0 / 2.0, 9.0 / 2.0, 5.0 / 2.0, 10.0 / 2.0};
 
   53    double m3_buf[] = {11.0 / 2.0, 16.0 / 2.0, 12.0 / 2.0,
 
   54                       17.0 / 2.0, 13.0 / 2.0, 18 / 2.0};
 
   55    double m4_buf[] = {14.0 / 2.0, 19.0 / 2.0, 15.0 / 2.0, 20.0 / 2.0};
 
   57    std::shared_ptr<InnerType> in_m1(
new InnerType(2, 3, m1_buf));
 
   58    std::shared_ptr<InnerType> in_m2(
new InnerType(2, 2, m2_buf));
 
   59    std::shared_ptr<InnerType> in_m3(
new InnerType(2, 3, m3_buf));
 
   60    std::shared_ptr<InnerType> in_m4(
new InnerType(2, 2, m4_buf));
 
   62    std::shared_ptr<ScaleType> m1(
new ScaleType(2.0, in_m1));
 
   63    std::shared_ptr<ScaleType> m2(
new ScaleType(2.0, in_m2));
 
   64    std::shared_ptr<ScaleType> m3(
new ScaleType(2.0, in_m3));
 
   65    std::shared_ptr<ScaleType> m4(
new ScaleType(2.0, in_m4));
 
   67    unsigned int rowCounts[] = {2, 2};
 
   68    unsigned int colCounts[] = {3, 2};
 
   72    std::shared_ptr<BlockType> b(
new BlockType(2, 2, rowCounts, colCounts));
 
   73    b->SetBlock(0, 0, m1);
 
   74    b->SetBlock(0, 1, m2);
 
   75    b->SetBlock(1, 0, m3);
 
   76    b->SetBlock(1, 1, m4);
 
   78    double rhs_buf[] = {10, 20, 30, 40, 50};
 
   83    double expected_buf[] = {550, 1300, 2050, 2800};
 
   86    BOOST_CHECK_EQUAL(expected_result, result);
 
   94    double m_00_buf[] = {3, 1, 5, 5};
 
   95    double m_01_buf[] = {2, 4, 4, 1, 1, 3};
 
   96    double m_02_buf[] = {3, 1, 2, 2, 4, 1, 4, 2};
 
   98    double m_10_buf[] = {1, 3, 5, 1, 4, 2};
 
   99    double m_11_buf[] = {4, 4, 1, 1, 1, 4, 5, 5, 3};
 
  100    double m_12_buf[] = {5, 2, 1, 2, 3, 1, 1, 3, 1, 4, 1, 1};
 
  102    double m_20_buf[] = {3, 1, 4, 2, 5, 1, 4, 2};
 
  103    double m_21_buf[] = {4, 5, 2, 4, 4, 2, 3, 5, 2, 2, 5, 3};
 
  104    double m_22_buf[] = {3, 4, 3, 1, 2, 1, 2, 4, 4, 5, 2, 3, 5, 4, 1, 1};
 
  106    double m_30_buf[] = {2, 2, 1, 4, 5, 5};
 
  107    double m_31_buf[] = {1, 1, 3, 2, 1, 2, 3, 3, 2};
 
  108    double m_32_buf[] = {3, 1, 3, 1, 2, 2, 4, 2, 5, 5, 1, 1};
 
  110    std::shared_ptr<InnerType> m00(
new InnerType(2, 2, m_00_buf));
 
  111    std::shared_ptr<InnerType> m01(
new InnerType(2, 3, m_01_buf));
 
  112    std::shared_ptr<InnerType> m02(
new InnerType(2, 4, m_02_buf));
 
  114    std::shared_ptr<InnerType> m10(
new InnerType(3, 2, m_10_buf));
 
  115    std::shared_ptr<InnerType> m11(
new InnerType(3, 3, m_11_buf));
 
  116    std::shared_ptr<InnerType> m12(
new InnerType(3, 4, m_12_buf));
 
  118    std::shared_ptr<InnerType> m20(
new InnerType(4, 2, m_20_buf));
 
  119    std::shared_ptr<InnerType> m21(
new InnerType(4, 3, m_21_buf));
 
  120    std::shared_ptr<InnerType> m22(
new InnerType(4, 4, m_22_buf));
 
  122    std::shared_ptr<InnerType> m30(
new InnerType(3, 2, m_30_buf));
 
  123    std::shared_ptr<InnerType> m31(
new InnerType(3, 3, m_31_buf));
 
  124    std::shared_ptr<InnerType> m32(
new InnerType(3, 4, m_32_buf));
 
  126    unsigned int rowCounts[] = {2, 3, 4, 3};
 
  127    unsigned int colCounts[] = {2, 3, 4};
 
  129    BlockType b(4, 3, rowCounts, colCounts);
 
  130    b.SetBlock(0, 0, m00);
 
  131    b.SetBlock(0, 1, m01);
 
  132    b.SetBlock(0, 2, m02);
 
  133    b.SetBlock(1, 0, m10);
 
  134    b.SetBlock(1, 1, m11);
 
  135    b.SetBlock(1, 2, m12);
 
  136    b.SetBlock(2, 0, m20);
 
  137    b.SetBlock(2, 1, m21);
 
  138    b.SetBlock(2, 2, m22);
 
  139    b.SetBlock(3, 0, m30);
 
  140    b.SetBlock(3, 1, m31);
 
  141    b.SetBlock(3, 2, m32);
 
  145    BlockType b_initializedWithArray(arrayRowCounts, arrayColCounts);
 
  146    b_initializedWithArray.SetBlock(0, 0, m00);
 
  147    b_initializedWithArray.SetBlock(0, 1, m01);
 
  148    b_initializedWithArray.SetBlock(0, 2, m02);
 
  149    b_initializedWithArray.SetBlock(1, 0, m10);
 
  150    b_initializedWithArray.SetBlock(1, 1, m11);
 
  151    b_initializedWithArray.SetBlock(1, 2, m12);
 
  152    b_initializedWithArray.SetBlock(2, 0, m20);
 
  153    b_initializedWithArray.SetBlock(2, 1, m21);
 
  154    b_initializedWithArray.SetBlock(2, 2, m22);
 
  155    b_initializedWithArray.SetBlock(3, 0, m30);
 
  156    b_initializedWithArray.SetBlock(3, 1, m31);
 
  157    b_initializedWithArray.SetBlock(3, 2, m32);
 
  159    double rhs_buf[] = {4, 2, 5, 5, 3, 1, 3, 2, 3};
 
  165    double expected_buf[] = {84, 63, 71, 80, 67, 100, 76, 80, 88, 69, 51, 67};
 
  168    BOOST_CHECK_EQUAL(expected_result, result);
 
  169    BOOST_CHECK_EQUAL(expected_result, result1);
 
BOOST_AUTO_TEST_CASE(TestMatrixVectorMultiplication)