//
//  Copyright (c) 2010 Athanasios Iliopoulos
//
//  Distributed under the Boost Software License, Version 1.0. (See
//  accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)
//

#include <boost/numeric/ublas/assignment.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/vector_proxy.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include "libs/numeric/ublas/test/utils.hpp"
#include <boost/timer.hpp>
#include <ctime>

using namespace boost::numeric::ublas;

namespace tans {
template <class AE>
typename AE::value_type mean_square(const matrix_expression<AE> &me) {
    typename AE::value_type s(0);
    typename AE::size_type i, j;
    for (i=0; i!= me().size1(); i++) {
        for (j=0; j!= me().size2(); j++) {
            s+=std::fabs(me()(i,j));
        }
    }
    return s/me().size1()*me().size2();
}


template <class AE>
typename AE::value_type mean_square(const vector_expression<AE> &ve) {
    // We could have use norm2 here, but ublas' ABS does not support unsigned types.
    typename AE::value_type s(0);
    typename AE::size_type i;
    for (i=0; i!= ve().size(); i++) {
            s+=std::fabs(ve()(i));
        }
    return s/ve().size();
}
const double TOL=0.0;

}

template <class V>
bool test_vector() {
    bool pass = true;
    using namespace tans;

    V a(3), ra(3);
    a <<=  1, 2, 3;
    ra(0) = 1; ra(1) = 2; ra(2) = 3;
    pass &= (mean_square(a-ra)<=TOL);

    V b(7), rb(7);
    b<<= a, 10, a;
    rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3;
    pass &= (mean_square(b-rb)<=TOL);

    V c(6), rc(6);
    c <<= 1, move(2), 3 ,4, 5, move(-5), 10, 10;
    rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5;
    pass &= (mean_square(c-rc)<=TOL);

    V d(6), rd(6);
    d <<= 1, move_to(3), 3 ,4, 5, move_to(1), 10, 10;
    rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5;
    pass &= (mean_square(d-rd)<=TOL);

    {
    V c(6), rc(6);
    c <<= 1, move<2>(), 3 ,4, 5, move<-5>(), 10, 10;
    rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5;
    pass &= (mean_square(c-rc)<=TOL);

    V d(6), rd(6);
    d <<= 1, move_to<3>(), 3 ,4, 5, move_to<1>(), 10, 10;
    rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5;
    pass &= (mean_square(d-rd)<=TOL);
    }


    {
    V f(6), rf(6);
    f <<= 5, 5, 5, 5, 5, 5;
    V fa(3); fa<<= 1, 2, 3;
    f <<= fill_policy::index_plus_assign(), fa;
    rf <<= 6,7,8, 5, 5, 5;
    pass &= (mean_square(f-rf)<=TOL);
    }

    {
    V f(6), rf(6);
    f <<= 5, 5, 5, 5, 5, 5;
    V fa(3); fa<<= 1, 2, 3;
    f <<= fill_policy::index_minus_assign(), fa;
    rf <<= 4,3,2, 5, 5, 5;
    pass &= (mean_square(f-rf)<=TOL);
    }

    return pass;
}

template <class V>
bool test_vector_sparse_push_back() {
    bool pass = true;
    using namespace tans;

    V a(3), ra(3);
    a <<= fill_policy::sparse_push_back(), 1, 2, 3;
    ra(0) = 1; ra(1) = 2; ra(2) = 3;
    pass &= (mean_square(a-ra)<=TOL);

    V b(7), rb(7);
    b<<= fill_policy::sparse_push_back(), a, 10, a;
    rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3;
    pass &= (mean_square(b-rb)<=TOL);

    V c(6), rc(6);
    c <<= fill_policy::sparse_push_back(), 1, move(2), 3 ,4, 5; // Move back (i.e. negative is dangerous for push_back)
    rc(0) = 1; rc(1) = 0; rc(2) = 0; rc(3) = 3; rc(4) = 4; rc(5) = 5;
    pass &= (mean_square(c-rc)<=TOL);

    V d(6), rd(6);
    d <<= fill_policy::sparse_push_back(), 1, move_to(3), 3 ,4, 5; // Move back (i.e. before current index is dangerous for push_back)
    rd(0) = 1; rd(1) = 0; rd(2) = 0; rd(3) = 3; rd(4) = 4; rd(5) = 5;
    pass &= (mean_square(d-rd)<=TOL);

    V e(6), re(6);
    e <<= fill_policy::sparse_push_back(), 1, move_to(3), 3 ,4, 5, fill_policy::sparse_insert(), move_to(1), 10, 10; // If you want to move back, use this
    re(0) = 1; re(1) = 10; re(2) = 10; re(3) = 3; re(4) = 4; re(5) = 5;
    pass &= (mean_square(e-re)<=TOL);

    return pass;
}


template <class V>
bool test_vector_sparse_insert() {
    bool pass = true;
    using namespace tans;

    V a(3), ra(3);
    a <<= fill_policy::sparse_insert(), 1, 2, 3;
    ra(0) = 1; ra(1) = 2; ra(2) = 3;
    pass &= (mean_square(a-ra)<=TOL);

    V b(7), rb(7);
    b<<= fill_policy::sparse_insert(), a, 10, a;
    rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3;
    pass &= (mean_square(b-rb)<=TOL);

    V c(6), rc(6);
    c <<= fill_policy::sparse_insert(), 1, move(2), 3 ,4, 5, move(-5), 10, 10; // Move back (i.e. negative is dangerous for sparse)
    rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5;
    pass &= (mean_square(c-rc)<=TOL);


    V d(6), rd(6);
    d <<= fill_policy::sparse_insert(), 1, move_to(3), 3 ,4, 5, move_to(1), 10, 10; // Move back (i.e.before is dangerous for sparse)
    rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5;
    pass &= (mean_square(d-rd)<=TOL);


    return pass;
}


template <class V>
bool test_matrix() {
    bool pass = true;
    using namespace tans;

    V A(3,3), RA(3,3);
    A <<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
    RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3;
    RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6;
    RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9;
    pass &= (mean_square(A-RA)<=TOL);

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<= 1, 2, 3, b, 7, project(b, range(1,3));
    RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it.
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<= move(1,0), b, move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3));
    RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(9);
    b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
    B<<=b;
    RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<=    2, 3,
            4, 5;
    B<<= C,C,
        C,C;
    RB <<=   2,3,2,3,
            4,5,4,5,
            2,3,2,3,
            4,5,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<= C, zero_matrix<typename V::value_type>(2,2),
        zero_matrix<typename V::value_type>(2,2), C;
    RB<<=    2,3,0,0,
            4,5,0,0,
            0,0,2,3,
            0,0,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<= C, zero_matrix<typename V::value_type>(2,2),
        zero_matrix<typename V::value_type>(2,2), C;
    RB<<=    2,3,0,0,
            4,5,0,0,
            0,0,2,3,
            0,0,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4); // We need that because of the non-zero instatiation of dense types.
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<= move(1,1), C;
    RB<<=    0,0,0,0,
            0,2,3,0,
            0,4,5,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<= move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5;
    RB<<=    0,2,3,0,
            1,2,0,0,
            4,5,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5;
    RB<<=    0,2,4,0,
            0,3,5,0,
            0,6,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5;
    RB<<=    0,2,0,0,
            0,3,0,0,
            0,0,0,0,
            4,5,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8;
    RB<<=    0,2,0,0,
            0,3,0,0,
            4,5,6,7,
            8,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2;
    RB<<=    0,2,1,2,
            0,3,0,0,
            4,5,6,7,
            8,9,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = scalar_matrix<typename V::value_type>(4,4,1);
    V C(2,2);
    C <<= 1, 2, 3, 4;
    B<<= fill_policy::index_plus_assign(), move(1,1), C;
    RB<<=    1,1,1,1,
            1,2,3,1,
            1,4,5,1,
            1,1,1,1;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = scalar_matrix<typename V::value_type>(4,4,5);
    V C(2,2);
    C <<= 1, 2, 3, 4;
    B<<= fill_policy::index_minus_assign(), move(1,1), C;
    RB<<=    5,5,5,5,
            5,4,3,5,
            5,2,1,5,
            5,5,5,5;
    pass &= (mean_square(B-RB)<=TOL);
    }


    return pass;
}

template <class V>
bool test_matrix_sparse_push_back() {
    bool pass = true;
    using namespace tans;

    V A(3,3), RA(3,3);
    A <<= fill_policy::sparse_push_back(), 1, 2, 3, 4, 5, 6, 7, 8, 9;
    RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3;
    RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6;
    RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9;
    pass &= (mean_square(A-RA)<=TOL);

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<=fill_policy::sparse_push_back(), 1, 2, 3, b, 7, project(b, range(1,3));
    RB<<= 1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it.
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<=fill_policy::sparse_push_back(), move(1,0), b, fill_policy::sparse_insert(), move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3));
    RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(9);
    b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
    B<<=b;
    RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9;
    pass &= (mean_square(B-RB)<=TOL);
    }


    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<=    2, 3,
            4, 5;
    // It might get complicated for sparse push_back, this must go into the tutorial. (This way is not convient nor fast)
    B<<=fill_policy::sparse_push_back(), C, move_to(2,2), C, fill_policy::sparse_insert(), move_to(0,2), C, C;
    RB <<=   2,3,2,3,
            4,5,4,5,
            2,3,2,3,
            4,5,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }


    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<=fill_policy::sparse_push_back(), C, move_to(2,2), C;
    RB<<=    2,3,0,0,
            4,5,0,0,
            0,0,2,3,
            0,0,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<=fill_policy::sparse_push_back(), move(1,1), C;
    RB<<=    0,0,0,0,
            0,2,3,0,
            0,4,5,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_push_back(), move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5;
    RB<<=    0,2,3,0,
            1,2,0,0,
            4,5,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }
    // The next will not work with sparse push_back because elements that are prior to the ones already in are attempted to be added
/*
    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5;
    RB<<=    0,2,4,0,
            0,3,5,0,
            0,6,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }
*/
    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5;
    RB<<=    0,2,0,0,
            0,3,0,0,
            0,0,0,0,
            4,5,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8;
    RB<<=    0,2,0,0,
            0,3,0,0,
            4,5,6,7,
            8,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    // The next will not work with sparse push_back because elements that are prior to the ones already in are attempted to be added
/*
    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2;
    RB<<=    0,2,1,2,
            0,3,0,0,
            4,5,6,7,
            8,9,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }
*/
    return pass;
}

template <class V>
bool test_matrix_sparse_insert() {
    bool pass = true;
    using namespace tans;

    V A(3,3), RA(3,3);
    A <<= fill_policy::sparse_insert(), 1, 2, 3, 4, 5, 6, 7, 8, 9;
    RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3;
    RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6;
    RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9;
    pass &= (mean_square(A-RA)<=TOL);

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<=fill_policy::sparse_insert(), 1, 2, 3, b, 7, project(b, range(1,3));
    RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it.
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(3);
    b<<= 4,5,6;
    B<<=fill_policy::sparse_insert(), move(1,0), b, fill_policy::sparse_insert(), move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3));
    RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(3,3), RB(3,3);
    vector<typename V::value_type>  b(9);
    b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
    B<<=b;
    RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9;
    pass &= (mean_square(B-RB)<=TOL);
    }


    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<=    2, 3,
            4, 5;
    B<<=fill_policy::sparse_insert(), C, C, C, C;
    RB <<=   2,3,2,3,
            4,5,4,5,
            2,3,2,3,
            4,5,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }


    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<=fill_policy::sparse_insert(), C, move_to(2,2), C;
    RB<<=    2,3,0,0,
            4,5,0,0,
            0,0,2,3,
            0,0,4,5;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    V C(2,2);
    C <<= 2, 3, 4, 5;
    B<<=fill_policy::sparse_insert(), move(1,1), C;
    RB<<=    0,0,0,0,
            0,2,3,0,
            0,4,5,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_insert(), move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5;
    RB<<=    0,2,3,0,
            1,2,0,0,
            4,5,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5;
    RB<<=    0,2,4,0,
            0,3,5,0,
            0,6,0,0,
            0,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5;
    RB<<=    0,2,0,0,
            0,3,0,0,
            0,0,0,0,
            4,5,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8;
    RB<<=    0,2,0,0,
            0,3,0,0,
            4,5,6,7,
            8,0,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    {
    V B(4,4), RB(4,4);
    B = zero_matrix<typename V::value_type>(4,4);
    B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2;
    RB<<=    0,2,1,2,
            0,3,0,0,
            4,5,6,7,
            8,9,0,0;
    pass &= (mean_square(B-RB)<=TOL);
    }

    return pass;
}


BOOST_UBLAS_TEST_DEF (test_vector) {

    BOOST_UBLAS_DEBUG_TRACE( "Starting operator \"<<= \" vector assignment tests" );

    BOOST_UBLAS_TEST_CHECK(test_vector<vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<vector<char> >());

    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<double,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<float,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<long,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<unsigned long,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<int,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<unsigned int,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<std::size_t,7> >()));
    BOOST_UBLAS_TEST_CHECK((test_vector<bounded_vector<char,7> >()));

    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<unsigned int> >())
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<std::size_t> >())
    BOOST_UBLAS_TEST_CHECK(test_vector<mapped_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<compressed_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<long> >())
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<unsigned long> >())
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector<coordinate_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<compressed_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back<coordinate_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<compressed_vector<char> >());

    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<double> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<float> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert<coordinate_vector<char> >());
}

BOOST_UBLAS_TEST_DEF (test_matrix) {

    BOOST_UBLAS_DEBUG_TRACE( "Starting operator \"<<= \" matrix assignment tests" );

    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<matrix<char> >());

    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<double,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<float,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<long,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<unsigned long,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<int,7,7 > >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<unsigned int,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<char,7, 7> >()));
    BOOST_UBLAS_TEST_CHECK((test_matrix<bounded_matrix<std::size_t,7, 7> >()));

    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<unsigned int> >())
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<std::size_t> >())
    BOOST_UBLAS_TEST_CHECK(test_matrix<mapped_matrix<char> >());

    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<compressed_matrix<char> >());

    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<long> >())
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<unsigned long> >())
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix<coordinate_matrix<char> >());

    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<compressed_matrix<char> >());

    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back<coordinate_matrix<char> >());


    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<compressed_matrix<char> >());

    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<double> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<float> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<unsigned long> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<unsigned int> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<std::size_t> >());
    BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert<coordinate_matrix<char> >());
}


int main () {
    BOOST_UBLAS_TEST_BEGIN();

    BOOST_UBLAS_TEST_DO( test_vector );
    BOOST_UBLAS_TEST_DO( test_matrix );

    BOOST_UBLAS_TEST_END();

    return EXIT_SUCCESS;;
}
