diff --git a/algoim/organizer/organizer.hpp b/algoim/organizer/organizer.hpp index ffe86f0..f702817 100644 --- a/algoim/organizer/organizer.hpp +++ b/algoim/organizer/organizer.hpp @@ -419,7 +419,7 @@ void buildOcTreeV0(const Scene& scene, } if (subNodes[1].blobTree.structure[4].inOut != NODE_IN_OUT_UNKNOWN && std::find(subNodes[1].polyIntersectIndices.begin(), subNodes[1].polyIntersectIndices.end(), 3) - != subNodes[1].polyIntersectIndices.end()) { + != subNodes[1].polyIntersectIndices.end()) { int aaa = 1; int bbb = 1; } @@ -438,7 +438,7 @@ void basicTask(const std::shared_ptr& p, int q = 20, real xmin = if (auto pt = std::dynamic_pointer_cast(p)) { tensor3 tensor(nullptr, 3); algoim_spark_alloc(real, tensor); - std::vector aabbs; + std::vector aabbs; VisiblePrimitiveRep visiblePrimitiveRep{{tensor}, aabbs, AABB(), BlobTree()}; makeSphere(*pt, visiblePrimitiveRep); detail::powerTransformation(range, xmin, tensor); @@ -453,7 +453,7 @@ void basicTask(const std::shared_ptr& p, int q = 20, real xmin = assert(faceCount > 1); std::vector planeTensors(faceCount, tensor3(nullptr, 2)); algoim_spark_alloc(real, planeTensors); - std::vector aabbs; + std::vector aabbs; VisiblePrimitiveRep visiblePrimitiveRep{planeTensors, aabbs, AABB(), BlobTree()}; AABB aabb; makeMesh(*pt, visiblePrimitiveRep); @@ -483,7 +483,7 @@ void basicTask(const std::vector>& primitives, in if (auto pt = std::dynamic_pointer_cast(primitives[i])) { tensor3 tensor(nullptr, 3); phiStacks.emplace_back(algoim_spark_alloc_heap(real, tensor)); - std::vector aabbs; + std::vector aabbs; VisiblePrimitiveRep visiblePrimitiveRep{{tensor}, aabbs, AABB(), BlobTree()}; makeSphere(*pt, visiblePrimitiveRep); @@ -495,7 +495,7 @@ void basicTask(const std::vector>& primitives, in assert(faceCount > 1); std::vector planeTensors(faceCount, tensor3(nullptr, 3)); algoimSparkAllocHeapVector(phiStacks, planeTensors); - std::vector aabbs; + std::vector aabbs; VisiblePrimitiveRep visiblePrimitiveRep{planeTensors, aabbs, AABB(), BlobTree()}; makeMesh(*pt, visiblePrimitiveRep); @@ -549,7 +549,13 @@ BasicTaskRes basicTask(const Scene& scene, const OcTreeNode& node, int q = 10) } // ImplicitPolyQuadrature<3> ipquad(scene.minimalReps, node.polyIntersectIndices); ImplicitPolyQuadrature<3> ipquad(phis); - +#if STOP_WHEN_BLOCKED + if (stopCurrentQuadrature) { + stopCurrentQuadrature = false; + std::cout << "blocked" << std::endl; + return {0, 0}; + } +#endif ipquad.integrate(AutoMixed, q, [&](const uvector& x, real w) { auto realX = x * range + node.aabb.min; // 这里realX应该是最原始空间下的点?不过因为算体积,所以不影响 if (keepQuadraturePoint(phis, node, x)) { volume += w * integrand(realX); } diff --git a/algoim/quadrature_multipoly.hpp b/algoim/quadrature_multipoly.hpp index 2c38d79..f137043 100644 --- a/algoim/quadrature_multipoly.hpp +++ b/algoim/quadrature_multipoly.hpp @@ -36,6 +36,15 @@ #include "tanhsinh.hpp" #include "bernstein.hpp" +#define STOP_WHEN_BLOCKED true + +#if STOP_WHEN_BLOCKED +#include +auto timerStart = std::chrono::high_resolution_clock::now(); +bool stopCurrentQuadrature = false; +const double MAX_DURATION = 10; // seconds +#endif + // #define namespace algoim @@ -404,6 +413,14 @@ void eliminate_axis(PolySet& phi, int k, PolySet& // R for (int i = 0; i < phi.count(); ++i) for (int j = i + 1; j < phi.count(); ++j) { +#if STOP_WHEN_BLOCKED + auto timerEnd = std::chrono::high_resolution_clock::now(); + std::chrono::duration duration = timerEnd - timerStart; + if (duration.count() > MAX_DURATION) { + stopCurrentQuadrature = true; + return; + } // 超过20s +#endif const auto& p = phi.poly(i); const auto& pmask = phi.mask(i); const auto& q = phi.poly(j); @@ -551,6 +568,9 @@ struct ImplicitPolyQuadrature { // Build quadrature hierarchy for a domain implicitly defined by a single polynomial ImplicitPolyQuadrature(const xarray& p) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif auto mask = detail::nonzeroMask(p, booluarray(true)); if (!detail::maskEmpty(mask)) { @@ -563,6 +583,9 @@ struct ImplicitPolyQuadrature { // Build quadrature hierarchy for a domain implicitly defined by two polynomials ImplicitPolyQuadrature(const xarray& p, const xarray& q) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif { // auto tmp = booluarray(false); auto mask = detail::nonzeroMask(p, booluarray(true)); @@ -580,6 +603,9 @@ struct ImplicitPolyQuadrature { // Build quadrature hierarchy for a domain implicitly defined by multiple polynomials ImplicitPolyQuadrature(const std::vector>& ps) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif for (const auto& p : ps) { auto mask = detail::nonzeroMask(p, booluarray(true)); if (!detail::maskEmpty(mask)) phi.push_back(p, mask); @@ -608,6 +634,9 @@ struct ImplicitPolyQuadrature { ImplicitPolyQuadrature(const std::vector& tensors, const std::vector& polyIndices) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif for (auto i : polyIndices) { auto mask = detail::nonzeroMask(tensors[i], booluarray(true)); if (!detail::maskEmpty(mask)) phi.push_back(tensors[i], mask); @@ -617,6 +646,9 @@ struct ImplicitPolyQuadrature { ImplicitPolyQuadrature(const std::vector& minimalReps, const std::vector& polyIndices) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif for (auto i : polyIndices) { auto mask = detail::nonzeroMask(minimalReps[i].tensor, booluarray(true)); if (!detail::maskEmpty(mask)) phi.push_back(minimalReps[i].tensor, mask); @@ -630,6 +662,9 @@ struct ImplicitPolyQuadrature { const xarray& q, const booluarray& qmask) { +#if STOP_WHEN_BLOCKED + timerStart = std::chrono::high_resolution_clock::now(); +#endif { auto mask = detail::nonzeroMask(p, pmask); if (!maskEmpty(mask)) phi.push_back(p, mask); @@ -645,6 +680,7 @@ struct ImplicitPolyQuadrature { // Assuming phi has been instantiated, determine elimination axis and build base void build(bool outer, bool auto_apply_TS) { + if (stopCurrentQuadrature) { return; } type = outer ? OuterSingle : Inner; this->auto_apply_TS = auto_apply_TS;