ampl名字空间AAuto代码:
namespace ampl readtbl=function(tblname){ var file=assert(..io.open(tblname++".tab","r")) //读第一行 var str=file.read() assert(str!="","空文件") var ss=..string.split(str,'\t ') assert(ss[1]=="ampl.tab","不是ampl表文件") var nkey=tonumber(ss[2]) var ndata=tonumber(ss[3]) //读第二行 str=file.read() var kdname=..string.split(str,'\t ') //读数据 var kdval={key={};data={}} for i=1;nkey+ndata if i<=nkey kdval.key[kdname[i]]={} else kdval.data[kdname[i]]={} str=file.read() var pos=0 while(str!=null){ ss=..string.split(str,'\t ') pos++ for i=1;nkey kdval.key[kdname[i]][pos]=ss[i] for i=nkey+1;nkey+ndata kdval.data[kdname[i]][pos]=tonumber(ss[i]) str=file.read() } file.close() return kdval } writetbl=function(tblname,kd){ if tblname=='' return null if #kd%2!=0 return null var nkey=0 for i=1;#kd;2{ if kd[i][#kd[i]]=='_'# nkey++ else break } var rownum for i=2;#kd;2 if rownum==null rownum=#kd[i] elseif rownum!=#kd[i] return null if nkey==0 return null var file=assert(..io.open(tblname++".tab","w")) //写第一行 file.write("ampl.tab ",nkey," ",#kd/2-nkey) //写第二行 file.write('\n') for i=1;#kd;2 if kd[i][#kd[i]]=='_'# file.write(..string.sub(kd[i],1,#kd[i]-1),' ') for i=1+2*nkey;#kd;2 file.write(kd[i],' ') //写数据 for j=1;rownum{ file.write('\n') for i=2;#kd;2 file.write(kd[i][j],' ') } file.write('\n') file.close() } runamplcode=function(modstr){ var str=..string.replace(modstr,'#.*?[\n\r]',''); str=..string.replace(str,'[\r\n]',''); str=..string.replace(str,'"','""') outmod=assert(..io.exist("outmodstr.exe"),'outmodstr.exe不存在') execute(outmod++' "'++str++'" | ampl') }
import ampl io.open() x={} ind={} n=5000 for i=1;n{ x[i]=i ind[i]=i } ampl.writetbl("ex1",{"i_";ind;"x";x}) modstr=/* set S; param x{S}; table ex1 IN: S<-[i], x; read table ex1; table ex2 OUT: {1..1}->[i],(sum{j in S}x[j])~re; write table ex2; */ ampl.runamplcode(modstr) re=ampl.readtbl("ex2") io.print(re.data.re[1]) execute("pause") io.close()