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 >
1034 assert(max() >= sv.
size());
1041 for(
int i = 0; i < nnz; ++i )
1044 if( sv.
value(idx) != 0.0 )
1060 template <
class R >
1067 for(
int i = size() - 1; i >= 0; --i )
1085 template <
class R >
1086 template <
class S >
1091 allocMem((vec.
dim() < 1) ? 2 : vec.
dim());
1094 assert(isConsistent());
1100 template <
class R >
1101 template <
class S >
1106 allocMem(old.
size() < 1 ? 2 : old.
size());
1109 assert(isConsistent());
1115 template <
class R >
1116 template <
class S >
1126 assert(isConsistent());
1134 template <
class R >
1135 template <
class S >
1139 assert(
this != &vec);
1142 makeMem(vec.
size());
1157 template <
class R >
1159 std::ostream& operator<<(std::ostream& s, const VectorBase<R>& vec)
1165 for( i = 0; i < vec.dim() - 1; ++i )
1166 s << vec[i] <<
", ";
1176 template <
class R >
1182 for(
int i = 0; i < res.dim(); ++i )
1191 template <
class R >
1195 assert(v.
dim() == w.
dim());
1199 for(
int i = 0; i < res.dim(); ++i )
1200 res[i] = v[i] + w[i];
1208 template <
class R >
1222 template <
class R >
1232 template <
class R >
1236 assert(v.
dim() == w.
dim());
1240 for(
int i = 0; i < res.dim(); ++i )
1241 res[i] = v[i] - w[i];
1249 template <
class R >
1263 template <
class R >
1269 for(
int i = 0; i < res.dim(); ++i )
1280 template <
class R >
1286 for(
int i = 0; i < res.dim(); ++i )
1295 template <
class R >
1305 template <
class R >
1311 for(
int i = 0; i < v.
size(); ++i )
1320 template <
class R >
1330 template <
class R >
1338 while( s.get(c).good() )
1340 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1352 if( i >= vec.
dim() - 1 )
1356 while( s.get(c).good() )
1358 if( c !=
' ' && c !=
'\t' && c !=
'\n' )
1380 template <
class R >
1382 std::ostream& operator<<(std::ostream& os, const SVectorBase<R>& v)
1384 for(
int i = 0, j = 0; i < v.size(); ++i )
1388 if( v.value(i) < 0 )
1389 os <<
" - " << -v.value(i);
1391 os <<
" + " << v.value(i);
1396 os <<
" x" << v.index(i);
1399 if( (i + 1) % 4 == 0 )
1409 template <
class R >
1411 std::ostream& operator<<(std::ostream& os, const SVSetBase<R>& s)
1413 for(
int i = 0; i < s.num(); ++i )
1422 #ifdef SOPLEX_DEBUG_BASEVECTORS 1423 #define SOPLEX_DEBUG 1424 #undef SOPLEX_DEBUG_BASEVECTORS 1427 #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.