// Read a Linear Program from XML File import java.io.*; import java.net.*; import java.util.*; import mit16_410_13.*; class LPXMLReader { Simplex lprogram; LPXMLReader () { lprogram=null; } public Simplex readLP (String path) { XMLStream strm; FileInputStream istrm=null; try { LinkedList vars=null; String name=null; String inequality=null; double value=0.0; boolean maximizeprocessed=false; int constraintsprocessed=0; int processing=0; // 0= nothing, 1=Maximize, 2=Constraint boolean inlpproblem=false; istrm=new FileInputStream(path); strm=new XMLStream(istrm, System.out); System.out.println("Reading from "+path); String txt=strm.readText(); // Read any preceding text for (XMLTag atag=strm.readNextTag(); atag!=null; atag=strm.readNextTag()) { String tagid=atag.getTagID(); if (tagid.equals("LPPROBLEM")) { if (inlpproblem) System.out.println("Nested LPPROBLEM not allowed\n"); inlpproblem=true; lprogram=new Simplex(); // instantiate the problem } else if (tagid.equals("/LPPROBLEM")) { if (inlpproblem) inlpproblem=false; else System.out.println("/LPPROBLEM not in an LPPROBLEM"); } else if (tagid.equals("MAXIMIZE")) { if (!inlpproblem) { System.out.println("MAXIMIZE not in an LPPROBLEM"); inlpproblem=true; // recover } if (processing==1) { System.out.println("Nested MAXIMIZE not allowed"); } processing=1; // processing a maximize. name=atag.getAttribute("name"); inequality=atag.getAttribute("inequality"); //double y=new Double(atag.getAttribute("y")).doubleValue(); vars=new LinkedList(); } else if (tagid.equals("/MAXIMIZE")) { lprogram.addObjectiveFunction(name, vars); name=null; vars=null; processing=0; } else if (tagid.equals("CONSTRAINT")) { if (!inlpproblem) { System.out.println("CONSTRAINT not embedded in a LPPROBLEM\n"); } else { inequality=atag.getAttribute("inequality"); value=new Double(atag.getAttribute("value")).doubleValue(); vars=new LinkedList(); processing=2; // Processing a constraint. } } else if (tagid.equals("/CONSTRAINT")) { if (processing!=2) System.out.println("/CONSTRAINT not in a CONSTRAINT"); else if (!inlpproblem) System.out.println("/CONSTRAINT not in an LPPROBLEM"); else { lprogram.addConstraint(inequality, value, vars); processing=0; vars=null; inequality=null; } } else if (tagid.equals("VARIABLE")) { vars.add(new Variable(atag.getAttribute("name"), new Double(atag.getAttribute("coefficient")).doubleValue())); } else if (tagid.equals("/VARIABLE")) { } else { System.out.println("Unknown Tag: "); atag.writeTag(strm); } txt=strm.readText(); } } catch (Exception e) { System.out.println("Exception: "+e.toString()); } finally { try { if (istrm!=null) istrm.close(); } catch (Exception e) {} } return lprogram; } } // Fin