package edu.isi.karma.cleaning; import java.util.Vector; public class Section implements GrammarTreeNode { public Position[] pair; public static int time_limit = 10; public Vector<int[]> rules = new Vector<int[]>(); public int rule_cxt_size = Segment.cxtsize_limit; public int curState = 0; public boolean isinloop = false; public Vector<String> orgStrings = new Vector<String>(); public Vector<String> tarStrings = new Vector<String>(); public static Interpretor itInterpretor = null; public static int supermode = 0; public Section(Position[] p,Vector<String> orgStrings,Vector<String> tarStrings,boolean isinloop) { pair = p; this.orgStrings = orgStrings; this.tarStrings = tarStrings; if(itInterpretor==null) itInterpretor = new Interpretor(); if(supermode == 0) this.createTotalOrderVector(); else { this.reiniteRules(); } this.isinloop = isinloop; } public String verifySpace() { String rule = ""; this.pair[0].isinloop = this.isinloop; this.pair[1].isinloop = this.isinloop; long sec_time_limit = System.currentTimeMillis(); while(curState < this.rules.size()) { if((System.currentTimeMillis()-sec_time_limit)/1000 > time_limit*1.0/5) { return "null"; } String rule1 = this.pair[0].VerifySpace(rules.get(curState)[0]); String rule2 = this.pair[1].VerifySpace(rules.get(curState)[1]); curState ++; if (rule1.indexOf("null") == -1 && rule2.indexOf("null") == -1) { rule = String.format("substr(value,%s,%s)", rule1, rule2); return rule; } if(rule1.indexOf("null") != -1 && rule2.indexOf("null")!= -1) { break; } } return "null"; } @Override public String toProgram() { // TODO Auto-generated method stub return null; } @Override public GrammarTreeNode mergewith(GrammarTreeNode a) { Section sec = (Section)a; Position x = this.pair[0].mergewith(sec.pair[0]); Position y = this.pair[1].mergewith(sec.pair[1]); if(x== null || y == null) return null; else { Position[] pa = {x,y}; boolean loop = this.isinloop || sec.isinloop; Vector<String> strs = new Vector<String>(); Vector<String> tars = new Vector<String>(); if(this.orgStrings.size() == sec.orgStrings.size() && this.orgStrings.size() == 1 && this.orgStrings.get(0).compareTo(sec.orgStrings.get(0))==0) { // merge within one example. test the loop expression // strs.addAll(this.orgStrings); tars.add(this.tarStrings.get(0)+sec.tarStrings.get(0)); loop = true; } else { strs.addAll(this.orgStrings); strs.addAll(sec.orgStrings); tars.addAll(this.tarStrings); tars.addAll(sec.tarStrings); } Section st = new Section(pa,strs,tars,loop); return st; } } @Override public String getNodeType() { return "section"; } @Override public double getScore() { // TODO Auto-generated method stub return this.pair[0].getScore()+this.pair[1].getScore(); } @Override public String getrepString() { // TODO Auto-generated method stub return pair[0].getrepString()+pair[1].getrepString(); } @Override public void createTotalOrderVector() { for(int i = 0; i< pair[0].rules.size(); i++) { for(int j = 0; j< pair[1].rules.size(); j++) { int[] elem = {i,j}; rules.add(elem); } } } public void reiniteRules() { Vector<Long> indexs = new Vector<Long>(); indexs.add((long)16); indexs.add((long)16); Vector<Vector<Integer>> configs = new Vector<Vector<Integer>>(); rules.clear(); getCrossIndex(indexs, 0, "", configs); for(int i = 0; i<configs.size(); i++) { int[] elem = {configs.get(i).get(0),configs.get(i).get(1)}; rules.add(elem); } } public void getCrossIndex(Vector<Long> indexs, int cur, String path, Vector<Vector<Integer>> configs) { String tpath = path; if (cur >= indexs.size()) { String[] elems = tpath.split(","); Vector<Integer> line = new Vector<Integer>(); for (String s : elems) { String x = s.trim(); if (x.length() > 0) { line.add(Integer.parseInt(x)); } } if (line.size() > 0) { configs.add(line); } return; } for (int i = 0; i < indexs.get(cur); i++) { String xtpath = path + i + ","; getCrossIndex(indexs, cur + 1, xtpath, configs); } } @Override public void emptyState() { this.curState = 0; } public String getRule(long index) { if(index > this.rules.size()) return "null"; String rule = ""; int[] loc = this.rules.get(((int)index)); pair[0].isinloop = this.isinloop; pair[1].isinloop = this.isinloop; rule = String.format("substr(value,%s,%s)",pair[0].getRule(loc[0]),pair[1].getRule(loc[1])); return rule; } @Override public long size() { return pair[0].rules.size()*pair[1].rules.size(); } public String toString() { String lp = ""; String rp = ""; if(pair[0]!=null) { lp = pair[0].toString(); } if(pair[1]!=null) { rp = pair[1].toString(); } return lp+rp; } }