src/main.rs

Thu, 07 Nov 2024 16:52:05 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 07 Nov 2024 16:52:05 -0500
changeset 34
aa6129697116
parent 33
556afeaa34bf
child 35
8d26483c4333
child 37
d7cd14b8ccc0
permissions
-rw-r--r--

Same face path optimisation / possible fix

13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
1 /*!
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
2 Optimisation on non-Riemannian manifolds.
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
3 */
4
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
4
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
5 // We use unicode. We would like to use much more of it than Rust allows.
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
6 // Live with it. Embrace it.
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
7 #![allow(uncommon_codepoints)]
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
8 #![allow(mixed_script_confusables)]
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
9 #![allow(confusable_idents)]
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
11 mod manifold;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
12 mod fb;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
13 mod cube;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
14 mod dist;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
15 mod zero;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
16 mod scaled;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
17
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
18 use serde::{Serialize, Deserialize};
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
19 use alg_tools::logger::Logger;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
20 use alg_tools::tabledump::{TableDump, write_csv};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
21 use alg_tools::error::DynError;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
22 use alg_tools::lingrid::LinSpace;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
23 use alg_tools::loc::Loc;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
24 use alg_tools::types::*;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
25 use alg_tools::mapping::{Sum, Apply};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
26 use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose};
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
27 use alg_tools::mapping::Mapping;
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
28 use image::{ImageFormat, ImageBuffer, Rgb};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
29
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
30 use dist::{DistTo, DistToSquaredDiv2};
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
31 use fb::{forward_backward, IterInfo, Desc, Prox};
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
32 use manifold::EmbeddedManifoldPoint;
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
33 use cube::*;
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
34 use Face::*;
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
35 #[allow(unused_imports)]
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
36 use zero::ZeroFn;
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
37 use scaled::Scaled;
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
39 /// Program entry point
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 fn main() {
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
41 simple_cube_test().unwrap()
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
42 }
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
44 /// Helper structure for saving a point on a cube into a CSV file
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
45 #[derive(Serialize,Deserialize,Debug)]
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
46 struct CSVPoint {
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
47 face : Face,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
48 x : f64,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
49 y : f64,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
50 z : f64
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
51 }
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
52
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
53 impl From<&OnCube> for CSVPoint {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
54 fn from(point : &OnCube) -> Self {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
55 let Loc([x,y,z]) = point.embedded_coords();
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
56 let face = point.face();
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
57 CSVPoint { face, x, y, z }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
58 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
59 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
60
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
61 /// Helper structure for saving the log into a CSV file
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
62 #[derive(Serialize,Deserialize,Debug)]
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
63 struct CSVLog {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
64 iter : usize,
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
65 value : f64,
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
66 // serde is junk
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
67 //#[serde(flatten)]
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
68 //point : CSVPoint
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
69 face : Face,
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
70 x : f64,
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
71 y : f64,
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
72 z : f64
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
73 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
74
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
75
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
76 /// Location for saving results
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
77 static PREFIX : &str = "res";
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
78
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
79 /// A simple test on the cube
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
80 fn simple_cube_test() -> DynError {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
81
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
82 let points = [
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
83 OnCube::new(F1, Loc([0.5, 0.7])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
84 OnCube::new(F2, Loc([0.3, 0.5])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
85 OnCube::new(F4, Loc([0.9, 0.9])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
86 OnCube::new(F6, Loc([0.4, 0.3])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
87 OnCube::new(F4, Loc([0.3, 0.7])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
88 OnCube::new(F3, Loc([0.3, 0.7])),
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
89 ];
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
90
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
91 let origin = OnCube::new(F4, Loc([0.5, 0.5]));
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
92
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
93 write_points(format!("{PREFIX}/data"), points.iter())?;
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
94 write_points(format!("{PREFIX}/origin"), std::iter::once(&origin))?;
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
95
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
96 let f = Sum::new(points.into_iter().map(DistToSquaredDiv2));
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
97 //let g = ZeroFn::new();
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
98 let g = Scaled::new(0.5, DistTo(origin));
32
eb07aee01d57 Higher τ and lower maxiter
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
99 let τ = 0.1;
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
100
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
101 std::fs::create_dir_all(PREFIX)?;
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
102 for face in Face::all() {
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
103 write_face_csv(format!("{PREFIX}/{face}"), face, 32, |x| f.apply(x) + g.apply(x))?;
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
104 }
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
105 write_face_imgs(128, |x| f.apply(x) + g.apply(x))?;
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
106
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
107 run_and_save("x1", &f, &g, OnCube::new(F3, Loc([0.1, 0.7])), τ)?;
33
556afeaa34bf change third source point
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
108 run_and_save("x2", &f, &g, OnCube::new(F2, Loc([0.3, 0.1])), τ)?;
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
109 run_and_save("x3", &f, &g, OnCube::new(F6, Loc([0.6, 0.2])), τ)
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
110 }
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
111
25
9ac11616a2c5 cleanup
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
112 /// Runs [forward_backward] and saves the results.
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
113 pub fn run_and_save<F, G>(
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
114 name : &str,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
115 f : &F,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
116 g : &G,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
117 x : OnCube,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
118 τ : f64,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
119 ) -> DynError
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
120 where F : Desc<OnCube> + Mapping<OnCube, Codomain = f64>,
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
121 G : Prox<OnCube> + Mapping<OnCube, Codomain = f64> {
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
122
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
123 let mut logger = Logger::new();
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
124 let logmap = |iter, IterInfo { value, point } : IterInfo<OnCube>| {
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
125 let CSVPoint {x , y, z, face} = CSVPoint::from(&point);
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
126 CSVLog {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
127 iter, value, //point : CSVPoint::from(&point)
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
128 x, y, z, face
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
129 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
130 };
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
131 let iter = AlgIteratorOptions{
32
eb07aee01d57 Higher τ and lower maxiter
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
132 max_iter : 20,
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
133 verbose_iter : Verbose::Every(1),
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
134 .. Default::default()
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
135 }.mapped(logmap)
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
136 .into_log(&mut logger);
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
137
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
138 let x̂ = forward_backward(f, g, x, τ, iter);
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
139 println!("result = {}\n{:?}", x̂.embedded_coords(), &x̂);
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
140
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
141 logger.write_csv(format!("{PREFIX}/{name}_log.csv"))?;
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
142
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
143 Ok(())
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 }
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
145
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
146 /// Writes the values of `f` on `face` of a [`OnCube`] into a PNG file
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
147 /// with resolution `n × n`.
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
148 fn write_face_imgs(n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError {
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
149 let grid = LinSpace {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
150 start : Loc([0.0, 0.0]),
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
151 end : Loc([1.0, 1.0]),
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
152 count : [n, n]
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
153 };
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
154
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
155 let mut m = 0.0;
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
156 let mut datas = Vec::new();
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
157
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
158 for face in Face::all() {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
159 let rawdata : Vec<_> = grid.into_iter()
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
160 .map(|Loc([x,y])| f(&OnCube::new(face, Loc([x, 1.0-y]))))
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
161 .collect();
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
162 m = rawdata.iter().copied().fold(m, f64::max);
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
163 datas.push((face, rawdata));
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
164 }
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
165
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
166 for (face, rawdata) in datas {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
167 let mut img = ImageBuffer::new(n as u32, n as u32);
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
168 img.pixels_mut()
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
169 .zip(rawdata)
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
170 .for_each(|(p, v)| {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
171 let t = v/m;
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
172 // A very colourful option for bug hunting.
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
173 //let rgb = [(50.0*t).cos(), (20.0*t).sin(), (3.0*t).cos()];
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
174 let rgb = [1.0-t, 1.0-t, 1.0];
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
175 *p = Rgb(rgb.map(|v| (v*(u8::RANGE_MAX as f64)) as u8))
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
176 });
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
177
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
178 img.save_with_format(format!("{PREFIX}/{face}.png"), ImageFormat::Png)?;
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
179 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
180
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
181 Ok(())
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
182 }
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
183
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
184 /// Writes the values of `f` on `face` of a [`OnCube`] into a CSV file
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
185 /// with resolution `n × n`.
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
186 fn write_face_csv(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError {
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
187
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
188 #[derive(Serialize)]
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
189 struct CSVFace { u : f64, v : f64, value : f64 }
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
190
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
191 let grid = LinSpace {
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
192 start : Loc([0.0, 0.0]),
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
193 end : Loc([1.0, 1.0]),
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
194 count : [n, n]
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
195 };
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
196
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
197 let data = grid.into_iter()
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
198 .map(|p@Loc([u,v])| CSVFace{ u, v, value : f(&OnCube::new(face, p)) });
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
199
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
200 write_csv(data, format!("{filename}.csv"))?;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
201
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
202 Ok(())
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
203 }
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
204
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
205 /// Writes a list of points on a [`OnCube`] into a CSV file
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
206 fn write_points<'a, I : Iterator<Item=&'a OnCube>>(filename : String, list : I) -> DynError {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
207
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
208 write_csv(list.map(CSVPoint::from), format!("{filename}.csv"))?;
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
209 Ok(())
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
210 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
211

mercurial