Eigen::internal::AmbiVector< Scalar_, StorageIndex_ > Class Template Reference

#include <AmbiVector.h>

Classes

class  Iterator
 
struct  ListEl
 

Public Types

typedef Scalar_ Scalar
 
typedef StorageIndex_ StorageIndex
 
typedef NumTraits< Scalar >::Real RealScalar
 

Public Member Functions

 AmbiVector (Index size)
 
void init (double estimatedDensity)
 
void init (int mode)
 
Index nonZeros () const
 
void setBounds (Index start, Index end)
 
void setZero ()
 
void restart ()
 
ScalarcoeffRef (Index i)
 
Scalarcoeff (Index i)
 
 ~AmbiVector ()
 
void resize (Index size)
 
StorageIndex size () const
 

Protected Member Functions

StorageIndex convert_index (Index idx)
 
void reallocate (Index size)
 
void reallocateSparse ()
 

Protected Attributes

Scalarm_buffer
 
Scalar m_zero
 
StorageIndex m_size
 
StorageIndex m_start
 
StorageIndex m_end
 
StorageIndex m_allocatedSize
 
StorageIndex m_allocatedElements
 
StorageIndex m_mode
 
StorageIndex m_llStart
 
StorageIndex m_llCurrent
 
StorageIndex m_llSize
 

Detailed Description

template<typename Scalar_, typename StorageIndex_>
class Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >

Hybrid sparse/dense vector class designed for intensive read-write operations.

See BasicSparseLLT and SparseProduct for usage examples.

Member Typedef Documentation

◆ RealScalar

template<typename Scalar_ , typename StorageIndex_ >
typedef NumTraits<Scalar>::Real Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::RealScalar

◆ Scalar

template<typename Scalar_ , typename StorageIndex_ >
typedef Scalar_ Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::Scalar

◆ StorageIndex

template<typename Scalar_ , typename StorageIndex_ >
typedef StorageIndex_ Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::StorageIndex

Constructor & Destructor Documentation

◆ AmbiVector()

template<typename Scalar_ , typename StorageIndex_ >
Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::AmbiVector ( Index  size)
inlineexplicit
33  : m_buffer(0), m_zero(0), m_size(0), m_end(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1) {
34  resize(size);
35  }
StorageIndex m_allocatedSize
Definition: AmbiVector.h:110
StorageIndex m_allocatedElements
Definition: AmbiVector.h:111
StorageIndex m_end
Definition: AmbiVector.h:109
StorageIndex m_size
Definition: AmbiVector.h:107
StorageIndex size() const
Definition: AmbiVector.h:63
Scalar m_zero
Definition: AmbiVector.h:106
Scalar * m_buffer
Definition: AmbiVector.h:105
StorageIndex m_mode
Definition: AmbiVector.h:112
void resize(Index size)
Definition: AmbiVector.h:58

References Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::resize(), and Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::size().

◆ ~AmbiVector()

template<typename Scalar_ , typename StorageIndex_ >
Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::~AmbiVector ( )
inline

Member Function Documentation

◆ coeff()

template<typename Scalar_ , typename StorageIndex_ >
Scalar_ & Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::coeff ( Index  i)
229  {
230  if (m_mode == IsDense)
231  return m_buffer[i];
232  else {
233  ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
235  if ((m_llSize == 0) || (i < llElements[m_llStart].index)) {
236  return m_zero;
237  } else {
238  Index elid = m_llStart;
239  while (elid >= 0 && llElements[elid].index < i) elid = llElements[elid].next;
240 
241  if (llElements[elid].index == i)
242  return llElements[m_llCurrent].value;
243  else
244  return m_zero;
245  }
246  }
247 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_RESTRICT
Definition: Macros.h:1067
#define eigen_assert(x)
Definition: Macros.h:910
StorageIndex m_llCurrent
Definition: AmbiVector.h:116
StorageIndex m_llSize
Definition: AmbiVector.h:117
StorageIndex m_llStart
Definition: AmbiVector.h:115
@ IsDense
Definition: Constants.h:365
@ IsSparse
Definition: Constants.h:365
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References eigen_assert, EIGEN_RESTRICT, i, Eigen::IsDense, and Eigen::IsSparse.

◆ coeffRef()

template<typename Scalar_ , typename StorageIndex_ >
Scalar_ & Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::coeffRef ( Index  i)
171  {
172  if (m_mode == IsDense)
173  return m_buffer[i];
174  else {
175  ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
176  // TODO factorize the following code to reduce code generation
178  if (m_llSize == 0) {
179  // this is the first element
180  m_llStart = 0;
181  m_llCurrent = 0;
182  ++m_llSize;
183  llElements[0].value = Scalar(0);
184  llElements[0].index = convert_index(i);
185  llElements[0].next = -1;
186  return llElements[0].value;
187  } else if (i < llElements[m_llStart].index) {
188  // this is going to be the new first element of the list
189  ListEl& el = llElements[m_llSize];
190  el.value = Scalar(0);
191  el.index = convert_index(i);
192  el.next = m_llStart;
194  ++m_llSize;
196  return el.value;
197  } else {
198  StorageIndex nextel = llElements[m_llCurrent].next;
199  eigen_assert(i >= llElements[m_llCurrent].index &&
200  "you must call restart() before inserting an element with lower or equal index");
201  while (nextel >= 0 && llElements[nextel].index <= i) {
202  m_llCurrent = nextel;
203  nextel = llElements[nextel].next;
204  }
205 
206  if (llElements[m_llCurrent].index == i) {
207  // the coefficient already exists and we found it !
208  return llElements[m_llCurrent].value;
209  } else {
210  if (m_llSize >= m_allocatedElements) {
212  llElements = reinterpret_cast<ListEl*>(m_buffer);
213  }
214  eigen_internal_assert(m_llSize < m_allocatedElements && "internal error: overflow in sparse mode");
215  // let's insert a new coefficient
216  ListEl& el = llElements[m_llSize];
217  el.value = Scalar(0);
218  el.index = convert_index(i);
219  el.next = llElements[m_llCurrent].next;
220  llElements[m_llCurrent].next = m_llSize;
221  ++m_llSize;
222  return el.value;
223  }
224  }
225  }
226 }
#define eigen_internal_assert(x)
Definition: Macros.h:916
void reallocateSparse()
Definition: AmbiVector.h:85
StorageIndex convert_index(Index idx)
Definition: AmbiVector.h:66
Scalar_ Scalar
Definition: AmbiVector.h:28
StorageIndex_ StorageIndex
Definition: AmbiVector.h:29
double el
Definition: crbond_bessel.cc:27

References Eigen::internal::convert_index(), eigen_assert, eigen_internal_assert, EIGEN_RESTRICT, CRBond_Bessel::el, i, Eigen::IsDense, and Eigen::IsSparse.

Referenced by Eigen::internal::sparse_solve_triangular_sparse_selector< Lhs, Rhs, Mode, UpLo, ColMajor >::run(), and Eigen::internal::sparse_sparse_product_with_pruning_impl().

◆ convert_index()

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::convert_index ( Index  idx)
inlineprotected

◆ init() [1/2]

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::init ( double  estimatedDensity)
130  {
131  if (estimatedDensity > 0.1)
132  init(IsDense);
133  else
134  init(IsSparse);
135 }
void init(double estimatedDensity)
Definition: AmbiVector.h:130

References Eigen::IsDense, and Eigen::IsSparse.

Referenced by Eigen::internal::sparse_solve_triangular_sparse_selector< Lhs, Rhs, Mode, UpLo, ColMajor >::run(), and Eigen::internal::sparse_sparse_product_with_pruning_impl().

◆ init() [2/2]

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::init ( int  mode)
138  {
139  m_mode = mode;
140  // This is only necessary in sparse mode, but we set these unconditionally to avoid some maybe-uninitialized warnings
141  // if (m_mode==IsSparse)
142  {
143  m_llSize = 0;
144  m_llStart = -1;
145  }
146 }

◆ nonZeros()

template<typename Scalar_ , typename StorageIndex_ >
Index Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::nonZeros
Returns
the number of non zeros in the current sub vector
122  {
123  if (m_mode == IsSparse)
124  return m_llSize;
125  else
126  return m_end - m_start;
127 }
StorageIndex m_start
Definition: AmbiVector.h:108

References Eigen::IsSparse.

◆ reallocate()

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::reallocate ( Index  size)
inlineprotected
68  {
69  // if the size of the matrix is not too large, let's allocate a bit more than needed such
70  // that we can handle dense vector even in sparse mode.
71  delete[] m_buffer;
72  if (size < 1000) {
73  Index allocSize = (size * sizeof(ListEl) + sizeof(Scalar) - 1) / sizeof(Scalar);
74  m_allocatedElements = convert_index((allocSize * sizeof(Scalar)) / sizeof(ListEl));
75  m_buffer = new Scalar[allocSize];
76  } else {
77  m_allocatedElements = convert_index((size * sizeof(Scalar)) / sizeof(ListEl));
78  m_buffer = new Scalar[size];
79  }
81  m_start = 0;
82  m_end = m_size;
83  }
SCALAR Scalar
Definition: bench_gemm.cpp:45

References Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::convert_index(), Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_allocatedElements, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_buffer, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_end, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_size, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_start, and Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::size().

Referenced by Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::resize().

◆ reallocateSparse()

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::reallocateSparse ( )
inlineprotected
85  {
86  Index copyElements = m_allocatedElements;
88  Index allocSize = m_allocatedElements * sizeof(ListEl);
89  allocSize = (allocSize + sizeof(Scalar) - 1) / sizeof(Scalar);
90  Scalar* newBuffer = new Scalar[allocSize];
91  std::memcpy(newBuffer, m_buffer, copyElements * sizeof(ListEl));
92  delete[] m_buffer;
93  m_buffer = newBuffer;
94  }
#define min(a, b)
Definition: datatypes.h:22

References Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_allocatedElements, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_buffer, Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_size, and min.

◆ resize()

◆ restart()

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::restart

Must be called whenever we might perform a write access with an index smaller than the previous one.

Don't worry, this function is extremely cheap.

154  {
156 }

Referenced by Eigen::internal::sparse_solve_triangular_sparse_selector< Lhs, Rhs, Mode, UpLo, ColMajor >::run(), and Eigen::internal::sparse_sparse_product_with_pruning_impl().

◆ setBounds()

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::setBounds ( Index  start,
Index  end 
)
inline

◆ setZero()

template<typename Scalar_ , typename StorageIndex_ >
void Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::setZero

Set all coefficients of current subvector to zero

160  {
161  if (m_mode == IsDense) {
162  for (Index i = m_start; i < m_end; ++i) m_buffer[i] = Scalar(0);
163  } else {
165  m_llSize = 0;
166  m_llStart = -1;
167  }
168 }

References eigen_assert, i, Eigen::IsDense, and Eigen::IsSparse.

Referenced by Eigen::internal::sparse_solve_triangular_sparse_selector< Lhs, Rhs, Mode, UpLo, ColMajor >::run(), and Eigen::internal::sparse_sparse_product_with_pruning_impl().

◆ size()

Member Data Documentation

◆ m_allocatedElements

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_allocatedElements
protected

◆ m_allocatedSize

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_allocatedSize
protected

◆ m_buffer

◆ m_end

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_end
protected

◆ m_llCurrent

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_llCurrent
protected

◆ m_llSize

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_llSize
protected

◆ m_llStart

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_llStart
protected

◆ m_mode

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_mode
protected

◆ m_size

◆ m_start

template<typename Scalar_ , typename StorageIndex_ >
StorageIndex Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_start
protected

◆ m_zero

template<typename Scalar_ , typename StorageIndex_ >
Scalar Eigen::internal::AmbiVector< Scalar_, StorageIndex_ >::m_zero
protected

The documentation for this class was generated from the following file: