def lp_track_weights(graph, connection_weights, detection_weights, entry_weight, verbose=False, add_gt_hamming=False): if not graph: return [] lp = LinearProgram(verbose) def Var(): v = lp.Var() lp.add_constraint(0 <= v <= 1) return v for d in graph: d.outgoing = [Var() for n in d.next] d.exit = Var() d.entry = Var() d.present = Var() for d in graph: d.incomming = [p.outgoing[p.next.index(d)] for p in d.prev] connection_weight = 0 for d in graph: lp.add_constraint(sum(d.outgoing) + d.exit - d.present == 0) lp.add_constraint(sum(d.incomming) + d.entry - d.present == 0) connection_weight += sum(connection_weights[i].item() * v for v, i in zip(d.outgoing, d.weight_index)) if add_gt_hamming: connection_weight += sum( hamming_weight(v, gt) for v, gt in zip(d.outgoing, d.gt_next)) detection_weight = sum(d.present * detection_weights[d.index] + entry_weight * d.entry for d in graph) if add_gt_hamming: detection_weight += sum( hamming_weight(d.present, d.gt_present) + hamming_weight(d.entry, d.gt_entry) for d in graph) lp.objective = connection_weight + detection_weight m = lp.maximize() tracks = [] for d in graph: if d.entry.value: tr = [d] while not d.exit.value: d = d.next[max([(v.value, i) for i, v in enumerate(d.outgoing)])[1]] tr.append(d) tracks.append(tr) return tracks
def test_mip1(): lp = LinearProgram() x, y, z = lp.IntVar(), lp.IntVar(), lp.IntVar() lp.objective = 10 * x - 6 * y + 4 * z lp.add_constraint(0 <= x <= 10) lp.add_constraint(0 <= y <= 10) lp.add_constraint(0 <= z <= 10) minval = lp.minimize() print(minval) print(x.value, y.value, z.value) assert minval == -60 assert (x.value, y.value, z.value) == (0, 10, 0)
def test_lp1(): lp = LinearProgram() x, y, z = lp.Var(), lp.Var(), lp.Var() lp.objective = 10 * x - 6 * y + 4 * z lp.add_constraint(0 <= x <= 10) lp.add_constraint(0 <= y <= 10) lp.add_constraint(0 <= z <= 10) maxval = lp.maximize() print(maxval) print(x.value, y.value, z.value) assert maxval == 140 assert (x.value, y.value, z.value) == (10, 0, 10)
def test_lp3(): lp = LinearProgram() x, y, z = lp.Var(), lp.Var(), lp.Var() lp.objective = 10 * x + 6 * y + 4 * z lp.add_constraint(x + y + z <= 100) lp.add_constraint(10 * x + 4 * y + 5 * z <= 600) lp.add_constraint(2 * x + 2 * y + 6 * z <= 300) lp.add_constraint(x >= 0) lp.add_constraint(y >= 0) lp.add_constraint(z >= 0) maxval = lp.maximize() print(maxval) print(x.value, y.value, z.value) assert int(maxval) == 733 assert int(x.value) == 33 assert int(y.value) == 66 assert int(z.value) == 0
def test_mip_zero(): lp = LinearProgram() x, y, z = lp.IntVar(), lp.IntVar(), lp.IntVar() lp.objective = 10 * x + 6 * y + 4 * z lp.add_constraint(0 + x + y + z <= 100) lp.add_constraint(0 + 10 * x + 4 * y + 5 * z <= 600) lp.add_constraint(2 * x + 2 * y + 6 * z + 0 <= 300) lp.add_constraint(x >= 0) lp.add_constraint(y >= 0) lp.add_constraint(z >= 0) maxval = lp.maximize() print(maxval) print(x.value, y.value, z.value) assert maxval == 732.0 assert x.value == 33 assert y.value == 67 assert z.value == 0
def test_isub(): lp = LinearProgram() x, y = lp.Var(), lp.Var() lp.objective += 10 * x - 6 * y lp.add_constraint(x <= 10) lp.add_constraint(0 <= y) lp.objective -= 6 * y z = lp.Var() lp.add_constraint(z <= 10) lp.objective += 4 * z maxval = lp.maximize() print(maxval) print(x.value, y.value, z.value) assert maxval == 140 assert (x.value, y.value, z.value) == (10, 0, 10)