#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& singularities, bool use_minimum_cost_flow); static void optimize_positions_fixed( Hierarchy& mRes, std::vector& edge_values, std::vector& edge_diff, std::set& sharp_vertices, std::map>& sharp_constraints, int with_scale = 0); static void optimize_positions_sharp( Hierarchy& mRes, std::vector& edge_values, std::vector& edge_diff, std::vector& sharp_edges, std::set& sharp_vertices, std::map>& sharp_constraints, int with_scale = 0); static void optimize_positions_dynamic( MatrixXi& F, MatrixXd& V, MatrixXd& N, MatrixXd& Q, std::vector>& Vset, std::vector& O_compact, std::vector& F_compact, std::vector& V2E_compact, std::vector& E2E_compact, double mScale, std::vector& diffs, std::vector& diff_count, std::map, int>& o2e, std::vector& sharp_o, std::map>& 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