AAuto 언어와 AMPL 표 데이터 통신 인터페이스 및 AAuto 언어는 AMPL 코드 함수를 실행합니다

2737 단어
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('
') 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('
') for i=2;#kd;2 file.write(kd[i][j],' ') } file.write('
') file.close() } runamplcode=function(modstr){ var str=..string.replace(modstr,'#.*?[
\r]',''); str=..string.replace(str,'[\r
]',''); 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는 빠른 프로젝트의 현재 디렉터리에 있습니다.

좋은 웹페이지 즐겨찾기