1function transport12(varargin)
3 % check workspace info from arguments
5 wsInfo = gams.control.WorkspaceInfo();
6 wsInfo.systemDirectory = varargin{1};
7 ws = gams.control.Workspace(wsInfo);
9 ws = gams.control.Workspace();
14 ' i canning plants / seattle, san-diego / '
15 ' j markets / new-york, chicago, topeka / ; '
19 ' a(i) capacity of plant i in cases '
23 ' b(j) demand at market j in cases '
28 'Table d(i,j) distance in thousands of miles '
29 ' new-york chicago topeka '
30 ' seattle 2.5 1.7 1.8 '
31 ' san-diego 2.5 1.8 1.4 ; '
33 'Scalar f freight in dollars per case per thousand miles /90/ ;'
34 'Scalar bmult demand multiplier /1/; '
36 'Parameter c(i,j) transport cost in thousands of dollars per case ; '
38 ' c(i,j) = f * d(i,j) / 1000 ; '
41 ' x(i,j) shipment quantities in cases '
42 ' z total transportation costs in thousands of dollars ; '
44 'Positive Variable x ; '
47 ' cost define objective function '
48 ' supply(i) observe supply limit at plant i '
49 ' demand(j) satisfy demand at market j ; '
51 'cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; '
53 'supply(i) .. sum(j, x(i,j)) =l= a(i) ; '
55 'demand(j) .. sum(i, x(i,j)) =g= bmult*b(j) ; '
57 'Model transport /all/ ; '
59 model = sprintf(
'%s\n', model{:});
61 % initialize a checkpont by running a job
62 cp = ws.addCheckpoint();
63 t12 = ws.addJobFromString(model);
66 bmultlist = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3];
68 % create a ModelInstance and solve it multiple times with different scalar bmult
69 mi = cp.addModelInstance();
70 db1 = ws.addDatabase();
71 scen1 = db1.addSet(
'scen', 1,
'');
72 bmult = db1.addParameter(
'bmultlist',
'', scen1);
73 zscen1 = db1.addParameter(
'zscen',
'', scen1);
75 for i = 1:numel(bmultlist)
76 rec = bmult.addRecord(sprintf(
's%d', i));
77 rec.value = bmultlist(i);
78 scen1.addRecord(sprintf(
's%d', i));
81 dict = db1.addSet(
'dict', 3,
'');
82 dict.addRecord(scen1.name,
'scenario',
'');
83 dict.addRecord(
'bmult',
'param', bmult.name);
84 dict.addRecord(
'z',
'level', zscen1.name);
86 GUSSCall(dict, mi,
'transport use lp min z', [], [], []);
88 for rec = db1.getParameter(zscen1.name).records;
89 fprintf(
'%s obj: %g\n', rec{1}.key(1), rec{1}.value);
92 mi2 = cp.addModelInstance();
93 db2 = ws.addDatabase();
94 scen2 = db2.addSet(
'scen', 1,
'');
95 zscen2 = db2.addParameter(
'zscen',
'', scen2);
96 xup = db2.addParameter(
'xup', 3,
'');
99 for i = t12.outDB.getSet(
'i').records
100 for j = t12.outDB.getSet(
'j').records
101 rec = xup.addRecord(sprintf(
's%d', k), i{1}.key(1), j{1}.key(1));
105 scen2.addRecord(sprintf(
's%d', k));
108 dict2 = db2.addSet(
'dict', 3,
'');
109 dict2.addRecord({scen2.name,
'scenario',
''});
110 dict2.addRecord({
'x',
'lower', xup.name});
111 dict2.addRecord({
'z',
'level', zscen2.name});
113 GUSSCall(dict2, mi2,
'transport use lp min z', [], [], gams.control.PrintStream());
115 for rec = db2.getParameter(zscen2.name).records;
116 fprintf(
'%s obj: %g\n', rec{1}.key(1), rec{1}.value);
120function GUSSCall(dict, mi, solveStatement, opt, miOpt, output)
123 if (dict.dimension ~= 3)
124 error(
'Dict needs to be 3-dimensional');
127 scenName = dict.getFirstRecord(
' ',
'scenario',
' ').key(1);
128 scenSymbol = dict.database.getSet(scenName);
130 for rec = dict.records
132 key1 = lower(keys{2});
133 if strcmp(key1,
'scenario')
138 case {
'param',
'lower',
'upper',
'fixed'}
139 modifierDim = dict.database.getParameter(keys{3}).dimension - scenSymbol.dimension;
141 error(
'Dimension of %s too small', keys{3});
143 case {
'level',
'marginal'}
145 error(
'Cannot handle UpdateAction %s', keys{2});
149 case {
'lower',
'upper',
'fixed'}
151 modifierVar = dict.database.getVariable(keys{1});
153 modifierVar = mi.syncDB.addVariable(keys{1}, modifierDim, gams.control.globals.VarType.FREE,
'');
155 case {
'level',
'marginal'}
156 % Check that parameter exists in Database, will
throw an exception
if not
157 dict.database.getParameter(keys{3});
162 mod = gams.control.Modifier(mi.syncDB.addParameter(keys{1}, modifierDim,
''));
164 mod = gams.control.Modifier(modifierVar, gams.control.globals.UpdateAction.LOWER, ...
165 mi.syncDB.addParameter(keys{3}, modifierDim,
''));
167 mod = gams.control.Modifier(modifierVar, gams.control.globals.UpdateAction.UPPER, ...
168 mi.syncDB.addParameter(keys{3}, modifierDim,
''));
170 mod = gams.control.Modifier(modifierVar, gams.control.globals.UpdateAction.FIXED, ...
171 mi.syncDB.addParameter(keys{3}, modifierDim,
''));
175 case {
'param',
'lower',
'upper',
'fixed'}
176 param = dict.database.getParameter(keys{3});
177 modifierList{end+1} = {mod, param};
182 for i = 1:numel(modifierList)
183 if isa(modifierList{i}{1},
'gams.control.Modifier')
184 mods{end+1} = modifierList{i}{1};
189 mi.instantiate(solveStatement, mods);
191 mi.instantiate(solveStatement, opt, mods);
196 for s = scenSymbol.records
197 for i = 1:numel(modifierList)
198 m = modifierList{i}{1};
199 pscen = modifierList{i}{2};
207 filter = cell(1, pscen.dimension);
208 for i = 1:scenSymbol.dimension
209 filter{i} = s{1}.key(i);
211 for i = scenSymbol.dimension+1:pscen.dimension
216 rec = pscen.getFirstRecord(filter);
222 myKeys = cell(1, p.dimension);
223 for i = 1:p.dimension
224 myKeys{i} = rec.key(scenSymbol.dimension+i);
226 r = p.addRecord(myKeys);
234 if isempty(output) && isempty(miOpt)
235 mi.solve(gams.control.globals.SymbolUpdateType.BASECASE);
236 elseif isempty(miOpt)
237 mi.solve(gams.control.globals.SymbolUpdateType.BASECASE, output);
239 mi.solve(gams.control.globals.SymbolUpdateType.BASECASE, output, miOpt);
241 if numel(outList) == 0
242 for rec = dict.records
243 key = lower(rec{1}.key(2));
246 case {
'level',
'marginal'}
247 sym = mi.syncDB.getSymbol(rec{1}.key(1));
248 param = dict.database.getParameter(rec{1}.key(3));
249 str = lower(rec{1}.key(2));
250 outList{end+1} = {sym, param, str};
255 for i = 1:numel(outList)
256 symbol = outList{i}{1};
257 param = outList{i}{2};
259 myKeys = cell(1, scenSymbol.dimension + numel(symbol.getFirstRecord().keys));
260 for j = 1:scenSymbol.dimension
261 myKeys{j} = s{1}.key(j);
264 if strcmp(str,
'level') && (isa(symbol,
'gams.control.Variable') || isa(symbol,
'gams.control.Equation'))
265 for rec = symbol.records
266 for j = 1:numel(rec{1}.keys)
267 myKeys(scenSymbol.dimension + j) = s{1}.key(j);
269 r = param.addRecord(myKeys);
270 r.value = rec{1}.level;
272 elseif strcmp(str,
'marginal') && (isa(symbol,
'gams.control.Variable') || isa(symbol,
'gams.control.Equation'))
273 for rec = symbol.records
274 for j = 1:numel(rec{1}.keys)
275 myKeys(scenSymbol.dimension + j) = s{1}.key(j);
277 r = param.addRecord(myKeys);
278 r.value = rec{1}.marginal;