Using an API to Create a Batch¶
Batch Optimization is a feature only available with the Gurobi Cluster Manager. It allows a client to create a model, tag a set of relevant elements in that model, and then submit that model as a batch. A unique batch ID is returned in response, allowing the client to query and monitor the status of the batch (submitted, completed, etc.). Once the batch request has been processed, the client can retrieve its solution and the relevant attributes of the tagged elements in the model as a JSON document.
In this section, we just want to introduce the principles of the API by briefly illustrating these steps. The code snippets that follow show the main concepts, but aren’t necessarily complete programs. You can refer to the Gurobi Reference Manual for details on the full API and for a complete and functional example.
The first step in this process is to create a batch environment by
connecting to a Cluster Manager and enabling batch mode with the
CSBatchMode
parameter. In order to authenticate the application with
the Cluster Manager, you have two options. The first is to use your user
name and password, by setting the UserName
and ServerPassword
parameters. The second, which we recommend, is to use API keys and set
the CSAPIAccessID
and CSAPISecret
parameters instead. We set
these parameters directly in the code snippet for simplicity, but we
recommended that you set them in the license file or read their values
from environment variables to avoid the need to hard-code them.
Then you can build a model, tag the variables and other elements that you will want to export in the solution, and finally you can submit the batch, which gives a batch ID.
The following Python code illustrates these steps:
import gurobipy as gp
# create a batch environment
with gp.Env(empty=True) as env:
env.setParam('CSManager', 'http://localhost:61080')
env.setParam('CSAPIAccessID', '0e8c35d5-ff20-4e5d-a639-10105e56b264')
env.setParam('CSAPISecret', 'd588f010-ad47-4310-933e-1902057661c9')
env.setParam('CSBatchMode', 1)
env.start()
# build the model
with gp.read('misc07.mps', env) as model:
# set tags to control the solution export
[...]
# submit and get the batch ID
batchid = model.optimizeBatch()
Then your client or application can monitor the batch status. Here is an example that accesses and prints the current status:
# create a batch environment
with gp.Env(empty=True) as env:
env.setParam('CSManager', 'http://localhost:61080')
env.setParam('CSAPIAccessID', '0e8c35d5-ff20-4e5d-a639-10105e56b264')
env.setParam('CSAPISecret', 'd588f010-ad47-4310-933e-1902057661c9')
env.setParam('CSBatchMode', 1)
env.start()
# get the batch information
with gp.Batch(batchid, env) as batch:
print("Batch ID {}: Error code {} ({})".format(
batch.BatchID, batch.BatchErrorCode, batch.BatchErrorMessage))
Once the batch is complete, you can retrieve the solution as a JSON object:
# create a batch environment
with gp.Env(empty=True) as env:
env.setParam('CSManager', 'http://localhost:61080')
env.setParam('CSAPIAccessID', '0e8c35d5-ff20-4e5d-a639-10105e56b264')
env.setParam('CSAPISecret', 'd588f010-ad47-4310-933e-1902057661c9')
env.setParam('CSBatchMode', 1)
env.start()
# get the batch information
with gp.Batch(batchid, env) as batch:
# Get JSON solution as string, create dict from it
sol = json.loads(batch.getJSONSolution())
# Pretty printing the general solution information
print(json.dumps(sol["SolutionInfo"], indent=4))