|
| 1 | +//! Создание `CurveFitApp` и инициализация значений по умолчанию для UI и рантайма. |
| 2 | +
|
| 3 | +use super::*; |
| 4 | + |
| 5 | +impl CurveFitApp { |
| 6 | + /// Создает приложение и настраивает загрузчики изображений для иконок/формул. |
| 7 | + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { |
| 8 | + egui_extras::install_image_loaders(&cc.egui_ctx); |
| 9 | + Self { |
| 10 | + ui_language: UiLanguage::from_system_locale(), |
| 11 | + ..Self::default() |
| 12 | + } |
| 13 | + } |
| 14 | +} |
| 15 | + |
| 16 | +impl Default for CurveFitApp { |
| 17 | + fn default() -> Self { |
| 18 | + let selected_model = ModelChoice::Polynomial; |
| 19 | + let polynomial_degree = 1; |
| 20 | + let selected_family = polynomial_family(polynomial_degree); |
| 21 | + let default_lbfgs = LbfgsConfig::default(); |
| 22 | + let default_nelder_mead = NelderMeadConfig::default(); |
| 23 | + let default_steepest_descent = SteepestDescentConfig::default(); |
| 24 | + let default_newton_cg = NewtonCgConfig::default(); |
| 25 | + let default_sgd = SgdConfig::default(); |
| 26 | + let default_adam = AdamConfig::default(); |
| 27 | + |
| 28 | + Self { |
| 29 | + points: PointsEditorState::default(), |
| 30 | + #[cfg(not(target_arch = "wasm32"))] |
| 31 | + points_file_import_dialog: FileDialog::new() |
| 32 | + .title("Import points from file") |
| 33 | + .add_file_filter_extensions("Point files", vec!["csv", "CSV", "xlsx", "XLSX"]) |
| 34 | + .add_file_filter_extensions("CSV files", vec!["csv", "CSV"]) |
| 35 | + .add_file_filter_extensions("Excel files", vec!["xlsx", "XLSX"]) |
| 36 | + .default_file_filter("Point files"), |
| 37 | + #[cfg(not(target_arch = "wasm32"))] |
| 38 | + points_file_import_last_directory: None, |
| 39 | + #[cfg(not(target_arch = "wasm32"))] |
| 40 | + clipboard_import_request_pending: false, |
| 41 | + #[cfg(not(target_arch = "wasm32"))] |
| 42 | + clipboard_import_requested_at: None, |
| 43 | + #[cfg(target_arch = "wasm32")] |
| 44 | + clipboard_import_web_in_flight: false, |
| 45 | + #[cfg(target_arch = "wasm32")] |
| 46 | + clipboard_import_web_result: Rc::new(RefCell::new(None)), |
| 47 | + #[cfg(target_arch = "wasm32")] |
| 48 | + clipboard_copy_web_in_flight: false, |
| 49 | + #[cfg(target_arch = "wasm32")] |
| 50 | + clipboard_copy_web_result: Rc::new(RefCell::new(None)), |
| 51 | + selected_model, |
| 52 | + polynomial_degree, |
| 53 | + parameter_inputs: params_to_input_strings(&selected_family.default_params()), |
| 54 | + optimizer_method: OptimizerMethod::Lbfgs, |
| 55 | + optimizer_mode: OptimizerUiMode::Basic, |
| 56 | + optimization_loss_metric: OptimizationLossMetric::default(), |
| 57 | + metric_quantization_enabled: false, |
| 58 | + metric_quantization_decimal_places: DEFAULT_METRIC_QUANTIZATION_DECIMAL_PLACES, |
| 59 | + normalize_parametric_data: false, |
| 60 | + lbfgs_inputs: LbfgsInputState::from_config(&default_lbfgs), |
| 61 | + lbfgs_preset: infer_lbfgs_preset(&default_lbfgs), |
| 62 | + nelder_mead_inputs: NelderMeadInputState::from_config(&default_nelder_mead), |
| 63 | + nelder_mead_preset: infer_nelder_mead_preset(&default_nelder_mead), |
| 64 | + steepest_descent_inputs: SteepestDescentInputState::from_config( |
| 65 | + &default_steepest_descent, |
| 66 | + ), |
| 67 | + steepest_descent_preset: infer_steepest_descent_preset(&default_steepest_descent), |
| 68 | + newton_cg_inputs: NewtonCgInputState::from_config(&default_newton_cg), |
| 69 | + newton_cg_preset: infer_newton_cg_preset(&default_newton_cg), |
| 70 | + sgd_inputs: SgdInputState::from_config(&default_sgd), |
| 71 | + sgd_preset: infer_sgd_preset(&default_sgd), |
| 72 | + adam_inputs: AdamInputState::from_config(&default_adam), |
| 73 | + adam_preset: infer_adam_preset(&default_adam), |
| 74 | + ui_language: UiLanguage::English, |
| 75 | + plot_tool: PlotTool::SinglePoint, |
| 76 | + spray_points_per_second: 140, |
| 77 | + spray_radius_rel: 0.02, |
| 78 | + spray_brush: SprayBrush::Uniform, |
| 79 | + eraser_radius_rel: 0.03, |
| 80 | + spray_seed: 0xDEADBEEFCAFEBABE, |
| 81 | + spray_points_budget: 0.0, |
| 82 | + spray_last_emit_at: None, |
| 83 | + fit_to_content_requested: false, |
| 84 | + center_origin_requested: false, |
| 85 | + origin_bottom_left_requested: true, |
| 86 | + last_plot_bounds: None, |
| 87 | + active_tool_bounds: None, |
| 88 | + panel: PanelState::default(), |
| 89 | + spline_knots: crate::fit::DEFAULT_SPLINE_KNOTS, |
| 90 | + spline_knot_strategy: SplineKnotStrategy::default(), |
| 91 | + spline_extrapolation: SplineExtrapolation::default(), |
| 92 | + spline_duplicate_x_policy: SplineDuplicateXPolicy::default(), |
| 93 | + spline_initial_knot_y_inputs: Vec::new(), |
| 94 | + auto_refit_enabled: false, |
| 95 | + auto_refit_pending_rerun: false, |
| 96 | + last_right_panel_fit_snapshot: None, |
| 97 | + replay: ReplayState::default(), |
| 98 | + fit_in_progress: false, |
| 99 | + fit_loss_metric: OptimizationLossMetric::default(), |
| 100 | + fit_metric_quantization: MetricQuantization::Disabled, |
| 101 | + fit_optimizer_method: OptimizerMethod::default(), |
| 102 | + fit_export_record: None, |
| 103 | + #[cfg(not(target_arch = "wasm32"))] |
| 104 | + fit_export_file_dialog: FileDialog::new() |
| 105 | + .title("Save fit result JSON") |
| 106 | + .add_save_extension("JSON files", "json") |
| 107 | + .default_save_extension("JSON files") |
| 108 | + .default_file_name("fit-result.json"), |
| 109 | + #[cfg(not(target_arch = "wasm32"))] |
| 110 | + fit_export_last_directory: None, |
| 111 | + #[cfg(not(target_arch = "wasm32"))] |
| 112 | + fit_export_pending_json: None, |
| 113 | + fit_preview_params: None, |
| 114 | + fit_preview_iteration: None, |
| 115 | + fit_started_at: None, |
| 116 | + last_fit_duration: None, |
| 117 | + fit_result: None, |
| 118 | + spline_result: None, |
| 119 | + active_fit_points: None, |
| 120 | + fit_run_ui_seed: None, |
| 121 | + result_metrics: None, |
| 122 | + residual_plot_points: Vec::new(), |
| 123 | + spline_plot_curve: None, |
| 124 | + #[cfg(not(target_arch = "wasm32"))] |
| 125 | + formula_svg_cache: None, |
| 126 | + sampled_curve_cache: None, |
| 127 | + iteration_diagnostics: IterationDiagnostics::default(), |
| 128 | + status: Some(StatusMessage::Ready), |
| 129 | + #[cfg(not(target_arch = "wasm32"))] |
| 130 | + fit_worker_rx: None, |
| 131 | + #[cfg(not(target_arch = "wasm32"))] |
| 132 | + fit_cancel_flag: None, |
| 133 | + #[cfg(not(target_arch = "wasm32"))] |
| 134 | + discard_fit_worker_updates: false, |
| 135 | + #[cfg(target_arch = "wasm32")] |
| 136 | + wasm_fit_job: None, |
| 137 | + } |
| 138 | + } |
| 139 | +} |
0 commit comments