| 325 // format!("{:?}", self).hash(state); |
325 // format!("{:?}", self).hash(state); |
| 326 // } |
326 // } |
| 327 // } |
327 // } |
| 328 |
328 |
| 329 /// Plotting level configuration |
329 /// Plotting level configuration |
| 330 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Serialize, ValueEnum, Debug)] |
330 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize, ValueEnum, Debug)] |
| 331 pub enum PlotLevel { |
331 pub enum PlotLevel { |
| 332 /// Plot nothing |
332 /// Plot nothing |
| 333 #[clap(name = "none")] |
333 #[clap(name = "none")] |
| 334 None, |
334 None, |
| 335 /// Plot problem data |
335 /// Plot problem data |
| 370 pruned : usize, |
370 pruned : usize, |
| 371 this_iters : usize, |
371 this_iters : usize, |
| 372 } |
372 } |
| 373 |
373 |
| 374 /// Collected experiment statistics |
374 /// Collected experiment statistics |
| 375 #[derive(Clone, Debug, Serialize)] |
375 #[derive(Clone, Debug, Serialize, Deserialize)] |
| 376 struct ExperimentStats<F : Float> { |
376 struct ExperimentStats<F : Float> { |
| 377 /// Signal-to-noise ratio in decibels |
377 /// Signal-to-noise ratio in decibels |
| 378 ssnr : F, |
378 ssnr : F, |
| 379 /// Proportion of noise in the signal as a number in $[0, 1]$. |
379 /// Proportion of noise in the signal as a number in $[0, 1]$. |
| 380 noise_ratio : F, |
380 noise_ratio : F, |
| 414 Ok(()) |
414 Ok(()) |
| 415 } |
415 } |
| 416 |
416 |
| 417 |
417 |
| 418 /// Struct for experiment configurations |
418 /// Struct for experiment configurations |
| 419 #[derive(Debug, Clone, Serialize)] |
419 #[derive(Debug, Clone, Serialize, Deserialize)] |
| |
420 #[serde(bound( |
| |
421 serialize = "Cube<F, N> : Serialize, |
| |
422 NoiseDistr : Serialize, |
| |
423 [usize; N] : Serialize, |
| |
424 RNDM<F, N> : Serialize, |
| |
425 Regularisation<F> : Serialize, |
| |
426 F : Serialize, |
| |
427 S : Serialize, |
| |
428 P : Serialize, |
| |
429 K : Serialize", |
| |
430 deserialize = "Cube<F, N> : for<'a> Deserialize<'a>, |
| |
431 NoiseDistr : for<'a> Deserialize<'a>, |
| |
432 [usize; N] : for<'a> Deserialize<'a>, |
| |
433 RNDM<F, N> : for<'a> Deserialize<'a>, |
| |
434 Regularisation<F> : for<'a> Deserialize<'a>, |
| |
435 F : for<'a> Deserialize<'a>, |
| |
436 S : for<'a> Deserialize<'a>, |
| |
437 P : for<'a> Deserialize<'a>, |
| |
438 K : for<'a> Deserialize<'a>,", |
| |
439 ))] |
| 420 pub struct ExperimentV2<F, NoiseDistr, S, K, P, const N : usize> |
440 pub struct ExperimentV2<F, NoiseDistr, S, K, P, const N : usize> |
| 421 where F : Float, |
441 where F : Float, |
| 422 [usize; N] : Serialize, |
|
| 423 NoiseDistr : Distribution<F>, |
442 NoiseDistr : Distribution<F>, |
| 424 S : Sensor<F, N>, |
443 S : Sensor<F, N>, |
| 425 P : Spread<F, N>, |
444 P : Spread<F, N>, |
| 426 K : SimpleConvolutionKernel<F, N>, |
445 K : SimpleConvolutionKernel<F, N>, |
| 427 { |
446 { |
| 450 /// A map of default configurations for algorithms |
469 /// A map of default configurations for algorithms |
| 451 #[serde(skip)] |
470 #[serde(skip)] |
| 452 pub algorithm_defaults : HashMap<DefaultAlgorithm, AlgorithmConfig<F>>, |
471 pub algorithm_defaults : HashMap<DefaultAlgorithm, AlgorithmConfig<F>>, |
| 453 } |
472 } |
| 454 |
473 |
| 455 #[derive(Debug, Clone, Serialize)] |
474 #[derive(Debug, Clone, Serialize, Deserialize)] |
| |
475 #[serde(bound( |
| |
476 serialize = "ExperimentV2<F, NoiseDistr, S, K, P, N> : Serialize, |
| |
477 B : Serialize, |
| |
478 F : Serialize", |
| |
479 deserialize = "ExperimentV2<F, NoiseDistr, S, K, P, N >: for<'a> Deserialize<'a>, |
| |
480 B : for<'a> Deserialize<'a>, |
| |
481 F : for<'a> Deserialize<'a>", |
| |
482 ))] |
| 456 pub struct ExperimentBiased<F, NoiseDistr, S, K, P, B, const N : usize> |
483 pub struct ExperimentBiased<F, NoiseDistr, S, K, P, B, const N : usize> |
| 457 where F : Float, |
484 where F : Float, |
| 458 [usize; N] : Serialize, |
485 [usize; N] : Serialize, |
| 459 NoiseDistr : Distribution<F>, |
486 NoiseDistr : Distribution<F>, |
| 460 S : Sensor<F, N>, |
487 S : Sensor<F, N>, |
| 539 String, |
566 String, |
| 540 ) -> Result<(RNDM<F, N>, Z), RunError>, |
567 ) -> Result<(RNDM<F, N>, Z), RunError>, |
| 541 ) -> DynError |
568 ) -> DynError |
| 542 where |
569 where |
| 543 PlotLookup : Plotting<N>, |
570 PlotLookup : Plotting<N>, |
| |
571 DeltaMeasure<Loc<F, N>, F> : Serialize, |
| 544 { |
572 { |
| 545 let mut logs = Vec::new(); |
573 let mut logs = Vec::new(); |
| 546 |
574 |
| 547 let iterator_options = AlgIteratorOptions{ |
575 let iterator_options = AlgIteratorOptions{ |
| 548 max_iter : cli.max_iter, |
576 max_iter : cli.max_iter, |
| 645 PlotLookup : Plotting<N>, |
673 PlotLookup : Plotting<N>, |
| 646 DefaultBT<F, N> : SensorGridBT<F, S, P, N, Depth=DynamicDepth> + BTSearch<F, N>, |
674 DefaultBT<F, N> : SensorGridBT<F, S, P, N, Depth=DynamicDepth> + BTSearch<F, N>, |
| 647 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
675 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
| 648 RNDM<F, N> : SpikeMerging<F>, |
676 RNDM<F, N> : SpikeMerging<F>, |
| 649 NoiseDistr : Distribution<F> + Serialize + std::fmt::Debug, |
677 NoiseDistr : Distribution<F> + Serialize + std::fmt::Debug, |
| |
678 [F; N] : Serialize, |
| |
679 [[F; 2]; N] : Serialize, |
| 650 // DefaultSG<F, S, P, N> : ForwardModel<RNDM<F, N>, F, PreadjointCodomain = PreadjointCodomain, Observable=DVector<F::MixedType>>, |
680 // DefaultSG<F, S, P, N> : ForwardModel<RNDM<F, N>, F, PreadjointCodomain = PreadjointCodomain, Observable=DVector<F::MixedType>>, |
| 651 // PreadjointCodomain : Space + Bounded<F> + DifferentiableRealMapping<F, N>, |
681 // PreadjointCodomain : Space + Bounded<F> + DifferentiableRealMapping<F, N>, |
| 652 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
682 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
| 653 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, NonnegRadonRegTerm<F>, N>, |
683 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, NonnegRadonRegTerm<F>, N>, |
| 654 // RadonSquared : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
684 // RadonSquared : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
| 910 DefaultBT<F, N> : SensorGridBT<F, S, P, N, Depth=DynamicDepth> + BTSearch<F, N>, |
940 DefaultBT<F, N> : SensorGridBT<F, S, P, N, Depth=DynamicDepth> + BTSearch<F, N>, |
| 911 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
941 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
| 912 RNDM<F, N> : SpikeMerging<F>, |
942 RNDM<F, N> : SpikeMerging<F>, |
| 913 NoiseDistr : Distribution<F> + Serialize + std::fmt::Debug, |
943 NoiseDistr : Distribution<F> + Serialize + std::fmt::Debug, |
| 914 B : Mapping<Loc<F, N>, Codomain = F> + Serialize + std::fmt::Debug, |
944 B : Mapping<Loc<F, N>, Codomain = F> + Serialize + std::fmt::Debug, |
| |
945 [F; N] : Serialize, |
| |
946 [[F; 2]; N] : Serialize, |
| 915 // DefaultSG<F, S, P, N> : ForwardModel<RNDM<F, N>, F, PreadjointCodomain = PreadjointCodomain, Observable=DVector<F::MixedType>>, |
947 // DefaultSG<F, S, P, N> : ForwardModel<RNDM<F, N>, F, PreadjointCodomain = PreadjointCodomain, Observable=DVector<F::MixedType>>, |
| 916 // PreadjointCodomain : Bounded<F> + DifferentiableRealMapping<F, N>, |
948 // PreadjointCodomain : Bounded<F> + DifferentiableRealMapping<F, N>, |
| 917 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
949 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
| 918 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, NonnegRadonRegTerm<F>, N>, |
950 // DefaultSeminormOp<F, K, N> : ProxPenalty<F, PreadjointCodomain, NonnegRadonRegTerm<F>, N>, |
| 919 // RadonSquared : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
951 // RadonSquared : ProxPenalty<F, PreadjointCodomain, RadonRegTerm<F>, N>, |
| 1167 opA : &A, |
1199 opA : &A, |
| 1168 b_hat : &A::Observable, |
1200 b_hat : &A::Observable, |
| 1169 b : &A::Observable, |
1201 b : &A::Observable, |
| 1170 kernel_plot_width : F, |
1202 kernel_plot_width : F, |
| 1171 ) -> DynError |
1203 ) -> DynError |
| 1172 where F : Float + ToNalgebraRealField, |
1204 where |
| 1173 Sensor : RealMapping<F, N> + Support<F, N> + Clone, |
1205 F : Float + ToNalgebraRealField, |
| 1174 Spread : RealMapping<F, N> + Support<F, N> + Clone, |
1206 Sensor : RealMapping<F, N> + Support<F, N> + Clone, |
| 1175 Kernel : RealMapping<F, N> + Support<F, N>, |
1207 Spread : RealMapping<F, N> + Support<F, N> + Clone, |
| 1176 Convolution<Sensor, Spread> : DifferentiableRealMapping<F, N> + Support<F, N>, |
1208 Kernel : RealMapping<F, N> + Support<F, N>, |
| 1177 𝒟 : DiscreteMeasureOp<Loc<F, N>, F>, |
1209 Convolution<Sensor, Spread> : DifferentiableRealMapping<F, N> + Support<F, N>, |
| 1178 𝒟::Codomain : RealMapping<F, N>, |
1210 𝒟 : DiscreteMeasureOp<Loc<F, N>, F>, |
| 1179 A : ForwardModel<RNDM<F, N>, F>, |
1211 𝒟::Codomain : RealMapping<F, N>, |
| 1180 for<'a> &'a A::Observable : Instance<A::Observable>, |
1212 A : ForwardModel<RNDM<F, N>, F>, |
| 1181 A::PreadjointCodomain : DifferentiableRealMapping<F, N> + Bounded<F>, |
1213 for<'a> &'a A::Observable : Instance<A::Observable>, |
| 1182 PlotLookup : Plotting<N>, |
1214 A::PreadjointCodomain : DifferentiableRealMapping<F, N> + Bounded<F>, |
| 1183 Cube<F, N> : SetOrd { |
1215 PlotLookup : Plotting<N>, |
| |
1216 Cube<F, N> : SetOrd, |
| |
1217 DeltaMeasure<Loc<F, N>, F> : Serialize, |
| |
1218 { |
| 1184 |
1219 |
| 1185 if cli.plot < PlotLevel::Data { |
1220 if cli.plot < PlotLevel::Data { |
| 1186 return Ok(()) |
1221 return Ok(()) |
| 1187 } |
1222 } |
| 1188 |
1223 |