| 7 #![allow(uncommon_codepoints)] |
7 #![allow(uncommon_codepoints)] |
| 8 #![allow(mixed_script_confusables)] |
8 #![allow(mixed_script_confusables)] |
| 9 #![allow(confusable_idents)] |
9 #![allow(confusable_idents)] |
| 10 |
10 |
| 11 use serde::Serialize; |
11 use serde::Serialize; |
| |
12 use alg_tools::logger::Logger; |
| |
13 use alg_tools::tabledump::{TableDump, write_csv}; |
| |
14 use alg_tools::error::DynError; |
| |
15 use alg_tools::lingrid::LinSpace; |
| |
16 use alg_tools::loc::Loc; |
| |
17 use alg_tools::types::*; |
| |
18 use alg_tools::mapping::{Sum, Apply}; |
| |
19 use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose}; |
| |
20 use image::{ImageFormat, ImageBuffer, Rgb}; |
| |
21 |
| 12 use dist::DistToSquaredDiv2; |
22 use dist::DistToSquaredDiv2; |
| 13 use fb::{forward_backward, IterInfo}; |
23 use fb::{forward_backward, IterInfo}; |
| 14 use manifold::EmbeddedManifoldPoint; |
24 use manifold::EmbeddedManifoldPoint; |
| 15 use alg_tools::logger::Logger; |
|
| 16 use alg_tools::tabledump::TableDump; |
|
| 17 use alg_tools::error::DynError; |
|
| 18 use cube::*; |
25 use cube::*; |
| 19 use image::{ |
26 use Face::*; |
| 20 ImageFormat, |
27 use zero::ZeroFn; |
| 21 ImageBuffer, |
|
| 22 Rgb |
|
| 23 }; |
|
| 24 |
28 |
| 25 mod manifold; |
29 mod manifold; |
| 26 mod fb; |
30 mod fb; |
| 27 mod cube; |
31 mod cube; |
| 28 mod dist; |
32 mod dist; |
| 47 /// Location for saving results |
51 /// Location for saving results |
| 48 static PREFIX : &str = "res"; |
52 static PREFIX : &str = "res"; |
| 49 |
53 |
| 50 /// A simple test on the cube |
54 /// A simple test on the cube |
| 51 fn simple_cube_test() -> DynError { |
55 fn simple_cube_test() -> DynError { |
| 52 use alg_tools::loc::Loc; |
|
| 53 use Face::*; |
|
| 54 use zero::ZeroFn; |
|
| 55 use alg_tools::mapping::{Sum, Apply}; |
|
| 56 use alg_tools::iterate::{AlgIteratorOptions, AlgIteratorFactory, Verbose}; |
|
| 57 |
56 |
| 58 let points = [ |
57 let points = [ |
| 59 //OnCube::new(F1, Loc([0.5, 0.5])), |
58 //OnCube::new(F1, Loc([0.5, 0.5])), |
| 60 //OnCube::new(F2, Loc([0.5, 0.5])), |
59 //OnCube::new(F2, Loc([0.5, 0.5])), |
| 61 //OnCube::new(F4, Loc([0.1, 0.1])), |
60 //OnCube::new(F4, Loc([0.1, 0.1])), |
| 90 std::fs::create_dir_all(PREFIX)?; |
89 std::fs::create_dir_all(PREFIX)?; |
| 91 |
90 |
| 92 logger.write_csv(format!("{PREFIX}/log.txt"))?; |
91 logger.write_csv(format!("{PREFIX}/log.txt"))?; |
| 93 |
92 |
| 94 for face in Face::all() { |
93 for face in Face::all() { |
| 95 write_face(format!("{PREFIX}/{face}"), face, 128, |x| f.apply(x) + g.apply(x))?; |
94 write_face_csv(format!("{PREFIX}/{face}"), face, 64, |x| f.apply(x) + g.apply(x))?; |
| |
95 write_face_img(format!("{PREFIX}/{face}"), face, 128, |x| f.apply(x) + g.apply(x))?; |
| 96 } |
96 } |
| 97 |
97 |
| 98 Ok(()) |
98 Ok(()) |
| 99 } |
99 } |
| 100 |
100 |
| 101 /// Writes the values of `f` on `face` of a [`OnCube`] into a PNG file |
101 /// Writes the values of `f` on `face` of a [`OnCube`] into a PNG file |
| 102 /// with resolution `n × n`. |
102 /// with resolution `n × n`. |
| 103 fn write_face(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError { |
103 fn write_face_img(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError { |
| 104 use alg_tools::lingrid::LinSpace; |
|
| 105 use alg_tools::loc::Loc; |
|
| 106 use alg_tools::types::*; |
|
| 107 |
|
| 108 let mut img = ImageBuffer::new(n as u32, n as u32); |
104 let mut img = ImageBuffer::new(n as u32, n as u32); |
| 109 let grid = LinSpace { |
105 let grid = LinSpace { |
| 110 start : Loc([0.0, 0.0]), |
106 start : Loc([0.0, 0.0]), |
| 111 end : Loc([1.0, 1.0]), |
107 end : Loc([1.0, 1.0]), |
| 112 count : [n, n] |
108 count : [n, n] |
| 125 |
121 |
| 126 img.save_with_format(format!("{filename}.png"), ImageFormat::Png)?; |
122 img.save_with_format(format!("{filename}.png"), ImageFormat::Png)?; |
| 127 |
123 |
| 128 Ok(()) |
124 Ok(()) |
| 129 } |
125 } |
| |
126 |
| |
127 /// Writes the values of `f` on `face` of a [`OnCube`] into a CSV file |
| |
128 /// with resolution `n × n`. |
| |
129 fn write_face_csv(filename : String, face : Face, n : usize, mut f : impl FnMut(&OnCube) -> f64) -> DynError { |
| |
130 |
| |
131 #[derive(Serialize)] |
| |
132 struct CSVFace { u : f64, v : f64, value : f64 } |
| |
133 |
| |
134 let grid = LinSpace { |
| |
135 start : Loc([0.0, 0.0]), |
| |
136 end : Loc([1.0, 1.0]), |
| |
137 count : [n, n] |
| |
138 }; |
| |
139 |
| |
140 let data = grid.into_iter() |
| |
141 .map(|p@Loc([u,v])| CSVFace{ u, v, value : f(&OnCube::new(face, p)) }); |
| |
142 |
| |
143 write_csv(data, format!("{filename}.csv"))?; |
| |
144 |
| |
145 Ok(()) |
| |
146 } |