AAuto语言与AMPL表数据通信接口及AAuto语言执行AMPL代码函数

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到快手工程的当前目录下。

你可能感兴趣的:(AAuto语言与AMPL表数据通信接口及AAuto语言执行AMPL代码函数)