src/main.rs

Tue, 01 Apr 2025 21:45:15 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 01 Apr 2025 21:45:15 -0500
changeset 65
d5d746465b6e
parent 57
1afca417d71b
permissions
-rw-r--r--

Another README typofix

46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
1 // Optimisation on non-Riemannian manifolds.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
2 #![doc = include_str!(concat!(env!("OUT_DIR"), "/README_uglified.md"))]
4
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
3
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
4 // 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
5 // Live with it. Embrace it.
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
6 #![allow(uncommon_codepoints)]
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
7 #![allow(mixed_script_confusables)]
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
8 #![allow(confusable_idents)]
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
10 mod manifold;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
11 mod fb;
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
12 mod cube;
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
13 mod cylinder;
19
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;
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
17 mod newton;
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
18
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
19 use serde::{Serialize, Deserialize};
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
20 use alg_tools::logger::Logger;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
21 use alg_tools::tabledump::{TableDump, write_csv};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
22 use alg_tools::error::DynError;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
23 use alg_tools::lingrid::LinSpace;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
24 use alg_tools::loc::Loc;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
25 use alg_tools::types::*;
57
1afca417d71b Further alg_tools updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 56
diff changeset
26 use alg_tools::mapping::Mapping;
1afca417d71b Further alg_tools updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 56
diff changeset
27 use alg_tools::operator_arithmetic::MappingSum;
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
28 use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
29 use image::{ImageFormat, ImageBuffer, Rgb};
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
30
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
31 use dist::{DistTo, DistToSquaredDiv2};
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
32 use fb::{forward_backward, IterInfo, Desc, Prox};
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
33 use manifold::{EmbeddedManifoldPoint, ManifoldPoint, FacedManifoldPoint};
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
34 use cube::OnCube;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
35 use cylinder::{CylCoords, Cylinder, CylinderConfig, OnCylinder, normalise_angle};
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
36 #[allow(unused_imports)]
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
37 use zero::ZeroFn;
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
38 use scaled::Scaled;
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
40 /// Location for saving results
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
41 static PREFIX : &str = "res";
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
42
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
43 /// Program entry point
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 fn main() {
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
45 simple_cube_test(format!("{PREFIX}/cube").as_str()).unwrap();
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
46 simple_cylinder_test(format!("{PREFIX}/cylinder").as_str()).unwrap();
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
47 }
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
49 /// 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
50 #[derive(Serialize,Deserialize,Debug)]
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
51 struct CSVPoint<Face> {
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
52 face : Face,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
53 x : f64,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
54 y : f64,
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
55 z : f64
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
56 }
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
57
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
58 impl<M> From<&M> for CSVPoint<M::Face>
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
59 where M : EmbeddedManifoldPoint<EmbeddedCoords = Loc<f64, 3>> + FacedManifoldPoint {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
60 fn from(point : &M) -> Self {
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
61 let Loc([x,y,z]) = point.embedded_coords();
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
62 let face = point.face();
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
63 CSVPoint { face, x, y, z }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
64 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
65 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
66
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
67 /// Helper structure for saving a point on a cylinder into a CSV file
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
68 #[derive(Serialize,Deserialize,Debug)]
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
69 struct CSVCylPoint<Face> {
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
70 face : Face,
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
71 angle : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
72 r : f64,
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
73 z : f64
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
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
76 impl<'a> From<&'a crate::cylinder::OnCylinder<'a>> for CSVCylPoint<crate::cylinder::Face> {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
77 fn from(point : &'a OnCylinder<'a>) -> Self {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
78 let CylCoords {r, angle, z} = point.cyl_coords();
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
79 let face = point.face();
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
80 CSVCylPoint { face, r, angle, z }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
81 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
82 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
83
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
84 /// A simple test on the cube
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
85 fn simple_cube_test(dir : &str) -> DynError {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
86 use crate::cube::Face;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
87 use crate::cube::Face::*;
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
88
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
89 let points = [
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
90 OnCube::new(F1, Loc([0.5, 0.7])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
91 OnCube::new(F2, Loc([0.3, 0.5])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
92 OnCube::new(F4, Loc([0.9, 0.9])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
93 OnCube::new(F6, Loc([0.4, 0.3])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
94 OnCube::new(F4, Loc([0.3, 0.7])),
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
95 OnCube::new(F3, Loc([0.3, 0.7])),
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
96 ];
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
97
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
98 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
99
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
100 std::fs::create_dir_all(dir)?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
101 write_csv(points.iter().map(CSVPoint::from), format!("{dir}/data.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
102 write_csv(std::iter::once(&origin).map(CSVPoint::from), format!("{dir}/origin.csv"))?;
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
103
57
1afca417d71b Further alg_tools updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 56
diff changeset
104 let f = MappingSum::new(points.into_iter().map(DistToSquaredDiv2));
19
bc7f268b324a test change
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
105 //let g = ZeroFn::new();
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
106 let g = Scaled::new(0.5, DistTo(origin));
32
eb07aee01d57 Higher τ and lower maxiter
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
107 let τ = 0.1;
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
108
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
109 for face in Face::all() {
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
110 write_cube_face_csv(format!("{dir}/{face}"), face, 32, |x| f.apply(x) + g.apply(x))?;
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
111 }
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
112 write_cube_face_imgs(dir, 128, |x| f.apply(x) + g.apply(x))?;
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
113
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
114 /// Helper structure for saving the log into a CSV file
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
115 #[derive(Serialize,Deserialize,Debug)]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
116 struct CSVLog<Face> {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
117 iter : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
118 value : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
119 // serde is junk
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
120 //#[serde(flatten)]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
121 //point : CSVPoint
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
122 face : Face,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
123 x : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
124 y : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
125 z : f64
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
126 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
127
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
128 let logmap = |iter, IterInfo { value, point } : IterInfo<OnCube>| {
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
129 let CSVPoint {x , y, z, face} = CSVPoint::from(&point);
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
130 CSVLog {
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
131 iter, value, //point : CSVPoint::from(&point)
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
132 x, y, z, face
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
133 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
134 };
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
135
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
136 run_and_save(dir, "x1", &f, &g, OnCube::new(F3, Loc([0.1, 0.7])), τ, logmap)?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
137 run_and_save(dir, "x2", &f, &g, OnCube::new(F2, Loc([0.3, 0.1])), τ, logmap)?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
138 run_and_save(dir, "x3", &f, &g, OnCube::new(F6, Loc([0.6, 0.2])), τ, logmap)
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
139 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
140
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
141
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
142 /// A simple test on a [`Cylinder`].
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
143 fn simple_cylinder_test(dir : &str) -> DynError {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
144 let π = f64::PI;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
145
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
146 let cyl = Cylinder {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
147 radius : 1.0,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
148 height : 1.0,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
149 config : CylinderConfig { newton_iters : 100 },
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
150 //Default::default(),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
151 };
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
152
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
153 let points = [
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
154 cyl.on_side(π/2.0, 0.4),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
155 cyl.on_side(π*3.0/2.0, -0.1),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
156 cyl.on_side(π, 0.2),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
157 cyl.on_side(-π/5.0, -0.2),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
158 cyl.on_side(π*2.0/3.0, -0.45),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
159 cyl.on_top(π*3.0/4.0, 0.7),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
160 cyl.on_bottom(π*5.0/4.0, 0.3),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
161 ];
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
162
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
163 let origin = cyl.on_side(0.0, 0.0);
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
164
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
165 std::fs::create_dir_all(dir)?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
166 write_csv(points.iter().map(CSVCylPoint::from), format!("{dir}/data.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
167 write_csv(std::iter::once(&origin).map(CSVCylPoint::from), format!("{dir}/origin.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
168
57
1afca417d71b Further alg_tools updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 56
diff changeset
169 let f = MappingSum::new(points.into_iter().map(DistToSquaredDiv2));
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
170 let g = Scaled::new(4.0, DistTo(origin));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
171 let τ = 0.1;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
172
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
173 write_cylinder_faces_csv(dir, &cyl, 32, 32, 32, |x| f.apply(x) + g.apply(x))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
174
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
175 /// Helper structure for saving the log into a CSV file
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
176 #[derive(Serialize,Deserialize,Debug)]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
177 struct CSVLog<Face> {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
178 iter : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
179 value : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
180 // serde is junk
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
181 //#[serde(flatten)]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
182 //point : CSVCylPoint
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
183 face : Face,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
184 angle : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
185 r : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
186 z : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
187 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
188
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
189 let logmap = |iter, IterInfo { value, point } : IterInfo<OnCylinder<'_>>| {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
190 let CSVCylPoint {r, angle, z, face} = CSVCylPoint::from(&point);
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
191 CSVLog {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
192 iter, value, //point : CSVPoint::from(&point)
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
193 r, angle, z, face
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
194 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
195 };
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
196
42
271fba635bce Adjust demonstrations
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
197 run_and_save(dir, "x1", &f, &g, cyl.on_top(π*0.7, 0.8), τ, logmap)?;
271fba635bce Adjust demonstrations
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
198 run_and_save(dir, "x2", &f, &g, cyl.on_side(-π*0.42, -0.38), τ, logmap)?;
271fba635bce Adjust demonstrations
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
199 run_and_save(dir, "x3", &f, &g, cyl.on_bottom(-π*0.3, 0.9), τ, logmap)
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
200
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
201 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
202
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
203
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
204 /// Runs [`forward_backward`] and saves the results.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
205 pub fn run_and_save<F, G, M, I>(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
206 dir : &str,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
207 name : &str,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
208 f : &F,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
209 g : &G,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
210 x : M,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
211 τ : f64,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
212 logmap : impl Fn(usize, IterInfo<M>) -> I
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
213 ) -> DynError
56
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
214 where
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
215 M : ManifoldPoint
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
216 + EmbeddedManifoldPoint<EmbeddedCoords = Loc<f64, 3>>
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
217 + FacedManifoldPoint,
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
218 F : Desc<M> + Mapping<M, Codomain = f64>,
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
219 G : Prox<M> + Mapping<M, Codomain = f64>,
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
220 I : Serialize
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
221 {
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
222
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
223 let mut logger = Logger::new();
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
224 let iter = AlgIteratorOptions{
32
eb07aee01d57 Higher τ and lower maxiter
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
225 max_iter : 20,
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
226 verbose_iter : Verbose::Every(1),
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
227 .. Default::default()
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
228 }.mapped(logmap)
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
229 .into_log(&mut logger);
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
230
24
8b4b014277fa Multiple trajectories
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
231 let x̂ = forward_backward(f, g, x, τ, iter);
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
232 println!("result = {}\n{:?}", x̂.embedded_coords(), &x̂);
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
233
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
234 logger.write_csv(format!("{dir}/{name}_log.csv"))?;
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
235
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
236 Ok(())
1
29738fae471e Added some missing files
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
237 }
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
238
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
239 /// 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
240 /// with resolution `n × n`.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
241 fn write_cube_face_imgs(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
242 dir : &str,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
243 n : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
244 mut f : impl FnMut(&OnCube) -> f64
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
245 ) -> DynError {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
246 use crate::cube::Face;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
247
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
248 let grid = LinSpace {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
249 start : Loc([0.0, 0.0]),
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
250 end : Loc([1.0, 1.0]),
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
251 count : [n, n]
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
252 };
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
253
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
254 let mut m = 0.0;
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
255 let mut datas = Vec::new();
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
256
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
257 for face in Face::all() {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
258 let rawdata : Vec<_> = grid.into_iter()
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
259 .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
260 .collect();
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
261 m = rawdata.iter().copied().fold(m, f64::max);
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
262 datas.push((face, rawdata));
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
263 }
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
264
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
265 for (face, rawdata) in datas {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
266 let mut img = ImageBuffer::new(n as u32, n as u32);
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
267 img.pixels_mut()
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
268 .zip(rawdata)
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
269 .for_each(|(p, v)| {
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
270 let t = v/m;
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
271 // A very colourful option for bug hunting.
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
272 //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
273 let rgb = [1.0-t, 1.0-t, 1.0];
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
274 *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
275 });
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
276
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
277 img.save_with_format(format!("{dir}/{face}.png"), ImageFormat::Png)?;
31
49227d097d14 image saving changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 25
diff changeset
278 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
279
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
280 Ok(())
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
281 }
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
282
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
283 /// 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
284 /// with resolution `n × n`.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
285 fn write_cube_face_csv(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
286 filename : String,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
287 face : crate::cube::Face,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
288 n : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
289 mut f : impl FnMut(&OnCube) -> f64
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
290 ) -> DynError {
16
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
291
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
292 #[derive(Serialize)]
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
293 struct CSVFace { u : f64, v : f64, value : f64 }
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
294
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
295 let grid = LinSpace {
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
296 start : Loc([0.0, 0.0]),
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
297 end : Loc([1.0, 1.0]),
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
298 count : [n, n]
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
299 };
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
300
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
301 let data = grid.into_iter()
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
302 .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
303
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
304 write_csv(data, format!("{filename}.csv"))?;
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
305
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
306 Ok(())
a6efe0fafd90 CSV output of face data
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
307 }
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
308
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
309 /// Writes the values of `f` on the faces of a `cylinder`.
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
310 fn write_cylinder_faces_csv<'a>(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
311 dir : &str,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
312 cyl : &'a Cylinder,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
313 n_height : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
314 n_radius : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
315 n_angle : usize,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
316 mut f : impl FnMut(&OnCylinder<'a>) -> f64
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
317 ) -> DynError {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
318 let π = f64::PI;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
319
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
320 // Side front is [a, b] for the TikZ configuration.
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
321 let a = -π*5.0/6.0;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
322 let b = π/6.0;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
323
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
324 #[derive(Serialize)]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
325 struct CSVFace { angle : f64, /*cos_angle : f64, sin_angle : f64,*/ v : f64, value : f64 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
326
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
327 let mkf = |angle, v, value| CSVFace {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
328 angle,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
329 //cos_angle : angle.cos(),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
330 //sin_angle : angle.sin(),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
331 v,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
332 value
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
333 };
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
334
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
335 let side_half_grid = LinSpace {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
336 start : Loc([0.0, cyl.bottom_z()]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
337 end : Loc([π, cyl.top_z()]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
338 count : [n_angle / 2, n_height]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
339 };
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
340
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
341 let side_grid = LinSpace {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
342 start : Loc([0.0, cyl.bottom_z()]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
343 end : Loc([2.0*π, cyl.top_z()]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
344 count : [n_angle, n_height]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
345 };
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
346 let cap_grid = LinSpace {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
347 start : Loc([0.0, 0.0]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
348 end : Loc([2.0*π, cyl.radius]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
349 count : [n_angle, n_radius]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
350 };
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
351
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
352 let side_front = side_grid.into_iter()
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
353 .map(|Loc([angle, v])| mkf(angle, v, f(&cyl.on_side(angle, v))));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
354 write_csv(side_front, format!("{dir}/side.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
355
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
356 let side_front = side_half_grid.into_iter()
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
357 .map(|Loc([angle, v])| (normalise_angle(angle + a), v))
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
358 .map(|(angle, v)| mkf(angle, v, f(&cyl.on_side(angle, v))));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
359 write_csv(side_front, format!("{dir}/side_front.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
360
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
361 let side_back = side_half_grid.into_iter()
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
362 .map(|Loc([angle, v])| (normalise_angle(angle + b), v))
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
363 .map(|(angle, v)| mkf(angle + π, v, f(&cyl.on_side(angle + π, v))));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
364 write_csv(side_back, format!("{dir}/side_back.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
365
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
366 let top = cap_grid.into_iter()
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
367 .map(|Loc([angle, v])| mkf(angle, v, f(&cyl.on_top(angle, v))));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
368 write_csv(top, format!("{dir}/top.csv"))?;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
369
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
370 let bottom = cap_grid.into_iter()
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
371 .map(|Loc([angle, v])| mkf(angle, v, f(&cyl.on_bottom(angle, v))));
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
372 write_csv(bottom, format!("{dir}/bottom.csv"))
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
373
20
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
374 }
bd6fd49146ce Test changes and more saving
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
375

mercurial