34 #define SOPLEX_DEBUG_SVSETBASE 72 class SVSetBase :
protected ClassArray < Nonzero<R> >
209 "counting unused memory (unusedMem = {}, numUnusedMemUpdates = {}, this = {})\n",
210 unusedMem, numUnusedMemUpdates, (
void*)
this);
216 unusedMem -= ps->size();
218 numUnusedMemUpdates = 0;
221 SPxOut::debug(
this,
" --> NEW: unusedMem = {}\n", unusedMem);
229 numUnusedMemUpdates++;
231 if(unusedMem < 0 || unusedMem >
memSize() || numUnusedMemUpdates >= 1000000)
252 if(list.
last() && shortenLast)
256 int unusedPsMem = ps->max() - ps->size();
257 assert(unusedPsMem >= 0);
261 ps->set_max(ps->size());
265 SPxOut::debug(
this,
"ensureMem, this = {} : updateUnusedMemEstimation -= {}\n", (
void*)
this,
275 if(missingMem > 0 && missingMem <= unusedMem
295 if(ps == list.
last())
301 SPxOut::debug(
this,
"deleteVec (1), this = {} : updateUnusedMemEstimation -= {}\n", (
void*)
this,
302 ps->max() - ps->size());
309 else if(ps != list.
first())
312 int sz = prev->
size();
319 SPxOut::debug(
this,
"deleteVec (2), this = {} : updateUnusedMemEstimation += {}\n", (
void*)
this,
331 SPxOut::debug(
this,
"deleteVec (3), this = {} : updateUnusedMemEstimation += {}\n", (
void*)
this,
385 void add(
DataKey& nkey,
const S* rowValues,
const int* rowIndices,
int rowSize)
387 assert(rowSize <= 0 || rowIndices != 0);
388 assert(rowSize <= 0 || rowValues != 0);
396 new_svec->
assignArray(rowValues, rowIndices, rowSize);
409 for(i = len = 0; i < n; ++i)
410 len += svec[i].
size();
415 for(i = 0; i < n; ++i)
430 for(
int i =
num() - 1; --n; --i)
444 for(i = len = 0; i < n; ++i)
445 len += pset[i].
size();
450 for(i = 0; i < n; ++i)
470 nkey[--n] =
key(--i);
483 if(
memSize() == 0 && idxmax <= 0)
525 if(svec.
max() < newmax)
532 if(ps == list.
last())
547 SPxOut::debug(
this,
"xtend (1), this = {} : updateUnusedMemEstimation -= {}\n", (
void*)
this,
552 ps->setMem(newmax, ps->mem());
575 if(ps != list.
first())
578 int prevsz = prev->
size();
585 SPxOut::debug(
this,
"xtend (2), this = {} : updateUnusedMemEstimation += {}\n", (
void*)
this,
593 ps->setMem(newmax, newps.
mem());
620 svec.
add(n, idx, val);
633 svec.
add(n, idx, val);
648 set.remove(removekey);
654 void remove(
int removenum)
656 remove(
key(removenum));
673 void remove(
int perm[])
680 for(
int i = j - 1; i >= 0; --i)
697 remove(keys, n, perm.
get_ptr());
703 void remove(
const int nums[],
int n)
706 remove(nums, n, perm.
get_ptr());
710 void remove(
const DataKey keys[],
int n,
int* perm)
712 for(
int i =
num() - 1; i >= 0; --i)
716 perm[
number(*keys++)] = -1;
728 void remove(
const int nums[],
int n,
int* perm)
730 for(
int i =
num() - 1; i >= 0; --i)
758 numUnusedMemUpdates = 0;
818 return set.key(static_cast<const DLPSV*>(svec));
824 return set.number(k);
830 return set.number(static_cast<const DLPSV*>(svec));
848 return set.has(static_cast<const DLPSV*>(svec));
878 "counting unused memory (unusedMem = {}, numUnusedMemUpdates = {}, this = {})\n",
879 unusedMem, numUnusedMemUpdates, (
void*)
this);
891 int l_max = ps->max();
895 ps->setMem(l_max, newmem);
904 numUnusedMemUpdates = 0;
907 SPxOut::debug(
this,
" --> NEW: unusedMem = {}, after memRemax({})\n", unusedMem,
929 for(used = 0, ps = list.
first(); ps; ps = list.
next(ps))
931 const int sz = ps->size();
936 for(j = 0; j < sz; ++j)
937 this->SVSetBaseArray::operator[](used + j) = ps->mem()[j];
939 ps->setMem(sz, &this->SVSetBaseArray::operator[](used));
950 "counting unused memory (unusedMem = {}, numUnusedMemUpdates = {}, this = {})\n", unusedMem,
951 numUnusedMemUpdates, (
void*)
this);
953 " --> NEW: unusedMem = {}, zero after memPack() at memMax() = {}\n",
965 numUnusedMemUpdates = 0;
983 #ifdef ENABLE_CONSISTENCY_CHECKS 989 if(!ps->isConsistent())
995 next = list.
next(ps);
997 if(next && ps->mem() + ps->max() != next->mem())
1015 SVSetBase(
int pmax = -1,
int pmemmax = -1,
double pfac = 1.1,
double pmemFac = 1.2)
1016 : SVSetBaseArray(0, (pmemmax > 0) ? pmemmax : 8 * ((pmax > 0) ? pmax : 8), pmemFac)
1017 ,
set((pmax > 0) ? pmax : 8)
1019 , numUnusedMemUpdates(0)
1044 void* delta0 = &(*(
static_cast<SVSetBaseArray*
>(
this)))[0];
1045 void* delta1 = &(*(
static_cast<SVSetBaseArray*
>(
const_cast<SVSetBase<R>*
>(&rhs))))[0];
1046 ptrdiff_t delta =
reinterpret_cast<char*
>(delta0) - reinterpret_cast<char*>(delta1);
1048 for(ps = rhs.list.first(); ps; ps = rhs.list.next(ps))
1050 newps = &
set[rhs.number(ps)];
1052 newps->setMem(ps->max(),
1053 reinterpret_cast<Nonzero<R>*
>(
reinterpret_cast<char*
>(ps->mem()) + delta));
1054 newps->set_size(ps->size());
1065 template <
class S >
1084 , unusedMem(old.unusedMem)
1085 , numUnusedMemUpdates(old.numUnusedMemUpdates)
1086 , factor(old.factor)
1094 template <
class S >
1097 , unusedMem(old.unusedMem)
1098 , numUnusedMemUpdates(old.numUnusedMemUpdates)
1099 , factor(old.factor)
1113 #ifdef SOPLEX_DEBUG_SVSETBASE 1114 #define SOPLEX_DEBUG 1115 #undef SOPLEX_DEBUG_SVSETBASE 1118 #endif // _SVSETBASE_H_ SVSetBase(int pmax=-1, int pmemmax=-1, double pfac=1.1, double pmemFac=1.2)
Default constructor.
void clear(bool pDestroyElements=false)
removes all elements from an IsList.
static void debug(const T *, Args &&... args)
void append(T *elem)
appends elem to end of list.
Sparse vector nonzero element.
ClassSet< DLPSV > set
set of SVectorBases
SVSetBase< R > & operator=(const SVSetBase< R > &rhs)
Assignment operator.
SVectorBase< R > & operator=(const VectorBase< S > &vec)
Assignment operator.
DLPSV & operator=(const DLPSV &rhs)
Assignment operator.
int unusedMem
an estimate of the unused memory (the difference of max() and size() summed up over all vectors) due ...
Generic Real linked list.
Entry identifier class for items of a DataSet.
SVectorBase< R > & operator[](const DataKey &k)
Gets SVectorBase by DataKey, writeable.
void reMax(int newmax=0)
Resets maximum number of SVectorBases.
void ensurePSVec(int n)
Provides enough vector memory for n more SVectorBases.
void setMem(int n, Nonzero< R > *elmem)
Set the memory area where the nonzeros will be stored.
T * get_ptr()
get a C pointer to the data.
void deleteVec(DLPSV *ps)
Deleting a vector from the data array and the list.
int size() const
Number of used indices.
Generic Real linked list.Class IdList implements an intrusive Real linked list as a template class...
DataKey key(const SVectorBase< R > *svec) const
Gets DataKey of SVectorBase.
void set_size(int s)
Set size of the vector.
#define SPX_MSG_INCONSISTENT(name)
DLPSV *const & next() const
Next SVectorBase.
void move(ptrdiff_t delta)
adjusts list pointers to a new memory address.
int number(const DataKey &k) const
Gets vector number of DataKey.
void countUnusedMem()
count size of unused memory exactly
double memFactor
memory extension factor.
bool isConsistent() const
Consistency check.
int memSize() const
Used nonzero memory.
bool has(const SVectorBase< R > *svec) const
Is an SVectorBase in the set?
void add(DataKey &nkey, const S *rowValues, const int *rowIndices, int rowSize)
Adds svec to SVSetBase.
SVectorBase< R > * create(int idxmax=0)
Creates new SVectorBase in set.
void add(DataKey nkey[], const SVSetBase< S > &pset)
Adds all SVectorBases of pset to SVSetBase.
Nonzero< R > & last()
Reference to last element.
Nonzero< R > * mem() const
get pointer to internal memory.
Entry identifier class for items of a DataSet.Every item in a DataSet is assigned a DataKey by which ...
DataKey key(int n) const
Gets DataKey of vector number.
Save arrays of data objects.
DLPSV * thenext
next SVectorBase
void add(DataKey nkey[], const SVectorBase< R > svec[], int n)
Adds n SVectorBases to SVSetBase.
bool has(int n) const
True iff SVSetBase contains a SVectorBase for vector number n.
void add(const SVectorBase< R > &svec)
Adds svec to the set.
int numUnusedMemUpdates
counter for how often unusedMem has been updated since last exact value
DLPSV & operator=(DLPSV &&rhs)
move assignment operator.
SVectorBase< R > * create(DataKey &nkey, int idxmax=-1)
Creates new SVectorBase in set.
ClassArray< Nonzero< R > > SVSetBaseArray
SVSetBase(const SVSetBase< S > &old)
Copy constructor.
void updateUnusedMemEstimation(int change)
update estimation of unused memory
const SVectorBase< R > & operator[](int n) const
Gets SVectorBase by number.
int memMax() const
Length of nonzero memory.
SVectorBase< R > & operator[](int n)
Gets SVectorBase by number, writeable.
int size() const
Returns number of elements.
SVSetBase(const SVSetBase< R > &old)
Copy constructor.
void remove(T *elem)
removes elem from list.
bool has(const DataKey &k) const
True iff SVSetBase contains a SVectorBase for DataKey k.
bool isConsistent() const
Consistency check.
OutputIterator copy(const RangeT &range, OutputIterator out)
double factor
sparse vector memory enlargment factor
SVectorBase with prev/next pointers.
void add(const SVectorBase< R > svec[], int n)
Adds all n SVectorBases in the array svec to the set.
Safe arrays of class objects.Class ClassArray provides safe arrays of general C++ objects (in contras...
DLPSV()
Default constructor.
DLPSV *& next()
Next SVectorBase.
int max() const
Returns maximum number of elements.
void add(DataKey &nkey, const SVectorBase< R > &svec)
Adds svec to SVSetBase.
void reSize(int newsize)
Resets size to newsize.
T * next(const T *elem) const
returns successor of elem or 0, if elem is the last element.
void memRemax(int newmax)
Reset length of nonzero memory.
void memPack()
Garbage collection in nonzero memory.
Set of class objects.Class ClassSet manages of sets of class objects of a template type T...
void add(int i, const R &v)
Append one nonzero (i,v).
Debugging, floating point type and parameter definitions.
DLPSV(DLPSV &©)
move constructor.
ClassArray & operator=(const ClassArray &rhs)
Assignment operator.
bool isConsistent() const
Consistency check.
DLPSV * theprev
previous SVectorBase
SVSetBase< R > & operator=(const SVSetBase< S > &rhs)
Assignment operator.
Nonzero< R > * get_ptr()
Gets a C pointer to the data.
void removeLast(int m=1)
Removes m last elements.
Everything should be within this namespace.
int max() const
Maximal number of indices.
void clear()
Remove all indices.
void add2(SVectorBase< R > &svec, int n, const int idx[], const S val[])
Adds n nonzeros to svec of this SVSetBase.
Nonzero< R > & operator[](int n)
Reference to n 'th element.
DLPSV(const DLPSV ©)
Copy constructor.
ptrdiff_t reMax(int newMax=1, int newSize=-1)
Resets maximum number of elements.
SVectorBase< R > & assignArray(const S *rowValues, const int *rowIndices, int rowSize)
Assignment operator.
Nonzero< R > * data
the array of elements
void clear(int minNewSize=-1)
Removes all SVectorBases from set.
void ensureMem(int n, bool shortenLast=true)
Provides enough nonzero memory for n more Nonzeros.
DLPSV *& prev()
Previous SVectorBase.
void insert(int i, int n)
Inserts n uninitialized elements before i 'th element.
void add2(SVectorBase< R > &svec, int idx, R val)
Adds nonzero (idx, val) to svec of this SVSetBase.
void add2(SVectorBase< R > &svec, int n, const int idx[], const R val[])
Adds n nonzeros to svec of this SVSetBase.
virtual ~SVSetBase()
Destructor.
void xtend(SVectorBase< R > &svec, int newmax)
Extends svec to fit newmax nonzeros.
bool isConsistent() const
consistency check.
void add(const SVSetBase< S > &pset)
Adds all SVectorBases in pset to SVSetBase.
Sparse vectors.Class SVectorBase provides packed sparse vectors. Such are a sparse vectors...
DLPSV *const & prev() const
Previous SVectorBase.
const SVectorBase< R > & operator[](const DataKey &k) const
Gets SVectorBase by DataKey.
T * last() const
returns last element in list.
T * first() const
returns first element in list.
int max() const
Current maximum number of SVectorBases.
int num() const
Current number of SVectorBases.
IdList< DLPSV > list
doubly linked list for non-zero management
int number(const SVectorBase< R > *svec) const
Gets vector number of SVectorBase.
Sparse vector set.Class SVSetBase provides a set of sparse vectors SVectorBase. All SVectorBases in a...
void clear()
Removes all elements.