Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Eigen::internal::AmbiVector< _Scalar, _StorageIndex > Class Template Reference

#include <src/eigen/Eigen/src/SparseCore/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 >

Class Documentation

◆ Eigen::internal::AmbiVector::ListEl

struct Eigen::internal::AmbiVector::ListEl
template<typename _Scalar, typename _StorageIndex>
struct Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::ListEl
Class Members
StorageIndex index
StorageIndex next
Scalar value

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
32 {
33 resize(size);
34 }
Scalar m_zero
Definition AmbiVector.h:113
void resize(Index size)
Definition AmbiVector.h:54
StorageIndex size() const
Definition AmbiVector.h:61
StorageIndex m_size
Definition AmbiVector.h:114
StorageIndex m_mode
Definition AmbiVector.h:119
StorageIndex m_allocatedSize
Definition AmbiVector.h:117
Scalar * m_buffer
Definition AmbiVector.h:112
StorageIndex m_allocatedElements
Definition AmbiVector.h:118

References Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::resize(), and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::size().

+ Here is the call graph for this function:

◆ ~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)
256{
257 if (m_mode==IsDense)
258 return m_buffer[i];
259 else
260 {
261 ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
263 if ((m_llSize==0) || (i<llElements[m_llStart].index))
264 {
265 return m_zero;
266 }
267 else
268 {
269 Index elid = m_llStart;
270 while (elid >= 0 && llElements[elid].index<i)
271 elid = llElements[elid].next;
272
273 if (llElements[elid].index==i)
274 return llElements[m_llCurrent].value;
275 else
276 return m_zero;
277 }
278 }
279}
#define EIGEN_RESTRICT
Definition Macros.h:796
#define eigen_assert(x)
Definition Macros.h:579
StorageIndex m_llCurrent
Definition AmbiVector.h:123
StorageIndex m_llStart
Definition AmbiVector.h:122
StorageIndex m_llSize
Definition AmbiVector.h:124
@ IsDense
Definition Constants.h:357
@ IsSparse
Definition Constants.h:358
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:33

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

◆ coeffRef()

template<typename _Scalar , typename _StorageIndex >
_Scalar & Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::coeffRef ( Index  i)
187{
188 if (m_mode==IsDense)
189 return m_buffer[i];
190 else
191 {
192 ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
193 // TODO factorize the following code to reduce code generation
195 if (m_llSize==0)
196 {
197 // this is the first element
198 m_llStart = 0;
199 m_llCurrent = 0;
200 ++m_llSize;
201 llElements[0].value = Scalar(0);
202 llElements[0].index = convert_index(i);
203 llElements[0].next = -1;
204 return llElements[0].value;
205 }
206 else if (i<llElements[m_llStart].index)
207 {
208 // this is going to be the new first element of the list
209 ListEl& el = llElements[m_llSize];
210 el.value = Scalar(0);
211 el.index = convert_index(i);
212 el.next = m_llStart;
214 ++m_llSize;
216 return el.value;
217 }
218 else
219 {
220 StorageIndex nextel = llElements[m_llCurrent].next;
221 eigen_assert(i>=llElements[m_llCurrent].index && "you must call restart() before inserting an element with lower or equal index");
222 while (nextel >= 0 && llElements[nextel].index<=i)
223 {
224 m_llCurrent = nextel;
225 nextel = llElements[nextel].next;
226 }
227
228 if (llElements[m_llCurrent].index==i)
229 {
230 // the coefficient already exists and we found it !
231 return llElements[m_llCurrent].value;
232 }
233 else
234 {
236 {
238 llElements = reinterpret_cast<ListEl*>(m_buffer);
239 }
240 eigen_internal_assert(m_llSize<m_allocatedElements && "internal error: overflow in sparse mode");
241 // let's insert a new coefficient
242 ListEl& el = llElements[m_llSize];
243 el.value = Scalar(0);
244 el.index = convert_index(i);
245 el.next = llElements[m_llCurrent].next;
246 llElements[m_llCurrent].next = m_llSize;
247 ++m_llSize;
248 return el.value;
249 }
250 }
251 }
252}
#define eigen_internal_assert(x)
Definition Macros.h:585
void reallocateSparse()
Definition AmbiVector.h:90
_Scalar Scalar
Definition AmbiVector.h:26
StorageIndex convert_index(Index idx)
Definition AmbiVector.h:64
_StorageIndex StorageIndex
Definition AmbiVector.h:27

References Eigen::internal::convert_index(), eigen_assert, eigen_internal_assert, EIGEN_RESTRICT, Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::ListEl::index, Eigen::IsDense, Eigen::IsSparse, Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::ListEl::next, and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::ListEl::value.

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ convert_index()

template<typename _Scalar , typename _StorageIndex >
StorageIndex Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::convert_index ( Index  idx)
inlineprotected
65 {
66 return internal::convert_index<StorageIndex>(idx);
67 }

Referenced by Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::reallocate(), Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::resize(), and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::setBounds().

+ Here is the caller graph for this function:

◆ init() [1/2]

template<typename _Scalar , typename _StorageIndex >
void Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::init ( double  estimatedDensity)
139{
140 if (estimatedDensity>0.1)
141 init(IsDense);
142 else
143 init(IsSparse);
144}
void init(double estimatedDensity)
Definition AmbiVector.h:138

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().

+ Here is the caller graph for this function:

◆ init() [2/2]

template<typename _Scalar , typename _StorageIndex >
void Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::init ( int  mode)
148{
149 m_mode = mode;
150 if (m_mode==IsSparse)
151 {
152 m_llSize = 0;
153 m_llStart = -1;
154 }
155}
IGL_INLINE void mode(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &X, const int d, Eigen::Matrix< T, Eigen::Dynamic, 1 > &M)
Definition mode.cpp:14

References Eigen::IsSparse.

◆ nonZeros()

template<typename _Scalar , typename _StorageIndex >
Index Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::nonZeros
Returns
the number of non zeros in the current sub vector
130{
131 if (m_mode==IsSparse)
132 return m_llSize;
133 else
134 return m_end - m_start;
135}
StorageIndex m_end
Definition AmbiVector.h:116
StorageIndex m_start
Definition AmbiVector.h:115

References Eigen::IsSparse.

◆ reallocate()

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

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().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ reallocateSparse()

template<typename _Scalar , typename _StorageIndex >
void Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::reallocateSparse ( )
inlineprotected
91 {
92 Index copyElements = m_allocatedElements;
94 Index allocSize = m_allocatedElements * sizeof(ListEl);
95 allocSize = (allocSize + sizeof(Scalar) - 1)/sizeof(Scalar);
96 Scalar* newBuffer = new Scalar[allocSize];
97 std::memcpy(newBuffer, m_buffer, copyElements * sizeof(ListEl));
98 delete[] m_buffer;
99 m_buffer = newBuffer;
100 }

References Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_allocatedElements, Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_buffer, and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_size.

◆ resize()

template<typename _Scalar , typename _StorageIndex >
void Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::resize ( Index  size)
inline
55 {
59 }
void reallocate(Index size)
Definition AmbiVector.h:69

References Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::convert_index(), Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_allocatedSize, Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_size, Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::reallocate(), and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::size().

Referenced by Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::AmbiVector().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ 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.

164{
166}

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

+ Here is the caller graph for this function:

◆ setBounds()

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

Specifies a sub-vector to work on

T * end(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:608

References Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::convert_index(), Eigen::end(), Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_end, and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_start.

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setZero()

template<typename _Scalar , typename _StorageIndex >
void Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::setZero

Set all coefficients of current subvector to zero

171{
172 if (m_mode==IsDense)
173 {
174 for (Index i=m_start; i<m_end; ++i)
175 m_buffer[i] = Scalar(0);
176 }
177 else
178 {
180 m_llSize = 0;
181 m_llStart = -1;
182 }
183}

References eigen_assert, 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().

+ Here is the caller graph for this function:

◆ size()

template<typename _Scalar , typename _StorageIndex >
StorageIndex Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::size ( ) const
inline
61{ return m_size; }

References Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::m_size.

Referenced by Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::AmbiVector(), Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::reallocate(), and Eigen::internal::AmbiVector< _Scalar, _StorageIndex >::resize().

+ Here is the caller graph for this function:

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: