28 #ifndef SHARK_LINALG_BLAS_TRIANGULAR_MATRIX_HPP 29 #define SHARK_LINALG_BLAS_TRIANGULAR_MATRIX_HPP 35 #include <boost/serialization/collection_size_type.hpp> 36 #include <boost/serialization/array.hpp> 37 #include <boost/serialization/nvp.hpp> 38 #include <boost/serialization/vector.hpp> 43 template<
class T,
class Orientation,
class TriangularType>
46 typedef std::vector<T> array_type;
48 typedef typename array_type::size_type size_type;
49 typedef typename array_type::difference_type difference_type;
50 typedef typename array_type::value_type value_type;
51 typedef value_type scalar_type;
57 typedef std::size_t index_type;
93 :m_size(e().
size1()), m_data(m_size * (m_size+1)/2)
133 return m_data.size();
145 m_data.resize(size*(size+1)/2);
156 std::fill(m_data.begin(), m_data.end(), value_type());
160 const_reference
operator()(index_type i, index_type j)
const {
161 if(!orientation::non_zero(i,j))
163 return m_data [orientation::element(i,j,
size1())];
169 m_data [orientation::element(i,j,
size1())] = t;
173 return orientation::non_zero(i,j);
190 self_type temporary(e);
198 m_data.swap(m.m_data);
206 template<
class TIter>
208 public random_access_iterator_base<
209 major1_iterator<TIter>,
210 typename boost::remove_const<T>::type,
211 packed_random_access_iterator_tag
214 difference_type offset(difference_type n)
const{
215 difference_type k = m_index;
217 return (n*(2*k+n+1))/2;
221 return -(n*(2*k+n+1))/2;
225 typedef typename boost::remove_const<TIter>::type value_type;
232 :m_pos(arrayBegin), m_index(index){}
236 :m_pos(iter.m_pos), m_index(iter.m_index){}
241 m_index = iter.m_index;
268 return m_index - it.m_index;
276 return m_pos[offset(n)];
287 return m_index == it.m_index;
290 bool operator < (major1_iterator<U>
const& it)
const {
291 return m_index < it.m_index;
296 difference_type m_index;
300 template<
class TIter>
302 public random_access_iterator_base<
303 major2_iterator<TIter>,
304 typename boost::remove_const<T>::type,
305 packed_random_access_iterator_tag
308 difference_type offset(difference_type n)
const{
309 difference_type k = m_size-m_index-1;
311 return (2*k*n-n*n+n)/2;
315 return -(2*k*n-n*n+n)/2;
319 typedef typename boost::remove_const<TIter>::type value_type;
326 :m_pos(arrayBegin), m_index(index), m_size(size){}
330 :m_pos(iter.m_pos), m_index(iter.m_index), m_size(iter.m_size){}
335 m_index = iter.m_index;
336 m_size = iter.m_size;
343 m_pos += m_size-m_index;
347 m_pos -= m_size-m_index;
363 return m_index - it.m_index;
371 return m_pos[offset(n)];
382 return m_index == it.m_index;
385 bool operator < (major2_iterator<U>
const& it)
const {
386 return m_index < it.m_index;
391 difference_type m_index;
392 difference_type m_size;
396 typedef typename boost::mpl::if_<
397 boost::is_same<Orientation,row_major>,
398 dense_storage_iterator<value_type>,
399 typename boost::mpl::if_c<
400 TriangularType::is_upper,
405 typedef typename boost::mpl::if_<
406 boost::is_same<Orientation,row_major>,
407 typename boost::mpl::if_c<
408 TriangularType::is_upper,
410 major1_iterator<value_type>
412 dense_storage_iterator<value_type>
415 typedef typename boost::mpl::if_<
416 boost::is_same<Orientation,row_major>,
417 dense_storage_iterator<value_type const>,
418 typename boost::mpl::if_c<
419 TriangularType::is_upper,
424 typedef typename boost::mpl::if_<
425 boost::is_same<Orientation,row_major>,
426 typename boost::mpl::if_c<
427 TriangularType::is_upper,
429 major1_iterator<value_type const>
431 dense_storage_iterator<value_type const>
437 std::size_t
index = TriangularType::is_upper?i:0;
444 const_row_iterator
row_end(index_type i)
const {
445 std::size_t
index = TriangularType::is_upper?
size2():i+1;
453 std::size_t
index = TriangularType::is_upper?i:0;
461 std::size_t
index = TriangularType::is_upper?
size2():i+1;
470 std::size_t
index = TriangularType::is_upper?0:i;
478 std::size_t
index = TriangularType::is_upper?i+1:
size2();
486 std::size_t
index = TriangularType::is_upper?0:i;
494 std::size_t
index = TriangularType::is_upper?i+1:
size2();
503 template<
class Archive>
508 boost::serialization::collection_size_type s(m_size);
511 ar & boost::serialization::make_nvp(
"size",s);
514 if (Archive::is_loading::value) {
517 ar & boost::serialization::make_nvp(
"data",m_data);
525 template<
class T,
class Orientation,
class TriangularType>
529 template<
class T,
class Orientation,
class TriangularType>