@@ -17,6 +17,7 @@ mod fit_worker;
1717mod formula;
1818mod i18n;
1919mod input_parse;
20+ mod normalization;
2021mod optimizer;
2122mod param_init;
2223mod 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 ;
4244use 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};
7274use 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" ) ]
503515enum 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