Skip to content

Commit 6df573f

Browse files
authored
Compact monotone component (#423)
* Create basic compact monotone component * Working compact univariate bases * Adding compact to create component * Compiling and running serialization * Working inversion * Working compact monotone component * Working coeffgrad tests * Working tests and create component * lint tests * Fix LogDeterminantInputGrad * Fix Affine tests
1 parent 5467732 commit 6df573f

34 files changed

Lines changed: 1761 additions & 407 deletions

MParT/BasisEvaluator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class BasisEvaluator<BasisHomogeneity::OffdiagHomogeneous,
234234
* @param offdiag Evaluator for offdiagonal input elements
235235
* @param diag Evaluator for diagonal input element
236236
*/
237-
BasisEvaluator(unsigned int dim, OffdiagEvaluatorType const &offdiag = OffdiagEvaluatorType(),
237+
BasisEvaluator(unsigned int dim = 0, OffdiagEvaluatorType const &offdiag = OffdiagEvaluatorType(),
238238
DiagEvaluatorType const &diag = DiagEvaluatorType())
239239
: offdiag_(offdiag), diag_(diag), dim_(dim) {}
240240

MParT/MapFactory.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,15 @@ namespace mpart{
217217
*/
218218
template<typename MemorySpace>
219219
struct CompFactoryImpl{
220-
typedef std::tuple<BasisTypes, bool, PosFuncTypes, QuadTypes> OptionsKeyType;
220+
typedef std::tuple<BasisTypes, bool, PosFuncTypes, QuadTypes, bool> OptionsKeyType;
221221
typedef std::function<std::shared_ptr<ConditionalMapBase<MemorySpace>>(FixedMultiIndexSet<MemorySpace> const&, MapOptions options)> FactoryFunctionType;
222222
typedef std::map<OptionsKeyType, FactoryFunctionType> FactoryMapType;
223223

224224
static FactoryFunctionType GetFactoryFunction(MapOptions opts)
225225
{
226226
bool isLinearized = (!isinf(opts.basisLB)) ||(!isinf(opts.basisUB));
227-
OptionsKeyType optionsKey(opts.basisType, isLinearized, opts.posFuncType, opts.quadType);
227+
bool isCompact = opts.isCompact;
228+
OptionsKeyType optionsKey(opts.basisType, isLinearized, opts.posFuncType, opts.quadType, isCompact);
228229

229230
auto factoryMap = GetFactoryMap();
230231

MParT/MapOptions.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ namespace mpart{
1212
{
1313
ProbabilistHermite,
1414
PhysicistHermite,
15-
HermiteFunctions
15+
HermiteFunctions,
16+
Legendre
1617
};
1718

1819
enum class PosFuncTypes
@@ -76,6 +77,8 @@ namespace mpart{
7677
double basisLB = -std::numeric_limits<double>::infinity();
7778
double basisUB = std::numeric_limits<double>::infinity();
7879

80+
/** Whether the map should be compactly supported (cannot be linearized, only works with certain other map options */
81+
bool isCompact = false;
7982

8083
/** The type of positive bijector used inside the monotonicity-guaranteeing integral
8184
formulation.

MParT/MonotoneComponent.h

Lines changed: 175 additions & 104 deletions
Large diffs are not rendered by default.

MParT/MultivariateExpansionWorker.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,27 @@ class MultivariateExpansionWorker
129129
*/
130130
KOKKOS_INLINE_FUNCTION unsigned int InputSize() const {return multiSet_.Length();};
131131

132+
/**
133+
@brief Fills cache to evaluate f(0)
134+
@details
135+
@param polyCache A pointer to the start of the cache. This memory must be allocated before calling this function.
136+
@param derivType
137+
138+
@see FillCache1, FillCache2
139+
*/
140+
KOKKOS_FUNCTION void FillCache0(double* polyCache,
141+
DerivativeFlags::DerivativeType derivType) const
142+
{
143+
// Only allowed to evaluate, fail if you want derivatives; while possible this is a safety precaution
144+
if(derivType == DerivativeFlags::None || derivType == DerivativeFlags::Parameters){
145+
for(unsigned int d=0; d<dim_; ++d) {
146+
basis1d_.EvaluateAll(d, &polyCache[startPos_(d)], maxDegrees_(d), 0.);
147+
}
148+
} else {
149+
ProcAgnosticError<std::invalid_argument>("Cannot get derivatives for FillCache0");
150+
}
151+
}
152+
132153
/**
133154
@brief Precomputes parts of the cache using all but the last component of the point, i.e., using only \f$x_1,x_2,\ldots,x_{d-1}\f$, not \f$x_d\f$.
134155
@details

MParT/OrthogonalPolynomial.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef ORTHOGONALPOLYNOMIAL_H
2-
#define ORTHOGONALPOLYNOMIAL_H
1+
#ifndef MPART_ORTHOGONALPOLYNOMIAL_H
2+
#define MPART_ORTHOGONALPOLYNOMIAL_H
33

44
#include <Kokkos_Core.hpp>
55
#include <cmath>
@@ -327,6 +327,21 @@ class PhysicistHermiteMixer{
327327
typedef OrthogonalPolynomial<PhysicistHermiteMixer> PhysicistHermite;
328328

329329

330+
class ShiftedLegendreMixer{ // Polynomials orthogonal on U[0,1]
331+
public:
332+
KOKKOS_INLINE_FUNCTION double Normalization(unsigned int polyOrder) const { return 1./(2*polyOrder+1);}
333+
protected:
334+
// \f[ p_{k}(x) = (a_k x + b_k) p_{k-1}(x) - c_k p_{k-2}(x) \f]
335+
KOKKOS_INLINE_FUNCTION double ak(unsigned int k) const {return 2. * (2. * k - 1)/k;}
336+
KOKKOS_INLINE_FUNCTION double bk(unsigned int k) const {return -(2. * k - 1)/k;}
337+
KOKKOS_INLINE_FUNCTION double ck(unsigned int k) const {return (k-1.)/k;}
338+
KOKKOS_INLINE_FUNCTION double phi0(double) const {return 1.0;}
339+
KOKKOS_INLINE_FUNCTION double phi1(double x) const {return 2*x-1;}
340+
KOKKOS_INLINE_FUNCTION double phi1_deriv(double) const{return 2.0;};
341+
};
342+
343+
using ShiftedLegendre = OrthogonalPolynomial<ShiftedLegendreMixer>;
344+
330345
} // namespace mpart
331346

332347
#endif

MParT/UnivariateBases.h

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#ifndef MPART_UNIVARIATEBASES_H
2+
#define MPART_UNIVARIATEBASES_H
3+
4+
#include <Kokkos_Core.hpp>
5+
#include <cmath>
6+
7+
#include <iostream>
8+
9+
#include "MParT/Utilities/MathFunctions.h"
10+
11+
namespace mpart{
12+
13+
/**
14+
* @brief Generic class to represent functions
15+
* \f[p_0(x)\equiv 1,p_k(x)=sin(2\pi k x)\f]
16+
*/
17+
class SineBasis
18+
{
19+
public:
20+
static constexpr double PI2 = 2*M_PI;
21+
22+
/* Evaluates all polynomials up to a specified order. */
23+
KOKKOS_FUNCTION void EvaluateAll(double* output,
24+
unsigned int maxOrder,
25+
double x) const
26+
{
27+
output[0] = 1.;
28+
29+
double sin_x, cos_x, cos_kx;
30+
31+
if(maxOrder>0) {
32+
sin_x = sin(PI2*x);
33+
cos_x = cos(PI2*x);
34+
cos_kx = cos_x;
35+
output[1] = sin_x;
36+
}
37+
38+
for(unsigned int order=2; order<=maxOrder; ++order) {
39+
output[order] = output[order-1]*cos_x + cos_kx*sin_x;
40+
cos_kx = cos_kx*cos_x - output[order-1]*sin_x;
41+
}
42+
}
43+
44+
/** Evaluates the derivative of every polynomial in this family up to degree maxOrder (inclusive).
45+
The results are stored in the memory pointed to by the derivs pointer.
46+
*/
47+
KOKKOS_FUNCTION void EvaluateDerivatives(double* derivs,
48+
unsigned int maxOrder,
49+
double x) const
50+
{
51+
derivs[0] = 0.;
52+
53+
double sin_x, cos_x, sin_kx;
54+
55+
if(maxOrder>0) {
56+
sin_x = sin(PI2*x);
57+
cos_x = cos(PI2*x);
58+
sin_kx = sin_x;
59+
derivs[1] = cos_x;
60+
}
61+
62+
// d_x sin(2pi k x) = 2pi k cos(2pi k x)
63+
for(unsigned int order=2; order<=maxOrder; ++order) {
64+
derivs[order] = derivs[order-1]*cos_x - sin_kx*sin_x;
65+
sin_kx = sin_kx*cos_x + derivs[order-1]*sin_x;
66+
derivs[order-2] *= PI2*(order-2);
67+
}
68+
if(maxOrder>0) derivs[maxOrder-1] *= PI2*(maxOrder-1);
69+
derivs[maxOrder] *= PI2*(maxOrder);
70+
}
71+
72+
/** Evaluates the value and derivative of every polynomial in this family up to degree maxOrder (inclusive).
73+
The results are stored in the memory pointed to by the derivs pointer.
74+
*/
75+
KOKKOS_FUNCTION void EvaluateDerivatives(double* vals,
76+
double* derivs,
77+
unsigned int maxOrder,
78+
double x) const
79+
{
80+
vals[0] = 1.;
81+
derivs[0] = 0.;
82+
83+
double sin_x, cos_x;
84+
85+
if(maxOrder>0) {
86+
sin_x = sin(PI2*x);
87+
cos_x = cos(PI2*x);
88+
vals[1] = sin_x;
89+
derivs[1] = cos_x;
90+
}
91+
92+
for(unsigned int order=2; order<=maxOrder; ++order) {
93+
vals[order] = vals[order-1]*cos_x + derivs[order-1]*sin_x;
94+
derivs[order] = derivs[order-1]*cos_x - vals[order-1]*sin_x;
95+
derivs[order-2] *= PI2*(order-2);
96+
}
97+
if(maxOrder>0) derivs[maxOrder-1] *= PI2*(maxOrder-1);
98+
derivs[maxOrder] *= PI2*(maxOrder);
99+
}
100+
101+
KOKKOS_FUNCTION void EvaluateSecondDerivatives(double* vals,
102+
double* derivs,
103+
double* secondDerivs,
104+
unsigned int maxOrder,
105+
double x) const
106+
{
107+
vals[0] = 1.;
108+
derivs[0] = 0.;
109+
secondDerivs[0] = 0.;
110+
111+
double sin_x, cos_x;
112+
113+
if(maxOrder>0) {
114+
sin_x = sin(PI2*x);
115+
cos_x = cos(PI2*x);
116+
vals[1] = sin_x;
117+
derivs[1] = cos_x;
118+
secondDerivs[1] = -PI2*PI2*vals[1];
119+
}
120+
121+
for(unsigned int order=2; order<=maxOrder; ++order) {
122+
vals[order] = vals[order-1]*cos_x + derivs[order-1]*sin_x;
123+
derivs[order] = derivs[order-1]*cos_x - vals[order-1]*sin_x;
124+
derivs[order-2] *= PI2*(order-2);
125+
secondDerivs[order] = -(PI2*order)*(PI2*order)*vals[order];
126+
}
127+
if(maxOrder > 0) derivs[maxOrder-1] *= PI2*(maxOrder-1);
128+
derivs[maxOrder] *= PI2*(maxOrder);
129+
}
130+
131+
132+
133+
KOKKOS_FUNCTION double Evaluate(unsigned int const order,
134+
double const x) const
135+
{
136+
return order == 0 ? 1. : sin(PI2*order*x);
137+
}
138+
139+
KOKKOS_FUNCTION double Derivative(unsigned int const order,
140+
double const x) const
141+
{
142+
return order == 0 ? 0. : PI2*order*cos(PI2*order*x);
143+
}
144+
145+
KOKKOS_FUNCTION double SecondDerivative(unsigned int const order,
146+
double const x) const
147+
{
148+
return -(PI2*order)*(PI2*order)*sin(PI2*order*x);
149+
}
150+
151+
};
152+
153+
} // namespace mpart
154+
155+
#endif

MParT/Utilities/Serialization.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111

1212
// A macro that can be used for registering the various MonotoneComponent classes with CEREAL
1313
// This macro is used in the MapFactoryImpl*.cpp files
14-
#define REGISTER_MONO_COMP(BASIS_HOMOGENEITY, BASIS_TYPE, POS_TYPE, QUAD_TYPE, MEMORY_SPACE) \
15-
CEREAL_REGISTER_TYPE(mpart::MonotoneComponent<mpart::MultivariateExpansionWorker<mpart::BasisEvaluator<BASIS_HOMOGENEITY, BASIS_TYPE>, MEMORY_SPACE>, mpart::POS_TYPE, mpart::QUAD_TYPE<MEMORY_SPACE>, MEMORY_SPACE>)
14+
#define REGISTER_HOMOGENEOUS_MONO_COMP(BASIS_TYPE, POS_TYPE, QUAD_TYPE, MEMORY_SPACE, IS_COMPACT) \
15+
CEREAL_REGISTER_TYPE(mpart::MonotoneComponent<mpart::MultivariateExpansionWorker<mpart::BasisEvaluator<BasisHomogeneity::Homogeneous, BASIS_TYPE>, MEMORY_SPACE>, mpart::POS_TYPE, mpart::QUAD_TYPE<MEMORY_SPACE>, MEMORY_SPACE, IS_COMPACT>)
16+
#define REGISTER_OFFDIAGHOMOGENEOUS_MONO_COMP(BASIS_TYPE_1, BASIS_TYPE_2, RECTIFIER, POS_TYPE, QUAD_TYPE, MEMORY_SPACE, IS_COMPACT) \
17+
CEREAL_REGISTER_TYPE(mpart::MonotoneComponent<mpart::MultivariateExpansionWorker<mpart::BasisEvaluator<BasisHomogeneity::OffdiagHomogeneous, Kokkos::pair<BASIS_TYPE_1, BASIS_TYPE_2>, RECTIFIER>, MEMORY_SPACE>, mpart::POS_TYPE, mpart::QUAD_TYPE<MEMORY_SPACE>, MEMORY_SPACE, IS_COMPACT>)
1618

1719

1820
namespace cereal {

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ target_sources(mpart
5454
MapFactoryImpl16.cpp
5555
MapFactoryImpl17.cpp
5656
MapFactoryImpl18.cpp
57+
MapFactoryImpl19.cpp
5758

5859
${MPART_OPT_FILES}
5960
Initialization.cpp

src/MapFactoryImpl1.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
using namespace mpart;
1414

1515

16-
template<typename MemorySpace, typename PosFuncType>
16+
template<typename MemorySpace, typename PosFuncType, bool isCompact>
1717
std::shared_ptr<ConditionalMapBase<MemorySpace>> CreateComponentImpl_Phys_ACC(FixedMultiIndexSet<MemorySpace> const& mset, MapOptions opts)
1818
{
1919
BasisEvaluator<BasisHomogeneity::Homogeneous,PhysicistHermite> basis1d(opts.basisNorm);
@@ -24,27 +24,38 @@ std::shared_ptr<ConditionalMapBase<MemorySpace>> CreateComponentImpl_Phys_ACC(Fi
2424
MultivariateExpansionWorker<BasisEvaluator<BasisHomogeneity::Homogeneous,PhysicistHermite>,MemorySpace> expansion(mset, basis1d);
2525
std::shared_ptr<ConditionalMapBase<MemorySpace>> output;
2626

27-
output = std::make_shared<MonotoneComponent<decltype(expansion), PosFuncType, decltype(quad), MemorySpace>>(expansion, quad, opts.contDeriv, opts.nugget);
27+
output = std::make_shared<MonotoneComponent<decltype(expansion), PosFuncType, decltype(quad), MemorySpace, isCompact>>(expansion, quad, opts.contDeriv, opts.nugget);
2828

2929
Kokkos::View<const double*, MemorySpace> coeffs = Kokkos::View<double*,MemorySpace>("Component Coefficients", mset.Size());
3030
output->SetCoeffs(coeffs);
3131
return output;
3232
}
3333

34-
static auto reg_host_phys_acc_exp = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, Exp>));
35-
static auto reg_host_phys_acc_splus = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, SoftPlus>));
34+
static auto reg_host_phys_acc_exp = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis, false), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, Exp, false>));
35+
static auto reg_host_phys_acc_splus = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis, false), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, SoftPlus, false>));
3636
#if defined(MPART_ENABLE_GPU)
37-
static auto reg_device_phys_acc_exp = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, Exp>));
38-
static auto reg_device_phys_acc_splus = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, SoftPlus>));
37+
static auto reg_device_phys_acc_exp = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis, false), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, Exp, false>));
38+
static auto reg_device_phys_acc_splus = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis, false), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, SoftPlus, false>));
39+
#endif
40+
41+
static auto reg_host_phys_acc_exp_compact = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis, true), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, Exp, true>));
42+
static auto reg_host_phys_acc_splus_compact = mpart::MapFactory::CompFactoryImpl<Kokkos::HostSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis, true), CreateComponentImpl_Phys_ACC<Kokkos::HostSpace, SoftPlus, true>));
43+
#if defined(MPART_ENABLE_GPU)
44+
static auto reg_device_phys_acc_exp_compact = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::Exp, QuadTypes::AdaptiveClenshawCurtis, true), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, Exp, true>));
45+
static auto reg_device_phys_acc_splus_compact = mpart::MapFactory::CompFactoryImpl<mpart::DeviceSpace>::GetFactoryMap()->insert(std::make_pair(std::make_tuple(BasisTypes::PhysicistHermite, false, PosFuncTypes::SoftPlus, QuadTypes::AdaptiveClenshawCurtis, true), CreateComponentImpl_Phys_ACC<mpart::DeviceSpace, SoftPlus, true>));
3946
#endif
4047

4148
#if defined(MPART_HAS_CEREAL)
42-
REGISTER_MONO_COMP(BasisHomogeneity::Homogeneous, PhysicistHermite, Exp, AdaptiveClenshawCurtis, Kokkos::HostSpace)
43-
REGISTER_MONO_COMP(BasisHomogeneity::Homogeneous, PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, Kokkos::HostSpace)
49+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, Exp, AdaptiveClenshawCurtis, Kokkos::HostSpace, false)
50+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, Kokkos::HostSpace, false)
51+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, Exp, AdaptiveClenshawCurtis, Kokkos::HostSpace, true)
52+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, Kokkos::HostSpace, true)
4453
#if defined(MPART_ENABLE_GPU)
45-
REGISTER_MONO_COMP(BasisHomogeneity::Homogeneous, PhysicistHermite, Exp, AdaptiveClenshawCurtis, mpart::DeviceSpace)
46-
REGISTER_MONO_COMP(BasisHomogeneity::Homogeneous, PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, mpart::DeviceSpace)
47-
#endif
54+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, Exp, AdaptiveClenshawCurtis, mpart::DeviceSpace, false)
55+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, mpart::DeviceSpace, false)
56+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, Exp, AdaptiveClenshawCurtis, mpart::DeviceSpace, true)
57+
REGISTER_HOMOGENEOUS_MONO_COMP(PhysicistHermite, SoftPlus, AdaptiveClenshawCurtis, mpart::DeviceSpace, true)
58+
#endif
4859

4960
CEREAL_REGISTER_DYNAMIC_INIT(mpartInitMapFactory1)
5061
#endif

0 commit comments

Comments
 (0)