20 #ifndef _BASEVECTORS_H_ 21 #define _BASEVECTORS_H_ 25 #define SOPLEX_DEBUG_BASEVECTORS 39 #define SOPLEX_VECTOR_MARKER 1e-100 62 for(
int i = 0; i < vec.
size(); ++i )
64 assert(vec.
index(i) < dim());
68 assert(isConsistent());
82 for(
int i = vec.
size() - 1; i >= 0; --i )
84 assert(vec.
index(i) < dim());
88 assert(isConsistent());
124 assert(vec.
dim() <= dim());
130 for(
int i = vec.
size() - 1; i >= 0; --i)
132 val[*idx] = vec.
val[*idx];
150 for(
int i = vec.
size() - 1; i >= 0; --i )
152 assert(vec.
index(i) >= 0);
153 assert(vec.
index(i) < dim());
168 assert(dim() == vec.
dim());
172 for(
int i = vec.
size() - 1; i >= 0 ; --i )
177 for(
int i = dim() - 1; i >= 0; --i )
192 for(
int i = vec.
size() - 1; i >= 0; --i )
194 assert(vec.
index(i) >= 0);
195 assert(vec.
index(i) < dim());
210 assert(dim() == vec.
dim());
214 for(
int i = vec.
size() - 1; i >= 0; --i )
219 for(
int i = dim() - 1; i >= 0; --i )
233 assert(dim() >= vec.
dim());
237 for(
int i = vec.
size() - 1; i >= 0; --i )
250 assert(dim() == vec.
dim());
258 for(
int i = vec.
size() - 1; i >= 0; --i )
260 x += val[*idx] * vec.
val[*idx];
274 template <
class S,
class T >
278 for(
int i = vec.
size() - 1; i >= 0; --i )
280 assert(vec.
index(i) < dim());
291 template <
class S,
class T >
295 for(
int i = vec.
size() - 1; i >= 0; --i )
297 assert(vec.
index(i) < dim());
308 template <
class S,
class T >
312 assert(vec.
dim() <= dim());
318 for(
int i = vec.
size() - 1; i>= 0; --i )
319 val[idx[i]] += x * vec[idx[i]];
323 assert(vec.
dim() == dim());
325 for(
int i = dim() - 1; i >= 0; --i )
326 val[i] += x * vec.
val[i];
353 assert(isConsistent());
407 template <
class S,
class T >
418 for(
int i = vec.
size() - 1; i >= 0; --i )
424 x = v[j] + xx * vec.
value(i);
435 x = xx * vec.
value(i);
448 int* endptr = idx + num;
450 for( ; iptr < endptr; ++iptr )
459 num = int(iiptr - idx);
465 assert(isConsistent());
473 template <
class S,
class T >
477 assert(dim() == x.
dim());
478 assert(x.
dim() == y.
dim());
487 int n = x.
size() - 1;
488 int m = y.
size() - 1;
491 if( m >= 0 && n >= 0 )
496 while( i < n && j < m )
512 while( i < n && xi != yj )
515 while( j < m && xi != yj )
524 assert(isConsistent());
533 template <
class S,
class T >
537 assert(A.
num() == dim());
543 for(
int i = dim() - 1; i >= 0; --i )
554 assert(isConsistent());
562 #define shortProductFactor 0.5 564 template <
class S,
class T >
568 assert(A.
num() == x.
dim());
574 assign2product1(A, x);
579 assign2productShort(A, x);
584 assign2productFull(A, x);
588 assert(isConsistent());
597 template <
class S,
class T >
602 assert(x.
size() == 1);
605 const int nzidx = x.
idx[0];
606 const T nzval = x.
val[nzidx];
610 if(
isZero(nzval, epsilon) || Ai.
size() == 0 )
615 for(
int j = num - 1; j >= 0; --j )
623 assert(isConsistent());
632 template <
class S,
class T >
645 int curidx = x.
idx[0];
646 const T x0 = x.
val[curidx];
649 int xsize = x.
size();
653 if(
isZero(x0, epsilon) || num == 0 )
660 for(
int j = 0; j < num; ++j )
663 const R product = x0 * elt.
val;
666 idx[nonzero_idx] = elt.
idx;
676 for(
int i = 1; i < xsize; ++i )
679 const T xi = x.
val[curidx];
684 if (
isNotZero(xi, epsilon) || Aisize == 0 )
687 for(
int j = 0; j < Aisize; ++j )
690 idx[nonzero_idx] = elt.
idx;
702 oldval += xi * elt.
val;
719 for(
int i = 0; i < nonzero_idx; ++i )
727 idx[nz_counter] = curidx;
734 assert(isConsistent());
743 template <
class S,
class T >
755 bool A_is_zero =
true;
756 int xsize = x.
size();
759 for(
int i = 0; i < xsize; ++i )
761 const int curidx = x.
idx[i];
762 const T xi = x.
val[curidx];
766 if( A_is_zero && Aisize > 0 )
769 for(
int j = 0; j < Aisize; ++j )
786 template <
class S,
class T >
791 return assign2product4setup(A, x);
804 for(
int i = 0; i < end; ++i )
816 x.
idx[ nzcount++ ] = i;
818 for(
int j = Ai.
size() - 1; j >= 0; --j )
835 assert(isConsistent());
853 for(
int i = 0; i < s; ++i )
855 int k = rhs.
index(i);
869 assert(isConsistent());
887 for(
int i = 0; i < s; ++i )
889 int k = rhs.
index(i);
903 assert(isConsistent());
940 for(
int i = vec.
dim() - 1; i >= 0; --i )
971 for(
int i = vec.
dim() - 1; i >= 0; --i )
998 assert(max() >= sv.
size());
1005 for(
int i = 0; i < nnz; ++i )
1008 if( sv.
value(idx) != 0.0 )
1024 template <
class R >
1031 for(
int i = size() - 1; i >= 0; --i )
1049 template <
class R >
1050 template <
class S >
1055 allocMem((vec.
dim() < 1) ? 2 : vec.
dim());
1058 assert(isConsistent());
1064 template <
class R >
1065 template <
class S >
1070 allocMem(old.
size() < 1 ? 2 : old.
size());
1073 assert(isConsistent());
1079 template <
class R >
1080 template <
class S >
1090 assert(isConsistent());
1098 template <
class R >
1099 template <
class S >
1103 assert(
this != &vec);
1106 makeMem(vec.
size());
1121 template <
class R >
1123 std::ostream& operator<<(std::ostream& s, const VectorBase<R>& vec)
1129 for( i = 0; i < vec.dim() - 1; ++i )
1130 s << vec[i] <<
", ";
1140 template <
class R >
1146 for(
int i = 0; i < res.dim(); ++i )
1155 template <
class R >
1159 assert(v.
dim() == w.
dim());
1163 for(
int i = 0; i < res.dim(); ++i )
1164 res[i] = v[i] + w[i];
1172 template <
class R >
1186 template <
class R >
1196 template <
class R >
1200 assert(v.
dim() == w.
dim());
1204 for(
int i = 0; i < res.dim(); ++i )
1205 res[i] = v[i] - w[i];
1213 template <
class R >
1227 template <
class R >
1233 for(
int i = 0; i < res.dim(); ++i )
1244 template <
class R >
1250 for(
int i = 0; i < res.dim(); ++i )
1259 template <
class R >
1269 template <
class R >
1275 for(
int i = 0; i < v.
size(); ++i )
1284 template <
class R >
1294 template <
class R >
1302 while( s.get(c).good() )
1304 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1316 if( i >= vec.
dim() - 1 )
1320 while( s.get(c).good() )
1322 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1344 template <
class R >
1346 std::ostream& operator<<(std::ostream& os, const SVectorBase<R>& v)
1348 for(
int i = 0, j = 0; i < v.size(); ++i )
1352 if( v.value(i) < 0 )
1353 os <<
" - " << -v.value(i);
1355 os <<
" + " << v.value(i);
1360 os <<
" x" << v.index(i);
1363 if( (i + 1) % 4 == 0 )
1373 template <
class R >
1375 std::ostream& operator<<(std::ostream& os, const SVSetBase<R>& s)
1377 for(
int i = 0; i < s.num(); ++i )
1386 #ifdef SOPLEX_DEBUG_BASEVECTORS 1387 #define SOPLEX_DEBUG 1388 #undef SOPLEX_DEBUG_BASEVECTORS 1391 #endif // _BASEVECTORS_H_ DVectorBase< R > & operator=(const VectorBase< R > &vec)
Assignment operator.
bool isNotZero(Real a, Real eps=Param::epsilon())
returns true iff |a| > eps
SSVectorBase< R > & assign2productFull(const SVSetBase< S > &A, const SSVectorBase< T > &x)
Assignment helper.
int * idx
array of indices
bool isSetup() const
Returns setup status.
Sparse vector nonzero element.
void reDim(int newdim, const bool setZero=true)
Resets DVectorBase's dimension to newdim.
std::istream & operator>>(std::istream &s, DVectorBase< R > &vec)
Input operator.
VectorBase< R > & operator=(const VectorBase< S > &vec)
Assignment operator.
SSVectorBase< R > & assign(const SVectorBase< S > &rhs)
Assigns only the elements of rhs.
Dynamic dense vectors.Class DVectorBase is a derived class of VectorBase adding automatic memory mana...
Dense vector.Class VectorBase provides dense linear algebra vectors. It does not provide memory manag...
int size() const
Number of used indices.
SSVectorBase< R > & operator-=(const VectorBase< S > &vec)
Subtraction.
Nonzero< R > & element(int n)
Reference to the n 'th nonzero element.
SSVectorBase< R > & assign2product1(const SVSetBase< S > &A, const SSVectorBase< T > &x)
Assignment helper.
#define SOPLEX_VECTOR_MARKER
Dynamic sparse vectors.Class DSVectorBase implements dynamic sparse vectors, i.e. SVectorBases with a...
int memSize() const
Used nonzero memory.
R & value(int n)
Reference to value of n 'th nonzero.
Wrapper for GMP type mpq_class.We wrap mpq_class so that we can replace it by a double type if GMP is...
bool setupStatus
Is the SSVectorBase set up?
int idx
Index of nonzero element.
VectorBase< R > & operator+=(const VectorBase< S > &vec)
Addition.
void addIdx(int i)
appends index i.
Semi sparse vector.This class implements semi-sparse vectors. Such are DVectorBases where the indices...
void add(const SVectorBase< S > &vec)
Append nonzeros of sv.
int dim() const
Dimension of VectorBase.
SSVectorBase< R > & assign2productAndSetup(const SVSetBase< S > &A, SSVectorBase< T > &x)
Assigns SSVectorBase to thereby setting up x.
DVectorBase< R > operator-(const SVectorBase< R > &v, const VectorBase< R > &w)
Subtraction.
DVectorBase< R > operator+(const SVectorBase< R > &v, const VectorBase< R > &w)
Addition.
SSVectorBase< R > & assign2product(const SSVectorBase< S > &x, const SVSetBase< T > &A)
Assigns to SSVectorBase.
int & index(int n)
Reference to index of n 'th nonzero.
DVectorBase< R > operator*(const VectorBase< R > &v, R x)
Scaling.
SSVectorBase< R > & multAdd(S xx, const SVectorBase< T > &vec)
Addition of a scaled vector.
int index(int n) const
Returns index of the n 'th nonzero element.
const int * indexMem() const
Returns array indices.
Debugging, floating point type and parameter definitions.
VectorBase< R > & multAdd(const S &x, const VectorBase< T > &vec)
Addition of scaled vector.
int dim() const
Dimension of vector.
int size() const
Returns the number of nonzeros.
Everything should be within this namespace.
int dim() const
Dimension of the vector defined as maximal index + 1.
SSVectorBase< R > & operator+=(const VectorBase< S > &vec)
Addition.
VectorBase< R > & operator-=(const VectorBase< S > &vec)
Subtraction.
R operator*(const VectorBase< R > &vec) const
Inner product.
R val
Value of nonzero element.
Sparse vectors.Class SVectorBase provides packed sparse vectors. Such are a sparse vectors...
SSVectorBase< R > & assignPWproduct4setup(const SSVectorBase< S > &x, const SSVectorBase< T > &y)
Assigns pair wise vector product to SSVectorBase.
bool isZero(Real a, Real eps=Param::epsilon())
returns true iff |a| <= eps
VectorBase< R > & assign(const SVectorBase< S > &vec)
Assign values of vec.
int num
number of used indices
#define shortProductFactor
Assigns SSVectorBase to for a setup x.
SSVectorBase< R > & assign2productShort(const SVSetBase< S > &A, const SSVectorBase< T > &x)
Assignment helper.
int num() const
Current number of SVectorBases.
DSVectorBase< R > operator*(R x, const SVectorBase< R > &v)
Scaling.
Sparse vector set.Class SVSetBase provides a set of sparse vectors SVectorBase. All SVectorBases in a...
VectorBase< R > & multSub(const S &x, const SVectorBase< T > &vec)
Subtraction of scaled vector.
R value(int n) const
Returns value of the n 'th nonzero element.
SSVectorBase< R > & assign2product4setup(const SVSetBase< S > &A, const SSVectorBase< T > &x)
Assigns SSVectorBase to for a setup x.