48 std::srand(std::time(
nullptr));
49 const int32_t nPar5D4Deg = 126;
50 const int32_t nDim = 5;
51 const int32_t nDegree = 4;
52 const float abstolerance = 0.0001f;
61 float par[nPar5D4Deg]{20};
62 for (int32_t iter = 0; iter < 10; ++iter) {
65 for (int32_t
i = 1;
i < nPar5D4Deg; ++
i) {
73 for (
float a = 0;
a < 1;
a += 0.2f) {
74 for (
float b = 0;
b < 1;
b += 0.2f) {
75 for (
float c = 0;
c < 1;
c += 0.2f) {
76 for (
float d = 0; d < 1; d += 0.2f) {
77 for (
float e = 0; e < 1; e += 0.2f) {
78 const float arr[nDim]{
a,
b,
c, d, e};
79 const float valCT = polCT.eval(arr);
80 const float valRT = polRT.eval(arr);
82 BOOST_CHECK_SMALL(valCT - valRef, abstolerance);
83 BOOST_CHECK_SMALL(valRT - valRef, abstolerance);
94 std::srand(std::time(
nullptr));
95 const int32_t nPar5D5DegInteraction = 32;
96 const int32_t nDim = 5;
97 const int32_t nDegree = 5;
98 const float abstolerance = 0.0001f;
99 const bool interactionOnly =
true;
108 float par[nPar5D5DegInteraction]{20};
109 for (int32_t iter = 0; iter < 10; ++iter) {
112 for (int32_t
i = 1;
i < nPar5D5DegInteraction; ++
i) {
120 for (
float a = 0;
a < 1;
a += 0.2f) {
121 for (
float b = 0;
b < 1;
b += 0.2f) {
122 for (
float c = 0;
c < 1;
c += 0.2f) {
123 for (
float d = 0; d < 1; d += 0.2f) {
124 for (
float e = 0; e < 1; e += 0.2f) {
125 const float arr[nDim]{
a,
b,
c, d, e};
126 const float valCT = polCT.eval(arr);
127 const float valRT = polRT.eval(arr);
129 BOOST_CHECK_SMALL(valCT - valRef, abstolerance);
130 BOOST_CHECK_SMALL(valRT - valRef, abstolerance);
141 std::srand(std::time(
nullptr));
142 const int32_t nPar5D5DegInteraction = 32;
143 const int32_t nDim = 5;
144 const int32_t nDegree = 5;
145 const bool interactionOnly =
true;
151 std::vector<float> xMin(nDim, 0);
152 std::vector<float> xMax(nDim, 1);
153 const std::vector<uint32_t> nVert(nDim, 4);
154 NDPiecewisePolynomials<nDim, nDegree - 2, interactionOnly> piecewisePol(xMin.data(), xMax.data(), nVert.data());
157 std::function<float(
const double x[])> refFunc = [&polCT, nDim](
const double x[]) {
159 std::copy(
x,
x + nDim,
val);
160 return polCT.eval(
val);
163 float par[nPar5D5DegInteraction]{20};
164 for (int32_t iter = 0; iter < 5; ++iter) {
167 for (int32_t
i = 1;
i < nPar5D5DegInteraction; ++
i) {
174 const uint32_t nAux = 4;
175 const std::vector<uint32_t> nAxiliaryPoints(nDim, nAux);
178 piecewisePol.performFits(refFunc, nAxiliaryPoints.data());
181 for (
float a = 0;
a < 1;
a += 0.2f) {
182 for (
float b = 0;
b < 1;
b += 0.2f) {
183 for (
float c = 0;
c < 1;
c += 0.2f) {
184 for (
float d = 0; d < 1; d += 0.2f) {
185 for (
float e = 0; e < 1; e += 0.2f) {
186 const float arr[nDim]{
a,
b,
c, d, e};
187 const float valCT = polCT.eval(arr);
188 const float valpiecewisePol = piecewisePol.evalUnsafe(arr);
189 if (std::abs(valCT) < 0.2) {
190 BOOST_CHECK_SMALL(valCT - valpiecewisePol, 0.02f);
192 BOOST_CHECK_CLOSE(valpiecewisePol, valCT, 0.5);
201 for (
float a = xMin[0] - 10;
a <= xMin[0];
a += 2.f) {
202 for (
float b = xMin[1] - 10;
b <= xMin[1];
b += 2.f) {
203 for (
float c = xMin[2] - 10;
c <= xMin[2];
c += 2.f) {
204 for (
float d = xMin[3] - 10; d <= xMin[3]; d += 2.f) {
205 for (
float e = xMin[4] - 10; e <= xMin[4]; e += 2.f) {
206 float arr[nDim]{
a,
b,
c, d, e};
207 const float valUnsafeLow = piecewisePol.evalUnsafe(xMin.data());
208 const float valSafeLow = piecewisePol.eval(arr);
209 if (std::abs(valUnsafeLow) < 0.1) {
210 BOOST_CHECK_SMALL(valSafeLow - valUnsafeLow, 0.0001f);
212 BOOST_CHECK_CLOSE(valSafeLow, valUnsafeLow, 0.001);
221 const std::vector<int32_t> indexHigh(nDim, nAux - 2);
222 for (
float a = xMax[0];
a <= xMax[0] + 10;
a += 2.f) {
223 for (
float b = xMax[1];
b <= xMax[1] + 10;
b += 2.f) {
224 for (
float c = xMax[2];
c <= xMax[2] + 10;
c += 2.f) {
225 for (
float d = xMax[3]; d <= xMax[3] + 10; d += 2.f) {
226 for (
float e = xMax[4]; e <= xMax[4] + 10; e += 2.f) {
227 float arr[nDim]{
a,
b,
c, d, e};
228 const float valUnsafeHigh = piecewisePol.evalPol(xMax.data(), indexHigh.data());
229 const float valSafeHigh = piecewisePol.eval(arr);
230 if (std::abs(valUnsafeHigh) < 0.1) {
231 BOOST_CHECK_SMALL(valSafeHigh - valUnsafeHigh, 0.0001f);
233 BOOST_CHECK_CLOSE(valSafeHigh, valUnsafeHigh, 0.001);