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')
}
示例AAuto代码:
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()
要求你已经安装了 AMPL和 快手系统,并下载 outmodstr.exe到快手工程的当前目录下。