def compute_defense(att_stg, prod_dist, num_of_hp=args.fix_honeypots, rationality=args.fix_rationality): # production ports and attacker"s strategy df = DataFrame('P') ports = getRelPorts(att_stg, prod_dist, num=25) df.setColumn('P', list(ports)) #ports = getAllPorts(att_stg, prod_dist) #print(('Considered ports are: ', ports)) att = [att_stg.get(x, 0) for x in ports] prod = [prod_dist.get(x, 0) for x in ports] #print(('Attack ports: ', att, len(att))) #print(('Dist ports: ', prod, len(prod))) df.addColumn('s', prod) df.addColumn('p', att) ampl = AMPL(Environment(args.ampl)) ampl.setOption('solver', args.solver) # ampl.setOption('verbosity', 'terse') # Read the model file ampl.read(args.model) # Assign data to s ampl.setData(df, 'P') ampl.eval('let L := {}; let rat := {};'.format(num_of_hp, rationality)) #print(df) # Solve the model with suppress_stdout(): ampl.solve() reward = ampl.getObjective("reward").value() hp_stg = ampl.getData("{j in P} h[j]") output = dict() stg_json = list() for k, v in hp_stg.toDict().items(): stg_json.append({"port": int(k), "prob": v}) output.update({"stg": stg_json}) output.update({"reward": reward}) output.update({"rationality": rationality}) output.update({"num_of_hp": num_of_hp}) output.update({"used_hps": ampl.getData("tot").toDict().popitem()[1]}) ampl.close() return output
def testDataFrame(self): ampl = self.ampl # Create first dataframe (for data indexed over NUTR) # Add data row by row df1 = DataFrame('NUTR', ('n_min', 'n_max')) df1.addRow(('A', 700, 20000)) df1.addRow(('B1', 700, 20000)) df1.addRow(('B2', 700, 20000)) df1.addRow(('C', 700, 20000)) df1.addRow(('CAL', 16000, 24000)) df1.addRow(('NA', 0.0, 50000)) # Create second dataframe (for data indexed over FOOD) # Add column by column df2 = DataFrame('FOOD') foods = ['BEEF', 'CHK', 'FISH', 'HAM', 'MCH', 'MTL', 'SPG', 'TUR'] df2.setColumn('FOOD', foods) contents = [2] * 8 df2.addColumn('f_min', contents) contents = [10] * 8 df2.addColumn('f_max', contents) costs = [3.19, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49] df2.addColumn('cost', costs) print(df2.getColumn('FOOD')) for index in df2.getColumn('FOOD'): print(df2.getRow(index)) # Create third dataframe, to assign data to the AMPL entity # param amt{NUTR, FOOD}; df3 = DataFrame(('NUTR', 'FOOD')) # Populate the set columns nutrWithMultiplicity = [''] * 48 foodWithMultiplicity = [''] * 48 i = 0 for n in range(6): for f in range(8): print(df1.getRowByIndex(n)[0]) nutrWithMultiplicity[i] = df1.getRowByIndex(n)[0] foodWithMultiplicity[i] = foods[f] i += 1 df3.setColumn('NUTR', nutrWithMultiplicity) df3.setColumn('FOOD', foodWithMultiplicity) # Populate with all these values values = [ 60, 8, 8, 40, 15, 70, 25, 60, 10, 20, 15, 35, 15, 15, 25, 15, 15, 20, 10, 10, 15, 15, 15, 10, 20, 0, 10, 40, 35, 30, 50, 20, 295, 770, 440, 430, 315, 400, 370, 450, 968, 2180, 945, 278, 1182, 896, 1329, 1397 ] df3.addColumn('amt', values)
def main(argc, argv): from amplpy import AMPL, DataFrame os.chdir(os.path.dirname(__file__) or os.curdir) try: ampl = AMPL() if argc > 1: ampl.setOption('solver', argv[1]) # Read the model file modelDirectory = argv[2] if argc == 3 else os.path.join('..', 'models') ampl.read(os.path.join(modelDirectory, 'diet/diet.mod')) foods = ['BEEF', 'CHK', 'FISH', 'HAM', 'MCH', 'MTL', 'SPG', 'TUR'] costs = [3.59, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49] fmin = [2, 2, 2, 2, 2, 2, 2, 2] fmax = [10, 10, 10, 10, 10, 10, 10, 10] df = DataFrame('FOOD') df.setColumn('FOOD', foods) df.addColumn('cost', costs) df.addColumn('f_min', fmin) df.addColumn('f_max', fmax) ampl.setData(df, 'FOOD') nutrients = ['A', 'C', 'B1', 'B2', 'NA', 'CAL'] nmin = [700, 700, 700, 700, 0, 16000] nmax = [20000, 20000, 20000, 20000, 50000, 24000] df = DataFrame('NUTR') df.setColumn('NUTR', nutrients) df.addColumn('n_min', nmin) df.addColumn('n_max', nmax) ampl.setData(df, 'NUTR') amounts = [[60, 8, 8, 40, 15, 70, 25, 60], [20, 0, 10, 40, 35, 30, 50, 20], [10, 20, 15, 35, 15, 15, 25, 15], [15, 20, 10, 10, 15, 15, 15, 10], [928, 2180, 945, 278, 1182, 896, 1329, 1397], [295, 770, 440, 430, 315, 400, 379, 450]] df = DataFrame(('NUTR', 'FOOD'), 'amt') df.setValues({(nutrient, food): amounts[i][j] for i, nutrient in enumerate(nutrients) for j, food in enumerate(foods)}) ampl.setData(df) ampl.solve() print('Objective: {}'.format(ampl.getObjective('total_cost').value())) except Exception as e: print(e) raise
def testDataFrame(self): ampl = self.ampl # Create first dataframe (for data indexed over NUTR) # Add data row by row df1 = DataFrame("NUTR", ("n_min", "n_max")) df1.addRow(("A", 700, 20000)) df1.addRow(("B1", 700, 20000)) df1.addRow(("B2", 700, 20000)) df1.addRow(("C", 700, 20000)) df1.addRow(("CAL", 16000, 24000)) df1.addRow(("NA", 0.0, 50000)) # Create second dataframe (for data indexed over FOOD) # Add column by column df2 = DataFrame("FOOD") foods = ["BEEF", "CHK", "FISH", "HAM", "MCH", "MTL", "SPG", "TUR"] df2.setColumn("FOOD", foods) self.assertEqual(list(df2.getColumn("FOOD")), foods) contents = [2] * 8 df2.addColumn("f_min", contents) self.assertEqual(list(df2.getColumn("f_min")), contents) contents = [10] * 8 df2.addColumn("f_max", contents) self.assertEqual(list(df2.getColumn("f_max")), contents) costs = [3.19, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49] df2.addColumn("cost", costs) self.assertEqual(list(df2.getColumn("cost")), costs) labels = [random.choice(string.ascii_letters)] * 8 df2.addColumn("labels", labels) self.assertEqual(list(df2.getColumn("labels")), labels) df2.addColumn("empty", []) self.assertEqual(list(df2.getColumn("empty")), [None] * 8) print(df2.getColumn("FOOD")) for index in df2.getColumn("FOOD"): print(df2.getRow(index)) # Create third dataframe, to assign data to the AMPL entity # param amt{NUTR, FOOD}; df3 = DataFrame(("NUTR", "FOOD")) # Populate the set columns nutrWithMultiplicity = [""] * 48 foodWithMultiplicity = [""] * 48 i = 0 for n in range(6): for f in range(8): print(df1.getRowByIndex(n)[0]) nutrWithMultiplicity[i] = df1.getRowByIndex(n)[0] foodWithMultiplicity[i] = foods[f] i += 1 df3.setColumn("NUTR", nutrWithMultiplicity) df3.setColumn("FOOD", foodWithMultiplicity) # Populate with all these values values = [ 60, 8, 8, 40, 15, 70, 25, 60, 10, 20, 15, 35, 15, 15, 25, 15, 15, 20, 10, 10, 15, 15, 15, 10, 20, 0, 10, 40, 35, 30, 50, 20, 295, 770, 440, 430, 315, 400, 370, 450, 968, 2180, 945, 278, 1182, 896, 1329, 1397, ] df3.addColumn("amt", values)
def main(argc, argv): from amplpy import AMPL, DataFrame os.chdir(os.path.dirname(__file__) or os.curdir) try: # Create first dataframe (for data indexed over NUTR) # Add data row by row df1 = DataFrame('NUTR', ('n_min', 'n_max')) df1.addRow('A', 700, 20000) df1.addRow('B1', 700, 20000) df1.addRow('B2', 700, 20000) df1.addRow('C', 700, 20000) df1.addRow('CAL', 16000, 24000) df1.addRow('NA', 0.0, 50000) # Create second dataframe (for data indexed over FOOD) # Add column by column df2 = DataFrame('FOOD') foods = ['BEEF', 'CHK', 'FISH', 'HAM', 'MCH', 'MTL', 'SPG', 'TUR'] df2.setColumn('FOOD', foods) contents = [2] * 8 df2.addColumn('f_min', contents) contents = [10] * 8 df2.addColumn('f_max', contents) costs = [3.19, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49] df2.addColumn('cost', costs) # Create third dataframe, to assign data to the AMPL entity # param amt{NUTR, FOOD}; df3 = DataFrame(index=('NUTR', 'FOOD')) # Populate the set columns nutrWithMultiplicity = [''] * 48 foodWithMultiplicity = [''] * 48 i = 0 for n in range(6): for f in range(8): print(df1.getRowByIndex(n)[0]) nutrWithMultiplicity[i] = df1.getRowByIndex(n)[0] foodWithMultiplicity[i] = foods[f] i += 1 df3.setColumn('NUTR', nutrWithMultiplicity) df3.setColumn('FOOD', foodWithMultiplicity) # Populate with all these values values = [ 60, 8, 8, 40, 15, 70, 25, 60, 10, 20, 15, 35, 15, 15, 25, 15, 15, 20, 10, 10, 15, 15, 15, 10, 20, 0, 10, 40, 35, 30, 50, 20, 295, 770, 440, 430, 315, 400, 370, 450, 968, 2180, 945, 278, 1182, 896, 1329, 1397 ] df3.addColumn('amt', values) # Create AMPL object ampl = AMPL() if argc > 1: ampl.setOption('solver', argv[1]) # Read the model file modelDirectory = argv[2] if argc == 3 else os.path.join('..', 'models') ampl.read(os.path.join(modelDirectory, 'diet/diet.mod')) # Assign data to NUTR, n_min and n_max ampl.setData(df1, 'NUTR') # Assign data to FOOD, f_min, f_max and cost ampl.setData(df2, 'FOOD') # Assign data to amt ampl.setData(df3) # Solve the model ampl.solve() # Print out the result print("Objective function value: {}".format( ampl.getObjective('total_cost').value())) # Get the values of the variable Buy in a dataframe results = ampl.getVariable('Buy').getValues() # Print print(results) except Exception as e: print(e) raise