Skip to content

Commit 8919c72

Browse files
committed
minor refactoring
1 parent 0c46387 commit 8919c72

5 files changed

Lines changed: 452 additions & 402 deletions

File tree

src/app.rs

Lines changed: 184 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
509633
enum 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 {

src/app/diagnostics.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,27 +95,27 @@ impl IterationDiagnostics {
9595
fn reset_for_family(&mut self, family: CurveFamily) {
9696
self.family = Some(family);
9797
self.spline_parameter_count = None;
98-
self.clear_metric_points();
99-
self.parameter_names = family
100-
.parameter_names()
101-
.iter()
102-
.map(|name| (*name).to_string())
103-
.collect();
104-
self.parameter_series = (0..self.parameter_names.len())
105-
.map(|_| Vec::new())
106-
.collect();
98+
self.reset_parameter_series(
99+
family
100+
.parameter_names()
101+
.iter()
102+
.map(|name| (*name).to_string()),
103+
);
107104
}
108105

109106
fn reset_for_spline(&mut self, parameter_count: usize) {
110107
self.family = None;
111108
self.spline_parameter_count = Some(parameter_count);
109+
self.reset_parameter_series((0..parameter_count).map(|index| format!("knot_y[{index}]")));
110+
}
111+
112+
fn reset_parameter_series<I>(&mut self, names: I)
113+
where
114+
I: IntoIterator<Item = String>,
115+
{
112116
self.clear_metric_points();
113-
self.parameter_names = (0..parameter_count)
114-
.map(|index| format!("knot_y[{index}]"))
115-
.collect();
116-
self.parameter_series = (0..self.parameter_names.len())
117-
.map(|_| Vec::new())
118-
.collect();
117+
self.parameter_names = names.into_iter().collect();
118+
self.parameter_series = vec![Vec::new(); self.parameter_names.len()];
119119
}
120120

121121
/// Очищает только временные ряды метрик, не трогая метаданные параметров.

0 commit comments

Comments
 (0)