# Norman The norman library provides everything you need for calculationg norms of elements of vector spaces. Based on two traits—`Norm` and `Distance` – this crate implements different kinds of norm and distance functions for a wide variety of types—including complex numbers and arrays. These traits are mainly meant to facilitate generic implementations of numeric algorithms, where one often needs a grasp of how _big_ a value is or how _far_ two values are apart. ## Usage Add this to your `Cargo.toml`: ```toml [dependencies] norman = "0.0.4" ``` Then you can calculate the euclidean distance between two complex numbers: ```rust use num_complex::Complex; use norman::Distance; use norman::desc::Abs; assert_eq!(Complex::new(2.0, 5.0).distance(&Complex::new(-1.0, 1.0), Abs::new()), 5.0); ``` or the supremum norm, 2-norm and 1-norm of a vector that is rerpesented by an ndarray: ```rust use ndarray::Array1; use norman::Norm; use norman::desc::{Sup, PNorm}; let a = Array1::from(vec![2.0f32, -4.0, -2.0]); assert_eq!(a.norm(Sup::new()), 4.0); assert_eq!(a.norm(PNorm::new(2)), (2.0f32*2.0 + 4.0*4.0 + 2.0*2.0).sqrt()); assert_eq!(a.norm(PNorm::new(1)), 2.0f32 + 4.0 + 2.0); ``` The minimum supported version of rustc is currently **1.34.2**. ## Crate stability The main reason why this crate is in pre-0.1-state is that I am not sure about the naming of several items, so it may still encounter some renames. I am particularly not very happy with the verbose name `norm_eucl` for “just calulate the usual standard norm“. ## Future development The first step will be to support types representing usual vectors which are around in the ecosystem like: * vector types of [rulinalg](https://crates.io/crates/rulinalg), [nalgebra](https://crates.io/crates/nalgebra) and co. * simd types from [packed_simd](https://crates.io/crates/packed_simd) Later I will maybe introduce some operator norms on matrices. Furthermore, I might think about adding a new trait for derivatives of norms – in some algorithms, you do not only need to know the exact value of a norm, but also the derivative in order to know in which direction to go if you want to minimize the norm. # License Norman is distributed under the terms of both the MIT license and the Apache License (Version 2.0). See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT), and [COPYING](COPYING) for details. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.