Welcome to faropt’s documentation!

Indices and tables

Using the SDK

For a basic Walkthrough, do:

from faropt import FarOpt

// init a FarOpt object
fo = FarOpt()

// point to your source code, with a main.py and any other files and/or subfolders
fo.configure('../project/src/')

// submit the job
fo.submit()

// print logs()
fo.logs()

Saving and running a recipe

// add a recipe after submitting a job
fo.add_recipe(recipe_name='routing-v1', maintainer='Dexter')

// get unique recipe ID
r_id = fo.get_recipe_id_from_description(description='routing-v1')

// run this recipe
fo.run_recipe(r_id)

For black box optimization problems:

from faropt.templates.blackbox import AsyncOpt

// init an AsyncOpt object
ao = AsyncOpt()

// list existing models
ao.list_models()

// create a new model
ao.create_model(bounds = [(-1.0,1.0), (-5.0,5.0), (-3,3)])], model_tag = 'engine1')

// ask optimizer for a new point to evaluate
ao.ask_model(modelname = ...)

// tell the optimizer results of a evaluation
ao.tell_model(xval = [0,0,1], fval = 0.5, modelname= ...s)

Example code

See example code here - https://github.com/aws-samples/faropt/blob/master/tests/src/main.py

"""Capacited Vehicles Routing Problem (CVRP)."""

# [START import]
from __future__ import print_function
from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp
from utils import *
# [END import]


# [START data_model]
def create_data_model():
    """Stores the data for the problem."""
    data = {}
    data['distance_matrix'] = [
        [
            0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354,
            468, 776, 662
        ],

    //.
    //.
    //.
    //.
    //.

    # Solve the problem.
    # [START solve]
    solution = routing.SolveWithParameters(search_parameters)
    # [END solve]

    # Print solution on console.
    # [START print_solution]
    print('printing solutions')
    if solution:
        print_solution(data, manager, routing, solution)
    # [END print_solution]


main()

Logs from the back end …

1598041071123 |  Starting FarOpt backend
1598041071123 | ███████╗ █████╗ ██████╗  ██████╗ ██████╗ ████████╗
1598041071123 | ██╔════╝██╔══██╗██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝
1598041071123 | █████╗  ███████║██████╔╝██║   ██║██████╔╝   ██║
1598041071123 | ██╔══╝  ██╔══██║██╔══██╗██║   ██║██╔═══╝    ██║
1598041071123 | ██║     ██║  ██║██║  ██║╚██████╔╝██║        ██║
1598041071123 | ╚═╝     ╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝ ╚═╝        ╚═╝
.
.
.
.
.

Back-end architecture

Fargate based serverless Numerical Optimization

This architecture is a bare bones template of how you can run optimization models in a serverless fashion on Fargate. The Open source SDK can be used to submit optimization tasks and receive logs. Fargate will launch the container, run your code, push logs to cloudwatch and exit - you only pay for the seconds that this optimzation task runs.

Currently supported frameworks inlcude:

  1. PuLP

  2. Pyomo

  3. OR Tools

  4. JuMP (Julia)

What’s coming up?

  1. Scheduling optimization jobs

  2. Demand forecasting using Forecast

  3. Quantum Approximate Optimization Algorithm

  4. SageMaker RL solvers for certain problem types

How to use this CDK project

You should explore the contents of this project. It demonstrates a CDK app with an instance of a stack (faropt_stack) which contains an Amazon SQS queue that is subscribed to an Amazon SNS topic.

The cdk.json file tells the CDK Toolkit how to execute your app.

This project is set up like a standard Python project. The initialization process also creates a virtualenv within this project, stored under the .env directory. To create the virtualenv it assumes that there is a python3 executable in your path with access to the venv package. If for any reason the automatic creation of the virtualenv fails, you can create the virtualenv manually once the init process completes.

To manually create a virtualenv on MacOS and Linux:

$ python3 -m venv .env

After the init process completes and the virtualenv is created, you can use the following step to activate your virtualenv.

$ source .env/bin/activate

If you are a Windows platform, you would activate the virtualenv like this:

% .env\Scripts\activate.bat

Once the virtualenv is activated, you can install the required dependencies.

$ pip install -r requirements.txt

At this point you can now synthesize the CloudFormation template for this code.

$ cdk synth

You can now begin exploring the source code, contained in the hello directory. There is also a very trivial test included that can be run like this:

$ pytest

To add additional dependencies, for example other CDK libraries, just add to your requirements.txt file and rerun the pip install -r requirements.txt command.

Useful commands for the back end stack

  • cdk ls list all stacks in the app

  • cdk synth emits the synthesized CloudFormation template

  • cdk deploy deploy this stack to your default AWS account/region

  • cdk diff compare deployed stack with current state

  • cdk docs open CDK documentation

Enjoy!