3#include <wmtk/utils/Logger.hpp>
5#include "expression_parser/Expression.hpp"
12namespace wmtk::components::simwild {
30 double sum_quality = 0.;
33 double avg_quality()
const {
return count > 0 ? sum_quality / count : 0.; }
46 double avg_relative = 0.;
65template <
class Val
idFn,
class TagsFn,
class QualityFn>
67 const size_t capacity,
68 const std::vector<std::tuple<expression_parser::ExpressionPtr, double>>& quality_field,
69 const double base_target,
72 QualityFn&& quality_of)
75 out.groups.resize(quality_field.size() + 1);
76 out.groups[0].label =
"(default)";
77 out.groups[0].target = base_target;
78 for (
size_t i = 0; i < quality_field.size(); ++i) {
79 const auto& [expr, target] = quality_field[i];
80 out.groups[i + 1].label = expr->to_string();
81 out.groups[i + 1].target = target;
84 for (
size_t cid = 0; cid < capacity; ++cid) {
88 const auto& tags = tags_of(cid);
93 for (
size_t i = quality_field.size(); i-- > 0;) {
94 if (std::get<0>(quality_field[i])->eval(tags)) {
100 const double quality = quality_of(cid);
101 QualityGroup& g = out.groups[group];
102 g.max_quality = std::max(g.max_quality, quality);
103 g.sum_quality += quality;
106 const double relative = quality / g.target;
107 out.max_relative = std::max(out.max_relative, relative);
108 out.avg_relative += relative;
113 out.avg_relative /= out.count;
126inline void log_quality_breakdown(
const QualityBreakdown& breakdown)
128 std::vector<const QualityGroup*> order;
129 order.reserve(breakdown.groups.size());
130 for (
const auto& g : breakdown.groups) {
133 std::sort(order.begin(), order.end(), [](
const QualityGroup* a,
const QualityGroup* b) {
134 return a->max_relative() > b->max_relative();
138 "Quality by tag ({} cells, max rel = {:.4}, avg rel = {:.4}):",
140 breakdown.max_relative,
141 breakdown.avg_relative);
142 for (
const QualityGroup* g : order) {
144 logger().info(
" {:<20} no cells", g->label);
148 " {:<20} n = {:>8}, max = {:>8.6}, avg = {:>8.6}, target = {:>6.6}, max rel = {:6>.4}",
Per-group breakdown plus the mesh-wide relative figures optimization_quality_stats returns.
Definition QualityStats.hpp:40
double max_relative
Mesh-wide max/avg of quality RELATIVE to each cell's own target.
Definition QualityStats.hpp:45
std::vector< QualityGroup > groups
Definition QualityStats.hpp:43
Quality of the cells governed by one entry of the quality field.
Definition QualityStats.hpp:23
std::string label
The expression as written in the spec, or "(default)" for the fallback group.
Definition QualityStats.hpp:25
double max_relative() const
Quality relative to this group's own target – the number the stopping criterion sees.
Definition QualityStats.hpp:35
double target
The target the optimizer applies to this group – the entry's value, or stop_energy.
Definition QualityStats.hpp:27
double max_quality
Largest and summed ABSOLUTE quality; avg_quality divides the sum by count.
Definition QualityStats.hpp:29