| 3 // Live with it. Embrace it. |
3 // Live with it. Embrace it. |
| 4 #![allow(uncommon_codepoints)] |
4 #![allow(uncommon_codepoints)] |
| 5 #![allow(mixed_script_confusables)] |
5 #![allow(mixed_script_confusables)] |
| 6 #![allow(confusable_idents)] |
6 #![allow(confusable_idents)] |
| 7 |
7 |
| |
8 use serde::Serialize; |
| 8 use dist::DistToSquaredDiv2; |
9 use dist::DistToSquaredDiv2; |
| 9 use fb::forward_backward; |
10 use fb::{forward_backward, IterInfo}; |
| 10 use manifold::EmbeddedManifoldPoint; |
11 use manifold::EmbeddedManifoldPoint; |
| |
12 use alg_tools::logger::Logger; |
| |
13 use alg_tools::tabledump::TableDump; |
| |
14 use alg_tools::error::DynError; |
| 11 use cube::*; |
15 use cube::*; |
| 12 use image::{ |
16 use image::{ |
| 13 ImageFormat, |
17 ImageFormat, |
| 14 ImageBuffer, |
18 ImageBuffer, |
| 15 Rgb |
19 Rgb |
| 20 mod cube; |
24 mod cube; |
| 21 mod dist; |
25 mod dist; |
| 22 mod zero; |
26 mod zero; |
| 23 |
27 |
| 24 fn main() { |
28 fn main() { |
| 25 simple_test() |
29 simple_cube_test().unwrap() |
| 26 } |
30 } |
| 27 |
31 |
| 28 fn simple_test() { |
32 /// Helper structure for saving the log into a CSV file |
| |
33 #[derive(Serialize)] |
| |
34 struct CSVLog { |
| |
35 iter : usize, |
| |
36 value : f64, |
| |
37 face : Face, |
| |
38 x : f64, |
| |
39 y : f64, |
| |
40 z : f64 |
| |
41 } |
| |
42 |
| |
43 static PREFIX : &str = "res"; |
| |
44 |
| |
45 /// A simple test on the cube |
| |
46 fn simple_cube_test() -> DynError { |
| 29 use alg_tools::loc::Loc; |
47 use alg_tools::loc::Loc; |
| 30 use Face::*; |
48 use Face::*; |
| 31 use zero::ZeroFn; |
49 use zero::ZeroFn; |
| 32 use alg_tools::mapping::{Sum, Apply}; |
50 use alg_tools::mapping::{Sum, Apply}; |
| 33 use alg_tools::iterate::{AlgIteratorOptions, Verbose}; |
51 use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose}; |
| 34 |
52 |
| 35 let points = [ |
53 let points = [ |
| 36 //OnCube::new(F1, Loc([0.5, 0.5])), |
54 //OnCube::new(F1, Loc([0.5, 0.5])), |
| 37 //OnCube::new(F2, Loc([0.5, 0.5])), |
55 //OnCube::new(F2, Loc([0.5, 0.5])), |
| 38 //OnCube::new(F4, Loc([0.1, 0.1])), |
56 //OnCube::new(F4, Loc([0.1, 0.1])), |
| 45 // OnCube::new(F3, Loc([0.5, 0.5])); goes to opposite side |
63 // OnCube::new(F3, Loc([0.5, 0.5])); goes to opposite side |
| 46 let x = OnCube::new(F3, Loc([0.5, 0.4])); |
64 let x = OnCube::new(F3, Loc([0.5, 0.4])); |
| 47 let f = Sum::new(points.into_iter().map(DistToSquaredDiv2)); |
65 let f = Sum::new(points.into_iter().map(DistToSquaredDiv2)); |
| 48 let g = ZeroFn::new(); |
66 let g = ZeroFn::new(); |
| 49 let τ = 0.1; |
67 let τ = 0.1; |
| |
68 |
| |
69 let mut logger = Logger::new(); |
| |
70 let logmap = |iter, IterInfo { value, point } : IterInfo<OnCube>| { |
| |
71 let Loc([x,y,z]) = point.embedded_coords(); |
| |
72 let face = point.face(); |
| |
73 CSVLog { iter, value, face, x, y, z } |
| |
74 }; |
| 50 let iter = AlgIteratorOptions{ |
75 let iter = AlgIteratorOptions{ |
| 51 max_iter : 100, |
76 max_iter : 100, |
| 52 verbose_iter : Verbose::Every(1), |
77 verbose_iter : Verbose::Every(1), |
| 53 .. Default::default() |
78 .. Default::default() |
| 54 }; |
79 }.mapped(logmap) |
| |
80 .into_log(&mut logger); |
| 55 |
81 |
| 56 let x̂ = forward_backward(&f, &g, x, τ, iter); |
82 let x̂ = forward_backward(&f, &g, x, τ, iter); |
| 57 println!("result = {}\n{:?}", x̂.embedded_coords(), &x̂); |
83 println!("result = {}\n{:?}", x̂.embedded_coords(), &x̂); |
| 58 |
84 |
| |
85 std::fs::create_dir_all(PREFIX)?; |
| |
86 |
| |
87 logger.write_csv(format!("{PREFIX}/log.txt"))?; |
| |
88 |
| 59 for face in Face::all() { |
89 for face in Face::all() { |
| 60 write_face(format!("{face}"), face, 128, |x| f.apply(x) + g.apply(x)) |
90 write_face(format!("{PREFIX}/{face}"), face, 128, |x| f.apply(x) + g.apply(x))?; |
| 61 } |
91 } |
| |
92 |
| |
93 Ok(()) |
| 62 } |
94 } |
| 63 |
95 |
| 64 fn write_face(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) { |
96 /// Writes the values of `f` on `face` of a [`OnCube`] into a PNG file |
| |
97 /// with resolution `n × n`. |
| |
98 fn write_face(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError { |
| 65 use alg_tools::lingrid::LinSpace; |
99 use alg_tools::lingrid::LinSpace; |
| 66 use alg_tools::loc::Loc; |
100 use alg_tools::loc::Loc; |
| 67 use alg_tools::types::*; |
101 use alg_tools::types::*; |
| 68 |
102 |
| 69 let mut img = ImageBuffer::new(n as u32, n as u32); |
103 let mut img = ImageBuffer::new(n as u32, n as u32); |