Skip to content
Snippets Groups Projects
Commit bbd01ac2 authored by Philip Mueller, HS's avatar Philip Mueller, HS
Browse files

Removed the README description of the container interface.

The manual is now the only place where the ointerface is documented.
parent 4cc899cb
No related branches found
No related tags found
No related merge requests found
# Universal Container Interface
The universal container interface is a common semanting among all the
three containers for samples. It was mainly implemented and defined
because of Python's duck typing, which promotes, lets call it that,
a uniform and consisten interface semantic. It consists of basics
and of one extension that is not implemented on C++ level,
but is aviable on Python.
# Info
This folder contains the code for managing samples.
All container implement a common interface.
Once this file contained a description of it.
However it was removed.
Now only the manual contains a documentation of the interface.
## BASE
The base of the UCI consistes of a set of functions
### Construction
This section describes how the container should be constructed.
> ctr(d)
Constructs an empty container which is able to hold dimension of dimension d.
> ctr(d, n)
Construct a container with samples of dimension d and n samples allocated.
### Accessing
This function delas with the accessing.
> addNewSample(s)
This function adds sample s at the end of the container.
This could lead to reallocation and will invalidate all pointers,
references and iterators to samples of that container.
> setSampleTo(s, i)
This function sets the sample that has index i to the provided sample s.
This is like an exchange function.
> getSample(i)
This function returns a copy to the sample at location i.
It is not a reference, this is important.
### Capacity Management
This function delas with the capacity management.
> resize(newSize)
This function changes the size of the container to newSize.
This function is only allowed if the size of the container is zero.
> clear()
This function clears the internal memory of teh container and sets the size to zero.
Note that the number of dimensions is not affected by this.
All references and so on are invalidated.
> Reserve(newCap)
This fucntion allows to püreallocate storage without setting the size of the container.
It only works if the size of the container is zero.
If called on a container that has non zero size, no effect takes place.
### Query functions
Thsi functions allows to access the size of the container.
> nDims()
This function returns the numnber of dimensions samples have inside the container.
> nSamples()
This function returns the number of samples that are allocated inside the container.
> size()
This is an alias for nSamples.
Generally it is the bound for the usage of the the subscript operator if provided.
NOTE:
This function is very special. The idea of thsi interface was to enable an
uniform interface among all sample containers. However there is a probelm.
The operator[], bracket operator, behaves differently.
The sample collection is centred around the idea of the composition of
dimensional array, that forms the sample set. So the bracked operator
returns references to the dimensional arrays, consequently the size
operator of the sample collection returns the number of dimensions.
Hower the sample array and the sample list, are centred about samples,
and not dimensions. There the bracket operator reaturns sampels and
thus the size function returns the numnber of sampels.
This is inconsitent, sice it would lead to a divergence between the
C++ level and the python interface.
The final solution that was choosen was, that the python interface, does not
present a size function in any sample container.
Hower it is possible by using the CMake option YGGDRASIL_PYYGGDRASIL_PROVIDE_SIZEFKT=ON
to enable the issue of such a fucntion.
But there one has the incositency that the size function returns always nSamples.
Which is different on the C++ level.
### First Extension (C++)
This is the first extension of the interface.
They are optional.
> operator[](i)
This function returns a reference, that can be written to, to the ith sample of the container.
Thsi reference must not be a true reference, but can also be a proxy class.
Which must be convertable to a sample.
It is recomended that the cast operation to a non const sample reference is deleted.
#### Python Note
In python this extension is not optional.
However it is not mandatory that __getitem__ returns a reference like structure.
It is allowed to returning a copy.
### Second Extension (C++ & Python)
This extension describes methods to accessing a single dimension.
The sample collection implements this already, be the means of operator[].
That returns a sample array.
This extension requieres the containers to provide the following function.
> getDimensionArray(d)
This function returns a dimension array.
It is not requiered that the returned type provided writting access, meaning a copy can be returned.
In the C++ level thsi is requiered to be a dimensional array.
In Python this should be an Eigen type that can be transformed to NumPy.
### Third Extension
This extension requieres the containers to be initalizable from Eigen types.
The effect of this extension is that the containers can be constructed out of NumPy arrays.
The argument must be of reference type:
Eigen::Ref<MatrixType, 0, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic> >
where MatrixType is a Matrix.
The 0 is probably for Eigen::Unaligned.
This typedef comes from the pybind manual.
How the matrix is interpreted can be selected by an argument of the constructor.
It is also recomeneded that column and row major matrices are supported, at least in C++.
Note that in C++ allmost all calls are reduced to a templated function.
This function will exploit the UCI itself.
> ctr(mat, order)
This function construct a container out of the matrix mat.
How the columns and rows are interpreted is controled by the parmeter order.
It basically describes how the row of _any_ matrix is interpeted.
Note that not all combination of matriox and order paramter are fast and efficient.
> getMatrix(order)
This function returns an Eigen Matrix.
With the order parameter it can be controlled how the matrix is written.
#### The ORDER Parameter.
The order Parameter is implemented as an enum, the name of this enum is eMatrixViewRow.
It describes, how a row of a matrix should be interpreted.
It is important to note that this does not depend on the matrix layout of the matrix.
It can have two values.
> Sample
This means that one row is interpreted as one sample.
Thus the number of columns is the dimeinsionality of the problem.
> Dimension (rather !Sample)
It is as distinct value present, but technically every value that is not Sample will be interpreted as this one.
It says that the row of a matrix represents a dimension.
Thus the number of columns is the number of samples and the number of rows is the dimensionality.
### Forth Extension
This extension allows the manipulation of a single sample, without the need of loading it.
In addition it also allows to manipulate one dimension at once.
It can also be seen as an extension of the second extension.
> setSampleComponent(i, j, v)
This function sets the jth component of the ith sample to the value v.
This functionality is provided because only the sample list, which should be avoided,
could provide an easy and efficient way to achieve that.
> getSampleComponent(i, j)
This function returns the value of the jth component of the ith sample of the container.
> setDimensionTo(j, v)
This function sets the jth dimension of all samples to v.
> setDimensionArray(j, a)
This function exchanges the values of dinmension j with the values in the dimensional array a.
The dimension parameter of the array will be ignored.
This fucntion is like the setDimensionTo function, but allows to use a seperate value for the samples.
There is also an overload of thsi function of an Eigen type, whioch allows its usage in Python.
Note: The collection provides more overloads which exploids the internal structure of it.
#### Future Extension
There is the possibility that this extension could also be extended such that index arrays could be used.
In that case v must also be an array as well.
But they are not yet defined nor implemented.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment