Dear all,
I am trying to import data from MATLAB to GAMS. the sets and parameters result from a heuristic algorithm that I can not manipulate the values. Consider I have a set i as follows /10,5,2,9/. I need to define this set and some parameters on this set. bet the parameters which are defined on this set are not imported correctly. the values are zero. but when I use $LOADDC in GAMS, I get this error: (649) Error violation when loading from GDX file.
Therefore I redefine set i which includes ordered numbers as /1,2,3,4/. in this situation, the parameters are imported correctly. but this is not ideal for me and I need to define sets in the order which is resulted from the heuristic algorithm and define parameters base on that order.
I appreciate it if someone can help me.
Thanks and regards,
Bahar
There are different ways to deal with this ordering issue:
- Have a two dimensional set instead of a one dimensional set to preserve the order:
set i / 1*100/; alias (i,j);
set order(i,j) / 1.10,2.5,3.2,4.9/;
* iterate through i in user order:
loop(order(i,j), put_utility 'log' / j.tl);
- Rely on the order specified in the GDX file (you can’t specify the set i in other ways inside GAMS):
set i; set order(i<);
$gdxin fromMatlab
$loadDC order
-Michael
Thanks for your respone.
How should I use the second approach?
When I add the set order(i<), I get errors 10,185,492,649.
Bahar,
It would be helpful for you to post a short piece of Matlab code that produces the GDX file that is giving you problems. And send also the GDX file, and a short .gms file that reads the data from GDX. With all this, you will perhaps solve your own problem. If not, you’ll get some good help.
-Steve
Thanks for your reply.
This is my code in MATLAB:
Ps.name=‘p’;
Ps.type=‘set’;
Ps.val=[1:84]';
Ps.dim=1;
Is.name=‘i’;
Is.type=‘set’;
Is.val=[1;9;6;15];
Is.dim=1;
P8s.name=‘zb’;
P8s.type=‘parameter’;
P8s.form=‘full’;
P8s.val=[0 1 0 0;0 0 1 0;0 0 0 1;0 0 0 0];
P8s.dim=2;
wgdx(‘data1’,Ps,Is,P8s);
- and the following is my code in GAMS:
$GDXIN ‘data1’
SETS
k/1/
p
i;
alias (i,j);
$LOADDC i,p
PARAMETERS
zb(i,j);
$LOADDC zb
$GDXIN ‘data1’
display i,p,zb;
data1.gdx (984 Bytes)
And the gdx file is attached.
Since you unload ps first the label order is fixed to 1,2,3,4… and hence the order in i (1;9;6;15) has no consequence to the order in the GDX file not in GAMS. So my second “solution” won’t work (and you seem to work with an old GAMS system that does not have this capability anyway). You would have to implement my first suggestion and make i a 2-dim set.
-Michael