diff options
Diffstat (limited to 'extern/quadriflow/src/optimizer.hpp')
-rw-r--r-- | extern/quadriflow/src/optimizer.hpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/extern/quadriflow/src/optimizer.hpp b/extern/quadriflow/src/optimizer.hpp new file mode 100644 index 00000000000..ad6fa720a6e --- /dev/null +++ b/extern/quadriflow/src/optimizer.hpp @@ -0,0 +1,56 @@ +#ifndef OPTIMIZER_H_ +#define OPTIMIZER_H_ +#include "config.hpp" +#include "field-math.hpp" +#include "hierarchy.hpp" + +namespace qflow { + +class Optimizer { + public: + Optimizer(); + static void optimize_orientations(Hierarchy& mRes); + static void optimize_scale(Hierarchy& mRes, VectorXd& rho, int adaptive); + static void optimize_positions(Hierarchy& mRes, int with_scale = 0); + static void optimize_integer_constraints(Hierarchy& mRes, std::map<int, int>& singularities, + bool use_minimum_cost_flow); + static void optimize_positions_fixed( + Hierarchy& mRes, std::vector<DEdge>& edge_values, std::vector<Vector2i>& edge_diff, + std::set<int>& sharp_vertices, + std::map<int, std::pair<Vector3d, Vector3d>>& sharp_constraints, int with_scale = 0); + static void optimize_positions_sharp( + Hierarchy& mRes, std::vector<DEdge>& edge_values, std::vector<Vector2i>& edge_diff, + std::vector<int>& sharp_edges, std::set<int>& sharp_vertices, + std::map<int, std::pair<Vector3d, Vector3d>>& sharp_constraints, int with_scale = 0); + static void optimize_positions_dynamic( + MatrixXi& F, MatrixXd& V, MatrixXd& N, MatrixXd& Q, std::vector<std::vector<int>>& Vset, + std::vector<Vector3d>& O_compact, std::vector<Vector4i>& F_compact, + std::vector<int>& V2E_compact, std::vector<int>& E2E_compact, double mScale, + std::vector<Vector3d>& diffs, std::vector<int>& diff_count, + std::map<std::pair<int, int>, int>& o2e, std::vector<int>& sharp_o, + std::map<int, std::pair<Vector3d, Vector3d>>& compact_sharp_constraints, int with_scale); +#ifdef WITH_CUDA + static void optimize_orientations_cuda(Hierarchy& mRes); + static void optimize_positions_cuda(Hierarchy& mRes); +#endif +}; + +#ifdef WITH_CUDA +extern void UpdateOrientation(int* phase, int num_phases, glm::dvec3* N, glm::dvec3* Q, Link* adj, + int* adjOffset, int num_adj); +extern void PropagateOrientationUpper(glm::dvec3* srcField, int num_orientation, + glm::ivec2* toUpper, glm::dvec3* N, glm::dvec3* destField); +extern void PropagateOrientationLower(glm::ivec2* toUpper, glm::dvec3* Q, glm::dvec3* N, + glm::dvec3* Q_next, glm::dvec3* N_next, int num_toUpper); + +extern void UpdatePosition(int* phase, int num_phases, glm::dvec3* N, glm::dvec3* Q, Link* adj, + int* adjOffset, int num_adj, glm::dvec3* V, glm::dvec3* O, + double scale); +extern void PropagatePositionUpper(glm::dvec3* srcField, int num_position, glm::ivec2* toUpper, + glm::dvec3* N, glm::dvec3* V, glm::dvec3* destField); + +#endif + +} // namespace qflow + +#endif |