Fri, 06 Dec 2024 22:34:48 -0500
typofix
46 | 1 | // Optimisation on non-Riemannian manifolds. |
2 | #![doc = include_str!(concat!(env!("OUT_DIR"), "/README_uglified.md"))] | |
4 | 3 | |
4 | // We use unicode. We would like to use much more of it than Rust allows. | |
5 | // Live with it. Embrace it. | |
6 | #![allow(uncommon_codepoints)] | |
7 | #![allow(mixed_script_confusables)] | |
8 | #![allow(confusable_idents)] | |
1 | 9 | |
19 | 10 | mod manifold; |
11 | mod fb; | |
12 | mod cube; | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
13 | mod cylinder; |
19 | 14 | mod dist; |
15 | mod zero; | |
16 | mod scaled; | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
17 | mod newton; |
19 | 18 | |
20 | 19 | use serde::{Serialize, Deserialize}; |
16 | 20 | use alg_tools::logger::Logger; |
21 | use alg_tools::tabledump::{TableDump, write_csv}; | |
22 | use alg_tools::error::DynError; | |
23 | use alg_tools::lingrid::LinSpace; | |
24 | use alg_tools::loc::Loc; | |
25 | use alg_tools::types::*; | |
26 | use alg_tools::mapping::{Sum, Apply}; | |
27 | use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose}; | |
24 | 28 | use alg_tools::mapping::Mapping; |
16 | 29 | use image::{ImageFormat, ImageBuffer, Rgb}; |
30 | ||
19 | 31 | use dist::{DistTo, DistToSquaredDiv2}; |
24 | 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 | 36 | #[allow(unused_imports)] |
16 | 37 | use zero::ZeroFn; |
19 | 38 | use scaled::Scaled; |
1 | 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 | 43 | /// Program entry point |
1 | 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 | 47 | } |
1 | 48 | |
20 | 49 | /// Helper structure for saving a point on a cube into a CSV file |
50 | #[derive(Serialize,Deserialize,Debug)] | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
51 | struct CSVPoint<Face> { |
12 | 52 | face : Face, |
53 | x : f64, | |
54 | y : f64, | |
55 | z : f64 | |
56 | } | |
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 | 61 | let Loc([x,y,z]) = point.embedded_coords(); |
62 | let face = point.face(); | |
63 | CSVPoint { face, x, y, z } | |
64 | } | |
65 | } | |
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 | 68 | #[derive(Serialize,Deserialize,Debug)] |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
69 | struct CSVCylPoint<Face> { |
20 | 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 | 73 | z : f64 |
74 | } | |
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 | 83 | |
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 | 88 | |
89 | let points = [ | |
20 | 90 | OnCube::new(F1, Loc([0.5, 0.7])), |
91 | OnCube::new(F2, Loc([0.3, 0.5])), | |
92 | OnCube::new(F4, Loc([0.9, 0.9])), | |
93 | OnCube::new(F6, Loc([0.4, 0.3])), | |
94 | OnCube::new(F4, Loc([0.3, 0.7])), | |
95 | OnCube::new(F3, Loc([0.3, 0.7])), | |
7 | 96 | ]; |
97 | ||
20 | 98 | let origin = OnCube::new(F4, Loc([0.5, 0.5])); |
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 | 103 | |
7 | 104 | let f = Sum::new(points.into_iter().map(DistToSquaredDiv2)); |
19 | 105 | //let g = ZeroFn::new(); |
20 | 106 | let g = Scaled::new(0.5, DistTo(origin)); |
32 | 107 | let τ = 0.1; |
12 | 108 | |
24 | 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 | 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 | 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 | 128 | let logmap = |iter, IterInfo { value, point } : IterInfo<OnCube>| { |
20 | 129 | let CSVPoint {x , y, z, face} = CSVPoint::from(&point); |
130 | CSVLog { | |
131 | iter, value, //point : CSVPoint::from(&point) | |
132 | x, y, z, face | |
133 | } | |
12 | 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 | 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 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
169 | let f = Sum::new(points.into_iter().map(DistToSquaredDiv2)); |
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 | 197 | run_and_save(dir, "x1", &f, &g, cyl.on_top(π*0.7, 0.8), τ, logmap)?; |
198 | run_and_save(dir, "x2", &f, &g, cyl.on_side(-π*0.42, -0.38), τ, logmap)?; | |
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 | 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 |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
214 | where M : ManifoldPoint |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
215 | + EmbeddedManifoldPoint<EmbeddedCoords = Loc<f64, 3>> |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
216 | + FacedManifoldPoint, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
217 | F : Desc<M> + Mapping<M, Codomain = f64>, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
218 | G : Prox<M> + Mapping<M, Codomain = f64>, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
219 | I : Serialize { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
220 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
221 | let mut logger = Logger::new(); |
7 | 222 | let iter = AlgIteratorOptions{ |
32 | 223 | max_iter : 20, |
7 | 224 | verbose_iter : Verbose::Every(1), |
225 | .. Default::default() | |
12 | 226 | }.mapped(logmap) |
227 | .into_log(&mut logger); | |
7 | 228 | |
24 | 229 | let x̂ = forward_backward(f, g, x, τ, iter); |
7 | 230 | println!("result = {}\n{:?}", x̂.embedded_coords(), &x̂); |
11 | 231 | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
232 | logger.write_csv(format!("{dir}/{name}_log.csv"))?; |
12 | 233 | |
234 | Ok(()) | |
1 | 235 | } |
11 | 236 | |
12 | 237 | /// Writes the values of `f` on `face` of a [`OnCube`] into a PNG file |
238 | /// with resolution `n × n`. | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
239 | fn write_cube_face_imgs( |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
240 | dir : &str, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
241 | n : usize, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
242 | mut f : impl FnMut(&OnCube) -> f64 |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
243 | ) -> DynError { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
244 | use crate::cube::Face; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
245 | |
11 | 246 | let grid = LinSpace { |
247 | start : Loc([0.0, 0.0]), | |
248 | end : Loc([1.0, 1.0]), | |
249 | count : [n, n] | |
250 | }; | |
31 | 251 | |
252 | let mut m = 0.0; | |
253 | let mut datas = Vec::new(); | |
254 | ||
255 | for face in Face::all() { | |
256 | let rawdata : Vec<_> = grid.into_iter() | |
257 | .map(|Loc([x,y])| f(&OnCube::new(face, Loc([x, 1.0-y])))) | |
258 | .collect(); | |
259 | m = rawdata.iter().copied().fold(m, f64::max); | |
260 | datas.push((face, rawdata)); | |
261 | } | |
11 | 262 | |
31 | 263 | for (face, rawdata) in datas { |
264 | let mut img = ImageBuffer::new(n as u32, n as u32); | |
265 | img.pixels_mut() | |
266 | .zip(rawdata) | |
267 | .for_each(|(p, v)| { | |
268 | let t = v/m; | |
269 | // A very colourful option for bug hunting. | |
270 | //let rgb = [(50.0*t).cos(), (20.0*t).sin(), (3.0*t).cos()]; | |
271 | let rgb = [1.0-t, 1.0-t, 1.0]; | |
272 | *p = Rgb(rgb.map(|v| (v*(u8::RANGE_MAX as f64)) as u8)) | |
273 | }); | |
274 | ||
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
275 | img.save_with_format(format!("{dir}/{face}.png"), ImageFormat::Png)?; |
31 | 276 | } |
12 | 277 | |
278 | Ok(()) | |
11 | 279 | } |
16 | 280 | |
281 | /// Writes the values of `f` on `face` of a [`OnCube`] into a CSV file | |
282 | /// with resolution `n × n`. | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
283 | fn write_cube_face_csv( |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
284 | filename : String, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
285 | face : crate::cube::Face, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
286 | n : usize, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
287 | mut f : impl FnMut(&OnCube) -> f64 |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
288 | ) -> DynError { |
16 | 289 | |
290 | #[derive(Serialize)] | |
291 | struct CSVFace { u : f64, v : f64, value : f64 } | |
292 | ||
293 | let grid = LinSpace { | |
294 | start : Loc([0.0, 0.0]), | |
295 | end : Loc([1.0, 1.0]), | |
296 | count : [n, n] | |
297 | }; | |
298 | ||
299 | let data = grid.into_iter() | |
300 | .map(|p@Loc([u,v])| CSVFace{ u, v, value : f(&OnCube::new(face, p)) }); | |
301 | ||
302 | write_csv(data, format!("{filename}.csv"))?; | |
303 | ||
304 | Ok(()) | |
305 | } | |
20 | 306 | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
307 | /// Writes the values of `f` on the faces of a `cylinder`. |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
308 | fn write_cylinder_faces_csv<'a>( |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
309 | dir : &str, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
310 | cyl : &'a Cylinder, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
311 | n_height : usize, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
312 | n_radius : usize, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
313 | n_angle : usize, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
314 | mut f : impl FnMut(&OnCylinder<'a>) -> f64 |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
315 | ) -> DynError { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
316 | let π = f64::PI; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
317 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
318 | // Side front is [a, b] for the TikZ configuration. |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
319 | let a = -π*5.0/6.0; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
320 | let b = π/6.0; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
321 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
322 | #[derive(Serialize)] |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
323 | 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
|
324 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
325 | let mkf = |angle, v, value| CSVFace { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
326 | angle, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
327 | //cos_angle : angle.cos(), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
328 | //sin_angle : angle.sin(), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
329 | v, |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
330 | value |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
331 | }; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
332 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
333 | let side_half_grid = LinSpace { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
334 | start : Loc([0.0, cyl.bottom_z()]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
335 | end : Loc([π, cyl.top_z()]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
336 | count : [n_angle / 2, n_height] |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
337 | }; |
20 | 338 | |
37
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
339 | let side_grid = LinSpace { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
340 | start : Loc([0.0, cyl.bottom_z()]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
341 | end : Loc([2.0*π, cyl.top_z()]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
342 | count : [n_angle, n_height] |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
343 | }; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
344 | let cap_grid = LinSpace { |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
345 | start : Loc([0.0, 0.0]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
346 | end : Loc([2.0*π, cyl.radius]), |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
347 | count : [n_angle, n_radius] |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
348 | }; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
349 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
350 | let side_front = side_grid.into_iter() |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
351 | .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
|
352 | write_csv(side_front, format!("{dir}/side.csv"))?; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
353 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
354 | let side_front = side_half_grid.into_iter() |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
355 | .map(|Loc([angle, v])| (normalise_angle(angle + a), v)) |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
356 | .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
|
357 | write_csv(side_front, format!("{dir}/side_front.csv"))?; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
358 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
359 | let side_back = side_half_grid.into_iter() |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
360 | .map(|Loc([angle, v])| (normalise_angle(angle + b), v)) |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
361 | .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
|
362 | write_csv(side_back, format!("{dir}/side_back.csv"))?; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
363 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
364 | let top = cap_grid.into_iter() |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
365 | .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
|
366 | write_csv(top, format!("{dir}/top.csv"))?; |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
367 | |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
368 | let bottom = cap_grid.into_iter() |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
369 | .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
|
370 | write_csv(bottom, format!("{dir}/bottom.csv")) |
d7cd14b8ccc0
Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
371 | |
20 | 372 | } |
373 |