Struct net_ensembles::sampling::histogram::AtomicHistogramInt
source · [−]pub struct AtomicHistogramInt<T> { /* private fields */ }
Expand description
Implementations
sourceimpl<T> AtomicHistogramInt<T>
impl<T> AtomicHistogramInt<T>
sourcepub fn borders(&self) -> &[T]ⓘNotable traits for &[u8]impl Read for &[u8]impl Write for &mut [u8]
pub fn borders(&self) -> &[T]ⓘNotable traits for &[u8]impl Read for &[u8]impl Write for &mut [u8]
similar to self.borders_clone
but does not allocate memory
sourcepub fn bin_iter(&self) -> impl Iterator<Item = &[T; 2]>
pub fn bin_iter(&self) -> impl Iterator<Item = &[T; 2]>
Iterator over all the bins
In AtomicHistogramInt a bin is defined by two values: The left border (inclusive) and the right border (exclusive)
Here you get an iterator which iterates over said borders. The Iterator returns a borrowed Array of length two, where the first value is the left (inclusive) border and the second value is the right (exclusive) border
Example
use sampling::histogram::*;
let hist = AtomicHistI8::new(0, 8, 4).unwrap();
let mut bin_iter = hist.bin_iter();
assert_eq!(bin_iter.next(), Some(&[0_i8, 2]));
assert_eq!(bin_iter.next(), Some(&[2, 4]));
assert_eq!(bin_iter.next(), Some(&[4, 6]));
assert_eq!(bin_iter.next(), Some(&[6, 8]));
assert_eq!(bin_iter.next(), None);
sourcepub fn bin_hits_iter(&mut self) -> impl Iterator<Item = (&[T; 2], usize)>
pub fn bin_hits_iter(&mut self) -> impl Iterator<Item = (&[T; 2], usize)>
Iterate over all bins
In AtomicHistogramInt a bin is defined by two values: The left border (inclusive) and the right border (exclusive)
This iterates over these values as well as the corresponding hit count (i.e. how often the corresponding bin was hit)
Note
Since I am using atomics here it is possible that the hit-count changes during the iteration, if another thread writes to the histogram for example.
Item of Iterator
(&[left_border, right_border], number_of_hits)
Example
use sampling::histogram::*;
let mut hist = AtomicHistUsize::new(0, 6, 3).unwrap();
hist.increment(0).unwrap();
hist.increment(5).unwrap();
hist.increment(4).unwrap();
let mut iter = hist.bin_hits_iter();
assert_eq!(
iter.next(),
Some(
(&[0, 2], 1)
)
);
assert_eq!(
iter.next(),
Some(
(&[2, 4], 0)
)
);
assert_eq!(
iter.next(),
Some(
(&[4, 6], 2)
)
);
assert_eq!(iter.next(), None);
sourceimpl<T> AtomicHistogramInt<T>where
T: Add<T, Output = T> + Ord + One + Copy + NumCast + Sub<T, Output = T>,
impl<T> AtomicHistogramInt<T>where
T: Add<T, Output = T> + Ord + One + Copy + NumCast + Sub<T, Output = T>,
sourcepub fn increment<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
pub fn increment<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
Increment hit count
If val
is inside the histogram, the corresponding bin count will be increased
by 1 and the index corresponding to the bin in returned: Ok(index)
.
Otherwise an Error is returned
Note
- This is the same as AtomicHistogramVal::count_val
- Uses atomic operations, so this is thread safe
sourcepub fn increment_quiet<V>(&self, val: V)where
V: Borrow<T>,
pub fn increment_quiet<V>(&self, val: V)where
V: Borrow<T>,
Increment hit count
Increments the hit count of the bin corresponding to val
.
If no bin corresponding to val
exists, nothing happens
Note
- Uses atomic operations for the counters, so this is thread safe
sourceimpl<T> AtomicHistogramInt<T>where
T: Zero + Copy + PartialOrd<T> + ToPrimitive + FromPrimitive + CheckedAdd + One<Output = T> + HasUnsignedVersion + Bounded + Sub<T, Output = T> + Mul<T>,
RangeInclusive<T>: Iterator<Item = T>,
<T as HasUnsignedVersion>::Unsigned: Bounded + HasUnsignedVersion<LeBytes = <T as HasUnsignedVersion>::LeBytes, Unsigned = <T as HasUnsignedVersion>::Unsigned> + WrappingAdd + ToPrimitive + Sub<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + Rem<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + FromPrimitive + Zero + Eq + Div<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + Ord + Mul<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + WrappingSub + Copy,
RangeInclusive<<T as HasUnsignedVersion>::Unsigned>: Iterator<Item = <T as HasUnsignedVersion>::Unsigned>,
impl<T> AtomicHistogramInt<T>where
T: Zero + Copy + PartialOrd<T> + ToPrimitive + FromPrimitive + CheckedAdd + One<Output = T> + HasUnsignedVersion + Bounded + Sub<T, Output = T> + Mul<T>,
RangeInclusive<T>: Iterator<Item = T>,
<T as HasUnsignedVersion>::Unsigned: Bounded + HasUnsignedVersion<LeBytes = <T as HasUnsignedVersion>::LeBytes, Unsigned = <T as HasUnsignedVersion>::Unsigned> + WrappingAdd + ToPrimitive + Sub<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + Rem<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + FromPrimitive + Zero + Eq + Div<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + Ord + Mul<<T as HasUnsignedVersion>::Unsigned, Output = <T as HasUnsignedVersion>::Unsigned> + WrappingSub + Copy,
RangeInclusive<<T as HasUnsignedVersion>::Unsigned>: Iterator<Item = <T as HasUnsignedVersion>::Unsigned>,
sourcepub fn new(
left: T,
right: T,
bins: usize
) -> Result<AtomicHistogramInt<T>, HistErrors>
pub fn new(
left: T,
right: T,
bins: usize
) -> Result<AtomicHistogramInt<T>, HistErrors>
Create a new histogram
right
: exclusive borderleft
: inclusive borderbins
: how many bins do you need?
Note
(right - left) % bins == 0
has to be true, otherwise the bins cannot all have the same length!
sourcepub fn new_inclusive(
left: T,
right: T,
bins: usize
) -> Result<AtomicHistogramInt<T>, HistErrors>
pub fn new_inclusive(
left: T,
right: T,
bins: usize
) -> Result<AtomicHistogramInt<T>, HistErrors>
Create a new histogram
- equivalent to
Self::new(left, right + 1, bins)
(except that this method checks for possible overflow)
Note:
- Due to implementation details,
right
cannot beT::MAX
- if you try, you will getErr(HistErrors::Overflow)
Trait Implementations
sourceimpl<T> AtomicHistogram for AtomicHistogramInt<T>
impl<T> AtomicHistogram for AtomicHistogramInt<T>
sourcefn count_multiple_index(
&self,
index: usize,
count: usize
) -> Result<(), HistErrors>
fn count_multiple_index(
&self,
index: usize,
count: usize
) -> Result<(), HistErrors>
Uses SeqCst
sourcefn hist(&self) -> &[AtomicUsize]
fn hist(&self) -> &[AtomicUsize]
sourcefn count_index(&self, index: usize) -> Result<(), HistErrors>
fn count_index(&self, index: usize) -> Result<(), HistErrors>
self.hist[index] += 1
, Err()
if index
out of boundssourcefn any_bin_zero(&self) -> bool
fn any_bin_zero(&self) -> bool
sourceimpl<T> AtomicHistogramVal<T> for AtomicHistogramInt<T>where
T: Sub<T, Output = T> + Add<T, Output = T> + One + NumCast + Copy + Ord,
impl<T> AtomicHistogramVal<T> for AtomicHistogramInt<T>where
T: Sub<T, Output = T> + Add<T, Output = T> + One + NumCast + Copy + Ord,
sourcefn get_bin_index<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
fn get_bin_index<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
None if not inside Hist covered zone
sourcefn count_val<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
fn count_val<V>(&self, val: V) -> Result<usize, HistErrors>where
V: Borrow<T>,
Ok(index)
, if inside of hist, Err(_)
if val is invalidsourcefn distance<V>(&self, val: V) -> f64where
V: Borrow<T>,
fn distance<V>(&self, val: V) -> f64where
V: Borrow<T>,
sourcefn first_border(&self) -> T
fn first_border(&self) -> T
sourcefn second_last_border(&self) -> T
fn second_last_border(&self) -> T
let b = self.borders_clone().expect("overflow"); assert_eq!(self.second_last_border(), b[b.len()-2])
sourcefn is_inside<V>(&self, val: V) -> boolwhere
V: Borrow<T>,
fn is_inside<V>(&self, val: V) -> boolwhere
V: Borrow<T>,
sourcefn not_inside<V>(&self, val: V) -> boolwhere
V: Borrow<T>,
fn not_inside<V>(&self, val: V) -> boolwhere
V: Borrow<T>,
is_inside