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());
306 #ifndef SOPLEX_LEGACY 313 for(
int i = vec.
size() - 1; i >= 0; --i )
315 assert(vec.
index(i) < dim());
316 val[vec.
index(i)].addProduct(x, vec.
value(i));
330 for(
int i = vec.
size() - 1; i >= 0; --i )
332 assert(vec.
index(i) < dim());
333 val[vec.
index(i)].subProduct(x, vec.
value(i));
344 template <
class S,
class T >
348 assert(vec.
dim() <= dim());
354 for(
int i = vec.
size() - 1; i>= 0; --i )
355 val[idx[i]] += x * vec[idx[i]];
359 assert(vec.
dim() == dim());
361 for(
int i = dim() - 1; i >= 0; --i )
362 val[i] += x * vec.
val[i];
389 assert(isConsistent());
443 template <
class S,
class T >
454 for(
int i = vec.
size() - 1; i >= 0; --i )
460 x = v[j] + xx * vec.
value(i);
471 x = xx * vec.
value(i);
484 int* endptr = idx + num;
486 for( ; iptr < endptr; ++iptr )
495 num = int(iiptr - idx);
501 assert(isConsistent());
509 template <
class S,
class T >
513 assert(dim() == x.
dim());
514 assert(x.
dim() == y.
dim());
523 int n = x.
size() - 1;
524 int m = y.
size() - 1;
527 if( m >= 0 && n >= 0 )
532 while( i < n && j < m )
548 while( i < n && xi != yj )
551 while( j < m && xi != yj )
560 assert(isConsistent());
569 template <
class S,
class T >
573 assert(A.
num() == dim());
579 for(
int i = dim() - 1; i >= 0; --i )
590 assert(isConsistent());
598 #define shortProductFactor 0.5 600 template <
class S,
class T >
604 assert(A.
num() == x.
dim());
610 assign2product1(A, x);
615 assign2productShort(A, x);
620 assign2productFull(A, x);
624 assert(isConsistent());
633 template <
class S,
class T >
638 assert(x.
size() == 1);
641 const int nzidx = x.
idx[0];
642 const T nzval = x.
val[nzidx];
646 if(
isZero(nzval, epsilon) || Ai.
size() == 0 )
651 for(
int j = num - 1; j >= 0; --j )
659 assert(isConsistent());
668 template <
class S,
class T >
681 int curidx = x.
idx[0];
682 const T x0 = x.
val[curidx];
685 int xsize = x.
size();
689 if(
isZero(x0, epsilon) || num == 0 )
696 for(
int j = 0; j < num; ++j )
699 const R product = x0 * elt.
val;
702 idx[nonzero_idx] = elt.
idx;
712 for(
int i = 1; i < xsize; ++i )
715 const T xi = x.
val[curidx];
720 if (
isNotZero(xi, epsilon) || Aisize == 0 )
723 for(
int j = 0; j < Aisize; ++j )
726 idx[nonzero_idx] = elt.
idx;
738 oldval += xi * elt.
val;
755 for(
int i = 0; i < nonzero_idx; ++i )
763 idx[nz_counter] = curidx;
770 assert(isConsistent());
779 template <
class S,
class T >
791 bool A_is_zero =
true;
792 int xsize = x.
size();
795 for(
int i = 0; i < xsize; ++i )
797 const int curidx = x.
idx[i];
798 const T xi = x.
val[curidx];
802 if( A_is_zero && Aisize > 0 )
805 for(
int j = 0; j < Aisize; ++j )
822 template <
class S,
class T >
827 return assign2product4setup(A, x);
840 for(
int i = 0; i < end; ++i )
852 x.
idx[ nzcount++ ] = i;
854 for(
int j = Ai.
size() - 1; j >= 0; --j )
871 assert(isConsistent());
889 for(
int i = 0; i < s; ++i )
891 int k = rhs.
index(i);
905 assert(isConsistent());
923 for(
int i = 0; i < s; ++i )
925 int k = rhs.
index(i);
939 assert(isConsistent());
976 for(
int i = vec.
dim() - 1; i >= 0; --i )
1007 for(
int i = vec.
dim() - 1; i >= 0; --i )
1028 template <
class R >
1029 template <
class S >
1033 assert(max() >= sv.
size());
1035 set_size(sv.
size());
1039 for(
int i = size() - 1; i >= 0; --i )
1042 e->val = sv[e->idx];
1052 template <
class R >
1059 for(
int i = size() - 1; i >= 0; --i )
1077 template <
class R >
1078 template <
class S >
1083 allocMem((vec.
dim() < 1) ? 2 : vec.
dim());
1086 assert(isConsistent());
1092 template <
class R >
1093 template <
class S >
1098 allocMem(old.
size() < 1 ? 2 : old.
size());
1101 assert(isConsistent());
1107 template <
class R >
1108 template <
class S >
1118 assert(isConsistent());
1126 template <
class R >
1127 template <
class S >
1131 assert(
this != &vec);
1134 makeMem(vec.
size());
1149 template <
class R >
1151 std::ostream& operator<<(std::ostream& s, const VectorBase<R>& vec)
1157 for( i = 0; i < vec.dim() - 1; ++i )
1158 s << vec[i] <<
", ";
1168 template <
class R >
1174 for(
int i = 0; i < res.dim(); ++i )
1183 template <
class R >
1187 assert(v.
dim() == w.
dim());
1191 for(
int i = 0; i < res.dim(); ++i )
1192 res[i] = v[i] + w[i];
1200 template <
class R >
1214 template <
class R >
1224 template <
class R >
1228 assert(v.
dim() == w.
dim());
1232 for(
int i = 0; i < res.dim(); ++i )
1233 res[i] = v[i] - w[i];
1241 template <
class R >
1255 template <
class R >
1261 for(
int i = 0; i < res.dim(); ++i )
1272 template <
class R >
1278 for(
int i = 0; i < res.dim(); ++i )
1287 template <
class R >
1297 template <
class R >
1303 for(
int i = 0; i < v.
size(); ++i )
1312 template <
class R >
1322 template <
class R >
1330 while( s.get(c).good() )
1332 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1344 if( i >= vec.
dim() - 1 )
1348 while( s.get(c).good() )
1350 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1372 template <
class R >
1374 std::ostream& operator<<(std::ostream& os, const SVectorBase<R>& v)
1376 for(
int i = 0, j = 0; i < v.size(); ++i )
1380 if( v.value(i) < 0 )
1381 os <<
" - " << -v.value(i);
1383 os <<
" + " << v.value(i);
1388 os <<
" x" << v.index(i);
1391 if( (i + 1) % 4 == 0 )
1401 template <
class R >
1403 std::ostream& operator<<(std::ostream& os, const SVSetBase<R>& s)
1405 for(
int i = 0; i < s.num(); ++i )
1414 #ifdef SOPLEX_DEBUG_BASEVECTORS 1415 #define SOPLEX_DEBUG 1416 #undef SOPLEX_DEBUG_BASEVECTORS 1419 #endif // _BASEVECTORS_H_ bool isNotZero(Real a, Real eps=Param::epsilon())
returns true iff |a| > eps
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.
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.
Nonzero< R > & element(int n)
Reference to the n 'th nonzero element.
#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.
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.
DVectorBase< R > operator-(const SVectorBase< R > &v, const VectorBase< R > &w)
Subtraction.
DVectorBase< R > operator+(const SVectorBase< R > &v, const VectorBase< R > &w)
Addition.
int & index(int n)
Reference to index of n 'th nonzero.
DVectorBase< R > operator*(const VectorBase< R > &v, R x)
Scaling.
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.
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...
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.
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.