15#ifndef ALICEO2_TPC_NDPIECEWISEPOLYNOMIALS
16#define ALICEO2_TPC_NDPIECEWISEPOLYNOMIALS
23#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
33#if !defined(GPUCA_GPUCODE)
46 NDPiecewisePolynomialContainer(
const uint32_t dim,
const uint32_t degree,
const uint32_t nParameters,
const float params[],
const bool interactionOnly,
const float xMin[],
const float xMax[],
const uint32_t nVertices[]) :
mDim{dim},
mDegree{degree},
mParams{
params,
params + nParameters},
mInteractionOnly{interactionOnly},
mMin{xMin, xMin + dim},
mMax{xMax, xMax + dim},
mN{nVertices, nVertices + dim} {};
55 const std::vector<float>
mMin{};
56 const std::vector<float>
mMax{};
57 const std::vector<uint32_t>
mN{};
76template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
80#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
95 NDPiecewisePolynomials() = default;
104#if !defined(GPUCA_GPUCODE)
127 setIndex<Dim - 1>(
x,
index);
137 setIndex<Dim - 1>(
x,
index);
147 GPUd() float getXMin(
const uint32_t dim)
const {
return mMin[dim]; }
150 GPUd() float getXMax(
const uint32_t dim)
const {
return mMax[dim]; }
153 GPUd() float getInvSpacing(
const uint32_t dim)
const {
return mInvSpacing[dim]; }
156 GPUd() uint32_t getNVertices(
const uint32_t dim)
const {
return mN[dim]; }
162 GPUd()
const float* getParams()
const {
return mParams; }
168 void init(
const float min[],
const float max[],
const uint32_t
n[]);
170#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
177 void performFits(
const std::function<
double(
const double x[])>&
func,
const uint32_t nAuxiliaryPoints[]);
204 void dumpToTree(
const uint32_t nSamplingPoints[],
const char* outName =
"debug.root",
const char* treeName =
"tree",
const bool recreateFile =
true)
const;
221 GPUd() static constexpr uint32_t getDim() {
return Dim; }
224 GPUd() static constexpr uint32_t getDegree() {
return Degree; }
227 GPUd() static constexpr
bool isInteractionOnly() {
return InteractionOnly; }
230 using DataTParams = float;
233 float mInvSpacing[Dim]{};
235 DataTParams* mParams{
nullptr};
240 GPUd() int32_t getVertex(
const float x,
const uint32_t dim)
const {
return ((
x - mMin[dim]) * mInvSpacing[dim]); }
244 GPUd() uint32_t getTerms(
const uint32_t dim)
const {
return (dim == 0) ? 1 : (mN[dim - 1] - 1) * getTerms(dim - 1); }
248 GPUd() uint32_t getDataIndex(
const int32_t ix[])
const {
return getDataIndex<Dim - 1>(
ix) * MultivariatePolynomialParametersHelper::getNParameters(
Degree, Dim, InteractionOnly); }
251 template <u
int32_t DimTmp>
259 template <u
int32_t DimTmp>
263 template <uint32_t DimTmp>
266#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
274 void fitInnerGrid(
const std::function<
double(
const double x[])>&
func,
const uint32_t nAuxiliaryPoints[],
const int32_t currentIndex[], TLinearFitter& fitter, std::vector<double>& xCords, std::vector<double>& response);
277 void checkPos(
const uint32_t iMax[], int32_t
pos[])
const;
282 double getStepWidth(
const uint32_t dim,
const int32_t nAuxiliaryPoints)
const {
return 1 / (
static_cast<double>(mInvSpacing[dim]) * (nAuxiliaryPoints - 1)); }
287 double getVertexPosition(
const uint32_t ix,
const int32_t dim)
const {
return ix /
static_cast<double>(mInvSpacing[dim]) + mMin[dim]; }
290#if !defined(GPUCA_GPUCODE)
292 std::size_t sizeOfParameters()
const {
return getNParameters() *
sizeof(DataTParams); }
305#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
306template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
309 if (Dim != container.
mDim) {
310 LOGP(info,
"wrong number of dimensions! this {} container {}", Dim, container.
mDim);
314 LOGP(info,
"wrong number of degrees! this {} container {}",
Degree, container.
mDegree);
318 LOGP(info,
"InteractionOnly is set for this object to {}, but stored as {} in the container", InteractionOnly, container.
mInteractionOnly);
321 init(container.
mMin.data(), container.
mMax.data(), container.
mN.data());
322 setParams(container.
mParams.data());
325template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
328 const auto nParamsPerPol = MultivariatePolynomialParametersHelper::getNParameters(
Degree, Dim, InteractionOnly);
329 const auto nPols = getNPolynomials();
330 std::vector<float>
params(nParamsPerPol);
332 for (
auto i = 0;
i < nPols; ++
i) {
333 std::copy(
params.begin(),
params.end(), &mParams[
i * nParamsPerPol]);
337template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
340 uint32_t nP = getNPolynomials(0);
341 for (uint32_t
i = 1;
i < Dim; ++
i) {
342 nP *= getNPolynomials(
i);
347template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
350 for (uint32_t
i = 0;
i < Dim; ++
i) {
351 if (
pos[
i] == int32_t(iMax[
i])) {
353 std::fill_n(
pos,
i + 1, 0);
361template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
366 for (uint32_t
i = 0;
i < Dim; ++
i) {
367 mMin[
i] = obj.mMin[
i];
368 mMax[
i] = obj.mMax[
i];
369 mInvSpacing[
i] = obj.mInvSpacing[
i];
377template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
380 char* oldFlatBufferPtr = mFlatBufferPtr;
382 char* currFlatBufferPtr = mFlatBufferPtr;
383 mFlatBufferPtr = oldFlatBufferPtr;
384 setActualBufferAddress(currFlatBufferPtr);
387template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
391 const std::size_t flatbufferSize = sizeOfParameters();
393 mParams =
reinterpret_cast<DataTParams*
>(mFlatBufferPtr);
396template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
399 for (uint32_t
i = 0;
i < Dim; ++
i) {
403 mInvSpacing[
i] = (mN[
i] - 1) / (mMax[
i] - mMin[
i]);
409template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
416template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
420 mParams =
reinterpret_cast<DataTParams*
>(mFlatBufferPtr);
423template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
430template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
431template <u
int32_t DimTmp>
434 if constexpr (DimTmp > 0) {
435 return ix[DimTmp] * getTerms(DimTmp) + getDataIndex<DimTmp - 1>(ix);
440template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
441template <u
int32_t DimTmp>
442GPUdi()
void NDPiecewisePolynomials<Dim,
Degree, InteractionOnly>::setIndex(const
float x[], int32_t
index[])
const
444 index[DimTmp] = getVertex(
x[DimTmp], DimTmp);
445 if constexpr (DimTmp > 0) {
446 return setIndex<DimTmp - 1>(
x,
index);
451template <u
int32_t Dim, u
int32_t Degree,
bool InteractionOnly>
452template <u
int32_t DimTmp>
455 if (
index[DimTmp] <= 0) {
458 if (
x[DimTmp] < mMin[DimTmp]) {
459 x[DimTmp] = mMin[DimTmp];
463 if (
index[DimTmp] >= int32_t(mN[DimTmp] - 1)) {
464 index[DimTmp] = mN[DimTmp] - 2;
465 x[DimTmp] = mMax[DimTmp];
469 if constexpr (DimTmp > 0) {
Definition of FlatObject class.
void setFutureBufferAddress(char *futureFlatBufferPtr)
void destroy()
_______________ Utilities _______________________________________________
static T * relocatePointer(const char *oldBase, char *newBase, const T *ptr)
Relocates a pointer inside a buffer to the new buffer address.
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
void startConstruction()
_____________ Construction _________
void moveBufferTo(char *newBufferPtr)
void finishConstruction(int32_t flatBufferSize)
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
void performFits(const std::vector< float > &x, const std::vector< float > &y)
void setActualBufferAddress(char *actualFlatBufferPtr)
set location of external flat buffer
~NDPiecewisePolynomials()=default
default destructor
GPUd() static const expr uint32_t getDim()
void writeToFile(TFile &outf, const char *name) const
void cloneFromObject(const NDPiecewisePolynomials &obj, char *newFlatBufferPtr)
========== FlatObject functionality, see FlatObject class for description =================
void setParams(const float params[])
Setting directly the parameters of the polynomials.
GPUd() static const expr bool isInteractionOnly()
void moveBufferTo(char *newBufferPtr)
void loadFromFile(const char *fileName, const char *name)
GPUd() float getXMin(const uint32_t dim) const
void setDefault()
setting default polynomials which just returns 1
void dumpToTree(const uint32_t nSamplingPoints[], const char *outName="debug.root", const char *treeName="tree", const bool recreateFile=true) const
void init(const float min[], const float max[], const uint32_t n[])
GPUd() uint32_t getNPolynomials(const uint32_t dim) const
NDPiecewisePolynomials(const NDPiecewisePolynomials &obj)
Copy constructor.
NDPiecewisePolynomialContainer getContainer() const
converts the class to a container which can be written to a root file
void performFits(const std::function< double(const double x[])> &func, const uint32_t nAuxiliaryPoints[])
uint32_t getNPolynomials() const
void destroy()
destroy the object (release internal flat buffer)
GPUd() static const expr uint32_t getDegree()
const int32_t index[] const
void loadFromFile(TFile &inpf, const char *name)
GPUd() float getInvSpacing(const uint32_t dim) const
GPUd() float eval(float x[]) const
GPUd() const float *getParams() const
void setFromContainer(const NDPiecewisePolynomialContainer &container)
NDPiecewisePolynomials(const char *fileName, const char *name)
uint32_t getNParameters() const
GPUd() float evalUnsafe(const float x[]) const
NDPiecewisePolynomials()=default
default constructor
GPUd() float getXMax(const uint32_t dim) const
GPUd() uint32_t getNVertices(const uint32_t dim) const
NDPiecewisePolynomials(const float min[], const float max[], const uint32_t n[])
void setFutureBufferAddress(char *futureFlatBufferPtr)
set future location of the flat buffer
GLuint const GLchar * name
GLenum const GLfloat * params
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
simple struct to enable writing the NDPiecewisePolynomials to file
const std::vector< float > mMax
max vertices positions of the grid
NDPiecewisePolynomialContainer()=default
for ROOT I/O
const std::vector< float > mMin
min vertices positions of the grid
const bool mInteractionOnly
consider only interaction terms
NDPiecewisePolynomialContainer(const uint32_t dim, const uint32_t degree, const uint32_t nParameters, const float params[], const bool interactionOnly, const float xMin[], const float xMax[], const uint32_t nVertices[])
const std::vector< float > mParams
parameters of the polynomial
const uint32_t mDim
number of dimensions of the polynomial
const uint32_t mDegree
degree of the polynomials
const std::vector< uint32_t > mN
number of vertices for each dimension