Circle-Packings/fractal_dimension/circle_counting_new/src/main.rs

168 lines
4.3 KiB
Rust
Raw Normal View History

2021-07-06 19:29:22 -07:00
#![allow(dead_code)]
2021-07-05 12:52:54 -07:00
2021-07-26 09:39:57 -07:00
use crate::{fractal::fractal_dimension, parser::read_file};
2021-07-06 19:29:22 -07:00
use std::process;
use structopt::StructOpt;
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
use ansi_term::Color::Yellow;
2021-07-05 12:52:54 -07:00
2021-08-03 00:27:07 -07:00
pub mod constants;
2021-07-26 09:39:57 -07:00
pub mod fractal;
pub mod parser;
pub mod search;
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
/// Compute fractal dimension of crystallographic packings via the circle counting method
#[derive(StructOpt)]
#[structopt(name = "Circle Counter")]
struct Opt {
/// File containing data in the order generators, root, faces
#[structopt(name = "data file")]
data_file: String,
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
/// Activate debug mode
#[structopt(short, long)]
debug: bool,
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
/// Number of sample points in linear regression
#[structopt(short, long, default_value = "50")]
n: usize,
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
/// Maximum curvature of circles
#[structopt(short, long, default_value = "1000000")]
max: f64,
/// Whether or not to time excecution (automatically enabled by --debug)
#[structopt(short, long)]
time: bool,
2021-07-06 21:37:50 -07:00
2021-08-03 00:27:07 -07:00
/// Cap on the recursion depth (0 means no cap)
2021-07-06 21:37:50 -07:00
#[structopt(short, long, default_value = "0")]
2021-08-03 00:27:07 -07:00
depth: usize,
/// Whether the generators given are geometric or algebraic generators (defaults to algebraic)
#[structopt(short, long)]
geometric: bool,
2021-07-05 12:52:54 -07:00
}
fn main() {
2021-07-06 19:29:22 -07:00
let opt = Opt::from_args();
let debug = opt.debug;
let time = debug || opt.time;
2021-08-03 00:27:07 -07:00
let depth = opt.depth;
2021-07-06 19:29:22 -07:00
let beginning = std::time::Instant::now();
2021-08-03 00:27:07 -07:00
let (mut generators, root, faces, orthogonal_generators) = read_file(&opt.data_file)
2021-07-15 10:50:33 -07:00
.unwrap_or_else(|err| {
eprintln!("{}", err);
process::exit(-1);
});
2021-07-05 12:52:54 -07:00
2021-07-06 19:29:22 -07:00
let after_parsing = std::time::Instant::now();
if time {
let duration = after_parsing.duration_since(beginning);
println!(
"Took {}s to parse {}",
duration.as_secs_f64(),
opt.data_file
);
}
if debug {
println!(
"{} (parsed from command args):\t{}",
Yellow.paint("max"),
opt.max
);
println!(
"{} (parsed from command args):\t{}",
Yellow.paint("n"),
opt.n
);
}
2021-07-05 12:52:54 -07:00
2021-08-03 00:27:07 -07:00
if !opt.geometric {
let c = nalgebra::DMatrix::from_columns(&root);
let ct = c
.clone()
.pseudo_inverse(1e-5)
.expect(format!("Invalid root matrix {}", c).as_str());
println!("{}", ct);
generators = generators
.iter()
.map(|sigma| &c * sigma.transpose() * &ct)
.collect();
}
2021-07-06 19:29:22 -07:00
if debug {
println!(
"{} (parsed from file {})",
Yellow.paint("Generators"),
opt.data_file
);
for generator in &generators {
println!("{}", generator);
}
println!(
"{} (parsed from file {}):",
Yellow.paint("Root Tuple"),
opt.data_file
);
2021-08-03 00:27:07 -07:00
for circle in &root {
println!("{}", circle);
}
2021-07-06 19:29:22 -07:00
println!(
"{} (parsed from file {}):",
Yellow.paint("Faces"),
opt.data_file
);
println!("{:?}\n", faces);
2021-07-11 11:11:03 -07:00
println!(
"{} (parsed from file {}):",
Yellow.paint("Orthogonal Generators"),
opt.data_file
);
println!("{:?}\n", orthogonal_generators);
2021-07-06 19:29:22 -07:00
}
2021-07-15 10:50:33 -07:00
let delta = fractal_dimension(
generators,
root,
opt.max,
opt.n,
debug,
2021-08-03 00:27:07 -07:00
depth,
faces,
2021-07-15 10:50:33 -07:00
orthogonal_generators,
)
.unwrap();
2021-07-06 19:29:22 -07:00
let after_computing = std::time::Instant::now();
if time {
let duration1 = after_computing.duration_since(after_parsing);
let duration2 = after_computing.duration_since(beginning);
2021-07-08 07:54:50 -07:00
let time1 = duration1.as_secs_f64();
let time2 = duration2.as_secs_f64();
let seconds1 = time1 % 60.0;
let seconds2 = time2 % 60.0;
let minutes1 = (time1 as isize) / 60;
let minutes2 = (time2 as isize) / 60;
if minutes1 > 0 {
println!(
"\nTook {}m {}s to compute fractal dimension; {}m {}s total",
minutes1, seconds1, minutes2, seconds2
);
} else {
println!(
"\nTook {}s to compute fractal dimension; {}s total",
seconds1, seconds2,
);
}
2021-07-06 19:29:22 -07:00
}
println!("\n{}", delta);
2021-07-05 12:52:54 -07:00
}