Built upon Microsoft SolverFoundation's ODSL and F# 3.0's custom keywords
Examples
let petrochem () = opt { let! sa = var<Barrel/Day>() let! vz = var<_>() assume (0.3 * sa + 0.4 * vz >= 2000.<_>) assume (0.4 * sa + 0.2 * vz >= 1500.<_>) assume (0.2 * sa + 0.3 * vz >= 500.<_>) assume (sa <= 9000.<_> && sa >= 0.<_>) assume (vz <= 6000.<_> && vz >= 0.<_>) minimise (20.0<Dollar/Barrel> * sa + 15.0<_> * vz) }
Syntax
The language implemented in this sample has the following grammar:
LinearProgram := (Variables, LinearConstraints, ObjectiveFunction) Variables := Variable := Variable \n Variables Variable := let identifier = var <UnitAnnotation>() := let identifier = vararray1 <UnitAnnotation>(range) := let identifier = vararray2 <UnitAnnotation>(range,range) ObjectiveFunction := minimise LinearFunction := maximise LinearFunction LinearFunction := RealConstant * RealVariable := LinearFunction + LinearFunction := sum range (fun identifier -> LinearFunction) LinearConstraints := LinearConstraint := LinearConstraint \n LinearConstraints LinearConstraint := assume Constraint Constraint := LinearFunction <= RealConstant := LinearFunction >= RealConstant := LinearFunction = RealConstant := integral identifier := foreach range (fun identifier -> Constraint) RealConstant := float_literal_constant := identifier := identifier.[Integer] := identifier.[Integer, Integer] RealVariable := identifier := identifier.[Integer] := identifier.[Integer, Integer] Integer := integer_literal_constant := identifier
More details will be added later.