Skip to content

Commit 613ff32

Browse files
committed
levelssat: two related bugs
1. Some constraints were using the condition x.lt_const(0), which is a constant -- it should have been x.lte_const(0), which checks a value for being zero. 2. When adding the fractional X values, the length of an edge in x constraints was not calculated correctly for short edges.
1 parent 74f61c5 commit 613ff32

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "railplot"
3-
version = "0.3.1"
3+
version = "0.3.2"
44
authors = ["Bjørnar Luteberget <luteberget@gmail.com>"]
55
edition = "2018"
66

lib/railplotlib/src/levelssat.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,15 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
157157
//
158158
// symbol node x deltas
159159
for (i,dx) in node_delta_xs.iter().enumerate() {
160-
let dx0a = s.cond_constraint(symbol_node_xs[i], symbol_node_xs[i+1], 0);
160+
//let dx0a = s.cond_constraint(symbol_node_xs[i], symbol_node_xs[i+1], 0);
161+
//s.sat.add_clause(vec![!dx.lt_const(0),dx0a]);
162+
161163
let dx0b = s.cond_constraint(symbol_node_xs[i+1], symbol_node_xs[i], 0);
162164
let dx1a = s.cond_constraint(symbol_node_xs[i], symbol_node_xs[i+1], -1*symbol_factor);
163165
let dx1b = s.cond_constraint(symbol_node_xs[i+1], symbol_node_xs[i], 1*symbol_factor);
164-
s.sat.add_clause(vec![!dx.lt_const(0),dx0a]);
165-
s.sat.add_clause(vec![!dx.lt_const(0),dx0b]);
166-
s.sat.add_clause(vec![dx.lt_const(0), !dx.lt_const(1), dx1a]);
167-
s.sat.add_clause(vec![dx.lt_const(0), !dx.lt_const(1), dx1b]);
166+
s.sat.add_clause(vec![!dx.lte_const(0),dx0b]);
167+
s.sat.add_clause(vec![dx.lte_const(0), !dx.lte_const(1), dx1a]);
168+
s.sat.add_clause(vec![dx.lte_const(0), !dx.lte_const(1), dx1b]);
168169
}
169170

170171
// (c1) global order
@@ -222,15 +223,32 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
222223
// After optimization, we extract the node_dx, ndoe_y, edge_y values
223224
// and use them add constraints to symbol_node_xs.
224225

225-
let (node_dx_values, node_y_values, edge_y_values) = {
226+
let (node_dx_values, node_y_values, edge_y_values, edge_short_values) = {
226227
let m = s.solve().unwrap();
227228
let node_dx_values = node_delta_xs.iter()
228229
.map(|x| m.sat.value(x)).collect::<Vec<_>>();
229230
let node_y_values = node_ys.iter()
230231
.map(|x| m.diff.get_value(*x)).collect::<Vec<_>>();
231232
let edge_y_values = edge_ys.iter()
232233
.map(|x| m.diff.get_value(*x)).collect::<Vec<_>>();
233-
(node_dx_values,node_y_values,edge_y_values)
234+
let edge_shapes = edge_shapes.iter().map(|(b,e)| {
235+
let begin = if m.sat.value(&b.straight) { EdgeDir::Straight }
236+
else if m.sat.value(&b.up) { EdgeDir::Up }
237+
else if m.sat.value(&b.down) { EdgeDir::Down }
238+
else { panic!() };
239+
let end = if m.sat.value(&e.straight) { EdgeDir::Straight }
240+
else if m.sat.value(&e.up) { EdgeDir::Up }
241+
else if m.sat.value(&e.down) { EdgeDir::Down }
242+
else { panic!() };
243+
(begin,end)
244+
}).collect::<Vec<_>>();
245+
let edge_short_values = edge_short.iter().map(|x| m.sat.value(&x.0) || m.sat.value(&x.1)).collect::<Vec<_>>();
246+
debug!("Node dx {:?}", node_dx_values);
247+
debug!("Edge shapes {:?}", edge_shapes);
248+
let sxs = symbol_node_xs.iter().map(|v| m.diff.get_value(*v)).collect::<Vec<_>>();
249+
debug!("Symbol Node Xs {:?}", sxs);
250+
251+
(node_dx_values,node_y_values,edge_y_values, edge_short_values)
234252
};
235253

236254
// Minimum DX values.
@@ -246,7 +264,8 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
246264
let dy1 = node_y_values[e.a.node] - edge_y_values[i];
247265
let dy2 = edge_y_values[i] - node_y_values[e.b.node];
248266
let samedir = dy1.signum() == dy2.signum() && dy1.signum() != 0;
249-
let dist = dy1.abs() + dy2.abs() + if samedir { 0 } else { 1 };
267+
let short = edge_short_values[i];
268+
let dist = dy1.abs() + dy2.abs() + if samedir || short { 0 } else { 1 };
250269
debug!("Edge {:?} dist{} dy{} dy{} {:?} {:?} {}", e,dist,dy1,dy2,x1,x2,-(dist*symbol_factor));
251270

252271
let c = s.cond_constraint(x1,x2,-(dist*symbol_factor));
@@ -375,7 +394,7 @@ fn optimize_and_commit_unary(name :&str, s :&mut SATModDiff, x :Unary) -> Result
375394
Ok(())
376395
}
377396

378-
#[derive(PartialEq,Eq)]
397+
#[derive(PartialEq,Eq,Debug)]
379398
enum EdgeDir { Up, Straight, Down }
380399

381400
fn map_portshape(s :&minisat::Model, x :&PortShape) -> EdgeDir {

0 commit comments

Comments
 (0)