From f7c30b2b54e04bcfb6215220ca44f301667f8776 Mon Sep 17 00:00:00 2001 From: William Ball Date: Wed, 21 Jul 2021 13:57:44 -0400 Subject: [PATCH] "works" --- .../circle_counting_new/src/lib.rs | 11 ++-- .../circle_counting_new/src/parser.rs | 65 +++++-------------- 2 files changed, 24 insertions(+), 52 deletions(-) diff --git a/fractal_dimension/circle_counting_new/src/lib.rs b/fractal_dimension/circle_counting_new/src/lib.rs index 243b679..1dd47e4 100644 --- a/fractal_dimension/circle_counting_new/src/lib.rs +++ b/fractal_dimension/circle_counting_new/src/lib.rs @@ -1,10 +1,13 @@ use ansi_term::Color::Yellow; use linregress::{FormulaRegressionBuilder, RegressionDataBuilder}; use nalgebra::{DMatrix, DVector}; +use f128::f128; + +type F = f128; pub fn fractal_dimension( - generators: Vec>, - root: DVector, + generators: Vec>, + root: DVector, faces: Vec>, upper_bound: f64, n: usize, @@ -18,7 +21,7 @@ pub fn fractal_dimension( let mut nodes: u64 = 1; let xs: Vec = (1..=n) - .map(|x| (x as f64 * upper_bound / (2.0 * n as f64) + upper_bound / 2.0)) + .map(|x| ((x as f64) * upper_bound / ((2 * n) as f64) + upper_bound / f64::from(2.0))) .collect(); let mut i = 0; @@ -54,7 +57,7 @@ pub fn fractal_dimension( continue; } for (k, max) in xs.iter().enumerate() { - if curvature <= max { + if curvature <= &F::from(*max) { add_children = true; too_big = false; totals[k] += 1; diff --git a/fractal_dimension/circle_counting_new/src/parser.rs b/fractal_dimension/circle_counting_new/src/parser.rs index cc62415..98dbac3 100644 --- a/fractal_dimension/circle_counting_new/src/parser.rs +++ b/fractal_dimension/circle_counting_new/src/parser.rs @@ -1,8 +1,11 @@ use std::fs; +use f128::f128; use nalgebra::{DMatrix, DVector}; use ansi_term::Color::Red; +type F = f128; + #[derive(Debug, PartialEq)] enum TokenType { OpenBracket, @@ -163,13 +166,13 @@ fn eval(data: &mut std::iter::Peekable) -> Result } } -fn vector_to_rust_value(value: &Value) -> Result, String> { - let mut result = vec![]; +fn vector_to_rust_value(value: &Value) -> Result, String> { + let mut result: Vec = vec![]; if let Value::List(data) = value { for datapoint in data { if let Value::Number(num) = datapoint { - result.push(*num); + result.push(F::from(*num)); } else { return Err(format!("Expected a number, got {:?}", datapoint)); } @@ -181,8 +184,8 @@ fn vector_to_rust_value(value: &Value) -> Result, String> { Ok(result) } -fn matrix_to_rust_value(value: &Value) -> Result>, String> { - let mut result = vec![]; +fn matrix_to_rust_value(value: &Value) -> Result>, String> { + let mut result: Vec> = vec![]; if let Value::List(data) = value { for row in data { @@ -197,8 +200,8 @@ fn matrix_to_rust_value(value: &Value) -> Result>, String> { Ok(result) } -fn matrix_to_rust_value_flat(value: &Value) -> Result, String> { - let mut result = vec![]; +fn matrix_to_rust_value_flat(value: &Value) -> Result, String> { + let mut result: Vec = vec![]; if let Value::List(data) = value { for row in data { @@ -213,8 +216,8 @@ fn matrix_to_rust_value_flat(value: &Value) -> Result, String> { Ok(result) } -pub type Generator = DMatrix; -pub type Root = DVector; +pub type Generator = DMatrix; +pub type Root = DVector; pub type FaceList = Vec>; pub type OrthogonalGenerators = Vec>; pub type Data = (Vec, Root, FaceList, OrthogonalGenerators); @@ -226,7 +229,7 @@ pub fn read_file(filename: &str) -> Result { let results = eval_full(contents)?; - let mut generators = vec![]; + let mut generators: Vec = vec![]; if let Value::List(gens) = &results[0] { for val in gens { let mat = matrix_to_rust_value(val)?; @@ -244,7 +247,9 @@ pub fn read_file(filename: &str) -> Result { let faces = matrix_to_rust_value(&results[2])?; let faces = faces .iter() - .map(|v| v.iter().map(|x| x.round() as usize).collect()) + .map(|v| -> Vec { + v.iter().map(|x| -> usize { (*x).into() }).collect() + }) .collect(); let orthogonal_generators: Vec> = if results.len() < 4 { @@ -252,7 +257,7 @@ pub fn read_file(filename: &str) -> Result { } else { matrix_to_rust_value(&results[3])? .iter() - .map(|v| v.iter().map(|x| x.round() as usize).collect()) + .map(|v| v.iter().map(|x| -> usize { (*x).into() }).collect()) .collect() }; @@ -372,40 +377,4 @@ mod test { ])] ); } - - #[test] - fn vector() { - let test = Value::List(vec![Value::Number(1.0), Value::Number(2.0)]); - assert_eq!(vector_to_rust_value(&test).unwrap(), vec![1.0, 2.0]); - } - - #[test] - fn matrix() { - let val = Value::List(vec![ - Value::List(vec![ - Value::Number(1.0), - Value::Number(0.0), - Value::Number(0.0), - ]), - Value::List(vec![ - Value::Number(0.0), - Value::Number(1.0), - Value::Number(0.0), - ]), - Value::List(vec![ - Value::Number(0.0), - Value::Number(0.0), - Value::Number(1.0), - ]), - ]); - let res = matrix_to_rust_value(&val).unwrap(); - assert_eq!( - res, - vec![ - vec![1.0, 0.0, 0.0], - vec![0.0, 1.0, 0.0], - vec![0.0, 0.0, 1.0] - ] - ); - } }