munkres 0.5.2

Kuhn-Munkres (aka Hungarian) algorithm for solving the Assignment Problem in O(n^3)
Documentation
use std::ops::{Add, Sub};
use std::{f32, f64};

pub trait WeightNum: PartialOrd + Copy + Sub<Output = Self> + Add<Output = Self> {
    fn is_zero(&self) -> bool;
    fn is_valid(&self) -> bool {
        true
    }
    fn add_if_valid(self, other: Self) -> Self {
        if self.is_valid() {
            self + other
        } else {
            self
        }
    }
    fn sub_if_valid(self, other: Self) -> Self {
        if self.is_valid() {
            self - other
        } else {
            self
        }
    }
}

impl WeightNum for usize {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for isize {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for u64 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for i64 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for u32 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for i32 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for u16 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for i16 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for u8 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for i8 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0
    }
}

impl WeightNum for f64 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0.0
    }

    #[inline(always)]
    fn is_valid(&self) -> bool {
        self.is_finite()
    }
}

impl WeightNum for f32 {
    #[inline(always)]
    fn is_zero(&self) -> bool {
        *self == 0.0
    }

    #[inline(always)]
    fn is_valid(&self) -> bool {
        self.is_finite()
    }
}