Skip to main content

nekolib/traits/
potential_function.rs

1//! ポテンシャル関数。
2
3use super::binop;
4
5pub use binop::{CommutativeGroup, Magma};
6
7/// ポテンシャル関数。
8pub trait PotentialFunction {
9    /// 要素の型。
10    type Item: CommutativeGroup;
11
12    /// 要素数 $n$ の集合 $\\{0, 1, \\dots, n-1\\}$ で初期化する。
13    fn new(n: usize, cgroup: Self::Item) -> Self;
14    /// 集合の要素数 $n$ を返す。
15    fn len(&self) -> usize;
16    /// 集合が空であれば `true` を返す。
17    fn is_empty(&self) -> bool { self.len() == 0 }
18
19    /// ポテンシャルの差を定義する。
20    ///
21    /// $\\phi(x\_u)-\\phi(x\_v) = w$ とする。
22    ///
23    /// 呼び出し前の定義と矛盾しない場合、呼び出し前に $\\phi(x\_u)-\\phi(x\_v)$ が未定義なら
24    /// `Ok(true)` を、そうでなければ `Ok(false)` を返す。
25    /// 矛盾する場合、定義は変化せずに `Err(e)` を返す。ただし、`e`
26    /// は呼び出し前の $\\phi(x\_u) - \\phi(x\_v)$ を表す。
27    fn relate(
28        &mut self,
29        u: usize,
30        v: usize,
31        w: <Self::Item as Magma>::Set,
32    ) -> Result<bool, <Self::Item as Magma>::Set>;
33
34    /// ポテンシャルの差を求める。
35    ///
36    /// $\\phi(x\_u)-\\phi(x\_v) = w$ であれば `Some(w)` を返す。
37    /// 未定義ならば `None` を返す。
38    fn diff(&self, u: usize, v: usize) -> Option<<Self::Item as Magma>::Set>;
39
40    /// 代表元とのポテンシャルの差を求める。
41    fn repr_diff(&self, u: usize) -> (usize, <Self::Item as Magma>::Set);
42}