Skip to main content

Model Export

OptalCP supports multiple export formats for models: JSON for serialization and interoperability, text format for debugging, and JavaScript code generation for sharing models.

JSON Export

Export models to JSON for serialization, storage, or transmission.

Signature

The Model class has the following method:

def to_json(
params: Parameters | None = None,
warm_start: Solution | None = None
) -> str
import optalcp as cp

model = cp.Model()
# ... build model ...

# Export to JSON string
json_str = model.to_json()

# Export with parameters
params: cp.Parameters = {'timeLimit': 60, 'nbWorkers': 4}
json_str = model.to_json(params)

# Export with parameters and warm start
warm_start = cp.Solution()
# ... build warm start ...
json_str = model.to_json(params, warm_start)

JSON Import

Reconstruct models from JSON. The Model class has a class method / static method:

@classmethod
def from_json(json_str: str) -> tuple[Model, Parameters | None, Solution | None]
import optalcp as cp

# Import from JSON
json_str = '{"model": {...}, "parameters": {...}}'
model, params, warm_start = cp.Model.from_json(json_str)

# Solve the loaded model
result = model.solve(params, warm_start)

Use Cases for JSON

  1. Saving Models: Persist models to disk or database
  2. Network Transmission: Send models to remote solvers
  3. Model Libraries: Build collections of benchmark problems
  4. Debugging: Inspect model structure in a standard format
import json
import optalcp as cp

# Save model to file
model = cp.Model()
# ... build model ...

with open('model.json', 'w') as f:
f.write(model.to_json(params))

# Load model from file
with open('model.json', 'r') as f:
json_str = f.read()

model, params, _ = cp.Model.from_json(json_str)
result = model.solve(params)

Text Export

Export models to human-readable text format (similar to CPO format).

Signature

The Model class has the following method:

def to_text(
params: Parameters | None = None,
warm_start: Solution | None = None
) -> str
import optalcp as cp

model = cp.Model()
# ... build model ...

# Export to text
text = model.to_text()
print(text)

# Export with parameters
text = model.to_text(params)

Example Text Output

sand_0 = intervalVar(length=15);
cut_1 = intervalVar(length=20);
endBeforeStart(cut_1, sand_0, 0);
paint_4 = intervalVar(length=30);
endBeforeStart(sand_0, paint_4, 0);
assemble_7 = intervalVar(length=25);
endBeforeStart(paint_4, assemble_7, 0);
noOverlap(_sequenceVar([cut_1, sand_0, paint_4, assemble_7]));
minimize(end(assemble_7));

Use Cases for Text

  1. Debugging: Quick inspection of model structure
  2. Documentation: Include model descriptions in reports
  3. Code Review: Share models in readable format
  4. Learning: Understand model structure
# Save model description to file
with open('model.txt', 'w') as f:
f.write(model.to_text(params))

JavaScript Code Export

Export models as JavaScript/TypeScript code.

Signature

The Model class has the following method:

def to_js(
params: Parameters | None = None,
warm_start: Solution | None = None
) -> str
import optalcp as cp

model = cp.Model()
# ... build model ...

# Export to JavaScript code
js_code = model.to_js()
print(js_code)

# Export with parameters
js_code = model.to_js(params)

Example JavaScript Output

import * as CP from '@scheduleopt/optalcp';

function defineProblem() {
let m = new CP.Model();

let sand$0 = m.intervalVar({ name: "sand", length: [15, 15] });
let cut$1 = m.intervalVar({ name: "cut", length: [20, 20] });
m.endBeforeStart(cut$1, sand$0, 0);
let paint$4 = m.intervalVar({ name: "paint", length: [30, 30] });
m.endBeforeStart(sand$0, paint$4, 0);
let assemble$7 = m.intervalVar({ name: "assemble", length: [25, 25] });
m.endBeforeStart(paint$4, assemble$7, 0);
m._noOverlap(m._sequenceVar([cut$1, sand$0, paint$4, assemble$7]));
m.minimize(m.end(assemble$7));

return m;
}

let parameters = {}

CP.benchmark(defineProblem, [1], CP.parseBenchmarkParameters(parameters));

Use Cases for JavaScript Export

  1. Debugging: Modify and experiment with the model independently of the original source code
  2. Cross-Language Transfer: Convert Python models to TypeScript
  3. Model Sharing: Share working code without dependencies (e.g., on a database)
Experimental

JavaScript export is experimental. Generated code may require manual adjustments for complex models.

Complete Example: Model Serialization

import optalcp as cp
import json

# Build model
model = cp.Model()

task1 = model.interval_var(length=20, name="task1")
task2 = model.interval_var(length=30, name="task2")
task3 = model.interval_var(length=25, name="task3")

task1.end_before_start(task2)
task2.end_before_start(task3)

model.minimize(task3.end())

# Create parameters and warm start
params: cp.Parameters = {'timeLimit': 60, 'nbWorkers': 4}
warm_start = cp.Solution()
warm_start.set_start(task1, 0)
warm_start.set_start(task2, 20)
warm_start.set_start(task3, 50)

# Export to JSON
json_str = model.to_json(params, warm_start)

# Save to file
with open('schedule_model.json', 'w') as f:
# Pretty print
parsed = json.loads(json_str)
f.write(json.dumps(parsed, indent=2))

print("Model saved to schedule_model.json")

# Later: load and solve
with open('schedule_model.json', 'r') as f:
json_str = f.read()

loaded_model, loaded_params, loaded_warm_start = cp.Model.from_json(json_str)
result = loaded_model.solve(loaded_params, loaded_warm_start)

print(f"Loaded and solved: objective={result.objective}")

Export for Debugging

Use exports to inspect models during debugging:

import optalcp as cp

model = cp.Model()
# ... build complex model ...

# Quick inspection
print("=== Model Structure ===")
print(model.to_text())

# Detailed inspection
print("\n=== Model JSON ===")
import json
parsed = json.loads(model.to_json())
print(json.dumps(parsed, indent=2))

# Count elements
print(f"\nInterval vars: {len(model.get_interval_vars())}")
print(f"Int vars: {len(model.get_int_vars())}")
print(f"Bool vars: {len(model.get_bool_vars())}")

See Also