import math import json import regex import inspect import guidance from ast import literal_eval from transformers import Tool from ortools.linear_solver import pywraplp guidance.llm = guidance.llms.OpenAI("gpt-4") structure_program = guidance( ''' {{#user~}} {{description}} Help me extract args from the data blob to apply the following algorithm: {{code}} ---- {{~#each examples}} Data Blob: {{this.input}} Result: {{this.output}} --- {{~/each}} Please help me extract the input values from a given data blob into a JSON. Data Blob: {{data_blob}} Result: {{~/user}} {{#assistant~}} {{gen 'output'}} {{~/assistant}} ''') class IntegerProgrammingTool(Tool): name = "integer_programming_tool" description = """ This tool solves an integer programming problem. Input is data_blob Output is the optimal solution as a string. """ inputs = ["text"] outputs = ["text"] examples = [ {'input': ''' ,Space,Price Puzzle,1,2 BoardGame,5,12 Constraint,100 ''', 'output': { "objective_coeffs": [ [1, 2], [5, 15], ], "constraints": [100], "bounds": [ [0, None], [0, None] ], "goal": "max" }, }, {'input': ''' ,Space,Price Puzzle,3,12 BoardGame,15,120 Constraint,300 ''', 'output': { "objective_coeffs": [ [3, 2], [15, 120], ], "constraints": [300], "bounds": [ [0, None], [0, None] ], "goal": "max" }, }, ] def __call__(self, data_blob): code = inspect.getsourcelines(self.__call__) args = structure_program( description=self.description, code=code, examples=self.examples, data_blob=data_blob, )['output'] pattern = regex.compile(r"\{(?:[^{}]|(?R))*\}") matches = pattern.findall(args)[0] args = literal_eval(matches) print(args) objective_coeffs = args['objective_coeffs'] constraints = args['constraints'] bounds = args['bounds'] goal = args['goal'] objective_coeffs = list(zip(*objective_coeffs)) solver = pywraplp.Solver.CreateSolver("CBC") variables = [solver.IntVar( int(bounds[i][0]) if bounds[i][0] is not None else -math.inf, int(bounds[i][1]) if bounds[i][1] is not None else math.inf, f"x{i}") for i in range(len(objective_coeffs))] # Set objective function objective = solver.Objective() for i, coeff_list in enumerate(objective_coeffs): for j, coeff_value in enumerate(coeff_list): objective.SetCoefficient(variables[j], coeff_value) if goal == 'max': objective.SetMaximization() else: objective.SetMinimization() # Add constraints for i, constraint_value in enumerate(constraints): if constraint_value: constraint = solver.RowConstraint(0, constraint_value) for j, coeff in enumerate(objective_coeffs[i]): constraint.SetCoefficient(variables[j], coeff) solver.Solve() solution = {"Objective value": objective.Value()} for i, variable in enumerate(variables): solution[f"x{i}"] = variable.solution_value() return json.dumps(solution)