@@ -504,6 +504,130 @@ impl StatusMessage {
504504 }
505505}
506506
507+ enum ActiveOptimizerView < ' a > {
508+ Lbfgs {
509+ inputs : & ' a LbfgsInputState ,
510+ preset : OptimizerPreset ,
511+ } ,
512+ NelderMead {
513+ inputs : & ' a NelderMeadInputState ,
514+ preset : OptimizerPreset ,
515+ } ,
516+ SteepestDescent {
517+ inputs : & ' a SteepestDescentInputState ,
518+ preset : OptimizerPreset ,
519+ } ,
520+ NewtonCg {
521+ inputs : & ' a NewtonCgInputState ,
522+ preset : OptimizerPreset ,
523+ } ,
524+ Sgd {
525+ inputs : & ' a SgdInputState ,
526+ preset : OptimizerPreset ,
527+ } ,
528+ Adam {
529+ inputs : & ' a AdamInputState ,
530+ preset : OptimizerPreset ,
531+ } ,
532+ }
533+
534+ impl ActiveOptimizerView < ' _ > {
535+ fn preset ( self ) -> OptimizerPreset {
536+ match self {
537+ Self :: Lbfgs { preset, .. }
538+ | Self :: NelderMead { preset, .. }
539+ | Self :: SteepestDescent { preset, .. }
540+ | Self :: NewtonCg { preset, .. }
541+ | Self :: Sgd { preset, .. }
542+ | Self :: Adam { preset, .. } => preset,
543+ }
544+ }
545+
546+ fn config ( self ) -> Result < OptimizerConfig , String > {
547+ match self {
548+ Self :: Lbfgs { inputs, .. } => inputs. to_config ( ) . map ( OptimizerConfig :: Lbfgs ) ,
549+ Self :: NelderMead { inputs, .. } => inputs. to_config ( ) . map ( OptimizerConfig :: NelderMead ) ,
550+ Self :: SteepestDescent { inputs, .. } => {
551+ inputs. to_config ( ) . map ( OptimizerConfig :: SteepestDescent )
552+ }
553+ Self :: NewtonCg { inputs, .. } => inputs. to_config ( ) . map ( OptimizerConfig :: NewtonCg ) ,
554+ Self :: Sgd { inputs, .. } => inputs. to_config ( ) . map ( OptimizerConfig :: Sgd ) ,
555+ Self :: Adam { inputs, .. } => inputs. to_config ( ) . map ( OptimizerConfig :: Adam ) ,
556+ }
557+ }
558+ }
559+
560+ enum ActiveOptimizerViewMut < ' a > {
561+ Lbfgs {
562+ inputs : & ' a mut LbfgsInputState ,
563+ preset : & ' a mut OptimizerPreset ,
564+ } ,
565+ NelderMead {
566+ inputs : & ' a mut NelderMeadInputState ,
567+ preset : & ' a mut OptimizerPreset ,
568+ } ,
569+ SteepestDescent {
570+ inputs : & ' a mut SteepestDescentInputState ,
571+ preset : & ' a mut OptimizerPreset ,
572+ } ,
573+ NewtonCg {
574+ inputs : & ' a mut NewtonCgInputState ,
575+ preset : & ' a mut OptimizerPreset ,
576+ } ,
577+ Sgd {
578+ inputs : & ' a mut SgdInputState ,
579+ preset : & ' a mut OptimizerPreset ,
580+ } ,
581+ Adam {
582+ inputs : & ' a mut AdamInputState ,
583+ preset : & ' a mut OptimizerPreset ,
584+ } ,
585+ }
586+
587+ impl ActiveOptimizerViewMut < ' _ > {
588+ fn set_preset ( self , value : OptimizerPreset ) {
589+ match self {
590+ Self :: Lbfgs { preset, .. }
591+ | Self :: NelderMead { preset, .. }
592+ | Self :: SteepestDescent { preset, .. }
593+ | Self :: NewtonCg { preset, .. }
594+ | Self :: Sgd { preset, .. }
595+ | Self :: Adam { preset, .. } => * preset = value,
596+ }
597+ }
598+
599+ fn apply_preset ( self , value : OptimizerPreset ) {
600+ match self {
601+ Self :: Lbfgs { inputs, preset } => {
602+ * inputs = LbfgsInputState :: from_config ( & lbfgs_config_from_preset ( value) ) ;
603+ * preset = value;
604+ }
605+ Self :: NelderMead { inputs, preset } => {
606+ * inputs = NelderMeadInputState :: from_config ( & nelder_mead_config_from_preset ( value) ) ;
607+ * preset = value;
608+ }
609+ Self :: SteepestDescent { inputs, preset } => {
610+ * inputs = SteepestDescentInputState :: from_config (
611+ & steepest_descent_config_from_preset ( value) ,
612+ ) ;
613+ * preset = value;
614+ }
615+ Self :: NewtonCg { inputs, preset } => {
616+ * inputs = NewtonCgInputState :: from_config ( & newton_cg_config_from_preset ( value) ) ;
617+ * preset = value;
618+ }
619+ Self :: Sgd { inputs, preset } => {
620+ * inputs = SgdInputState :: from_config ( & sgd_config_from_preset ( value) ) ;
621+ * preset = value;
622+ }
623+ Self :: Adam { inputs, preset } => {
624+ * inputs = AdamInputState :: from_config ( & adam_config_from_preset ( value) ) ;
625+ * preset = value;
626+ }
627+ }
628+ }
629+ }
630+
507631#[ cfg( not( target_arch = "wasm32" ) ) ]
508632#[ derive( Debug ) ]
509633enum FitWorkerMessage {
@@ -621,79 +745,78 @@ impl CurveFitApp {
621745 ResolvedModel :: from_choice ( self . selected_model , self . polynomial_degree )
622746 }
623747
624- fn selected_optimizer_preset ( & self ) -> OptimizerPreset {
748+ fn active_optimizer_view ( & self ) -> ActiveOptimizerView < ' _ > {
625749 match self . optimizer_method {
626- OptimizerMethod :: Lbfgs => self . lbfgs_preset ,
627- OptimizerMethod :: NelderMead => self . nelder_mead_preset ,
628- OptimizerMethod :: SteepestDescent => self . steepest_descent_preset ,
629- OptimizerMethod :: NewtonCg => self . newton_cg_preset ,
630- OptimizerMethod :: Sgd => self . sgd_preset ,
631- OptimizerMethod :: Adam => self . adam_preset ,
750+ OptimizerMethod :: Lbfgs => ActiveOptimizerView :: Lbfgs {
751+ inputs : & self . lbfgs_inputs ,
752+ preset : self . lbfgs_preset ,
753+ } ,
754+ OptimizerMethod :: NelderMead => ActiveOptimizerView :: NelderMead {
755+ inputs : & self . nelder_mead_inputs ,
756+ preset : self . nelder_mead_preset ,
757+ } ,
758+ OptimizerMethod :: SteepestDescent => ActiveOptimizerView :: SteepestDescent {
759+ inputs : & self . steepest_descent_inputs ,
760+ preset : self . steepest_descent_preset ,
761+ } ,
762+ OptimizerMethod :: NewtonCg => ActiveOptimizerView :: NewtonCg {
763+ inputs : & self . newton_cg_inputs ,
764+ preset : self . newton_cg_preset ,
765+ } ,
766+ OptimizerMethod :: Sgd => ActiveOptimizerView :: Sgd {
767+ inputs : & self . sgd_inputs ,
768+ preset : self . sgd_preset ,
769+ } ,
770+ OptimizerMethod :: Adam => ActiveOptimizerView :: Adam {
771+ inputs : & self . adam_inputs ,
772+ preset : self . adam_preset ,
773+ } ,
632774 }
633775 }
634776
635- fn set_selected_optimizer_preset ( & mut self , preset : OptimizerPreset ) {
777+ fn active_optimizer_view_mut ( & mut self ) -> ActiveOptimizerViewMut < ' _ > {
636778 match self . optimizer_method {
637- OptimizerMethod :: Lbfgs => self . lbfgs_preset = preset,
638- OptimizerMethod :: NelderMead => self . nelder_mead_preset = preset,
639- OptimizerMethod :: SteepestDescent => self . steepest_descent_preset = preset,
640- OptimizerMethod :: NewtonCg => self . newton_cg_preset = preset,
641- OptimizerMethod :: Sgd => self . sgd_preset = preset,
642- OptimizerMethod :: Adam => self . adam_preset = preset,
779+ OptimizerMethod :: Lbfgs => ActiveOptimizerViewMut :: Lbfgs {
780+ inputs : & mut self . lbfgs_inputs ,
781+ preset : & mut self . lbfgs_preset ,
782+ } ,
783+ OptimizerMethod :: NelderMead => ActiveOptimizerViewMut :: NelderMead {
784+ inputs : & mut self . nelder_mead_inputs ,
785+ preset : & mut self . nelder_mead_preset ,
786+ } ,
787+ OptimizerMethod :: SteepestDescent => ActiveOptimizerViewMut :: SteepestDescent {
788+ inputs : & mut self . steepest_descent_inputs ,
789+ preset : & mut self . steepest_descent_preset ,
790+ } ,
791+ OptimizerMethod :: NewtonCg => ActiveOptimizerViewMut :: NewtonCg {
792+ inputs : & mut self . newton_cg_inputs ,
793+ preset : & mut self . newton_cg_preset ,
794+ } ,
795+ OptimizerMethod :: Sgd => ActiveOptimizerViewMut :: Sgd {
796+ inputs : & mut self . sgd_inputs ,
797+ preset : & mut self . sgd_preset ,
798+ } ,
799+ OptimizerMethod :: Adam => ActiveOptimizerViewMut :: Adam {
800+ inputs : & mut self . adam_inputs ,
801+ preset : & mut self . adam_preset ,
802+ } ,
643803 }
644804 }
645805
806+ fn selected_optimizer_preset ( & self ) -> OptimizerPreset {
807+ self . active_optimizer_view ( ) . preset ( )
808+ }
809+
810+ fn set_selected_optimizer_preset ( & mut self , preset : OptimizerPreset ) {
811+ self . active_optimizer_view_mut ( ) . set_preset ( preset) ;
812+ }
813+
646814 fn apply_selected_optimizer_preset ( & mut self , preset : OptimizerPreset ) {
647- match self . optimizer_method {
648- OptimizerMethod :: Lbfgs => {
649- self . lbfgs_inputs = LbfgsInputState :: from_config ( & lbfgs_config_from_preset ( preset) ) ;
650- self . lbfgs_preset = preset;
651- }
652- OptimizerMethod :: NelderMead => {
653- self . nelder_mead_inputs =
654- NelderMeadInputState :: from_config ( & nelder_mead_config_from_preset ( preset) ) ;
655- self . nelder_mead_preset = preset;
656- }
657- OptimizerMethod :: SteepestDescent => {
658- self . steepest_descent_inputs = SteepestDescentInputState :: from_config (
659- & steepest_descent_config_from_preset ( preset) ,
660- ) ;
661- self . steepest_descent_preset = preset;
662- }
663- OptimizerMethod :: NewtonCg => {
664- self . newton_cg_inputs =
665- NewtonCgInputState :: from_config ( & newton_cg_config_from_preset ( preset) ) ;
666- self . newton_cg_preset = preset;
667- }
668- OptimizerMethod :: Sgd => {
669- self . sgd_inputs = SgdInputState :: from_config ( & sgd_config_from_preset ( preset) ) ;
670- self . sgd_preset = preset;
671- }
672- OptimizerMethod :: Adam => {
673- self . adam_inputs = AdamInputState :: from_config ( & adam_config_from_preset ( preset) ) ;
674- self . adam_preset = preset;
675- }
676- }
815+ self . active_optimizer_view_mut ( ) . apply_preset ( preset) ;
677816 }
678817
679818 fn optimizer_config ( & self ) -> Result < OptimizerConfig , String > {
680- match self . optimizer_method {
681- OptimizerMethod :: Lbfgs => self . lbfgs_inputs . to_config ( ) . map ( OptimizerConfig :: Lbfgs ) ,
682- OptimizerMethod :: NelderMead => self
683- . nelder_mead_inputs
684- . to_config ( )
685- . map ( OptimizerConfig :: NelderMead ) ,
686- OptimizerMethod :: SteepestDescent => self
687- . steepest_descent_inputs
688- . to_config ( )
689- . map ( OptimizerConfig :: SteepestDescent ) ,
690- OptimizerMethod :: NewtonCg => self
691- . newton_cg_inputs
692- . to_config ( )
693- . map ( OptimizerConfig :: NewtonCg ) ,
694- OptimizerMethod :: Sgd => self . sgd_inputs . to_config ( ) . map ( OptimizerConfig :: Sgd ) ,
695- OptimizerMethod :: Adam => self . adam_inputs . to_config ( ) . map ( OptimizerConfig :: Adam ) ,
696- }
819+ self . active_optimizer_view ( ) . config ( )
697820 }
698821
699822 fn auto_spline_samples ( points_len : usize , knots : usize ) -> usize {
0 commit comments