导入java.io.PrintWriter;导入java.math。BigDecimal;导入java.math。大整数;导入java.util。数组列表;导入java.util。哈希映射;导入java.util。地图。进入;导入de.uni_freiburg.informatik.ultimate.logic。ApplicationTerm;导入de.uni_freiburg.informatik.ultimate.logic。常数项;导入de.uni_freiburg.informatik.ultimate.logic。NoopScript;导入de.uni_freiburg.informatik.ultimate.logic。理性;导入de.uni_freiburg.informik.ultimate.logic。SMTLIB异常;导入de.uni_freiburg.informatik.ultimate.logic。排序;导入de.uni_freiburg.informatik.ultimate.logic。期限;导入de.uni_freiburg.informatik.ultimate.smtinterpol。配置;公共类LraSolver扩展了NoopScript{数组列表basics=新ArrayList();数组列表nonBasics=空;哈希图bs=新HashMap();有理[][]选项卡;有理[]基本值;有理[]非基本值;整数varNr=0;哈希图variableOrdering=新HashMap();字符串helpVarId=“%%y”//不能作为SMTLIB文件中的变量名(部分)出现数组列表tableau=新数组列表();@覆盖public void declareFun(String fun,Sort[]paramSorts,Sort resultSort)引发SMTLIBException{断言resultSort.toString().equals(“Real”)&&paramSorts.length==0;variableOrdering.put(fun,varNr++);super.declareFun(fun,paramSorts,resultSort);}@覆盖公共LBool assertTerm(术语术语)引发SMTLIBException{if(nonBasics==null){nonBasics=新ArrayList(variableOrdering.size());for(int i=0;i<variableOrdering.size();i++){nonBasics.add(“”);}for(条目en:variableOrdering.entrySet()){nonBasics.set(en.getValue(),en.getKey());}}断言ApplicationTerm&&的术语实例((ApplicationTerm)term).getParameters().length==2;ApplicationTerm at=(ApplicationTerm)期限;在.getFunction()处断言.getName()==“<=”;在ApplicationTerm的.getParameters()[0]实例上断言;Rational[]tableauLine=新Rational[nonBasics.size()];BoundConstr bound=readLeqTerm((ApplicationTerm),位于.getParameters()[0],位于.getParameters[1]);字符串newY=helpVarId+basics.size();variableOrdering.put(newY,varNr++);basics.add(newY);for(int i=0;i<bound.linearTerm.coefficients.size();i++){tableauLine[variableOrdering.get(bound.linearTerm.variables.get(i))]=bound.linearTerm.coefficients.get(i);}tableau.add(tableauLine);bs.put(newY,bound.bound);return super.assertTerm(term);}private BoundConstr readLeqTerm(ApplicationTerm linTerm,Term常量){后LinearTerm=新LinearTerm();if(linTerm.getParameters().length==0){aft.addSummand(Rational.ONE,linTerm.toString());}else if(linTerm.getFunction().getName()==“-”&&linTerm.getParameters().length==1){aft.addSummand(Rational.MONE,linTerm.getParameters()[0].toString());}else if(linTerm.getFunction().getName()==“+”){for(术语汇总:linTerm.getParameters()){if(ApplicationTerm的summand实例){ApplicationTerm smnd=(ApplicationTerm)总和;if(smnd.getFunction().getName()==“*”&&smnd.getParameters().length==2&&(((ApplicationTerm)smnd.getParameters()[1]).getParumenters().length==0){aft.addSummand(readRationalFromTerm(smnd.getParameters()[0]),smnd.getParameters[1].toString());}否则如果(smnd.getFunction().getName()==“-”&&smnd.getParameters().length==1&&smnd.getParameters()[0]ApplicationTerm&&实例(((ApplicationTerm)smnd.getParameters()[0]).getParumenters().length==0){aft.addSummand(Rational.MONE,smnd.getParameters()[0].toString());}else if(smnd.getParameters().length==0){aft.addSummand(Rational.ONE,smnd.toString());}其他断言错误;}其他断言错误;}}其他{断言错误;}return new BoundConstr(aft,readRationalFromTerm(常量));}私有Rational readRationalFromTerm(术语){理性回报=理性。零;if(ConstantTerm的术语实例){对象值=((ConstantTerm)term).getValue();if(Rational的值实例)toReturn=(有理)((ConstantTerm)term).getValue();else if(BigInteger的值实例)toReturn=理性。ONE.mul((BigInteger)值);else if(BigDecimal的值实例)toReturn=理性。ONE.mul(((BigDecimal)值).unsaledValue()).div(Rational.ONE.mul(BigInteger.TEN.pow((BigDecimal)值).scale()));其他的断言错误;}else if(术语ApplicationTerm实例){ApplicationTerm aterm=(ApplicationTerm)术语;字符串func=aterm.getFunction().getName();if(函数等于(“+”))for(术语t:aterm.getParameters())toReturn=toReturn.add(readRationalFromTerm(t));else if(函数等于(“-”))for(术语t:aterm.getParameters())toReturn=toReturn.sub(readRationalFromTerm(t));其他断言错误;}其他{断言错误;}返回到return;}@覆盖公共LBool checkSat(){//LBool是返回类型//使用//L工具。//L工具。联合国卫星电视台//在他们明显的意义上int n=nonBasics.size();int m=basics.size();String[]nba=新字符串[n];String[]ba=新字符串[m];nonBasics.toArray(nba);basis.toArray(ba);tab=新有理数[m][n];for(int i=0;i<m;i++)对于(int j=0;j<n;j++)tab[i][j]=tableau.get(i)[j]==空?理性。零:tableau.get(i)[j];nonBasicValues=新有理数[n];for(int i=0;i<n;i++)nonBasicValues[i]=有理。归零;basicValues=新有理数[m];for(int i=0;i<m;i++)basicValues[i]=有理。归零;//此时,约束中的所有值//存储在初始表格“选项卡”中//阵列列表“nonBasics”/“basics”包含变量名//每列/每行//对于它们的值,有数组(非)BasicValues//HashMap“bs”包含每个初始基本变量的界限//在矩阵中(即课堂符号中的对(yi,bi))//所有这些数据结构都是为了您的方便,您可以更改它们//如果你不喜欢他们//注意:如果您在执行中遇到断言错误,smt2文件可能包含//一些无法(尚未)解析的语法->要么坚持给定的语法,要么只添加//上述代码中的案例。//TODO:添加决策过程return LBool(返回LBool)。未知;}私有布尔值isInitiallyBasic(字符串变量){if(var.startsWith(helpVarId))返回true;其他的返回false;}公共字符串printTableau(ArrayList表格){StringBuilder to Return=新的StringBuilders();for(Rational[]行:tableau){for(int i=0;i<line.length;i++){toReturn.append(第[i]+行“\t”);}toReturn.append(“\n”);}返回到return.toString();}公共字符串printTableau(Rational[][]tableau){StringBuilder to Return=新的StringBuilders();for(int i=0;i<tableau.length;i++){有理[]线=表[i];对于(int j=0;j<line.length;j++){toReturn.append(/*trimRational(*/line[j]+“\t”);}toReturn.append(“\n”);}返回到return.toString();}public String printArray(Rational[]数组){StringBuilder sb=new StringBuilders();for(int i=0;i<array.length;i++){sb.append(数组[i]+“”);}将某人返回字符串();}类LinearTerm{数组列表系数=新的ArrayList();数组列表变量=新ArrayList();公共LinearTerm(){}public void addSummand(有理系数,字符串变量){系数。添加(系数);variables.add(变量);}公共字符串toString(){字符串返回=“”;for(int i=0;i<系数.size();i++){toReturn+=系数.get(i)+“*”+变量.get(i)+“”;}返回到return;}}类BoundConstr{线性项线性项;理性界限;public BoundConstr(线性项仿射项,有理边界){super();this.linearTerm=仿射项;this.bound=绑定;}}}