2
0
mirror of https://github.com/boostorg/ublas.git synced 2026-02-14 13:12:14 +00:00

Patch for norm_1 return type for complex

Thanks to Karl!

svn path=/trunk/boost/boost/numeric/ublas/; revision=23503
This commit is contained in:
Michael Stevens
2004-07-13 15:42:31 +00:00
parent 13070dccc3
commit a01d2a9899
3 changed files with 48 additions and 32 deletions

View File

@@ -78,12 +78,13 @@ namespace boost { namespace numeric { namespace ublas {
v.assign (zero_vector<value_type> (e1.size1 ()));
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v);
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_plus_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
axpy_prod (e1, e2, v, orientation_category ());
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<value_type>::epsilon () * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -229,12 +230,13 @@ namespace boost { namespace numeric { namespace ublas {
v.assign (zero_vector<value_type> (e1 ().size1 ()));
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v);
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_plus_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
axpy_prod (e1, e2, v, iterator_category ());
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<value_type>::epsilon () * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -302,12 +304,13 @@ namespace boost { namespace numeric { namespace ublas {
v.assign (zero_vector<value_type> (e2 ().size2 ()));
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v);
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_plus_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
axpy_prod (e1, e2, v, orientation_category ());
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<value_type>::epsilon () * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -453,12 +456,13 @@ namespace boost { namespace numeric { namespace ublas {
v.assign (zero_vector<value_type> (e2 ().size2 ()));
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v);
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_plus_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
axpy_prod (e1, e2, v, iterator_category ());
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<value_type>::epsilon () * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -490,7 +494,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, row_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, prod (e1, e2), row_major_tag ());
#endif
size_type size1 (e1 ().size1 ());
@@ -499,7 +504,7 @@ namespace boost { namespace numeric { namespace ublas {
for (size_type j = 0; j < size2; ++ j)
row (m, i).plus_assign (e1 () (i, j) * row (e2 (), j));
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -519,7 +524,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, row_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, prod (e1, e2), row_major_tag ());
#endif
typename expression1_type::const_iterator1 it1 (e1 ().begin1 ());
@@ -547,7 +553,7 @@ namespace boost { namespace numeric { namespace ublas {
++ it1;
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -567,7 +573,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, prod (e1, e2), column_major_tag ());
#endif
size_type size1 (e2 ().size1 ());
@@ -576,7 +583,7 @@ namespace boost { namespace numeric { namespace ublas {
for (size_type i = 0; i < size1; ++ i)
column (m, j).plus_assign (e2 () (i, j) * column (e1 (), i));
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -596,7 +603,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, prod (e1, e2), column_major_tag ());
#endif
typename expression2_type::const_iterator2 it2 (e2 ().begin2 ());
@@ -624,7 +632,7 @@ namespace boost { namespace numeric { namespace ublas {
++ it2;
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -726,7 +734,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, row_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, prod (e1, e2), row_major_tag ());
#endif
size_type size (BOOST_UBLAS_SAME (e1 ().size2 (), e2 ().size1 ()));
@@ -736,7 +745,7 @@ namespace boost { namespace numeric { namespace ublas {
m.plus_assign (outer_prod (ce1, re2));
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -756,7 +765,8 @@ namespace boost { namespace numeric { namespace ublas {
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, prod (e1, e2), column_major_tag ());
#endif
size_type size (BOOST_UBLAS_SAME (e1 ().size2 (), e2 ().size1 ()));
@@ -766,7 +776,7 @@ namespace boost { namespace numeric { namespace ublas {
m.plus_assign (outer_prod (ce1, re2));
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}

View File

@@ -34,7 +34,8 @@ namespace boost { namespace numeric { namespace ublas {
V v (e1 ().size1 ());
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v.size ());
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
size_type i_size = e1 ().size1 ();
@@ -68,7 +69,7 @@ namespace boost { namespace numeric { namespace ublas {
#endif
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= BOOST_UBLAS_TYPE_CHECK_EPSILON * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -88,7 +89,8 @@ namespace boost { namespace numeric { namespace ublas {
V v (e2 ().size2 ());
#if BOOST_UBLAS_TYPE_CHECK
vector<value_type> cv (v.size ());
value_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
indexing_vector_assign (scalar_assign<typename vector<value_type>::reference, value_type> (), cv, prod (e1, e2));
#endif
size_type i_size = BOOST_UBLAS_SAME (e1 ().size (), e2 ().size1 ());
@@ -121,7 +123,7 @@ namespace boost { namespace numeric { namespace ublas {
#endif
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= BOOST_UBLAS_TYPE_CHECK_EPSILON * verrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
#endif
return v;
}
@@ -142,7 +144,8 @@ namespace boost { namespace numeric { namespace ublas {
M m (e1 ().size1 (), e2 ().size2 ());
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, row_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, prod (e1, e2), row_major_tag ());
disable_type_check<bool>::value = true;
#endif
@@ -181,7 +184,7 @@ namespace boost { namespace numeric { namespace ublas {
}
#if BOOST_UBLAS_TYPE_CHECK
disable_type_check<bool>::value = false;
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= BOOST_UBLAS_TYPE_CHECK_EPSILON * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -202,7 +205,8 @@ namespace boost { namespace numeric { namespace ublas {
M m (e1 ().size1 (), e2 ().size2 ());
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, prod (e1, e2), column_major_tag ());
disable_type_check<bool>::value = true;
#endif
@@ -241,7 +245,7 @@ namespace boost { namespace numeric { namespace ublas {
}
#if BOOST_UBLAS_TYPE_CHECK
disable_type_check<bool>::value = false;
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= BOOST_UBLAS_TYPE_CHECK_EPSILON * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}

View File

@@ -38,7 +38,8 @@ namespace boost { namespace numeric { namespace ublas {
vector<value_type> temporary (e2 ().size2 ());
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, row_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, prod (e1, e2), row_major_tag ());
#endif
typename expression1_type::const_iterator1 it1 (e1 ().begin1 ());
@@ -81,7 +82,7 @@ namespace boost { namespace numeric { namespace ublas {
++ it1;
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}
@@ -102,7 +103,8 @@ namespace boost { namespace numeric { namespace ublas {
vector<value_type> temporary (e1 ().size1 ());
#if BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
value_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
typedef type_traits<value_type>::real_type real_type;
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, prod (e1, e2), column_major_tag ());
#endif
typename expression2_type::const_iterator2 it2 (e2 ().begin2 ());
@@ -145,7 +147,7 @@ namespace boost { namespace numeric { namespace ublas {
++ it2;
}
#if BOOST_UBLAS_TYPE_CHECK
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<value_type>::epsilon () * merrorbound, internal_logic ());
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
#endif
return m;
}