runmat-meshing 0.6.0

Topology-first meshing pipeline orchestration for RunMat
Documentation
use runmat_meshing_core::contracts::{
    MeshBackendSummary, TETRAHEDRON_EXACT_QUALITY_REPAIR_PASS_COUNT,
    TETRAHEDRON_EXACT_QUALITY_SEED_STAR_RELOCATION_COUNT,
    TETRAHEDRON_EXACT_QUALITY_UNREPAIRED_INTERIOR_SEED_COUNT,
    TETRAHEDRON_EXACT_QUALITY_UNREPAIRED_TOTAL_COUNT,
    TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_ACCEPTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_ATTEMPT_COUNT,
    TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_BUDGET_LIMIT_COUNT,
    TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_REJECTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_REJECTION_PREFIX,
    TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_ACCEPTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_ATTEMPT_COUNT,
    TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_BUDGET_LIMIT_COUNT,
    TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_REJECTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_REJECTION_PREFIX,
    TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_ACCEPTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_ATTEMPT_COUNT,
    TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_BUDGET_LIMIT_COUNT,
    TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_REJECTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_REJECTION_PREFIX,
    TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_ACCEPTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_ATTEMPT_COUNT,
    TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_BUDGET_LIMIT_COUNT,
    TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_REJECTED_COUNT,
    TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_REJECTION_PREFIX,
    TETRAHEDRON_UNTANGLING_FINAL_NEAR_SINGULAR_COUNT,
    TETRAHEDRON_UNTANGLING_INITIAL_NEAR_SINGULAR_COUNT, TETRAHEDRON_UNTANGLING_PASS_COUNT,
    TETRAHEDRON_UNTANGLING_RELOCATED_SEED_COUNT,
};
use runmat_meshing_tetrahedron::generate::TetrahedronMesh;

use super::backend_counts::{tetrahedron_entity_count, tetrahedron_rejection_counts_by_prefix};
use super::backend_quality::{optimization_target_evidence, BackendQualityEvidence};

pub(super) fn optimization_summary(
    tetrahedron_mesh: &TetrahedronMesh,
    initial_backend_quality: &BackendQualityEvidence,
    backend_quality: &BackendQualityEvidence,
) -> MeshBackendSummary {
    let optimization_targets =
        optimization_target_evidence(initial_backend_quality, backend_quality);

    MeshBackendSummary {
        tetrahedron_optimization_pass_count: usize::from(tetrahedron_mesh.quality_optimized),
        tetrahedron_optimization_budget_limited_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_BUDGET_LIMIT_COUNT,
        ) + tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_BUDGET_LIMIT_COUNT,
        ) + tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_BUDGET_LIMIT_COUNT,
        ) + tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_BUDGET_LIMIT_COUNT,
        ),
        tetrahedron_smoothed_point_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_ACCEPTED_COUNT,
        ) + tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_ACCEPTED_COUNT,
        ),
        tetrahedron_sliver_count: backend_quality.sliver_count,
        tetrahedron_sliver_removed_count: optimization_targets.sliver_removed_count,
        tetrahedron_optimization_sliver_removal_attempt_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_ATTEMPT_COUNT,
        ),
        tetrahedron_optimization_sliver_removal_accepted_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_ACCEPTED_COUNT,
        ),
        tetrahedron_optimization_sliver_removal_rejected_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_REJECTED_COUNT,
        ),
        tetrahedron_optimization_sliver_removal_budget_limited_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_BUDGET_LIMIT_COUNT,
        ),
        tetrahedron_optimization_sliver_removal_rejected_by_reason:
            tetrahedron_rejection_counts_by_prefix(
                tetrahedron_mesh,
                TETRAHEDRON_OPTIMIZATION_SLIVER_REMOVAL_REJECTION_PREFIX,
            ),
        tetrahedron_optimization_target_seed_count: optimization_targets.target_seed_count,
        tetrahedron_optimization_skipped_target_seed_count: optimization_targets
            .skipped_target_seed_count,
        tetrahedron_optimization_interior_smoothing_attempt_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_ATTEMPT_COUNT,
        ),
        tetrahedron_optimization_interior_smoothing_accepted_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_ACCEPTED_COUNT,
        ),
        tetrahedron_optimization_interior_smoothing_rejected_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_REJECTED_COUNT,
        ),
        tetrahedron_optimization_interior_smoothing_budget_limited_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_BUDGET_LIMIT_COUNT,
        ),
        tetrahedron_optimization_interior_smoothing_rejected_by_reason:
            tetrahedron_rejection_counts_by_prefix(
                tetrahedron_mesh,
                TETRAHEDRON_OPTIMIZATION_INTERIOR_SMOOTHING_REJECTION_PREFIX,
            ),
        tetrahedron_optimization_boundary_smoothing_attempt_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_ATTEMPT_COUNT,
        ),
        tetrahedron_optimization_boundary_smoothing_accepted_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_ACCEPTED_COUNT,
        ),
        tetrahedron_optimization_boundary_smoothing_rejected_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_REJECTED_COUNT,
        ),
        tetrahedron_optimization_boundary_smoothing_budget_limited_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_BUDGET_LIMIT_COUNT,
        ),
        tetrahedron_optimization_boundary_smoothing_rejected_by_reason:
            tetrahedron_rejection_counts_by_prefix(
                tetrahedron_mesh,
                TETRAHEDRON_OPTIMIZATION_BOUNDARY_SMOOTHING_REJECTION_PREFIX,
            ),
        tetrahedron_optimization_local_reconnection_attempt_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_ATTEMPT_COUNT,
        ),
        tetrahedron_optimization_local_reconnection_accepted_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_ACCEPTED_COUNT,
        ),
        tetrahedron_optimization_local_reconnection_rejected_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_REJECTED_COUNT,
        ),
        tetrahedron_optimization_local_reconnection_budget_limited_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_BUDGET_LIMIT_COUNT,
        ),
        tetrahedron_optimization_local_reconnection_rejected_by_reason:
            tetrahedron_rejection_counts_by_prefix(
                tetrahedron_mesh,
                TETRAHEDRON_OPTIMIZATION_LOCAL_RECONNECTION_REJECTION_PREFIX,
            ),
        tetrahedron_optimization_initial_max_aspect_ratio: initial_backend_quality.max_aspect_ratio,
        tetrahedron_optimization_final_max_aspect_ratio: backend_quality.max_aspect_ratio,
        tetrahedron_optimization_initial_min_exact_scaled_jacobian: initial_backend_quality
            .min_exact_scaled_jacobian,
        tetrahedron_optimization_final_min_exact_scaled_jacobian: backend_quality
            .min_exact_scaled_jacobian,
        tetrahedron_untangling_pass_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_UNTANGLING_PASS_COUNT,
        ),
        tetrahedron_untangling_initial_near_singular_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_UNTANGLING_INITIAL_NEAR_SINGULAR_COUNT,
        ),
        tetrahedron_untangling_final_near_singular_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_UNTANGLING_FINAL_NEAR_SINGULAR_COUNT,
        ),
        tetrahedron_untangling_relocated_seed_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_UNTANGLING_RELOCATED_SEED_COUNT,
        ),
        tetrahedron_exact_quality_repair_pass_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_EXACT_QUALITY_REPAIR_PASS_COUNT,
        ),
        tetrahedron_exact_quality_seed_star_relocation_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_EXACT_QUALITY_SEED_STAR_RELOCATION_COUNT,
        ),
        tetrahedron_exact_quality_unrepaired_total_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_EXACT_QUALITY_UNREPAIRED_TOTAL_COUNT,
        ),
        tetrahedron_exact_quality_unrepaired_interior_seed_count: tetrahedron_entity_count(
            tetrahedron_mesh,
            TETRAHEDRON_EXACT_QUALITY_UNREPAIRED_INTERIOR_SEED_COUNT,
        ),
        ..MeshBackendSummary::default()
    }
}