Skip to content

Commit 8253337

Browse files
committed
added optional data normalizer
1 parent e6538d5 commit 8253337

8 files changed

Lines changed: 592 additions & 88 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "curve-fit"
3-
version = "0.1.4"
3+
version = "0.1.5"
44
edition = "2024"
55
authors = ["hexqnt <hexqntlab@gmail.com>"]
66
license = "Apache-2.0 OR MIT"
@@ -20,14 +20,14 @@ argmin = { version = "0.11.0", default-features = false }
2020
argmin-math = { version = "0.5.1", default-features = false, features = [
2121
"vec",
2222
] }
23-
egui_extras = { version = "0.34.0", default-features = false, features = [
23+
egui_extras = { version = "0.34.1", default-features = false, features = [
2424
"svg_text",
2525
] }
2626
egui_plot = "0.35.0"
2727
stochastic_optimizers = "0.3.0"
2828

2929
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
30-
eframe = { version = "0.34.0", default-features = false, features = [
30+
eframe = { version = "0.34.1", default-features = false, features = [
3131
"default_fonts",
3232
"glow",
3333
"x11",
@@ -36,7 +36,7 @@ eframe = { version = "0.34.0", default-features = false, features = [
3636
sys-locale = "0.3.2"
3737

3838
[target.'cfg(target_arch = "wasm32")'.dependencies]
39-
eframe = { version = "0.34.0", default-features = false, features = [
39+
eframe = { version = "0.34.1", default-features = false, features = [
4040
"default_fonts",
4141
"glow",
4242
] }

src/app.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mod fit_worker;
1717
mod formula;
1818
mod i18n;
1919
mod input_parse;
20+
mod normalization;
2021
mod optimizer;
2122
mod param_init;
2223
mod plot_utils;
@@ -39,6 +40,7 @@ use self::i18n::{
3940
reset_icon_image, spline_extrapolation_label, spline_knot_strategy_label, spray_brush_label,
4041
stop_icon_image, tool_icon_image, tool_label, tr, undo_icon_image, view_icon_image,
4142
};
43+
use self::normalization::ParametricNormalization;
4244
use self::optimizer::{
4345
AdamInputState, LbfgsInputState, NelderMeadInputState, OptimizerPreset, OptimizerUiMode,
4446
SgdInputState, SteepestDescentInputState, adam_config_from_preset, infer_adam_preset,
@@ -72,7 +74,7 @@ use crate::fit::{IncrementalSplineFitRunner, IncrementalSplineFitStep};
7274
use crate::fit::{
7375
SplineConfig, SplineDuplicateXPolicy, SplineExtrapolation, SplineFamilyKind,
7476
SplineKnotStrategy, SplineResult, build_spline_initial_curve_from_knot_y,
75-
calculate_iteration_metrics, default_spline_initial_knot_y, sample_curve,
77+
calculate_iteration_metrics, calculate_metrics, default_spline_initial_knot_y, sample_curve,
7678
};
7779

7880
#[cfg(not(target_arch = "wasm32"))]
@@ -305,6 +307,16 @@ impl ResolvedModel {
305307
}
306308
}
307309

310+
fn spline_family(self) -> Option<SplineFamilyKind> {
311+
match self {
312+
Self::LinearSpline => Some(SplineFamilyKind::Linear),
313+
Self::MonotoneCubicSpline => Some(SplineFamilyKind::MonotoneCubic),
314+
Self::NaturalCubicSpline => Some(SplineFamilyKind::NaturalCubic),
315+
Self::AkimaSpline => Some(SplineFamilyKind::Akima),
316+
Self::Parametric(_) => None,
317+
}
318+
}
319+
308320
fn spline_min_knots(self) -> Option<usize> {
309321
match self {
310322
Self::Parametric(_) => None,
@@ -501,7 +513,10 @@ enum FitWorkerMessage {
501513

502514
#[cfg(target_arch = "wasm32")]
503515
enum WasmFitRunner {
504-
Parametric(IncrementalFitRunner),
516+
Parametric {
517+
runner: IncrementalFitRunner,
518+
normalization: Option<ParametricNormalization>,
519+
},
505520
Spline(IncrementalSplineFitRunner),
506521
}
507522

@@ -520,6 +535,7 @@ pub struct CurveFitApp {
520535
optimizer_method: OptimizerMethod,
521536
optimizer_mode: OptimizerUiMode,
522537
optimization_loss_metric: OptimizationLossMetric,
538+
normalize_parametric_data: bool,
523539
lbfgs_inputs: LbfgsInputState,
524540
lbfgs_preset: OptimizerPreset,
525541
nelder_mead_inputs: NelderMeadInputState,
@@ -779,13 +795,7 @@ impl CurveFitApp {
779795

780796
fn spline_family_and_init_config(&self) -> Option<(SplineFamilyKind, SplineConfig)> {
781797
let model = self.resolved_model();
782-
let family = match model {
783-
ResolvedModel::LinearSpline => SplineFamilyKind::Linear,
784-
ResolvedModel::MonotoneCubicSpline => SplineFamilyKind::MonotoneCubic,
785-
ResolvedModel::NaturalCubicSpline => SplineFamilyKind::NaturalCubic,
786-
ResolvedModel::AkimaSpline => SplineFamilyKind::Akima,
787-
ResolvedModel::Parametric(_) => return None,
788-
};
798+
let family = model.spline_family()?;
789799
let config = self.spline_config_for_model(model, 2)?;
790800
Some((family, config))
791801
}
@@ -1085,6 +1095,7 @@ impl Default for CurveFitApp {
10851095
optimizer_method: OptimizerMethod::Lbfgs,
10861096
optimizer_mode: OptimizerUiMode::Basic,
10871097
optimization_loss_metric: OptimizationLossMetric::default(),
1098+
normalize_parametric_data: false,
10881099
lbfgs_inputs: LbfgsInputState::from_config(&default_lbfgs),
10891100
lbfgs_preset: infer_lbfgs_preset(&default_lbfgs),
10901101
nelder_mead_inputs: NelderMeadInputState::from_config(&default_nelder_mead),

0 commit comments

Comments
 (0)