Explainable bounded multi-criteria ranking and weight-scenario analysis
moon add wrMamba/moonchoice@0.1.0import {
"wrMamba/moonchoice" @choice,
}fn main raise {
let m = @choice.decision_matrix(
["A", "B", "C"], ["quality", "cost"],
[@choice.Benefit, @choice.Cost],
[[7.0, 8.0], [9.0, 10.0], [6.0, 5.0]],
)
let r = @choice.saw(m, [0.5, 0.5])
assert_eq(r.ranking.winners(), ["B", "C"])
println(@choice.ranking_json(r.ranking).stringify())
}| 文件 | 已实现内容 |
|---|---|
| matrix, normalization | 防御性复制、收益/成本、minmax/向量归一化、尺度安全权重 |
| saw, topsis, wpm | 加权和贡献、理想解距离轨迹、正数对数加权乘积 |
| vikor | S/R/Q、可接受优势/稳定性、妥协集合 |
| preference, promethee | 六种偏好函数、成对矩阵、正负净流量 |
| objective_weights, ahp | 熵/离差/CRITIC、AHP 特征向量、残差/一致性/最坏三元组 |
| pareto, agreement | 精确支配层与见证、带并列的 Spearman/Kendall tau-b |
| scenarios, explain, transform | 有限网格、解析 SAW 交点、成对解释、单位变换、删项反转 |
| diagnostics | 指标统计、删指标敏感性、含警告和独立 SAW 贡献的报告 |
| json_codec, csv_codec, service | 有界 JSON/CSV、版本模式、无 I/O 的 JSON 请求分派 |
moon run examples/procurement --target wasm-gc --deny-warn
moon run examples/deployment --target wasm-gc --deny-warn
moon run examples/scenarios --target wasm-gc --deny-warn{"schema":"moonchoice.matrix/1","alternatives":["A","B"],"criteria":["speed"],"directions":["benefit"],"values":[[1],[2]]}{"schema":"moonchoice.request/1","operation":"rank","matrix":{"schema":"moonchoice.matrix/1","alternatives":["A","B"],"criteria":["speed"],"directions":["benefit"],"values":[[1],[2]]},"weights":[1],"algorithm":{"kind":"topsis","normalization":"minmax"}}moon info && moon fmt
moon fmt --check
moon check --deny-warn
moon test --deny-warn
moon build --deny-warn
python scripts/audit.pypub(all) struct AdditiveBreakEven {
intercept : Double
slope : Double
crossing : Double?
tied_for_all_weights : Bool
} derive(Debug)pub(all) struct CriterionComparison {
criterion : String
left_value : Double
right_value : Double
oriented_difference : Double
weighted_preference_left : Double
weighted_preference_right : Double
} derive(Debug)pub(all) struct CriterionRemoval {
omitted : String
remaining_criteria : Array[String]
ranking : Ranking
agreement : RankAgreement
winner_changed : Bool
} derive(Debug)pub(all) struct CriterionSensitivity {
baseline : Ranking
removals : Array[CriterionRemoval]
skipped_zero_weight_remainders : Array[String]
} derive(Debug)fn DecisionMatrix::convert_units(self : DecisionMatrix, scales : Array[Double], offsets : Array[Double]) -> DecisionMatrix raise ChoiceErrorfn DecisionMatrix::normalize(self : DecisionMatrix, mode : Normalization) -> Array[Array[Double]] raise ChoiceErrorfn DecisionMatrix::select_alternatives(self : DecisionMatrix, indices : Array[Int]) -> DecisionMatrix raise ChoiceErrorfn DecisionMatrix::select_criteria(self : DecisionMatrix, indices : Array[Int]) -> DecisionMatrix raise ChoiceErrorpub(all) struct DecisionReport {
ranking : Ranking
weights : Array[Double]
profiles : Array[CriterionProfile]
pareto : ParetoResult
additive_contributions : Array[Array[Double]]
warnings : Array[String]
} derive(Debug)pub(all) enum Method {
Additive(Normalization)
IdealDistance(Normalization)
Product
Compromise(Double)
Outranking(Array[Preference])
} derive(Debug)pub(all) struct PairExplanation {
left : String
right : String
criteria : Array[CriterionComparison]
aggregate_left : Double
aggregate_right : Double
net_preference : Double
left_dominates : Bool
right_dominates : Bool
} derive(Debug)pub(all) enum Preference {
Usual
UShape(Double)
VShape(Double)
Level(Double, Double)
Linear(Double, Double)
Gaussian(Double)
} derive(Debug)pub(all) struct RemovalAnalysis {
removed : String
baseline : Ranking
remaining : Ranking
agreement : RankAgreement
winner_changed : Bool
} derive(Debug)pub(all) struct ScenarioReport {
rankings : Array[Ranking]
rank_counts : Array[Array[Int]]
winner_counts : Array[Int]
mean_ranks : Array[Double]
best_ranks : Array[Int]
worst_ranks : Array[Int]
universally_best : Array[String]
pairwise_wins : Array[Array[Int]]
pairwise_ties : Array[Array[Int]]
} derive(Debug)fn additive_break_even(m : DecisionMatrix, weights : Array[Double], criterion : Int, left : Int, right : Int) -> AdditiveBreakEven raise ChoiceErrorfn ahp(comparisons : Array[Array[Double]], tolerance? : Double, max_iterations? : Int) -> AhpResult raise ChoiceErrorfn compare_methods(m : DecisionMatrix, weights : Array[Double], methods : Array[Method], tolerance? : Double) -> MethodComparison raise ChoiceErrorfn criterion_profiles(m : DecisionMatrix, weights : Array[Double]) -> Array[CriterionProfile] raise ChoiceErrorfn criterion_sensitivity(m : DecisionMatrix, weights : Array[Double], algorithm : Method) -> CriterionSensitivity raise ChoiceErrorfn decision_matrix(alternatives : Array[String], criteria : Array[String], directions : Array[Direction], values : Array[Array[Double]]) -> DecisionMatrix raise ChoiceErrorfn decision_report(m : DecisionMatrix, weights : Array[Double], algorithm : Method) -> DecisionReport raise ChoiceErrorfn dispatch(request : String) -> Stringfn evaluate(m : DecisionMatrix, weights : Array[Double], algorithm : Method, tolerance? : Double) -> Ranking raise ChoiceErrorfn explain_pair(m : DecisionMatrix, weights : Array[Double], preferences : Array[Preference], left : Int, right : Int) -> PairExplanation raise ChoiceErrorfn promethee(m : DecisionMatrix, weights : Array[Double], preferences : Array[Preference], tolerance? : Double) -> PrometheeResult raise ChoiceErrorfn rank_scores(labels : Array[String], scores : Array[Double], higher_is_better? : Bool, tolerance? : Double) -> Ranking raise ChoiceErrorfn removal_analysis(m : DecisionMatrix, weights : Array[Double], algorithm : Method, removed : Int) -> RemovalAnalysis raise ChoiceErrorfn saw(m : DecisionMatrix, weights : Array[Double], normalization? : Normalization, tolerance? : Double) -> AdditiveResult raise ChoiceErrorfn topsis(m : DecisionMatrix, weights : Array[Double], normalization? : Normalization, tolerance? : Double) -> TopsisResult raise ChoiceErrorfn vikor(m : DecisionMatrix, weights : Array[Double], v? : Double, tolerance? : Double) -> VikorResult raise ChoiceErrorfn weight_grid(weights : Array[Double], criterion : Int, values : Array[Double]) -> Array[Array[Double]] raise ChoiceErrorfn weight_scenarios(m : DecisionMatrix, scenarios : Array[Array[Double]], algorithm : Method, tolerance? : Double) -> ScenarioReport raise ChoiceErrorfn weighted_product(m : DecisionMatrix, weights : Array[Double], tolerance? : Double) -> ProductResult raise ChoiceErrorInstall
Download zipExplainable bounded multi-criteria ranking and weight-scenario analysis