Esempio n. 1
0
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
Esempio n. 2
0
def test_expr():
    lp = LinearProgram()
    x, y = lp.Var(), lp.Var()
    assert str(x + y) == " 1.00 X1 +  1.00 X2"
    assert str(2 * (x + y)) == " 2.00 X1 +  2.00 X2"
    assert str(2 * x + 3 * y) == " 2.00 X1 +  3.00 X2"
    assert str(0 <= 2 * x) == " 2.00 X1 >=  0.00"
    assert str(3 * y <= 7) == " 3.00 X2 <=  7.00"
    e = 0 <= 2 * x + 3 * y <= 7
    assert str(e) == " 0.00 <=  2.00 X1 +  3.00 X2 <=  7.00"
    e = 2 * x + 3 * y
    assert str(e <= 7) == " 2.00 X1 +  3.00 X2 <=  7.00"
    assert str(0 <= e) == " 2.00 X1 +  3.00 X2 >=  0.00"
    assert str(x * 4 == 8) == " 4.00 X1 ==  8.00"
    assert str(y <= 6) == "X2 <=  6.00"
    assert str(2 * x - 3 * y) == " 2.00 X1 + -3.00 X2"
    e += 3 * lp.Var()
    assert str(e) == " 2.00 X1 +  3.00 X2 +  3.00 X3"
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
def test_lp2():
    lp = LinearProgram()
    x, y, z = lp.Var(), lp.Var(), lp.Var()
    lp.objective = 10 * x - 6 * y + 4 * z
    lp.add_constraint(x <= 10)
    lp.add_constraint(0 <= y)
    lp.add_constraint(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)
Esempio n. 6
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
Esempio n. 7
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)