diff options
Diffstat (limited to 'extern/quadriflow/src/hierarchy.hpp')
-rw-r--r-- | extern/quadriflow/src/hierarchy.hpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/extern/quadriflow/src/hierarchy.hpp b/extern/quadriflow/src/hierarchy.hpp new file mode 100644 index 00000000000..8403038de4f --- /dev/null +++ b/extern/quadriflow/src/hierarchy.hpp @@ -0,0 +1,99 @@ +#ifndef HIERARCHY_H_ +#define HIERARCHY_H_ + +#ifdef WITH_CUDA +# include <glm/glm.hpp> +#endif + +#include <map> +#include <vector> +#include "adjacent-matrix.hpp" +#include "config.hpp" +#include "serialize.hpp" +#define RCPOVERFLOW 2.93873587705571876e-39f + +using namespace Eigen; + +namespace qflow { + +class Hierarchy { + public: + Hierarchy(); + void Initialize(double scale, int with_scale = 0); + void DownsampleGraph(const AdjacentMatrix adj, const MatrixXd& V, const MatrixXd& N, + const VectorXd& A, MatrixXd& V_p, MatrixXd& N_p, VectorXd& A_p, + MatrixXi& to_upper, VectorXi& to_lower, AdjacentMatrix& adj_p); + void generate_graph_coloring_deterministic(const AdjacentMatrix& adj, int size, + std::vector<std::vector<int>>& phases); + void FixFlip(); + int FixFlipSat(int depth, int threshold = 0); + void PushDownwardFlip(int depth); + void PropagateEdge(); + void DownsampleEdgeGraph(std::vector<Vector3i>& FQ, std::vector<Vector3i>& F2E, + std::vector<Vector2i>& edge_diff, + std::vector<int>& allow_changes, int level); + void UpdateGraphValue(std::vector<Vector3i>& FQ, std::vector<Vector3i>& F2E, + std::vector<Vector2i>& edge_diff); + + enum { MAX_DEPTH = 25 }; + + void SaveToFile(FILE* fp); + void LoadFromFile(FILE* fp); + + void clearConstraints(); + void propagateConstraints(); + + double mScale; + int rng_seed; + + MatrixXi mF; // mF(i, j) i \in [0, 3) ith index in face j + VectorXi mE2E; // inverse edge + std::vector<AdjacentMatrix> mAdj; + std::vector<MatrixXd> mV; + std::vector<MatrixXd> mN; + std::vector<VectorXd> mA; + std::vector<std::vector<std::vector<int>>> mPhases; + // parameters + std::vector<MatrixXd> mQ; + std::vector<MatrixXd> mO; + std::vector<VectorXi> mToLower; + std::vector<MatrixXi> mToUpper; // mToUpper[h](i, j) \in V; i \in [0, 2); j \in V + std::vector<MatrixXd> mS; + std::vector<MatrixXd> mK; + + // constraints + std::vector<MatrixXd> mCQ; + std::vector<MatrixXd> mCO; + std::vector<VectorXd> mCQw; + std::vector<VectorXd> mCOw; + + int with_scale; + + // upper: fine to coarse + std::vector<std::vector<int>> mToUpperFaces; // face correspondance + std::vector<std::vector<int>> mSing; + std::vector<std::vector<int>> mToUpperEdges; // edge correspondance + std::vector<std::vector<int>> mToUpperOrients; // rotation of edges from fine to coarse + std::vector<std::vector<Vector3i>> mFQ; // face_edgeOrients + std::vector<std::vector<Vector3i>> mF2E; // face_edgeIds + std::vector<std::vector<Vector2i>> mE2F; // undirect edges to face ID + std::vector<std::vector<int> > mAllowChanges; + std::vector<std::vector<Vector2i>> mEdgeDiff; // face_edgeDiff + +#ifdef WITH_CUDA + std::vector<Link*> cudaAdj; + std::vector<int*> cudaAdjOffset; + std::vector<glm::dvec3*> cudaN; + std::vector<glm::dvec3*> cudaV; + std::vector<glm::dvec3*> cudaQ; + std::vector<glm::dvec3*> cudaO; + std::vector<std::vector<int*>> cudaPhases; + std::vector<glm::ivec2*> cudaToUpper; + void CopyToDevice(); + void CopyToHost(); +#endif +}; + +} // namespace qflow + +#endif |