2#include <wmtk/OptimizerParameters.h>
3#include <nlohmann/json.hpp>
4#include <wmtk/Types.hpp>
5#include <wmtk/components/simwild/expression_parser/Expression.hpp>
7using ExpressionPtr = wmtk::components::simwild::expression_parser::ExpressionPtr;
9namespace wmtk::components::topological_offset {
25 ExpressionPtr offset_selection;
26 std::set<std::string> offset_output_tag;
27 std::set<std::string> protected_tags;
30 double target_distance;
31 double target_distance_rel;
35 bool throw_on_nonconvergence;
42 double envelope_size_rel;
48 double offset_dhat_factor;
73 double front_conv_rel;
81 double front_conv_frac()
const {
return front_conv / std::max(target_distance, 1e-16); }
106 bool front_normal_projection =
true;
141 bool sorted_marching;
185 std::string output_path;
190 int phi_grid_resolution;
203 double offset_envelope_rel;
211 double min_edge_length;
212 double min_edge_length_rel;
216 double min_sizing_scalar;
217 double max_sizing_scalar;
221 double sizing_gradation;
245 for (
const std::string& tag : json_params[
"offset_output_tags"]) {
246 if (tag ==
"ambient") {
248 "'ambient' tag cannot be given explicitly to offset_output_tags, ignoring. To "
249 "set offset to 'ambient', pass offset_output_tags=[].");
252 offset_output_tag.insert(tag);
254 for (
const std::string& tag : json_params[
"protected_tags"]) {
255 if (tag ==
"ambient") {
256 logger().warn(
"'ambient' tag cannot be protected, ignoring.");
259 protected_tags.insert(tag);
261 offset_in = json_params[
"offset_in"];
262 offset_out = json_params[
"offset_out"];
263 target_distance = json_params[
"target_distance"];
264 target_distance_rel = json_params[
"target_distance_rel"];
265 throw_on_nonconvergence = json_params[
"throw_on_nonconvergence"];
267 envelope_size = json_params[
"envelope_size"];
268 envelope_size_rel = json_params[
"envelope_size_rel"];
269 offset_dhat_factor = json_params[
"offset_dhat_factor"];
272 front_conv = json_params[
"front_conv"];
273 front_conv_rel = json_params[
"front_conv_rel"];
275 stencil_order = json_params[
"stencil_order"];
278 sorted_marching = json_params[
"sorted_marching"];
282 json_params[
"EXPERIMENTAL_consistent_construction_split"];
285 output_path = json_params[
"output"];
286 save_vtu = json_params[
"save_vtu"];
287 phi_grid_resolution = json_params[
"phi_grid_resolution"];
289 num_threads = json_params[
"num_threads"];
292 offset_envelope_rel = json_params[
"offset_envelope_rel"];
294 min_edge_length = json_params[
"min_edge_length"];
295 min_edge_length_rel = json_params[
"min_edge_length_rel"];
297 min_sizing_scalar = json_params[
"min_sizing_scalar"];
298 max_sizing_scalar = json_params[
"max_sizing_scalar"];
299 sizing_gradation = json_params[
"sizing_gradation"];
308 debug_output = json_params[
"DEBUG_output"];
309 lr = json_params[
"length_rel"];
310 l = json_params[
"length"];
311 stop_energy = json_params[
"stop_energy"];
313 interleaved_smoothing = json_params[
"interleaved_smoothing"];
314 interleaved_smoothing_passes = json_params[
"interleaved_smoothing_passes"];
328 stuck_refine_stall_eps = json_params[
"stuck_refine_stall_eps"];
329 stuck_refine_cooldown = json_params[
"stuck_refine_cooldown"];
330 stuck_refine_num_worst = json_params[
"stuck_refine_num_worst"];
331 stuck_refine_rings = json_params[
"stuck_refine_rings"];
332 stuck_refine_factor = json_params[
"stuck_refine_factor"];
333 stuck_refine_min_scalar = json_params[
"stuck_refine_min_scalar"];
334 stuck_refine_gradation = json_params[
"stuck_refine_gradation"];
335 stuck_refine_force_split = json_params[
"stuck_refine_force_split"];
336 front_normal_projection = json_params[
"front_normal_projection"];
341 w_amips = json_params[
"w_amips"];
347 perform_sanity_checks = json_params[
"perform_sanity_checks"];
350 void init(
const VectorXd& min_,
const VectorXd& max_)
359 preserve_topology =
true;
370 splitting_l2 = l * l * (64 / 25.);
373 if (target_distance > 0) {
374 target_distance_rel = target_distance / diag_l;
376 target_distance = target_distance_rel * diag_l;
381 if (envelope_size > 0) {
382 envelope_size_rel = envelope_size / diag_l;
384 envelope_size = envelope_size_rel * diag_l;
391 if (front_conv > 0) {
392 front_conv_rel = front_conv / diag_l;
394 front_conv = front_conv_rel * diag_l;
401 if (front_conv > target_distance) {
403 "front_conv {} must be <= target_distance {}: the convergence epsilon cannot be "
404 "coarser than the offset distance it measures, or every front face reads as "
405 "resolved from the first turn",
420 if (min_edge_length_rel < 0) {
425 min_edge_length_rel =
428 if (min_edge_length < 0) {
429 min_edge_length = min_edge_length_rel * target_distance;
431 min_edge_length_rel = min_edge_length / std::max(target_distance, 1e-16);
The parameters tetwild, triwild and simwild all share.
Definition OptimizerParameters.h:29
int project_line_search_nested_steps
Partial-projection bisections tried after it gives up; 0 disables that pass.
Definition OptimizerParameters.h:177
double w_amips
Definition OptimizerParameters.h:171
std::string smoothing_mode
"projected" or "exact"; see SmoothVertexOptions::SmoothingMode.
Definition OptimizerParameters.h:173
bool coarsen_pass
Definition OptimizerParameters.h:213
int coarsen_global_smoothing_passes
Definition OptimizerParameters.h:278
int coarsen_max_rounds
Definition OptimizerParameters.h:302
void init_lengths_from_diagonal(const double diag)
Derive the edge-length and envelope quantities from the bounding-box diagonal.
Definition OptimizerParameters.h:332
bool coarsen_unbounded
Definition OptimizerParameters.h:237
int split_high_valence_threshold
Definition OptimizerParameters.h:71
int coarsen_local_smoothing_passes
Definition OptimizerParameters.h:255
int project_line_search_steps
Bisections tried before the projected search gives up. See SmoothVertexOptions.
Definition OptimizerParameters.h:175
int coarsen_smooth_ring
Definition OptimizerParameters.h:271
bool smooth_quality_veto
Definition OptimizerParameters.h:183
int num_smoothing_passes
Number and placement of smoothing passes in the shared Wild optimization driver.
Definition OptimizerParameters.h:187
What the offset needs on top of the parameters every wmtk optimizer shares.
Definition Parameters.h:24
bool front_alignment_energy
Definition Parameters.h:107
bool sphere_trace_initialization
Definition Parameters.h:144
std::string front_conv_criterion
gradient_norm_rel | step_size_rel | decrement | residual_error [2D ONLY]
Definition Parameters.h:100
bool pre_smooth
Definition Parameters.h:236
bool experimental_aggresive_refine
Definition Parameters.h:170
std::string offset_field
"smooth" (Phi level set) or "euclidean" (exact distance)
Definition Parameters.h:54
double front_conv_frac() const
Definition Parameters.h:81
int max_iterations
Definition Parameters.h:195
bool sizing_collapse_min
Definition Parameters.h:111
bool experimental_nonoverlapping_gates
Definition Parameters.h:184
double adaptive_smoothing_stall_rel
front stalled: max ratio dropped by less than this
Definition Parameters.h:232
int max_rounds
Definition Parameters.h:117
bool optimize_offset
Definition Parameters.h:38
bool deform_others
Definition Parameters.h:114
double offset_envelope
absolute; < 0 means use offset_envelope_rel
Definition Parameters.h:202
bool adaptive_smoothing
Definition Parameters.h:230
int adaptive_smoothing_max_passes
cap on the passes per group
Definition Parameters.h:231
std::string front_measure
Definition Parameters.h:140
std::string sizing_gradation_mode
Definition Parameters.h:226
double debug_manual_dhat
Definition Parameters.h:53
double adaptive_smoothing_step_rel
Definition Parameters.h:233
double sphere_trace_target_rel_tol
Definition Parameters.h:145
bool experimental_consistent_construction_split
Definition Parameters.h:152