4#ifndef OPENVDB_POINTS_POINT_PRINCIPAL_COMPONENT_ANALYSIS_IMPL_HAS_BEEN_INCLUDED
5#define OPENVDB_POINTS_POINT_PRINCIPAL_COMPONENT_ANALYSIS_IMPL_HAS_BEEN_INCLUDED
8#ifdef OPENVDB_PROFILE_PCA
16#define OPENVDB_PCA_SELF_CONTRIBUTION 1
25#ifdef OPENVDB_PROFILE_PCA
29inline void start(
const char*) {}
40 inline void start(
const char* msg)
66template <
typename T,
typename LeafNodeT>
69 auto& array = leaf.attributeArray(idx);
73 const char* data = array.constDataAsByteArray();
74 return reinterpret_cast<T*
>(
const_cast<char*
>(data));
94template <
typename Po
intDataTreeT>
169#if OPENVDB_PCA_SELF_CONTRIBUTION == 0
175 bool endPointLeaf(
const typename PointDataTreeT::LeafNodeType&) {
return true; }
184#if OPENVDB_PCA_SELF_CONTRIBUTION == 0
185 bool mIsSameLeaf {
false};
189template <
typename Po
intDataTreeT>
195 static const Index DIM = PointDataTreeT::LeafNodeType::DIM;
203 :
BaseT(indices, settings, vs, manager, interrupt)
205 , mWeightedPositions()
211 , mWeightedPositions()
227 const auto*
const data = this->
template buffer<0>();
230 const float searchRadiusInv = 1.0f / this->
searchRadius();
241 for (
Index srcid = start; srcid < end; srcid += step) {
245 for (
Coord c = a; c.
x() <= b.
x(); ++c.x()) {
246 const Real minx = c.x() - 0.5;
247 const Real maxx = c.x() + 0.5;
249 (PsrcIS[0] < minx ?
math::Pow2(PsrcIS[0] - minx) :
250 (PsrcIS[0] > maxx ?
math::Pow2(PsrcIS[0] - maxx) : 0));
251 if (dminx > searchRadiusIS2)
continue;
253 for (c.y() = a.
y(); c.y() <= b.
y(); ++c.y()) {
254 const Real miny = c.y() - 0.5;
255 const Real maxy = c.y() + 0.5;
256 const Real dminxy = dminx +
257 (PsrcIS[1] < miny ?
math::Pow2(PsrcIS[1] - miny) :
258 (PsrcIS[1] > maxy ?
math::Pow2(PsrcIS[1] - maxy) : 0));
259 if (dminxy > searchRadiusIS2)
continue;
261 for (c.z() = a.
z(); c.z() <= b.
z(); ++c.z()) {
262 const Index offset = ij + (c.z() & (
DIM-1u));
263 if (!
mask.isOn(offset))
continue;
265 const Real minz = c.z() - 0.5;
266 const Real maxz = c.z() + 0.5;
267 const Real dminxyz = dminxy +
268 (PsrcIS[2] < minz ?
math::Pow2(PsrcIS[2] - minz) :
269 (PsrcIS[2] > maxz ?
math::Pow2(PsrcIS[2] - maxz) : 0));
271 if (dminxyz > searchRadiusIS2)
continue;
274 const Index targetEnd = data[offset];
275 const Index targetStart = (offset == 0) ? 0 :
Index(data[offset - 1]);
276 const Index targetStep =
283 for (
Index tgtid = targetStart; tgtid < targetEnd; tgtid += targetStep) {
284#if OPENVDB_PCA_SELF_CONTRIBUTION == 0
288 const Real d2 = (Psrc - Ptgt).lengthSqr();
289 if (d2 > searchRadius2)
continue;
295 mWeights[tgtid] += weight;
296 mWeightedPositions[tgtid] += Psrc * weight;
308 auto& leaf = this->
mManager.leaf(idx);
313 auto& array = leaf.attributeArray(this->
mIndices.mEllipsesGroupIndex.first);
323 if ((threshold == 0 || (mCounts[i] < threshold)) && group.
getUnsafe(i)) {
326 if (mCounts[i] <= 0)
continue;
329 mWeights[i] = 1.0 / mWeights[i];
330 mWeightedPositions[i] *= mWeights[i];
338 std::vector<int32_t> mCounts;
341template <
typename Po
intDataTreeT>
347 static const Index DIM = PointDataTreeT::LeafNodeType::DIM;
355 :
BaseT(indices, settings, vs, manager, interrupt)
356 , mInclusionGroupHandle()
358 , mWeightedPositions()
363 , mInclusionGroupHandle()
365 , mWeightedPositions()
371 mInclusionGroupHandle = std::make_unique<points::GroupHandle>(leaf.groupHandle(this->mIndices.mEllipsesGroupIndex));
381 const auto*
const data = this->
template buffer<0>();
384 const float searchRadiusInv = 1.0f/this->
searchRadius();
395 for (
Index srcid = start; srcid < end; srcid += step) {
399 for (
Coord c = a; c.
x() <= b.
x(); ++c.x()) {
400 const Real minx = c.x() - 0.5;
401 const Real maxx = c.x() + 0.5;
403 (PsrcIS[0] < minx ?
math::Pow2(PsrcIS[0] - minx) :
404 (PsrcIS[0] > maxx ?
math::Pow2(PsrcIS[0] - maxx) : 0));
405 if (dminx > searchRadiusIS2)
continue;
407 for (c.y() = a.
y(); c.y() <= b.
y(); ++c.y()) {
408 const Real miny = c.y() - 0.5;
409 const Real maxy = c.y() + 0.5;
410 const Real dminxy = dminx +
411 (PsrcIS[1] < miny ?
math::Pow2(PsrcIS[1] - miny) :
412 (PsrcIS[1] > maxy ?
math::Pow2(PsrcIS[1] - maxy) : 0));
413 if (dminxy > searchRadiusIS2)
continue;
415 for (c.z() = a.
z(); c.z() <= b.
z(); ++c.z()) {
416 const Index offset = ij + (c.z() & (
DIM-1u));
417 if (!
mask.isOn(offset))
continue;
419 const Real minz = c.z() - 0.5;
420 const Real maxz = c.z() + 0.5;
421 const Real dminxyz = dminxy +
422 (PsrcIS[2] < minz ?
math::Pow2(PsrcIS[2] - minz) :
423 (PsrcIS[2] > maxz ?
math::Pow2(PsrcIS[2] - maxz) : 0));
425 if (dminxyz > searchRadiusIS2)
continue;
427 const Index targetEnd = data[offset];
428 const Index targetStart = (offset == 0) ? 0 :
Index(data[offset - 1]);
429 const Index targetStep =
432 for (
Index tgtid = targetStart; tgtid < targetEnd; tgtid += targetStep) {
433 if (!mInclusionGroupHandle->get(tgtid))
continue;
434#if OPENVDB_PCA_SELF_CONTRIBUTION == 0
438 const Real d2 = (Psrc - Ptgt).lengthSqr();
439 if (d2 > searchRadius2)
continue;
443 const WeightSumT totalWeightInv = mWeights[tgtid];
459 float*
const m = mCovMats[tgtid].
asPointer();
465 m[0] += float(x[0] * posMeanDiff[0]);
466 m[1] += float(x[0] * posMeanDiff[1]);
467 m[2] += float(x[0] * posMeanDiff[2]);
469 m[3] += float(x[1] * posMeanDiff[0]);
470 m[4] += float(x[1] * posMeanDiff[1]);
471 m[5] += float(x[1] * posMeanDiff[2]);
473 m[6] += float(x[2] * posMeanDiff[0]);
474 m[7] += float(x[2] * posMeanDiff[1]);
475 m[8] += float(x[2] * posMeanDiff[2]);
490 std::vector<int32_t> mCounts;
495template <
typename Scalar>
500 if (vector[0] < vector[1]) {
501 std::swap(vector[0], vector[1]);
502 std::swap(order[0], order[1]);
504 if (vector[1] < vector[2]) {
505 std::swap(vector[1], vector[2]);
506 std::swap(order[1], order[2]);
508 if (vector[0] < vector[1]) {
509 std::swap(vector[0], vector[1]);
510 std::swap(order[0], order[1]);
522template <
typename Scalar>
531 if (!diagonalized)
return false;
546template <
typename Po
intDataGr
idT>
556 using PointDataTreeT =
typename PointDataGridT::TreeType;
558 using LeafNodeT =
typename PointDataTreeT::LeafNodeType;
561 const auto leaf =
tree.cbeginLeaf();
568 const auto initAttribute = [&](
const std::string& name,
const auto val)
570 using ValueT = std::decay_t<
decltype(val)>;
571 if (leaf->hasAttribute(name)) {
576 return leaf->attributeSet().find(name);
581 const size_t pvsIdx = leaf->attributeSet().find(
"P");
582 const auto& xform =
points.constTransform();
583 const double vs = xform.voxelSize()[0];
584 LeafManagerT manager(
tree);
592 const auto& descriptor = leaf->attributeSet().descriptor();
593 const std::vector<std::string> temps {
594 descriptor.uniqueName(
"_weightedpositionsums"),
595 descriptor.uniqueName(
"_inv_weightssum")
602 if (!leaf->attributeSet().descriptor().hasGroup(attrs.
ellipses)) {
609 const GroupIndexT ellipsesIdx =
610 leaf->attributeSet().descriptor().groupIndex(attrs.
ellipses);
616 timer.start(
"Compute position world spaces");
617 manager.foreach([&](LeafNodeT& leafnode,
size_t)
623 PwsT* Pws = initPcaArrayAttribute<PwsT>(leafnode, pwsIdx,
false);
625 for (
auto voxel = leafnode.cbeginValueOn(); voxel; ++voxel) {
626 const Coord voxelCoord = voxel.getCoord();
628 for (
auto iter = leafnode.beginIndexVoxel(voxelCoord); iter; ++iter) {
629 Pws[*iter] = xform.indexToWorld(Pvs.
get(*iter) + coordVec);
638 indices.mPosSumIndex = posSumIndex;
639 indices.mWeightSumIndex = weightSumIndex;
640 indices.mCovMatrixIndex = rotIdx;
641 indices.mPWsIndex = pwsIdx;
642 indices.mEllipsesGroupIndex = ellipsesIdx;
652 timer.start(
"Compute position weights");
654 WeightPosSumsTransfer<PointDataTreeT>
655 transfer(indices, settings,
float(vs), manager, settings.
interrupter);
665 timer.start(
"Compute covariance matrices");
667 CovarianceTransfer<PointDataTreeT>
668 transfer(indices, settings,
float(vs), manager, settings.
interrupter);
677 timer.start(
"Decompose covariance matrices");
678 manager.foreach([&](LeafNodeT& leafnode,
size_t)
682 GroupHandle ellipsesGroupHandle(leafnode.groupHandle(ellipsesIdx));
684 for (
Index idx = 0; idx < stretchHandle.
size(); ++idx) {
685 if (!ellipsesGroupHandle.
get(idx)) {
693 decomposeSymmetricMatrix(rotHandle.
get(idx), u, sigma);
697 sigma[1] = std::max(sigma[1], maxs);
698 sigma[2] = std::max(sigma[2], maxs);
712 stretchHandle.
set(idx, sigma);
713 rotHandle.
set(idx, u);
727 timer.start(
"Normalise the principal lengths");
728 manager.foreach([&](LeafNodeT& leafnode,
size_t)
731 filter.
reset(leafnode);
734 for (
Index i = 0; i < stretchHandle.
size(); ++i)
736 if (!filter.
valid(&i))
continue;
737 const Vec3f stretch = stretchHandle.
get(i);
739 const float stretchScale = 1.0f / std::cbrt(stretch.
product());
740 stretchHandle.
set(i, stretchScale * stretch);
752 timer.start(
"Laplacian smooth positions");
755 manager.foreach([&](LeafNodeT& leafnode,
size_t) {
769 Pws.
set(i, smoothedPosition);
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
Definition Exceptions.h:59
Axis-aligned bounding box of signed integer coordinates.
Definition Coord.h:252
const Coord & min() const
Definition Coord.h:324
const Coord & max() const
Definition Coord.h:325
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:26
Vec3d asVec3d() const
Definition Coord.h:144
Int32 y() const
Definition Coord.h:132
Int32 x() const
Definition Coord.h:131
Int32 z() const
Definition Coord.h:133
3x3 matrix class.
Definition Mat3.h:29
Vec3< T > col(int j) const
Get jth column, e.g. Vec3d v = m.col(0);.
Definition Mat3.h:168
static const Mat3< float > & identity()
Definition Mat3.h:121
void setColumns(const Vec3< T > &v1, const Vec3< T > &v2, const Vec3< T > &v3)
Set the columns of this matrix to the vectors v1, v2, v3.
Definition Mat3.h:209
T * asPointer()
Definition Vec3.h:95
T product() const
Return the product of all the vector components.
Definition Vec3.h:357
static Vec3< float > zero()
Definition Vec3.h:467
static Vec3< float > ones()
Definition Vec3.h:468
Definition AttributeArray.h:764
Index size() const
Definition AttributeArray.h:786
ValueType get(Index n, Index m=0) const
Definition AttributeArray.h:2058
Util::GroupIndex GroupIndex
Definition AttributeSet.h:317
Write-able version of AttributeHandle.
Definition AttributeArray.h:832
void set(Index n, const ValueType &value)
Definition AttributeArray.h:2115
Index filtering on group membership.
Definition AttributeGroup.h:136
void reset(const LeafT &leaf)
Definition AttributeGroup.h:151
bool valid(const IterT &iter) const
Definition AttributeGroup.h:156
Definition AttributeGroup.h:74
std::unique_ptr< GroupHandle > UniquePtr
Definition AttributeGroup.h:77
bool getUnsafe(Index n) const
Definition AttributeGroup.h:103
void setUnsafe(Index n, bool on)
Set on at the given index n (assumes in-core and non-uniform)
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition LeafManager.h:86
Simple timer for basic profiling.
Definition CpuTimer.h:67
bool diagonalizeSymmetricMatrix(const Mat3< T > &input, Mat3< T > &Q, Vec3< T > &D, unsigned int MAX_ITERATIONS=250)
Use Jacobi iterations to decompose a symmetric 3x3 matrix (diagonalize and compute eigenvectors)
Definition Mat3.h:736
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance.
Definition Math.h:349
float Sqrt(float x)
Return the square root of a floating-point value.
Definition Math.h:761
Mat3< float > Mat3s
Definition Mat3.h:832
Vec3< double > Vec3d
Definition Vec3.h:665
float Round(float x)
Return x rounded to the nearest integer.
Definition Math.h:819
Type Pow3(Type x)
Return x3.
Definition Math.h:552
Vec3< int32_t > Vec3i
Definition Vec3.h:662
Vec3< float > Vec3s
Definition Vec3.h:664
Type Pow2(Type x)
Return x2.
Definition Math.h:548
Definition PrincipalComponentAnalysisImpl.h:23
double WeightSumT
Definition PrincipalComponentAnalysisImpl.h:53
NoTimer TimerT
Definition PrincipalComponentAnalysisImpl.h:32
Vec3i descendingOrder(math::Vec3< Scalar > &vector)
Sort a vector into descending order and output a vector of the resulting order.
Definition PrincipalComponentAnalysisImpl.h:497
T * initPcaArrayAttribute(LeafNodeT &leaf, const size_t idx, const bool fill=true)
Definition PrincipalComponentAnalysisImpl.h:67
points::AttributeSet::Descriptor::GroupIndex GroupIndexT
Definition PrincipalComponentAnalysisImpl.h:55
bool decomposeSymmetricMatrix(const math::Mat3< Scalar > &mat, math::Mat3< Scalar > &U, math::Vec3< Scalar > &sigma)
Decomposes a symmetric matrix into its eigenvalues and a rotation matrix of eigenvectors....
Definition PrincipalComponentAnalysisImpl.h:524
Vec3d WeightedPositionSumT
Definition PrincipalComponentAnalysisImpl.h:54
Definition AttributeArray.h:42
void setGroup(PointDataTreeT &tree, const PointIndexTreeT &indexTree, const std::vector< short > &membership, const Name &group, const bool remove=false)
Sets group membership from a PointIndexTree-ordered vector.
Definition PointGroupImpl.h:438
void appendGroup(PointDataTreeT &tree, const Name &group)
Appends a new empty group to the VDB tree.
Definition PointGroupImpl.h:209
void pca(PointDataGridT &points, const PcaSettings &settings, const PcaAttributes &attrs)
Calculate ellipsoid transformations from the local point distributions as described in Yu and Turk's ...
Definition PrincipalComponentAnalysisImpl.h:548
void appendAttribute(PointDataTreeT &tree, const Name &name, const NamePair &type, const Index strideOrTotalSize=1, const bool constantStride=true, const Metadata *defaultValue=nullptr, const bool hidden=false, const bool transient=false)
Appends a new attribute to the VDB tree (this method does not require a templated AttributeType)
Definition PointAttributeImpl.h:103
void dropAttributes(PointDataTreeT &tree, const std::vector< size_t > &indices)
Drops attributes from the VDB tree.
Definition PointAttributeImpl.h:238
void rasterize(const PointDataTreeOrGridT &points, TransferT &transfer)
Perform potentially complex rasterization from a user defined transfer scheme. See below comments for...
Definition PointTransfer.h:700
Definition PointDataGrid.h:170
bool wasInterrupted(T *i, int percent=-1)
Definition NullInterrupter.h:49
Index32 Index
Definition Types.h:54
math::Vec3< float > Vec3f
Definition Types.h:74
double Real
Definition Types.h:60
constexpr T zeroVal()
Return the value of type T that corresponds to zero.
Definition Math.h:70
const char * typeNameAsString()
Definition Types.h:587
Definition Exceptions.h:13
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
Helper metafunction used to determine if the first template parameter is a specialization of the clas...
Definition Types.h:263
static T value()
Definition Math.h:148
InterruptableTransfer(util::NullInterrupter *const interrupt)
Definition PointTransfer.h:232
static const char * name()
Definition AttributeArray.h:443
The persistent attributes created by the PCA methods.
Definition PrincipalComponentAnalysis.h:156
std::string rotation
Definition PrincipalComponentAnalysis.h:167
math::Vec3< float > StretchT
Settings for the "stretch" attribute, a floating point vector attribute which represents the scaling ...
Definition PrincipalComponentAnalysis.h:160
std::string positionWS
Definition PrincipalComponentAnalysis.h:176
std::string ellipses
A point group to create that represents points which have valid ellipsoidal neighborhood....
Definition PrincipalComponentAnalysis.h:185
std::string stretch
Definition PrincipalComponentAnalysis.h:161
math::Vec3< double > PosWsT
Settings for the world space position of every point. This may end up being different to their actual...
Definition PrincipalComponentAnalysis.h:175
Various settings for the neighborhood analysis of point distributions.
Definition PrincipalComponentAnalysis.h:67
float allowedAnisotropyRatio
Definition PrincipalComponentAnalysis.h:94
float averagePositions
Definition PrincipalComponentAnalysis.h:147
util::NullInterrupter * interrupter
Definition PrincipalComponentAnalysis.h:149
float nonAnisotropicStretch
Definition PrincipalComponentAnalysis.h:99
VolumeTransfer(TreeTypes *... trees)
void initialize(const Coord &origin, const size_t, const CoordBBox &)
ValueType< Idx > * buffer()
Definition PointTransfer.h:325
NodeMaskT * mask()
Definition PointTransfer.h:337
Definition PrincipalComponentAnalysisImpl.h:58
size_t mCovMatrixIndex
Definition PrincipalComponentAnalysisImpl.h:61
size_t mPWsIndex
Definition PrincipalComponentAnalysisImpl.h:62
size_t mPosSumIndex
Definition PrincipalComponentAnalysisImpl.h:59
size_t mWeightSumIndex
Definition PrincipalComponentAnalysisImpl.h:60
GroupIndexT mEllipsesGroupIndex
Definition PrincipalComponentAnalysisImpl.h:63
void initialize(const Coord &origin, const size_t idx, const CoordBBox &bounds)
Definition PrincipalComponentAnalysisImpl.h:368
PcaTransfer< PointDataTreeT > BaseT
Definition PrincipalComponentAnalysisImpl.h:345
bool finalize(const Coord &, size_t)
Definition PrincipalComponentAnalysisImpl.h:483
static const Index DIM
Definition PrincipalComponentAnalysisImpl.h:347
CovarianceTransfer(const AttrIndices &indices, const PcaSettings &settings, const Real vs, tree::LeafManager< PointDataTreeT > &manager, util::NullInterrupter *interrupt)
Definition PrincipalComponentAnalysisImpl.h:350
CovarianceTransfer(const CovarianceTransfer &other)
Definition PrincipalComponentAnalysisImpl.h:361
static const Index LOG2DIM
Definition PrincipalComponentAnalysisImpl.h:348
void rasterizePoints(const Coord &, const Index start, const Index end, const CoordBBox &bounds)
Definition PrincipalComponentAnalysisImpl.h:377
Definition PrincipalComponentAnalysisImpl.h:28
void stop()
Definition PrincipalComponentAnalysisImpl.h:30
void start(const char *)
Definition PrincipalComponentAnalysisImpl.h:29
PcaTimer(util::NullInterrupter *const interrupt)
Definition PrincipalComponentAnalysisImpl.h:37
void stop()
Definition PrincipalComponentAnalysisImpl.h:45
void start(const char *msg)
Definition PrincipalComponentAnalysisImpl.h:40
util::NullInterrupter *const mInterrupt
Definition PrincipalComponentAnalysisImpl.h:50
PcaTransfer(const AttrIndices &indices, const PcaSettings &settings, const Real vs, tree::LeafManager< PointDataTreeT > &manager, util::NullInterrupter *interrupt)
Definition PrincipalComponentAnalysisImpl.h:105
bool startPointLeaf(const typename PointDataTreeT::LeafNodeType &leaf)
Definition PrincipalComponentAnalysisImpl.h:166
size_t maxSourcePointsPerVoxel() const
Definition PrincipalComponentAnalysisImpl.h:152
size_t maxTargetPointsPerVoxel() const
Definition PrincipalComponentAnalysisImpl.h:153
Vec3i range() const
Definition PrincipalComponentAnalysisImpl.h:156
const AttrIndices & mIndices
Definition PrincipalComponentAnalysisImpl.h:178
size_t neighbourThreshold() const
Definition PrincipalComponentAnalysisImpl.h:151
const tree::LeafManager< PointDataTreeT > & mManager
Definition PrincipalComponentAnalysisImpl.h:181
LeafNodeType * initialize(const Coord &origin, const size_t idx, const CoordBBox &bounds)
Definition PrincipalComponentAnalysisImpl.h:158
float searchRadius() const
Definition PrincipalComponentAnalysisImpl.h:150
std::unique_ptr< PositionHandleT > mTargetPosition
Definition PrincipalComponentAnalysisImpl.h:182
Vec3i range(const Coord &, size_t) const
Definition PrincipalComponentAnalysisImpl.h:155
VolumeTransfer< PointDataTreeT > BaseT
Definition PrincipalComponentAnalysisImpl.h:99
const PcaSettings & mSettings
Definition PrincipalComponentAnalysisImpl.h:179
PcaTransfer(const PcaTransfer &other)
Definition PrincipalComponentAnalysisImpl.h:122
points::AttributeHandle< Vec3d, NullCodec > PositionHandleT
Definition PrincipalComponentAnalysisImpl.h:103
typename PointDataTreeT::LeafNodeType LeafNodeType
Definition PrincipalComponentAnalysisImpl.h:100
const Real mDxInv
Definition PrincipalComponentAnalysisImpl.h:180
bool endPointLeaf(const typename PointDataTreeT::LeafNodeType &)
Definition PrincipalComponentAnalysisImpl.h:175
std::unique_ptr< PositionHandleT > mSourcePosition
Definition PrincipalComponentAnalysisImpl.h:183
bool finalize(const Coord &, size_t idx)
Definition PrincipalComponentAnalysisImpl.h:305
WeightPosSumsTransfer(const WeightPosSumsTransfer &other)
Definition PrincipalComponentAnalysisImpl.h:208
void initialize(const Coord &origin, const size_t idx, const CoordBBox &bounds)
Definition PrincipalComponentAnalysisImpl.h:214
PcaTransfer< PointDataTreeT > BaseT
Definition PrincipalComponentAnalysisImpl.h:193
static const Index DIM
Definition PrincipalComponentAnalysisImpl.h:195
WeightPosSumsTransfer(const AttrIndices &indices, const PcaSettings &settings, const Real vs, tree::LeafManager< PointDataTreeT > &manager, util::NullInterrupter *interrupt)
Definition PrincipalComponentAnalysisImpl.h:198
static const Index LOG2DIM
Definition PrincipalComponentAnalysisImpl.h:196
void rasterizePoints(const Coord &, const Index start, const Index end, const CoordBBox &bounds)
Definition PrincipalComponentAnalysisImpl.h:223
Base class for interrupters.
Definition NullInterrupter.h:26
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218