Changeset View
Changeset View
Standalone View
Standalone View
extern/quadriflow/src/hierarchy.hpp
- This file was added.
| #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 | |||||