NormalizedBwConfig

Struct NormalizedBwConfig 

Source
pub struct NormalizedBwConfig {
    pub mean: Option<Bandwidth>,
    pub std_dev: Option<Bandwidth>,
    pub upper_bound: Option<Bandwidth>,
    pub lower_bound: Option<Bandwidth>,
    pub duration: Option<Duration>,
    pub step: Option<Duration>,
    pub seed: Option<u64>,
}
Expand description

The configuration struct for NormalizedBw.

See NormalizedBw for more details.

Fields§

§mean: Option<Bandwidth>§std_dev: Option<Bandwidth>§upper_bound: Option<Bandwidth>§lower_bound: Option<Bandwidth>§duration: Option<Duration>§step: Option<Duration>§seed: Option<u64>

Implementations§

Source§

impl NormalizedBwConfig

Source

pub fn new() -> Self

Creates an uninitialized config

Source

pub fn mean(self, mean: Bandwidth) -> Self

Sets the mean

If the mean is not set, 12Mbps will be used.

Source

pub fn std_dev(self, std_dev: Bandwidth) -> Self

Sets the standard deviation

If the standard deviation is not set, 0Mbps will be used.

Source

pub fn upper_bound(self, upper_bound: Bandwidth) -> Self

Sets the upper bound

If the upper bound is not set, the upper bound will be the one of Bandwidth.

Source

pub fn lower_bound(self, lower_bound: Bandwidth) -> Self

Sets the lower bound

If the lower bound is not set, the lower bound will be the one of Bandwidth.

Source

pub fn duration(self, duration: Duration) -> Self

Sets the total duration of the trace

If the total duration is not set, 1 second will be used.

Source

pub fn step(self, step: Duration) -> Self

Sets the duration of each value

If the step is not set, 1ms will be used.

Source

pub fn seed(self, seed: u64) -> Self

Set the seed for a random generator

If the seed is not set, 42 will be used.

Source

pub fn random_seed(self) -> Self

Allows to use a randomly generated seed

This is equivalent to: self.seed(rand::random())

Source

pub fn build(self) -> NormalizedBw

Creates a new NormalizedBw corresponding to this config.

The created model will use StdRng as source of randomness (the call is equivalent to self.build_with_rng::<StdRng>()). It should be sufficient for most cases, but StdRng is not a portable random number generator, so one may want to use a portable random number generator like ChaCha, to this end one can use build_with_rng.

Source

pub fn build_with_rng<Rng: SeedableRng + RngCore>(self) -> NormalizedBw<Rng>

Creates a new NormalizedBw corresponding to this config.

Unlike build, this method let you choose the random generator.

§Example

let normal_bw = NormalizedBwConfig::new()
    .mean(Bandwidth::from_mbps(12))
    .std_dev(Bandwidth::from_mbps(1))
    .duration(Duration::from_millis(3))
    .seed(42);

let mut default_build = normal_bw.clone().build();
let mut std_build = normal_bw.clone().build_with_rng::<StdRng>();
// ChaCha is deterministic and portable, unlike StdRng
let mut chacha_build = normal_bw.clone().build_with_rng::<ChaCha20Rng>();

for cha in [12044676, 11754367, 11253775] {
    let default = default_build.next_bw();
    let std = std_build.next_bw();
    let chacha = chacha_build.next_bw();

    assert!(default.is_some());
    assert_eq!(default, std);
    assert_ne!(default, chacha);
    assert_eq!(chacha, Some((Bandwidth::from_bps(cha), Duration::from_millis(1))));
}

assert_eq!(default_build.next_bw(), None);
assert_eq!(std_build.next_bw(), None);
assert_eq!(chacha_build.next_bw(), None);
Source§

impl NormalizedBwConfig

Source

pub fn build_truncated(self) -> NormalizedBw

This is another implementation for converting NormalizedBwConfig into NormalizedBw, where the impact of truncation (lower_bound and upper_bound field) on the mathematical expectation of the distribution is taking account by modifying the center of the distribution.

§Examples

let normal_bw = NormalizedBwConfig::new()
    .mean(Bandwidth::from_mbps(12))
    .std_dev(Bandwidth::from_mbps(12))
    .duration(Duration::from_secs(100))
    .step(Duration::from_millis(1))
    .seed(42);

let mut default_build = normal_bw.clone().build();
let mut truncate_build = normal_bw.clone().build_truncated();

fn avg_mbps(mut model: impl BwTrace) -> f64{
    let mut count = 0;
    std::iter::from_fn( move ||{
        model.next_bw().map(|b| b.0.as_gbps_f64() * 1000.0)
    }).inspect(|_| count += 1).sum::<f64>() / count as f64
}

assert_eq!(avg_mbps(default_build), 12.974758080079994); // significantly higher than the expected mean
assert_eq!(avg_mbps(truncate_build), 11.97642456625989);

let normal_bw = NormalizedBwConfig::new()
    .mean(Bandwidth::from_mbps(12))
    .std_dev(Bandwidth::from_mbps(12))
    .duration(Duration::from_secs(100))
    .lower_bound(Bandwidth::from_mbps(8))
    .upper_bound(Bandwidth::from_mbps(20))
    .step(Duration::from_millis(1))
    .seed(42);

let mut default_build = normal_bw.clone().build();
let mut truncate_build = normal_bw.clone().build_truncated();

assert_eq!(avg_mbps(default_build),  13.221356471729928); // significantly higher than the expected mean
assert_eq!(avg_mbps(truncate_build), 11.978819427569897);
Source

pub fn build_truncated_with_rng<Rng: SeedableRng + RngCore>( self, ) -> NormalizedBw<Rng>

Similar to build_truncated but let you choose the random generator.

See build for details about the reason for using another random number generator than StdRng.

Trait Implementations§

Source§

impl BwTraceConfig for NormalizedBwConfig

Source§

impl Clone for NormalizedBwConfig

Source§

fn clone(&self) -> NormalizedBwConfig

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for NormalizedBwConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for NormalizedBwConfig

Source§

fn default() -> NormalizedBwConfig

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for NormalizedBwConfig

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Forever for NormalizedBwConfig

Source§

impl Serialize for NormalizedBwConfig

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,