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}