ugiocb.c |
/*******************************************************
Mosel User Guide Example Problems
=================================
file ugiocb.c
`````````````
Exchanging data between model and host application.
- Callbacks for exchanging data (sparse data, string indices) -
Executing a model file.
(c) 2009 Fair Isaac Corporation
author: S. Heipcke, Nov. 2009, rev. Feb. 2017
********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xprm_mc.h"
/* Input values for data: */
char *ind[]={"camera", "necklace", "vase", "picture", "tv", "video",
"chest", "brick"}; /* Index names */
double vdata[]={15,100,90,60,40,15,10, 1}; /* Input data: VALUE */
double wdata[]={ 2, 20,20,30,40,30,60,10}; /* Input data: WEIGHT */
int datasize=8;
struct SolArray
{ /* Array to receive solution values: */
const char *ind; /* index name */
double val; /* solution value */
};
struct SolArray *solution;
int solsize;
/********************************************/
/* Callback for generating Model input data */
/********************************************/
int XPRM_RTC cbinit_from(XPRMcbinit cb, void *info, const char *label,
int type, void *ref)
{
int i;
if(strcmp(label,"DATA")==0)
{
XPRMcb_sendctrl(cb, XPRM_CBC_OPENLST, 0);
for(i=0;i<datasize;i++)
{
XPRMcb_sendctrl(cb, XPRM_CBC_OPENNDX, 0);
XPRMcb_sendstring(cb, ind[i], -1, 0);
XPRMcb_sendctrl(cb, XPRM_CBC_CLOSENDX, 0);
XPRMcb_sendctrl(cb, XPRM_CBC_OPENLST, 0);
XPRMcb_sendreal(cb, vdata[i], 0);
XPRMcb_sendreal(cb, wdata[i], 0);
XPRMcb_sendctrl(cb, XPRM_CBC_CLOSELST, 0);
}
XPRMcb_sendctrl(cb, XPRM_CBC_CLOSELST, 0);
return 0;
}
else
{
fprintf(stderr,"Label `%s' not found.\n",label);
return 1;
}
}
/******************************************/
/* Callback for getting model output data */
/******************************************/
int XPRM_RTC cbinit_to(XPRMcbinit cb, void *info, const char *label,
int type, XPRMalltypes *ref)
{
XPRMarray solarr;
XPRMset sets[1];
int indices[1];
XPRMalltypes rvalue;
int ct;
if(strcmp(label,"SOL")==0)
{
solarr=ref->array;
solsize=XPRMgetarrsize(solarr);
solution = (struct SolArray *)malloc(solsize * sizeof(struct SolArray));
XPRMgetarrsets(solarr,sets); /* Get the indexing sets
(we know array has 1 dimension) */
ct=0;
XPRMgetfirstarrtruentry(solarr,indices); /* Get the first true index tuple */
do
{
solution[ct].ind=XPRMgetelsetval(sets[0],indices[0],&rvalue)->string;
XPRMgetarrval(solarr,indices,&rvalue);
solution[ct].val=rvalue.real;
ct++;
} while(!XPRMgetnextarrtruentry(solarr,indices));
}
else
{
printf("Unknown output data item: %s %p\n", label, ref);
}
return 0;
}
/********************************************************/
int main()
{
XPRMmodel mod;
int i,result;
char data_name[40]; /* File name of input data 'data' */
char solution_name[40]; /* File name of solution values */
char params[128]; /* Parameter string for model execution */
if(XPRMinit()) /* Initialize Mosel */
return 1;
/* Prepare file names for 'initializations' using the 'cb' driver */
sprintf(data_name, "cb:%p", cbinit_from);
sprintf(solution_name, "cb:%p", cbinit_to);
/* Pass file names as execution param.s */
sprintf(params, "DATAFILE='%s',SOLFILE='%s'", data_name, solution_name);
if(XPRMexecmod(NULL, "burglar13.mos", params, &result, &mod))
return 2; /* Execute a model file */
if((XPRMgetprobstat(mod)&XPRM_PBRES)!=XPRM_PBOPT)
return 3; /* Test whether a solution is found */
/* Display solution values obtained from the model */
printf("Objective value: %g\n", XPRMgetobjval(mod));
for(i=0;i<solsize;i++)
printf(" take(%s): %g\n", solution[i].ind, solution[i].val);
XPRMresetmod(mod);
return 0;
}
|
|
ugiodense.c |
/*******************************************************
Mosel User Guide Example Problems
=================================
file ugiodense.c
````````````````
Exchanging data between model and host application.
- Dense data -
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2006, rev. Feb. 2017
********************************************************/
#include <stdio.h>
#include "xprm_mc.h"
double vdata[8]={15,100,90,60,40,15,10, 1}; /* Input data: VALUE */
double wdata[8]={ 2, 20,20,30,40,30,60,10}; /* Input data: WEIGHT */
double solution[8]; /* Array for solution values */
int main()
{
XPRMmodel mod;
int i,result;
char vdata_name[40]; /* File name of input data 'vdata' */
char wdata_name[40]; /* File name of input data 'wdata' */
char solution_name[40]; /* File name of solution values */
char params[144]; /* Parameter string for model execution */
if(XPRMinit()) /* Initialize Mosel */
return 1;
/* Prepare file names for 'initializations' using the 'raw' driver: */
/* "rawoption[,...],filename" */
/* (Here, 'filename' uses the 'mem' driver, data is stored in memory) */
/* Options for 'raw': */
/* 'noindex': only array values are expected - no indices requested */
sprintf(vdata_name, "noindex,mem:%p/%d", vdata, (int)sizeof(vdata));
sprintf(wdata_name, "noindex,mem:%p/%d", wdata, (int)sizeof(wdata));
sprintf(solution_name, "noindex,mem:%p/%d", solution, (int)sizeof(solution));
/* Pass file names as execution param.s */
sprintf(params, "VDATA='%s',WDATA='%s',SOL='%s'", vdata_name, wdata_name,
solution_name);
if(XPRMexecmod(NULL, "burglar6.mos", params, &result, &mod))
return 2; /* Execute a model file */
if((XPRMgetprobstat(mod)&XPRM_PBRES)!=XPRM_PBOPT)
return 3; /* Test whether a solution is found */
/* Display solution values obtained from the model */
printf("Objective value: %g\n", XPRMgetobjval(mod));
for(i=0;i<8;i++)
printf(" take(%d): %g\n", i+1, solution[i]);
XPRMresetmod(mod); /* Reset the model */
return 0;
}
|
|
ugioscalar.c |
/*******************************************************
Mosel User Guide Example Problems
=================================
file ugioscalar.c
`````````````````
Exchanging data between model and host application.
- Scalars -
Executing a model file.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Mar. 2008, rev. Feb. 2017
********************************************************/
#include <stdio.h>
#include "xprm_mc.h"
int wmax=100;
int numitem;
double objval;
int main()
{
XPRMmodel mod;
int result;
char wmax_name[40]; /* File name of input data 'wmax' */
char num_name[40]; /* File name of output data 'num' */
char solution_name[40]; /* File name of solution value */
char params[160]; /* Parameter string for model execution */
if(XPRMinit()) /* Initialize Mosel */
return 1;
/* Prepare file names for 'initializations' using the 'raw' driver: */
/* "rawoption[,...],filename" */
/* (Here, 'filename' uses the 'mem' driver, data is stored in memory) */
sprintf(wmax_name, "mem:%p/%d", &wmax, (int)sizeof(wmax));
sprintf(num_name, "mem:%p/%d", &numitem, (int)sizeof(numitem));
sprintf(solution_name, "mem:%p/%d", &objval, (int)sizeof(objval));
/* Pass file names as execution param.s */
sprintf(params, "WMAX='%s',NUM='%s',SOLVAL='%s'", wmax_name, num_name,
solution_name);
if(XPRMexecmod(NULL, "burglar12.mos", params, &result, &mod))
return 2; /* Execute a model file */
if((XPRMgetprobstat(mod)&XPRM_PBRES)!=XPRM_PBOPT)
return 3; /* Test whether a solution is found */
/* Display solution values obtained from the model */
printf("Objective value: %g\n", objval);
printf("Total number of items: %d\n", numitem);
XPRMresetmod(mod);
return 0;
}
|
|
ugiosparse.c |
/*******************************************************
Mosel User Guide Example Problems
=================================
file ugiosparse.c
`````````````````
Exchanging data between model and host application.
- Sparse data (string indices) -
Executing a model file.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2006, rev. Jan. 2024
********************************************************/
#include <stdio.h>
#include "xprm_mc.h"
const struct
{ /* Initial values for array 'data': */
const char *ind; /* index name */
double val,wght; /* value and weight data entries */
} data[]={{"camera",15,2}, {"necklace",100,20}, {"vase",90,20},
{"picture",60,30}, {"tv",40,40}, {"video",15,30},
{"chest",10,60}, {"brick",1,10}};
struct
{ /* Array to receive solution values: */
const char *ind; /* index name */
double val; /* solution value */
} solution[8];
int main()
{
XPRMmodel mod;
int i,result;
char data_name[40]; /* File name of input data 'data' */
char solution_name[40]; /* File name of solution values */
char params[96]; /* Parameter string for model execution */
if(XPRMinit()) /* Initialize Mosel */
return 1;
/* Prepare file names for 'initializations' using the 'raw' driver: */
/* "rawoption[,...],filename" */
/* (Here, 'filename' uses the 'mem' driver, data is stored in memory) */
/* Options for 'raw': */
/* 'slength=0': strings are represented by pointers to null terminated */
/* arrays of characters (C-string) instead of fixed size arrays*/
sprintf(data_name, "slength=0,mem:%p/%d", data, (int)sizeof(data));
sprintf(solution_name, "slength=0,mem:%p/%d", solution, (int)sizeof(solution));
/* Pass file names as execution param.s */
sprintf(params, "DATA='%s',SOL='%s'", data_name, solution_name);
if(XPRMexecmod(NULL, "burglar7.mos", params, &result, &mod))
return 2; /* Execute a model file */
if((XPRMgetprobstat(mod)&XPRM_PBRES)!=XPRM_PBOPT)
return 3; /* Test whether a solution is found */
/* Display solution values obtained from the model */
printf("Objective value: %g\n", XPRMgetobjval(mod));
for(i=0;i<8;i++)
printf(" take(%s): %g\n", solution[i].ind, solution[i].val);
XPRMresetmod(mod);
return 0;
}
|
|
burglar13.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar13.mos
``````````````````
Same as burglar2.mos, with input from/output to
calling application.
*** Not intended to be run standalone - run from ugiocb.c ***
(c) 2009 Fair Isaac Corporation
author: S. Heipcke, Nov. 2009
*******************************************************!)
model Burglar13
uses "mmxprs"
parameters
DATAFILE = '' ! Location of input data
SOLFILE = '' ! Location for solution data output
WTMAX = 102 ! Maximum weight allowed
end-parameters
declarations
ITEMS: set of string ! Index set for items
VALUE: array(ITEMS) of real ! Value of items
WEIGHT: array(ITEMS) of real ! Weight of items
soltake: array(ITEMS) of real ! Solution values
end-declarations
initializations from DATAFILE
[VALUE,WEIGHT] as "DATA"
end-initializations
declarations
take: array(ITEMS) of mpvar ! 1 if we take item i; 0 otherwise
end-declarations
! 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
! Output solution to calling application
forall(i in ITEMS) soltake(i):= getsol(take(i))
initializations to SOLFILE
soltake as "SOL"
end-initializations
end-model
|
|
burglar6.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar6.mos
`````````````````
Model as in burglar.mos, with data input/ouput
from/to calling application.
*** Not intended to be run standalone - run from ugiodense.c ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Mar. 2006
*******************************************************!)
model Burglar6
uses "mmxprs"
parameters
VDATA = ''; WDATA = '' ! Locations of input data
SOL = '' ! Location for solution data output
WTMAX = 102 ! Maximum weight allowed
end-parameters
declarations
ITEMS = 1..8 ! Index range 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
soltake: array(ITEMS) of real ! Solution values
end-declarations
initializations from 'raw:'
VALUE as VDATA WEIGHT as WDATA
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
! Output solution to calling application
forall(i in ITEMS) soltake(i):= getsol(take(i))
initializations to 'raw:'
soltake as SOL
end-initializations
end-model
|
|
burglar12.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar12.mos
`````````````````
Same as burglari.mos, with some scalars
input from/output to calling application.
*** Not intended to be run standalone - run from ugioscalar.c ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Mar. 2008
*******************************************************!)
model Burglar12
uses "mmxprs"
parameters
NUM = '' ! Location for no. of items output
SOLVAL = '' ! Location for objective value output
WMAX = '' ! Maximum weight allowed
end-parameters
declarations
WTMAX: integer ! 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
end-declarations
VALUE :: (["camera", "necklace", "vase", "picture", "tv", "video",
"chest", "brick"])[15,100,90,60,40,15,10,1]
WEIGHT:: (["camera", "necklace", "vase", "picture", "tv", "video",
"chest", "brick"])[2,20,20,30,40,30,60,10]
initializations from 'raw:'
WTMAX as WMAX
end-initializations
declarations
take: array(ITEMS) of mpvar ! 1 if we take item i; 0 otherwise
end-declarations
! 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:")
forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i)))
! Output solution to calling application
initializations to 'raw:'
evaluation of getobjval as SOLVAL
evaluation of round(sum(i in ITEMS) getsol(take(i))) as NUM
end-initializations
end-model
|
|
burglar7.mos |
(!******************************************************
Mosel User Guide Example Problems
=================================
file burglar7.mos
`````````````````
Same as burglar2.mos, with input from/output to
calling application.
*** Not intended to be run standalone - run from ugiosparse.c ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Mar. 2006
*******************************************************!)
model Burglar7
uses "mmxprs"
parameters
DATA = '' ! Location of input data
SOL = '' ! Location for solution data output
WTMAX = 102 ! Maximum weight allowed
end-parameters
declarations
ITEMS: set of string ! Index set for items
VALUE: array(ITEMS) of real ! Value of items
WEIGHT: array(ITEMS) of real ! Weight of items
soltake: array(ITEMS) of real ! Solution values
end-declarations
initializations from 'raw:'
[VALUE,WEIGHT] as DATA
end-initializations
declarations
take: array(ITEMS) of mpvar ! 1 if we take item i; 0 otherwise
end-declarations
! 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
! Output solution to calling application
forall(i in ITEMS) soltake(i):= getsol(take(i))
initializations to 'raw:'
soltake as SOL
end-initializations
end-model
|
|