Sparse vector set.Class SVSetBase provides a set of sparse vectors SVectorBase. All SVectorBases in an SVSetBase share one big memory block for their nonzeros. This memory is referred to as the nonzero memory. The SVectorBases themselves are saved in another memory block referred to as the vector memory. Both memory blocks will grow automatically if required, when adding more SVectorBases to the set or enlarging SVectorBases within the set. For controlling memory consumption, methods are provided to inquire and reset the size of the memory blocks used for vectors and nonzeros. More...
#include <ssvectorbase.h>
Classes | |
class | DLPSV |
SVectorBase with prev/next pointers. More... | |
Public Member Functions | |
Extension | |
void | add (const SVectorBase< R > &svec) |
Adds svec to the set. More... | |
void | add (DataKey &nkey, const SVectorBase< R > &svec) |
Adds svec to SVSetBase. More... | |
template<class S > | |
void | add (DataKey &nkey, const S *rowValues, const int *rowIndices, int rowSize) |
Adds svec to SVSetBase. More... | |
void | add (const SVectorBase< R > svec[], int n) |
Adds all n SVectorBases in the array svec to the set. More... | |
void | add (DataKey nkey[], const SVectorBase< R > svec[], int n) |
Adds n SVectorBases to SVSetBase. More... | |
template<class S > | |
void | add (const SVSetBase< S > &pset) |
Adds all SVectorBases in pset to SVSetBase. More... | |
template<class S > | |
void | add (DataKey nkey[], const SVSetBase< S > &pset) |
Adds all SVectorBases of pset to SVSetBase. More... | |
SVectorBase< R > * | create (int idxmax=0) |
Creates new SVectorBase in set. More... | |
SVectorBase< R > * | create (DataKey &nkey, int idxmax=-1) |
Creates new SVectorBase in set. More... | |
void | xtend (SVectorBase< R > &svec, int newmax) |
Extends svec to fit newmax nonzeros. More... | |
void | add2 (SVectorBase< R > &svec, int idx, R val) |
Adds nonzero (idx , val ) to svec of this SVSetBase. More... | |
void | add2 (SVectorBase< R > &svec, int n, const int idx[], const R val[]) |
Adds n nonzeros to svec of this SVSetBase. More... | |
template<class S > | |
void | add2 (SVectorBase< R > &svec, int n, const int idx[], const S val[]) |
Adds n nonzeros to svec of this SVSetBase. More... | |
Shrinking | |
void | remove (const DataKey &removekey) |
Removes the vector with key removekey from the set. More... | |
void | remove (int removenum) |
Removes the vector with number removenum from the set. More... | |
void | remove (const SVectorBase< R > *svec) |
Removes one SVectorBase from set. More... | |
void | remove (int perm[]) |
Removes multiple elements. More... | |
void | remove (const DataKey keys[], int n) |
Removes n SVectorBases from set. More... | |
void | remove (const int nums[], int n) |
Removes n SVectorBases from set. More... | |
void | remove (const DataKey keys[], int n, int *perm) |
void | remove (const int nums[], int n, int *perm) |
void | clear (int minNewSize=-1) |
Removes all SVectorBases from set. More... | |
Access | |
SVectorBase< R > & | operator[] (int n) |
Gets SVectorBase by number, writeable. More... | |
const SVectorBase< R > & | operator[] (int n) const |
Gets SVectorBase by number. More... | |
SVectorBase< R > & | operator[] (const DataKey &k) |
Gets SVectorBase by DataKey, writeable. More... | |
const SVectorBase< R > & | operator[] (const DataKey &k) const |
Gets SVectorBase by DataKey. More... | |
Inquiry | |
int | num () const |
Current number of SVectorBases. More... | |
int | max () const |
Current maximum number of SVectorBases. More... | |
DataKey | key (int n) const |
Gets DataKey of vector number. More... | |
DataKey | key (const SVectorBase< R > *svec) const |
Gets DataKey of SVectorBase. More... | |
int | number (const DataKey &k) const |
Gets vector number of DataKey. More... | |
int | number (const SVectorBase< R > *svec) const |
Gets vector number of SVectorBase. More... | |
bool | has (const DataKey &k) const |
True iff SVSetBase contains a SVectorBase for DataKey k . More... | |
bool | has (int n) const |
True iff SVSetBase contains a SVectorBase for vector number n. More... | |
bool | has (const SVectorBase< R > *svec) const |
Is an SVectorBase in the set? More... | |
Memory Management | |
int | memSize () const |
Used nonzero memory. More... | |
int | memMax () const |
Length of nonzero memory. More... | |
void | memRemax (int newmax) |
Reset length of nonzero memory. More... | |
void | memPack () |
Garbage collection in nonzero memory. More... | |
Miscellaneous | |
void | reMax (int newmax=0) |
Resets maximum number of SVectorBases. More... | |
bool | isConsistent () const |
Consistency check. More... | |
Constructors / destructors | |
SVSetBase (int pmax=-1, int pmemmax=-1, double pfac=1.1, double pmemFac=1.2) | |
Default constructor. More... | |
virtual | ~SVSetBase () |
Destructor. More... | |
SVSetBase< R > & | operator= (const SVSetBase< R > &rhs) |
Assignment operator. More... | |
template<class S > | |
SVSetBase< R > & | operator= (const SVSetBase< S > &rhs) |
Assignment operator. More... | |
SVSetBase (const SVSetBase< R > &old) | |
Copy constructor. More... | |
template<class S > | |
SVSetBase (const SVSetBase< S > &old) | |
Copy constructor. More... | |
Private Types | |
typedef ClassArray< Nonzero< R > > | SVSetBaseArray |
Private Member Functions | |
Helpers | |
void | countUnusedMem () |
count size of unused memory exactly More... | |
void | updateUnusedMemEstimation (int change) |
update estimation of unused memory More... | |
void | ensurePSVec (int n) |
Provides enough vector memory for n more SVectorBases. More... | |
void | ensureMem (int n, bool shortenLast=true) |
Provides enough nonzero memory for n more Nonzeros. More... | |
void | deleteVec (DLPSV *ps) |
Deleting a vector from the data array and the list. More... | |
Private Attributes | |
Data | |
DataSet< DLPSV > | set |
set of SVectorBases More... | |
IdList< DLPSV > | list |
doubly linked list for non-zero management More... | |
int | unusedMem |
an estimate of the unused memory (the difference of max() and size() summed up over all vectors) due to deleteVec() and xtend() More... | |
int | numUnusedMemUpdates |
counter for how often unusedMem has been updated since last exact value More... | |
Control Parameters | |
double | factor |
sparse vector memory enlargment factor More... | |
Friends | |
template<class S > | |
class | SVSetBase |
Additional Inherited Members | |
![]() | |
Nonzero< R > & | operator[] (int n) |
Reference to n 'th element. More... | |
const Nonzero< R > & | operator[] (int n) const |
Reference to n 'th const element. More... | |
Nonzero< R > & | last () |
Reference to last element. More... | |
const Nonzero< R > & | last () const |
Reference to last const element. More... | |
Nonzero< R > * | get_ptr () |
Gets a C pointer to the data. More... | |
const Nonzero< R > * | get_const_ptr () const |
Gets a const C pointer to the data. More... | |
void | append (const Nonzero< R > &t) |
Appends element t . More... | |
void | append (int n, const Nonzero< R > t[]) |
Appends n elements from t . More... | |
void | append (const ClassArray< Nonzero< R > > &t) |
Appends all elements from t . More... | |
void | insert (int i, int n) |
Inserts n uninitialized elements before i 'th element. More... | |
void | insert (int i, int n, const Nonzero< R > t[]) |
Inserts n elements from t before i 'the element. More... | |
void | insert (int i, const ClassArray< Nonzero< R > > &t) |
Inserts all elements from t before i 'th element. More... | |
void | remove (int n=0, int m=1) |
Removes m elements starting at n . More... | |
void | removeLast (int m=1) |
Removes m last elements. More... | |
void | clear () |
Removes all elements. More... | |
int | size () const |
Returns number of elements. More... | |
void | reSize (int newsize) |
Resets size to newsize . More... | |
int | max () const |
Returns maximum number of elements. More... | |
ptrdiff_t | reMax (int newMax=1, int newSize=-1) |
Resets maximum number of elements. More... | |
ClassArray & | operator= (const ClassArray &rhs) |
Assignment operator. More... | |
bool | isConsistent () const |
Consistency check. More... | |
ClassArray (const ClassArray &old) | |
Copy constructor. More... | |
ClassArray (int p_size=0, int p_max=0, double p_fac=1.2) | |
Default constructor. More... | |
virtual | ~ClassArray () |
Destructor. More... | |
![]() | |
int | thesize |
number of used elements in array data More... | |
int | themax |
the length of array data and More... | |
Nonzero< R > * | data |
the array of elements More... | |
double | memFactor |
memory extension factor. More... | |
Sparse vector set.
Class SVSetBase provides a set of sparse vectors SVectorBase. All SVectorBases in an SVSetBase share one big memory block for their nonzeros. This memory is referred to as the nonzero memory. The SVectorBases themselves are saved in another memory block referred to as the vector memory. Both memory blocks will grow automatically if required, when adding more SVectorBases to the set or enlarging SVectorBases within the set. For controlling memory consumption, methods are provided to inquire and reset the size of the memory blocks used for vectors and nonzeros.
SVectorBases in an SVSetBase are numbered from 0 thru num()-1. They can be accessed using the index operator[](). When removing SVectorBases of a SVSetBase the remaining ones will be renumbered. However, all SVectorBase with a smaller number than the lowest number of the removed SVectorBases will remain unchanged.
For providing a uniform access to SVectorBases in a set even if others are removed or added, SVSetBase assigns a DataKey to each SVectorBase in the set. Such a DataKey remains unchanged as long as the corresponding SVectorBase is in the SVSetBase, no matter what other SVectorBases are added to or removed from the SVSetBase. Methods are provided for getting the DataKey to a SVectorBase or its number and vice versa. Further, each add() method for enlarging an SVSetBase is provided with two signatures. One of them returns the DataKeys assigned to the SVectorBases added to the SVSetBase.
Definition at line 33 of file ssvectorbase.h.
|
private |
Definition at line 68 of file svsetbase.h.
|
explicit |
Default constructor.
Definition at line 955 of file svsetbase.h.
|
virtual |
Destructor.
Definition at line 966 of file svsetbase.h.
Copy constructor.
Definition at line 1022 of file svsetbase.h.
Copy constructor.
Definition at line 1035 of file svsetbase.h.
void add | ( | const SVectorBase< R > & | svec | ) |
Adds svec
to the set.
This includes copying its nonzeros to the sets nonzero memory and creating an additional SVectorBase entry in vector memory. If neccessary, the memory blocks are enlarged appropriately.
Definition at line 305 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::add(), and LPRowSetBase< Real >::add().
void add | ( | DataKey & | nkey, |
const SVectorBase< R > & | svec | ||
) |
Adds svec
to SVSetBase.
Adds SVectorBase svec
to the set. This includes copying its nonzeros to the sets nonzero memory and creating an additional SVectorBase entry in vector memory. If neccessary, the memory blocks are enlarged appropriately.
nkey
contains the DataKey, that the SVSetBase has assosicated to the new SVectorBase. Definition at line 321 of file svsetbase.h.
void add | ( | DataKey & | nkey, |
const S * | rowValues, | ||
const int * | rowIndices, | ||
int | rowSize | ||
) |
Adds svec
to SVSetBase.
Adds SVectorBase svec
to the set. This includes copying its nonzeros to the sets nonzero memory and creating an additional SVectorBase entry in vector memory. If neccessary, the memory blocks are enlarged appropriately.
nkey
contains the DataKey, that the SVSetBase has assosicated to the new SVectorBase. Definition at line 338 of file svsetbase.h.
void add | ( | const SVectorBase< R > | svec[], |
int | n | ||
) |
Adds all n
SVectorBases in the array svec
to the set.
svec
must hold at least n
entries. Definition at line 355 of file svsetbase.h.
void add | ( | DataKey | nkey[], |
const SVectorBase< R > | svec[], | ||
int | n | ||
) |
Adds n SVectorBases to SVSetBase.
Adds all n
SVectorBases in the array svec
to the set.
nkey
contains the DataKeys, that the SVSetBase has assosicated to the new SVectorBases.nkey
must be large enough to fit n
DataKeys. Definition at line 379 of file svsetbase.h.
void add | ( | const SVSetBase< S > & | pset | ) |
Adds all SVectorBases in pset
to SVSetBase.
Definition at line 389 of file svsetbase.h.
Adds all SVectorBases of pset
to SVSetBase.
Adds all n
SVectorBases in the pset
to an SVSetBase.
nkey
contains the DataKeys, that the SVSetBase has assosicated to the new SVectorBases.nkey
must be large enough to fit pset.num()
DataKeys. Definition at line 414 of file svsetbase.h.
void add2 | ( | SVectorBase< R > & | svec, |
int | idx, | ||
R | val | ||
) |
Adds nonzero (idx
, val
) to svec
of this SVSetBase.
Adds one nonzero (idx
, val
) to SVectorBase svec
in the SVSetBase. If svec
is not large enough to hold the additional nonzero, it will be automatically enlarged within the set.
svec
must be an SVectorBase of the SVSetBase. Definition at line 553 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::add2(), and LPRowSetBase< Real >::add2().
void add2 | ( | SVectorBase< R > & | svec, |
int | n, | ||
const int | idx[], | ||
const R | val[] | ||
) |
Adds n
nonzeros to svec
of this SVSetBase.
Adds n
nonzeros to SVectorBase svec
in the SVSetBase. If svec
is not large enough to hold the additional nonzeros, it will be automatically enlarged within the set.
svec
must be an SVectorBase of the SVSetBase. Definition at line 565 of file svsetbase.h.
void add2 | ( | SVectorBase< R > & | svec, |
int | n, | ||
const int | idx[], | ||
const S | val[] | ||
) |
Adds n
nonzeros to svec
of this SVSetBase.
Adds n
nonzeros to SVectorBase svec
in the SVSetBase. If svec
is not large enough to hold the additional nonzeros, it will be automatically enlarged within the set.
svec
must be an SVectorBase of the SVSetBase. Definition at line 578 of file svsetbase.h.
void clear | ( | int | minNewSize = -1 | ) |
Removes all SVectorBases from set.
Definition at line 688 of file svsetbase.h.
|
private |
count size of unused memory exactly
Definition at line 167 of file svsetbase.h.
Referenced by SVSetBase< Rational >::updateUnusedMemEstimation().
SVectorBase<R>* create | ( | int | idxmax = 0 | ) |
Creates new SVectorBase in set.
The new SVectorBase will be ready to fit at least idxmax
nonzeros.
Definition at line 428 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add(), LPColSetBase< Rational >::create(), SVSetBase< Rational >::create(), LPRowSetBase< Real >::create(), and soplex::initConstVecs().
SVectorBase<R>* create | ( | DataKey & | nkey, |
int | idxmax = -1 |
||
) |
Creates new SVectorBase in set.
The new SVectorBase will be ready to fit at least idxmax
nonzeros.
nkey
contains the DataKey associated to the new SVectorBase. Definition at line 463 of file svsetbase.h.
|
private |
Deleting a vector from the data array and the list.
Definition at line 248 of file svsetbase.h.
Referenced by SVSetBase< Rational >::remove().
|
private |
Provides enough nonzero memory for n
more Nonzeros.
Definition at line 206 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add(), SVSetBase< Rational >::create(), and SVSetBase< Rational >::xtend().
|
private |
Provides enough vector memory for n
more SVectorBases.
Definition at line 195 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add(), and SVSetBase< Rational >::create().
bool has | ( | const DataKey & | k | ) | const |
True iff SVSetBase contains a SVectorBase for DataKey k
.
Definition at line 782 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::has(), LPRowSetBase< Real >::has(), and SVSetBase< Rational >::xtend().
bool has | ( | int | n | ) | const |
True iff SVSetBase contains a SVectorBase for vector number n.
Definition at line 788 of file svsetbase.h.
bool has | ( | const SVectorBase< R > * | svec | ) | const |
Is an SVectorBase in the set?
Definition at line 794 of file svsetbase.h.
bool isConsistent | ( | ) | const |
Consistency check.
Definition at line 921 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::isConsistent(), LPRowSetBase< Real >::isConsistent(), and SVSetBase< Rational >::SVSetBase().
DataKey key | ( | int | n | ) | const |
Gets DataKey of vector number.
Definition at line 758 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add(), SVSetBase< Rational >::create(), LPColSetBase< Rational >::key(), LPRowSetBase< Real >::key(), and SVSetBase< Rational >::remove().
DataKey key | ( | const SVectorBase< R > * | svec | ) | const |
Gets DataKey of SVectorBase.
Definition at line 764 of file svsetbase.h.
int max | ( | ) | const |
Current maximum number of SVectorBases.
Definition at line 752 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::max(), and LPRowSetBase< Real >::max().
int memMax | ( | ) | const |
Length of nonzero memory.
Definition at line 812 of file svsetbase.h.
Referenced by SVSetBase< Rational >::ensureMem(), LPColSetBase< Rational >::memMax(), LPRowSetBase< Real >::memMax(), and SVSetBase< Rational >::memPack().
void memPack | ( | ) |
Garbage collection in nonzero memory.
Pack the svectors together as tightly as possible. This removes all additional unused memory, i.e., size = max for every svector after the call.
Note: do not call isConsistent() here, because the following might happen: In SPxLP::doAddRows(const LPRowSet& p_set), when adding rows, the sizes of the vectors for the columns of the LP are increased (without yet filling in the data) to recieve the additional entries. This is done by calling xtend() above. xtend() in turn might call this method, which checks the yet unfilled positions, i.e., isConsistent() is likely to fail. In general, isConsistent() should not be called within this class, but in classes further up in the hierarchy.
Definition at line 867 of file svsetbase.h.
Referenced by SVSetBase< Rational >::ensureMem(), LPColSetBase< Rational >::memPack(), and LPRowSetBase< Real >::memPack().
void memRemax | ( | int | newmax | ) |
Reset length of nonzero memory.
Definition at line 818 of file svsetbase.h.
Referenced by SVSetBase< Rational >::ensureMem(), LPColSetBase< Rational >::memRemax(), and LPRowSetBase< Real >::memRemax().
int memSize | ( | ) | const |
Used nonzero memory.
Definition at line 806 of file svsetbase.h.
Referenced by SSVectorBase< Real >::assign2product4setup(), SVSetBase< Rational >::countUnusedMem(), SVSetBase< Rational >::create(), SVSetBase< Rational >::ensureMem(), SVSetBase< Rational >::memPack(), SVSetBase< Rational >::memRemax(), LPColSetBase< Rational >::memSize(), LPRowSetBase< Real >::memSize(), SVSetBase< Rational >::updateUnusedMemEstimation(), and SVSetBase< Rational >::xtend().
int num | ( | ) | const |
Current number of SVectorBases.
Definition at line 746 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add(), SPxLPBase< Real >::added2Set(), SSVectorBase< Real >::assign2product(), SSVectorBase< Real >::assign2product4setup(), SPxEquiliSC::computeEquiExpVec(), soplex::computeScalingVec(), SVSetBase< Rational >::create(), SVSetBase< Rational >::ensurePSVec(), soplex::initConstVecs(), LPColSetBase< Rational >::num(), LPRowSetBase< Real >::num(), and SVSetBase< Rational >::remove().
int number | ( | const DataKey & | k | ) | const |
Gets vector number of DataKey.
Definition at line 770 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::number(), LPRowSetBase< Real >::number(), and SVSetBase< Rational >::remove().
int number | ( | const SVectorBase< R > * | svec | ) | const |
Gets vector number of SVectorBase.
Definition at line 776 of file svsetbase.h.
Assignment operator.
Definition at line 970 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::operator=(), and LPRowSetBase< Real >::operator=().
Assignment operator.
Definition at line 1006 of file svsetbase.h.
SVectorBase<R>& operator[] | ( | int | n | ) |
Gets SVectorBase by number, writeable.
Definition at line 716 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::colVector(), LPColSetBase< Rational >::colVector_w(), LPRowSetBase< Real >::rowVector(), and LPRowSetBase< Real >::rowVector_w().
const SVectorBase<R>& operator[] | ( | int | n | ) | const |
Gets SVectorBase by number.
Definition at line 722 of file svsetbase.h.
SVectorBase<R>& operator[] | ( | const DataKey & | k | ) |
Gets SVectorBase by DataKey, writeable.
Definition at line 728 of file svsetbase.h.
const SVectorBase<R>& operator[] | ( | const DataKey & | k | ) | const |
Gets SVectorBase by DataKey.
Definition at line 734 of file svsetbase.h.
void reMax | ( | int | newmax = 0 | ) |
Resets maximum number of SVectorBases.
Definition at line 915 of file svsetbase.h.
Referenced by SVSetBase< Rational >::ensurePSVec(), LPColSetBase< Rational >::reMax(), LPRowSetBase< Real >::reMax(), and SVSetBase< Rational >::reMax().
void remove | ( | const DataKey & | removekey | ) |
Removes the vector with key removekey
from the set.
removekey
must be a key from SVSetBase Definition at line 593 of file svsetbase.h.
Referenced by LPColSetBase< Rational >::remove(), and LPRowSetBase< Real >::remove().
void remove | ( | int | removenum | ) |
Removes the vector with number removenum
from the set.
removenum
must be a valid vector number from SVSetBase Definition at line 602 of file svsetbase.h.
void remove | ( | const SVectorBase< R > * | svec | ) |
Removes one SVectorBase from set.
svec
must be from SVSetBase Definition at line 610 of file svsetbase.h.
void remove | ( | int | perm[] | ) |
Removes multiple elements.
Removes all SVectorBases for the SVSetBase with an index i
such that perm
[i] < 0. Upon completion, perm
[i] >= 0 indicates the new index where the i
'th SVectorBase has been moved to due to this removal.
perm
must point to an array of at least num() integers. Definition at line 621 of file svsetbase.h.
void remove | ( | const DataKey | keys[], |
int | n | ||
) |
Removes n
SVectorBases from set.
keys
must be at least of size n
and valid keys Definition at line 642 of file svsetbase.h.
void remove | ( | const int | nums[], |
int | n | ||
) |
Removes n
SVectorBases from set.
nums
must be at least of size n
and valid vector numbers Definition at line 651 of file svsetbase.h.
void remove | ( | const DataKey | keys[], |
int | n, | ||
int * | perm | ||
) |
Definition at line 658 of file svsetbase.h.
void remove | ( | const int | nums[], |
int | n, | ||
int * | perm | ||
) |
Removes n
SVectorBases from set.
nums
must be at least of size n
perm
must be at least of size num() perm
is the permutations resulting from this removal: perm
[i] < 0 indicates that the element to index i
has been removed. Otherwise, perm
[i] is the new index of the element with index i
before the removal. Definition at line 676 of file svsetbase.h.
|
private |
update estimation of unused memory
Definition at line 185 of file svsetbase.h.
Referenced by SVSetBase< Rational >::deleteVec(), SVSetBase< Rational >::ensureMem(), and SVSetBase< Rational >::xtend().
void xtend | ( | SVectorBase< R > & | svec, |
int | newmax | ||
) |
Extends svec
to fit newmax
nonzeros.
svec
must be an SVectorBase of the SVSetBase. Definition at line 475 of file svsetbase.h.
Referenced by SVSetBase< Rational >::add2(), LPColSetBase< Rational >::xtend(), and LPRowSetBase< Real >::xtend().
|
friend |
Definition at line 64 of file svsetbase.h.
|
private |
sparse vector memory enlargment factor
Definition at line 158 of file svsetbase.h.
doubly linked list for non-zero management
Definition at line 148 of file svsetbase.h.
Referenced by SVSetBase< Rational >::operator=().
|
private |
counter for how often unusedMem has been updated since last exact value
Definition at line 150 of file svsetbase.h.
set of SVectorBases
Definition at line 147 of file svsetbase.h.
|
private |
an estimate of the unused memory (the difference of max() and size() summed up over all vectors) due to deleteVec() and xtend()
Definition at line 149 of file svsetbase.h.