This repository demonstrates how to evolve a basic Pyomo optimization model into a fully-featured, cloud-native application using Nextmv. We'll take you through three stages of development, showing how minimal changes unlock powerful capabilities like observability, collaboration, instance management, version control, and experimentation.
A standard Pyomo diet optimization model that runs locally:
cd starting-state/
python main.pyWhat you get:
- ✅ Working optimization model
- ✅ Local execution
- ❌ No version control
- ❌ No collaboration features
- ❌ No observability
- ❌ No experimentation
Changes made:
- Added
app.yamlmanifest - Tells Nextmv how to run your model
cd run_in_nextmv_state/
tar czf - diet.dat | nextmv app run -a pyomo-example
nextmv app output -a pyomo-example -r <insert runID here>What you unlock:
- ✅ Observability: Detailed execution logs and metrics
- ✅ Collaboration: Share apps with team members
- ✅ Instance Management: Deploy and manage app versions
- ✅ Version Control: Track model changes over time
- ✅ Cloud Execution: Run on Nextmv's optimized infrastructure
Additional changes:
- Added statistics output - For experiment tracking and comparison
- Exposed options in
app.yaml- For model configuration
cd final_state/
tar czf - diet.dat | nextmv app run -a pyomo-example -o "solver=highs,limit_dairy=true"
nextmv app output -a pyomo-example -r <insert runID here>What you unlock:
- ✅ Configuration Testing: Compare different solver configurations
- ✅ Parameter Sweeps: Test multiple scenarios automatically
- ✅ Performance Analytics: Track solution quality and runtime
- ✅ Business Metrics: Custom statistics for your domain
This is a classic optimization problem that minimizes the cost of a diet while meeting nutritional requirements:
- Objective: Minimize total cost of food
- Constraints:
- Meet minimum nutritional requirements (calories, protein, vitamins, etc.)
- Stay within maximum volume limit
- Optional: Limit dairy products (experimentation feature)
Foods available: Cheeseburger, Ham Sandwich, Hamburger, Fish Sandwich, Chicken Sandwich, Fries, Sausage Biscuit, Lowfat Milk, Orange Juice
type: python
runtime: ghcr.io/nextmv-io/runtime/pyomo:latest
python:
pip-requirements: requirements.txt
files:
- main.py
- diet.py
configuration:
content:
format: "multi-file"
multi-file:
input:
path: "."
output:
solutions: "."
statistics: "statistics.json"This tells Nextmv:
- Use the Pyomo-optimized runtime
- Include your Python files
- How to handle input/output data
- Statistics Output (
main.py):
import nextmv
statistics = nextmv.Statistics(
result=nextmv.ResultStatistics(
value=value(instance.cost),
custom={
"nvars": len(instance.x),
"nconstraints": len(instance.nutrient_limit) + 1,
},
),
)- Configurable Options (
app.yaml):
configuration:
options:
items:
- name: solver
option_type: string
ui:
control_type: select
additional_attributes:
values: [cbc, glpk, highs]
- name: limit_dairy
option_type: bool
default: false
ui:
control_type: togglepip install -r requirements.txt
python main.py
python push.pyWith just two simple changes (adding app.yaml and renaming to main.py), you transform a local script into a cloud-native optimization application with:
- Zero infrastructure management
- Built-in experiment tracking
- Team collaboration features
- Automatic scaling
- Version control and rollback
- Performance monitoring
This is the power of "Nextmvifying" your optimization models - minimal changes, maximum impact.