ugcomptmp.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugcomptmp.cs
`````````````````
Compiling a model into a BIM file saved in Mosel's
temporary directory, then load and run it.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugcomptmp.cs {
public class ugcomptmp {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile the Mosel model, save the BIM file in Mosel's temp. dir.
mosel.Compile("", "burglar2.mos", "tmp:burglar2.bim");
// Load the BIM file
XPRMModel model = mosel.LoadModel("tmp:burglar2.bim");
// Run the model
model.Run();
}
}
}
|
|
ugcomptmp.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar2.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugrun.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugrun.cs
`````````````
Compile+load, then run a model.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugrun.cs {
public class ugrun {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile and load a model
XPRMModel model = mosel.CompileAndLoad("burglar2.mos");
// Run the model
model.Run();
Console.WriteLine("`burglar2' returned: " + model.Result);
}
}
}
|
|
ugrun.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar2.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugdefstream.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugdefstream.cs
```````````````````
Redirecting model output.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugdefstream.cs {
public class ugdefstream {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile and load the Mosel model
XPRMModel model = mosel.CompileAndLoad("burglar2.mos");
// Redirect the model output. Uncomment one of the following lines:
// Disable model output
// model.SetDefaultStream(XPRMStreamType.F_OUTPUT, "null:");
// Double model output (file+stdout)
model.SetDefaultStream(XPRMStreamType.F_OUTPUT, "tee:burglog.txt&");
// Run the model
model.Run();
Console.WriteLine("'burglar2' returned: {0}", model.Result);
}
}
}
|
|
ugdefstream.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar2.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugarray.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugarray.cs
```````````````
Accessing modeling objects (sparse arrays).
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
J.Farmer, May. 2021
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugarray.cs {
public class ugarray {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
XPRMArray varr;
XPRMSet[] sets;
XPRMValue[] vindex;
int dim;
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile and load a model
XPRMModel model = mosel.CompileAndLoad("transport.mos");
// Run the model
model.Run();
// Get model object 'flow', it must be an array
varr=(XPRMArray)model.FindIdentifier("flow");
dim = varr.Dim; // Get the number of dimensions of the array
sets = varr.IndexSets; // Get the indexing sets
// Enumerate over the true entries
foreach(int[] indices in varr.TEIndices)
{
// Get the values for this index
vindex = varr.DereferenceIndex(indices);
Console.Write("flow(");
for(int i=0;i<dim-1;i++)
Console.Write(vindex[i] + ",");
Console.Write(vindex[dim-1] + "), ");
// Alternative printing method:
// Console.Write("flow" + varr.IndexToString(indices) + ", ");
}
Console.WriteLine();
model.Reset(); // Reset the model
}
}
}
|
|
ugarray.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../transport.mos" CopyToOutputDirectory="Always" />
<Content Include="../transprt.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugcb.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugcb.cs
````````````
Retrieve model output via callback-style functionality.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, J.Farmer, Mar. 2013, rev. May. 2021
********************************************************/
using System;
using System.IO;
using System.Text;
using Mosel;
namespace ugcb.cs {
public class ugcb {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Associate .NET object with a name in Mosel
mosel.Bind("mycb", new MyOut());
// Redirect error stream to stdout
mosel.SetDefaultStream(XPRMStreamType.F_ERROR, Console.Out);
// Compile and load the Mosel model
XPRMModel model = mosel.CompileAndLoad("burglar2.mos");
// Redirect the model's output to a custom TextWriter
MyOut modelOut = new MyOut();
model.SetDefaultStream(XPRMStreamType.F_OUTPUT_LINEBUF, modelOut);
// Alternative:
// Redirect the model's output to our printing function 'cbmsg'
model.SetDefaultStream(XPRMStreamType.F_OUTPUT_LINEBUF, "dotnet:mycb");
// Run the model
model.Run();
}
}
public class MyOut: TextWriter
{
private bool atStartOfLine = true;
public override void Write(char b)
{
if (atStartOfLine) {
Console.Write("Mosel: ");
atStartOfLine=false;
}
if (b=='\n') {
Console.WriteLine();
atStartOfLine=true;
}
else if (b=='\r') {
// ignore
}
else {
Console.Write(b);
}
}
public override Encoding Encoding {
get {
return Encoding.UTF8;
}
}
}
}
|
|
ugcb.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar2.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugcb2.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugcb.cs
````````````
Retrieve model output via callback-style functionality.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Mar. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugcb.cs {
public class ugcb {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Redirect error stream to stdout
mosel.SetDefaultStream(XPRMStreamType.F_ERROR, Console.Out);
// Compile and load the Mosel model
XPRMModel model = mosel.CompileAndLoad("burglar2.mos");
// Collect the model's output into a string
StringWriter modelOut = new StringWriter();
model.SetDefaultStream(XPRMStreamType.F_OUTPUT_LINEBUF, modelOut);
// Run the model
model.Run();
// Print the output
string modelOutText = modelOut.ToString();
Console.WriteLine("Model output: {0}", modelOutText);
}
}
}
|
|
ugcb2.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar2.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugsol.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugsol.cs
`````````````
Accessing modeling objects and solution information.
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugsol.cs {
public class ugsol {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static int Main(string[] args) {
XPRMArray varr, darr;
XPRMSet set;
XPRMMPVar x;
double val;
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile and load a model
XPRMModel model = mosel.CompileAndLoad("burglar3.mos");
// Run the model
model.Run();
if(model.ProblemStatus!=XPRMProblemStatus.PB_OPTIMAL)
return 1; // Stop if no solution found
Console.WriteLine("Objective value: " + model.ObjectiveValue);
// Print the objective function value
// Get model object 'take', it must be an array
varr=(XPRMArray)model.FindIdentifier("take");
// Get model object 'VALUE', it must be an array
darr=(XPRMArray)model.FindIdentifier("VALUE");
// Get model object 'ITEMS', it must be a set
set=(XPRMSet)model.FindIdentifier("ITEMS");
// Enumerate all entries of 'varr' (dense array)
foreach(int[] indices in varr.Indices)
{
x = varr.Get(indices).AsMPVar(); // Get a variable from varr
val = darr.GetAsReal(indices); // Get the corresponding value
// Console.WriteLine("take(" + set.GetAsString(indices[0]) + "): " +
Console.WriteLine("take" + varr.IndexToString(indices) + ": " +
x.Solution + "\t (item value: " + val + ")");
}
model.Reset(); // Reset the model
return 0;
}
}
}
|
|
ugsol.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../burglar3.mos" CopyToOutputDirectory="Always" />
<Content Include="../burglar.dat" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
ugparam.cs |
/********************************************************
Mosel User Guide Example Problems
=================================
file ugparam.cs
```````````````
Passing parameters to a Mosel program
Accessing modeling objects (sets).
(c) 2013 Fair Isaac Corporation
author: S.Heipcke, Apr. 2013
********************************************************/
using System;
using System.IO;
using Mosel;
namespace ugparam.cs {
public class ugparam {
/// <summary>
/// Main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args) {
XPRMSet set;
int LIM=500, first, last;
// Initialize Mosel
XPRM mosel = XPRM.Init();
// Set Mosel work directory to folder containing our example source code
mosel.WorkDir = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
// Compile and load a model
XPRMModel model = mosel.CompileAndLoad("prime.mos");
// Run the model
model.ExecParams = "LIMIT=" + LIM;
model.Run();
Console.WriteLine("`prime' returned: " + model.Result);
// Get model object 'SPrime', it must be a set
set=(XPRMSet)model.FindIdentifier("SPrime");
// Enumerate the set elements
if (!set.IsEmpty)
{
first = set.FirstIndex; // Get the number of the first index
last = set.LastIndex; // Get the number of the last index
Console.WriteLine("Prime numbers from 2 to " + LIM);
for (int i=first;i<=last;i++) // Print all set elements
Console.Write(" {0},", set.GetAsInteger(i));
Console.WriteLine();
}
}
}
}
|
|
ugparam.csproj |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Include="../prime.mos" CopyToOutputDirectory="Always" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FICO.Xpress.XPRMdn" Version="5.6.1" />
</ItemGroup>
</Project>
|
|
burglar2.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar2.mos
`````````````````
Use of index sets.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2001, rev. 2006
*******************************************************!)
model Burglar2
uses "mmxprs"
declarations
WTMAX = 102 ! Maximum weight allowed
ITEMS = {"camera", "necklace", "vase", "picture", "tv", "video",
"chest", "brick"} ! Index set for items
VALUE: array(ITEMS) of real ! Value of items
WEIGHT: array(ITEMS) of real ! Weight of items
take: array(ITEMS) of mpvar ! 1 if we take item i; 0 otherwise
end-declarations
initializations from 'burglar.dat'
VALUE WEIGHT
end-initializations
! Objective: maximize total value
MaxVal:= sum(i in ITEMS) VALUE(i)*take(i)
! Weight restriction
sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX
! All variables are 0/1
forall(i in ITEMS) take(i) is_binary
maximize(MaxVal) ! Solve the MIP-problem
! Print out the solution
writeln("Solution:\n Objective: ", getobjval)
forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i)))
end-model
|
|
transport.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file transport.mos
``````````````````
Using dynamic arrays.
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, 2001, rev. June 2018
*******************************************************!)
model Transport
uses "mmxprs"
public declarations
REGION: set of string ! Set of customer regions
PLANT: set of string ! Set of plants
DEMAND: array(REGION) of real ! Demand at regions
PLANTCAP: array(PLANT) of real ! Production capacity at plants
PLANTCOST: array(PLANT) of real ! Unit production cost at plants
TRANSCAP: dynamic array(PLANT,REGION) of real
! Capacity on each route plant->region
DISTANCE: dynamic array(PLANT,REGION) of real
! Distance of each route plant->region
FUELCOST: real ! Fuel cost per unit distance
flow: dynamic array(PLANT,REGION) of mpvar ! Flow on each route
end-declarations
initializations from 'transprt.dat'
DEMAND
[PLANTCAP,PLANTCOST] as 'PLANTDATA'
[DISTANCE,TRANSCAP] as 'ROUTES'
FUELCOST
end-initializations
! Create the flow variables that exist
forall(p in PLANT, r in REGION | exists(TRANSCAP(p,r)) ) create(flow(p,r))
! Objective: minimize total cost
MinCost:= sum(p in PLANT, r in REGION | exists(flow(p,r)))
(FUELCOST * DISTANCE(p,r) + PLANTCOST(p)) * flow(p,r)
! Limits on plant capacity
forall(p in PLANT) sum(r in REGION) flow(p,r) <= PLANTCAP(p)
! Satisfy all demands
forall(r in REGION) sum(p in PLANT) flow(p,r) = DEMAND(r)
! Bounds on flows
forall(p in PLANT, r in REGION | exists(flow(p,r)))
flow(p,r) <= TRANSCAP(p,r)
minimize(MinCost) ! Solve the problem
end-model
|
|
prime.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file prime.mos
``````````````
Working with sets.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2001, rev. June 2018
*******************************************************!)
model Prime
parameters
LIMIT=100 ! Search for prime numbers in 2..LIMIT
end-parameters
public declarations
SNumbers: set of integer ! Set of numbers to be checked
SPrime: set of integer ! Set of prime numbers
end-declarations
SNumbers:={2..LIMIT}
writeln("Prime numbers between 2 and ", LIMIT, ":")
n:=2
repeat
while (not(n in SNumbers)) n+=1
SPrime += {n} ! n is a prime number
i:=n
while (i<=LIMIT) do ! Remove n and all its multiples
SNumbers-= {i}
i+=n
end-do
until SNumbers={}
writeln(SPrime)
writeln(" (", getsize(SPrime), " prime numbers.)")
end-model
|
|
burglar3.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar3.mos
`````````````````
Same as burglar2.mos but no output printing.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2001, rev. June 2018
*******************************************************!)
model Burglar3
uses "mmxprs"
public declarations
WTMAX = 102 ! Maximum weight allowed
ITEMS = {"camera", "necklace", "vase", "picture", "tv", "video",
"chest", "brick"} ! Index set for items
VALUE: array(ITEMS) of real ! Value of items
WEIGHT: array(ITEMS) of real ! Weight of items
take: array(ITEMS) of mpvar ! 1 if we take item i; 0 otherwise
end-declarations
initializations from 'burglar.dat'
VALUE WEIGHT
end-initializations
! Objective: maximize total value
MaxVal:= sum(i in ITEMS) VALUE(i)*take(i)
! Weight restriction
sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX
! All variables are 0/1
forall(i in ITEMS) take(i) is_binary
maximize(MaxVal) ! Solve the MIP-problem
end-model
|
|