📄 concepts.hpp
字号:
vector<std::complex<float> > ZeroElement (vector<std::complex<float> >) { return zero_vector<std::complex<float> > (); } template<> vector<std::complex<double> > ZeroElement (vector<std::complex<double> >) { return zero_vector<std::complex<double> > (); } template<> matrix<std::complex<float> > ZeroElement (matrix<std::complex<float> >) { return zero_matrix<std::complex<float> > (); } template<> matrix<std::complex<double> > ZeroElement (matrix<std::complex<double> >) { return zero_matrix<std::complex<double> > (); }#endif template<class T> T OneElement (T); template<> float OneElement (float) { return 1.f; } template<> double OneElement (double) { return 1.; } template<> matrix<float> OneElement (matrix<float>) { return identity_matrix<float> (); } template<> matrix<double> OneElement (matrix<double>) { return identity_matrix<double> (); }#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300) template<> std::complex<float> OneElement (std::complex<float>) { return std::complex<float> (1.f); } template<> std::complex<double> OneElement (std::complex<double>) { return std::complex<double> (1.); } template<> matrix<std::complex<float> > OneElement (matrix<std::complex<float> >) { return identity_matrix<std::complex<float> > (); } template<> matrix<std::complex<double> > OneElement (matrix<std::complex<double> >) { return identity_matrix<std::complex<double> > (); }#endif template<class E1, class E2> bool operator == (const vector_expression<E1> &e1, const vector_expression<E2> &e2) { typedef BOOST_UBLAS_TYPENAME promote_traits<BOOST_UBLAS_TYPENAME E1::value_type, BOOST_UBLAS_TYPENAME E2::value_type>::promote_type value_type; typedef BOOST_UBLAS_TYPENAME type_traits<value_type>::real_type real_type; return norm_inf (e1 - e2) == real_type (0); } template<class E1, class E2> bool operator == (const matrix_expression<E1> &e1, const matrix_expression<E2> &e2) { typedef BOOST_UBLAS_TYPENAME promote_traits<BOOST_UBLAS_TYPENAME E1::value_type, BOOST_UBLAS_TYPENAME E2::value_type>::promote_type value_type; typedef BOOST_UBLAS_TYPENAME type_traits<value_type>::real_type real_type; return norm_inf (e1 - e2) == real_type (0); } template<class T> struct AdditiveAbelianGroupConcept { typedef T value_type; static void constraints () { bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a + b) + c == a + (b + c); r = ZeroElement (value_type ()) + a == a; r = a + ZeroElement (value_type ()) == a; r = a + (- a) == ZeroElement (value_type ()); r = (- a) + a == ZeroElement (value_type ()); r = a + b == b + a; ignore_unused_variable_warning (r); } }; template<class T> struct MultiplicativeAbelianGroupConcept { typedef T value_type; static void constraints () { bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a * b) * c == a * (b * c); r = OneElement (value_type ()) * a == a; r = a * OneElement (value_type ()) == a; r = a * (OneElement (value_type ()) / a) == a; r = (OneElement (value_type ()) / a) * a == a; r = a * b == b * a; ignore_unused_variable_warning (r); } }; template<class T> struct RingWithIdentityConcept { typedef T value_type; static void constraints () { AdditiveAbelianGroupConcept<value_type>::constraints (); bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a * b) * c == a * (b * c); r = (a + b) * c == a * c + b * c; r = OneElement (value_type ()) * a == a; r = a * OneElement (value_type ()) == a; ignore_unused_variable_warning (r); } static void constraints (int) { AdditiveAbelianGroupConcept<value_type>::constraints (); bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = prod (T (prod (a, b)), c) == prod (a, T (prod (b, c))); r = prod (a + b, c) == prod (a, c) + prod (b, c); r = prod (OneElement (value_type ()), a) == a; r = prod (a, OneElement (value_type ())) == a; ignore_unused_variable_warning (r); } }; template<class T> struct CommutativeRingWithIdentityConcept { typedef T value_type; static void constraints () { RingWithIdentityConcept<value_type>::constraints (); bool r; value_type a = value_type (), b = value_type (); r = a * b == b * a; ignore_unused_variable_warning (r); } }; template<class T> struct FieldConcept { typedef T value_type; static void constraints () { CommutativeRingWithIdentityConcept<value_type>::constraints (); bool r; value_type a = value_type (); r = a == ZeroElement (value_type ()) || a * (OneElement (value_type ()) / a) == a; r = a == ZeroElement (value_type ()) || (OneElement (value_type ()) / a) * a == a; ignore_unused_variable_warning (r); } }; template<class T, class V> struct VectorSpaceConcept { typedef T value_type; typedef V vector_type; static void constraints () { FieldConcept<value_type>::constraints (); AdditiveAbelianGroupConcept<vector_type>::constraints (); bool r; value_type alpha = value_type (), beta = value_type (); vector_type a = vector_type (), b = vector_type (); r = alpha * (a + b) == alpha * a + alpha * b; r = (alpha + beta) * a == alpha * a + beta * a; r = (alpha * beta) * a == alpha * (beta * a); r = OneElement (value_type ()) * a == a; ignore_unused_variable_warning (r); } }; template<class T, class V, class M> struct LinearOperatorConcept { typedef T value_type; typedef V vector_type; typedef M matrix_type; static void constraints () { VectorSpaceConcept<value_type, vector_type>::constraints (); bool r; value_type alpha = value_type (), beta = value_type (); vector_type a = vector_type (), b = vector_type (); matrix_type A = matrix_type (); r = prod (A, alpha * a + beta * b) == alpha * prod (A, a) + beta * prod (A, b); ignore_unused_variable_warning (r); } }; void concept_checks () { // Storage Array#if defined (INTERNAL) || defined (INTERNAL_STORAGE) StorageArrayConcept<const std::vector<double> >::constraints (); MutableStorageArrayConcept<std::vector<double> >::constraints (); RandomAccessIteratorConcept<std::vector<double>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<std::vector<double>::iterator>::constraints (); StorageArrayConcept<const bounded_array<double, 1> >::constraints (); MutableStorageArrayConcept<bounded_array<double, 1> >::constraints (); RandomAccessIteratorConcept<bounded_array<double, 1>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<bounded_array<double, 1>::iterator>::constraints (); StorageArrayConcept<const unbounded_array<double> >::constraints (); MutableStorageArrayConcept<unbounded_array<double> >::constraints (); RandomAccessIteratorConcept<unbounded_array<double>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<unbounded_array<double>::iterator>::constraints (); StorageArrayConcept<const array_adaptor<double> >::constraints (); MutableStorageArrayConcept<array_adaptor<double> >::constraints (); RandomAccessIteratorConcept<array_adaptor<double>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<array_adaptor<double>::iterator>::constraints (); IndexSetConcept<range>::constraints (); RandomAccessIteratorConcept<range::const_iterator>::constraints (); IndexSetConcept<slice>::constraints (); RandomAccessIteratorConcept<slice::const_iterator>::constraints (); IndexSetConcept<indirect_array<> >::constraints (); RandomAccessIteratorConcept<indirect_array<>::const_iterator>::constraints ();#endif // Storage Sparse#if defined (INTERNAL) || defined (INTERNAL_STORAGE_SPARSE) StorageSparseConcept<const map_array<std::size_t, double> >::constraints (); MutableStorageSparseConcept<map_array<std::size_t, double> >::constraints (); RandomAccessIteratorConcept<map_array<std::size_t, double>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<map_array<std::size_t, double>::iterator>::constraints (); StorageSparseConcept<const std::map<std::size_t, double> >::constraints (); MutableStorageSparseConcept<std::map<std::size_t, double> >::constraints (); BidirectionalIteratorConcept<std::map<std::size_t, double>::const_iterator>::constraints (); // Not value_type mutable BidirectionalIteratorConcept<std::map<std::size_t, double>::iterator>::constraints ();#ifdef BOOST_UBLAS_DEPRACATED StorageSparseConcept<const set_array<std::size_t> >::constraints (); MutableStorageSparseConcept<set_array<std::size_t> >::constraints (); RandomAccessIteratorConcept<set_array<std::size_t>::const_iterator>::constraints (); MutableRandomAccessIteratorConcept<set_array<std::size_t>::iterator>::constraints (); StorageSparseConcept<const std::set<std::size_t> >::constraints (); MutableStorageSparseConcept<std::set<std::size_t> >::constraints (); BidirectionalIteratorConcept<std::set<std::size_t>::const_iterator>::constraints (); MutableBidirectionalIteratorConcept<std::set<std::size_t>::iterator>::constraints ();#endif#endif // Vector#if defined (INTERNAL) || defined (INTERNAL_VECTOR) VectorConcept<const vector<double> >::constraints (); MutableVectorConcept<vector<double> >::constraints (); IndexedRandomAccess1DIteratorConcept<vector<double>::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept<vector<double>::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept<vector<double>::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept<vector<double>::reverse_iterator>::constraints (); VectorConcept<unit_vector<double> >::constraints (); IndexedRandomAccess1DIteratorConcept<unit_vector<double>::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept<unit_vector<double>::const_reverse_iterator>::constraints (); VectorConcept<zero_vector<double> >::constraints (); IndexedBidirectional1DIteratorConcept<zero_vector<double>::const_iterator>::constraints (); IndexedBidirectional1DIteratorConcept<zero_vector<double>::const_reverse_iterator>::constraints (); VectorConcept<scalar_vector<double> >::constraints (); IndexedRandomAccess1DIteratorConcept<scalar_vector<double>::const_iterator>::constraints ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -