Skip to content

Commit 3695de8

Browse files
committed
hungarian is dead; use pathfinding instead
1 parent b0ff30c commit 3695de8

File tree

2 files changed

+10
-15
lines changed

2 files changed

+10
-15
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ schemars = { version = "0.8.12", default_features = false }
2525
serde = "1.0.158"
2626
serde_json = "1.0.94"
2727
thiserror = "1.0.40"
28-
hungarian = "1.1.1"
28+
pathfinding = "4.2.1"
2929

3030
[features]
3131
build-binary = ["clap", "anyhow"]

src/diff_walker.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::{BTreeMap, BTreeSet};
22

33
use schemars::schema::{
44
InstanceType, NumberValidation, ObjectValidation, RootSchema, Schema, SchemaObject,
5-
SingleOrVec, StringValidation, SubschemaValidation,
5+
SingleOrVec, SubschemaValidation,
66
};
77
use serde_json::Value;
88

@@ -36,10 +36,10 @@ impl DiffWalker {
3636
}
3737
}
3838

39-
let mut mat = vec![];
4039
let len = lhs_any_of.len();
41-
for l in lhs_any_of.iter_mut() {
42-
for r in rhs_any_of.iter_mut() {
40+
let mut mat = pathfinding::matrix::Matrix::new(len, len, 0i64);
41+
for (i, l) in lhs_any_of.iter_mut().enumerate() {
42+
for (j, r) in rhs_any_of.iter_mut().enumerate() {
4343
let mut walker = DiffWalker {
4444
changes: vec![],
4545
lhs_root: self.lhs_root.clone(),
@@ -50,25 +50,20 @@ impl DiffWalker {
5050
&mut l.clone().into_object(),
5151
&mut r.clone().into_object(),
5252
)?;
53-
mat.push(walker.changes.len());
53+
mat[(i, j)] = walker.changes.len() as i64;
5454
}
5555
}
56-
let pairs = hungarian::minimize(&mat, len, len)
57-
.into_iter()
58-
.enumerate()
59-
.filter_map(|(i, j)| j.map(|j| (i, j)))
60-
.collect::<Vec<_>>();
61-
56+
let pairs = pathfinding::kuhn_munkres::kuhn_munkres_min(&mat).1;
6257
for i in 0..len {
6358
let new_path = match is_rhs_split {
6459
true => json_path.to_owned(),
65-
false => format!("{json_path}.<anyOf:{}>", pairs[i].1),
60+
false => format!("{json_path}.<anyOf:{}>", pairs[i]),
6661
};
6762
self.do_diff(
6863
&new_path,
6964
true,
70-
&mut lhs_any_of[pairs[i].0].clone().into_object(),
71-
&mut rhs_any_of[pairs[i].1].clone().into_object(),
65+
&mut lhs_any_of[i].clone().into_object(),
66+
&mut rhs_any_of[pairs[i]].clone().into_object(),
7267
)?;
7368
}
7469
}

0 commit comments

Comments
 (0)