From d49ec13d1a039315fe3d137e003a01e635af855e Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 13 Jan 2017 17:45:48 +0100 Subject: generate-food.py: convert to array Hopefully it makes doing 1b easier. --- food_delivery/generate-food.py | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/food_delivery/generate-food.py b/food_delivery/generate-food.py index dc87c03..b182cd7 100755 --- a/food_delivery/generate-food.py +++ b/food_delivery/generate-food.py @@ -53,30 +53,29 @@ def fillin(cases, template_vars): return cases.format(**template_vars) return [template.format(**template_vars) for template in cases] -literals = [] +extrafuns = [] preds = [] # s0_j is the current stock of the truck # s1_j is the current stock of village 1 -for j in range(m + 1): - literals += ["s%d_%d" % (i, j) for i in range(len(states))] - literals += ["l%d" % j] +extrafuns += ["(s Int Int Int)"] +extrafuns += ["(l Int Int)"] # Initially the villages have 80 food, # the truck is at the supply (l=0), # and the truck is fully loaded for i in range(1, len(states)): - preds += ["(= s%d_0 80)" % i] -preds += ["(= l0 0)"] -preds += ["(= s0_0 %d)" % truck_capacity] + preds += ["(= (s %d 0) 80)" % i] +preds += ["(= (l 0) 0)"] +preds += ["(= (s 0 0) %d)" % truck_capacity] # The truck and village capacity should never drop below zero in any state. for j in range(m + 1): for i, capacity in enumerate(capacities): - preds += ["(>= s%d_%d 0)" % (i, j)] + preds += ["(>= (s %d %d) 0)" % (i, j)] # The village also has a maximum capacity if i > 0: - preds += ["(<= s%d_%d %d)" % (i, j, capacity)] + preds += ["(<= (s %d %d) %d)" % (i, j, capacity)] # For every step, any of the edge transitions can be done. for j in range(1, m + 1): @@ -85,34 +84,34 @@ for j in range(1, m + 1): for (x, y), cost in trans.items(): # Preds for this choice cpreds = fillin([ - "(= l{jprev} {x})", - "(= l{j} {y})", + "(= (l {jprev}) {x})", + "(= (l {j}) {y})", ], vars()) # All villages must have sufficient time to make the transition. for i in range(1, len(states)): cpreds += fillin([ - "(>= s{i}_{jprev} {cost})", + "(>= (s {i} {jprev}) {cost})", ], vars()) # Calculate new food stock per village. All village lose the cost, but # the next village can be stocked from the truck. for i in range(1, len(states)): - newval = "(- s{i}_{jprev} {cost})" + newval = "(- (s {i} {jprev}) {cost})" if i == y: # This is next village, so restock village from truck. - drop = "(- s0_{jprev} s0_{j})" + drop = "(- (s 0 {jprev}) (s 0 {j}))" newval = "(+ %s %s)" % (newval, drop) cpreds += fillin([ "(>= %s 0)" % drop, ], vars()) cpreds += fillin([ - "(= s{i}_{j} %s)" % newval, + "(= (s {i} {j}) %s)" % newval, ], vars()) # If next is truck, restock. if y == 0: cpreds += fillin([ - "(= s0_{j} {truck_capacity})", + "(= (s 0 {j}) {truck_capacity})", ], vars()) altpreds += ["(and %s)" % " ".join(cpreds)] preds += ["(or %s)" % "\n".join(altpreds)] @@ -123,7 +122,7 @@ if is_b: for j in range(1, m + 1): jprev = j - 1 highers = " ".join([ - "(>= s{i}_{j} s{i}_0)".format(i=i, j=j) + "(>= (s {i} {j}) (s {i} 0))".format(i=i, j=j) for i in range(1, len(states)) ]) stuff += fillin([ @@ -137,7 +136,7 @@ s = """(benchmark test.smt :logic QF_UFLIA :extrafuns ( """ -s += "\n".join("(%s Int)" % x for x in literals) +s += "\n".join(extrafuns) s += """ ) :formula (and -- cgit v1.2.1