From 477d6a506446add601141627978891ce27ff3390 Mon Sep 17 00:00:00 2001 From: Aaron Fenyes Date: Fri, 18 Jul 2025 10:59:41 -0700 Subject: [PATCH] Reorganize the shared example code The new layout deviates from what the Rust book suggests https://doc.rust-lang.org/book/ch11-03-test-organization.html#submodules-in-integration-tests and uses the frowned-upon `#[path]` attribute, https://doc.rust-lang.org/style-guide/advice.html#modules but we've decided that having a descriptive module filename instead of `mod.rs` is worth the cost. --- .../examples/common/{mod.rs => print.rs} | 10 +++++----- app-proto/examples/irisawa-hexlet.rs | 17 ++++++---------- app-proto/examples/kaleidocycle.rs | 17 ++++++---------- app-proto/examples/point-on-sphere.rs | 20 +++++++------------ app-proto/examples/three-spheres.rs | 17 ++++++---------- 5 files changed, 30 insertions(+), 51 deletions(-) rename app-proto/examples/common/{mod.rs => print.rs} (78%) diff --git a/app-proto/examples/common/mod.rs b/app-proto/examples/common/print.rs similarity index 78% rename from app-proto/examples/common/mod.rs rename to app-proto/examples/common/print.rs index 9b6c492..35857c5 100644 --- a/app-proto/examples/common/mod.rs +++ b/app-proto/examples/common/print.rs @@ -4,11 +4,11 @@ use nalgebra::DMatrix; use dyna3::engine::{Q, DescentHistory, RealizationResult}; -pub fn print_title(title: &str) { +pub fn title(title: &str) { println!("─── {title} ───"); } -pub fn print_realization_diagnostics(realization_result: &RealizationResult) { +pub fn realization_diagnostics(realization_result: &RealizationResult) { let RealizationResult { result, history } = realization_result; println!(); if let Err(ref message) = result { @@ -20,15 +20,15 @@ pub fn print_realization_diagnostics(realization_result: &RealizationResult) { println!("Loss: {}", history.scaled_loss.last().unwrap()); } -pub fn print_gram_matrix(config: &DMatrix) { +pub fn gram_matrix(config: &DMatrix) { println!("\nCompleted Gram matrix:{}", (config.tr_mul(&*Q) * config).to_string().trim_end()); } -pub fn print_config(config: &DMatrix) { +pub fn config(config: &DMatrix) { println!("\nConfiguration:{}", config.to_string().trim_end()); } -pub fn print_loss_history(history: &DescentHistory) { +pub fn loss_history(history: &DescentHistory) { println!("\nStep │ Loss\n─────┼────────────────────────────────"); for (step, scaled_loss) in history.scaled_loss.iter().enumerate() { println!("{:<4} │ {}", step, scaled_loss); diff --git a/app-proto/examples/irisawa-hexlet.rs b/app-proto/examples/irisawa-hexlet.rs index 750a0d0..ee4a5df 100644 --- a/app-proto/examples/irisawa-hexlet.rs +++ b/app-proto/examples/irisawa-hexlet.rs @@ -1,18 +1,13 @@ -mod common; +#[path = "common/print.rs"] +mod print; -use common::{ - print_gram_matrix, - print_loss_history, - print_realization_diagnostics, - print_title -}; use dyna3::engine::{Realization, examples::realize_irisawa_hexlet}; fn main() { const SCALED_TOL: f64 = 1.0e-12; let realization_result = realize_irisawa_hexlet(SCALED_TOL); - print_title("Irisawa hexlet"); - print_realization_diagnostics(&realization_result); + print::title("Irisawa hexlet"); + print::realization_diagnostics(&realization_result); if let Ok(Realization { config, .. }) = realization_result.result { // print the diameters of the chain spheres println!("\nChain diameters:"); @@ -22,7 +17,7 @@ fn main() { } // print the completed Gram matrix - print_gram_matrix(&config); + print::gram_matrix(&config); } - print_loss_history(&realization_result.history); + print::loss_history(&realization_result.history); } \ No newline at end of file diff --git a/app-proto/examples/kaleidocycle.rs b/app-proto/examples/kaleidocycle.rs index 21f8187..b73ecd0 100644 --- a/app-proto/examples/kaleidocycle.rs +++ b/app-proto/examples/kaleidocycle.rs @@ -1,24 +1,19 @@ -mod common; +#[path = "common/print.rs"] +mod print; use nalgebra::{DMatrix, DVector}; -use common::{ - print_config, - print_gram_matrix, - print_realization_diagnostics, - print_title -}; use dyna3::engine::{Realization, examples::realize_kaleidocycle}; fn main() { const SCALED_TOL: f64 = 1.0e-12; let realization_result = realize_kaleidocycle(SCALED_TOL); - print_title("Kaleidocycle"); - print_realization_diagnostics(&realization_result); + print::title("Kaleidocycle"); + print::realization_diagnostics(&realization_result); if let Ok(Realization { config, tangent }) = realization_result.result { // print the completed Gram matrix and the realized configuration - print_gram_matrix(&config); - print_config(&config); + print::gram_matrix(&config); + print::config(&config); // find the kaleidocycle's twist motion by projecting onto the tangent // space diff --git a/app-proto/examples/point-on-sphere.rs b/app-proto/examples/point-on-sphere.rs index 774368e..444fb02 100644 --- a/app-proto/examples/point-on-sphere.rs +++ b/app-proto/examples/point-on-sphere.rs @@ -1,12 +1,6 @@ -mod common; +#[path = "common/print.rs"] +mod print; -use common::{ - print_config, - print_gram_matrix, - print_loss_history, - print_realization_diagnostics, - print_title -}; use dyna3::engine::{ point, realize_gram, @@ -29,11 +23,11 @@ fn main() { let realization_result = realize_gram( &problem, 1.0e-12, 0.5, 0.9, 1.1, 200, 110 ); - print_title("Point on a sphere"); - print_realization_diagnostics(&realization_result); + print::title("Point on a sphere"); + print::realization_diagnostics(&realization_result); if let Ok(Realization{ config, .. }) = realization_result.result { - print_gram_matrix(&config); - print_config(&config); + print::gram_matrix(&config); + print::config(&config); } - print_loss_history(&realization_result.history); + print::loss_history(&realization_result.history); } \ No newline at end of file diff --git a/app-proto/examples/three-spheres.rs b/app-proto/examples/three-spheres.rs index dd2cdc0..74caf4a 100644 --- a/app-proto/examples/three-spheres.rs +++ b/app-proto/examples/three-spheres.rs @@ -1,11 +1,6 @@ -mod common; +#[path = "common/print.rs"] +mod print; -use common::{ - print_gram_matrix, - print_loss_history, - print_realization_diagnostics, - print_title -}; use dyna3::engine::{realize_gram, sphere, ConstraintProblem, Realization}; fn main() { @@ -25,10 +20,10 @@ fn main() { let realization_result = realize_gram( &problem, 1.0e-12, 0.5, 0.9, 1.1, 200, 110 ); - print_title("Three spheres"); - print_realization_diagnostics(&realization_result); + print::title("Three spheres"); + print::realization_diagnostics(&realization_result); if let Ok(Realization{ config, .. }) = realization_result.result { - print_gram_matrix(&config); + print::gram_matrix(&config); } - print_loss_history(&realization_result.history); + print::loss_history(&realization_result.history); } \ No newline at end of file