# HG changeset patch # User kono # Date 1223772197 -32400 # Node ID f9fa876d3539470f69f70f91f4fb63e402bbcc16 # Parent ddfc786811b946da82df59e5ddc161162a6e32a1 Optimizer test diff -r ddfc786811b9 -r f9fa876d3539 rep/optimizers/DeleteInsertOptimizer.java --- a/rep/optimizers/DeleteInsertOptimizer.java Sun Oct 12 04:23:57 2008 +0900 +++ b/rep/optimizers/DeleteInsertOptimizer.java Sun Oct 12 09:43:17 2008 +0900 @@ -11,13 +11,14 @@ * @author Takano * */ -public class DeleteInsertOptimizer extends REPCommandOptimizer { +public class DeleteInsertOptimizer implements REPCommandOptimizer { - // optimize メソッドから呼ばれます - protected List optimize0(List inp){ - List output; - output = reverse(inp); - + public List optimize(List cmdlist){ + List output = new LinkedList(); + for (REPCommand cmd: cmdlist){ + if (cmd.cmd==REP.REPCMD_NOP) continue; + output.add(0,new REPCommand(cmd)); + } for(int i = 0; i < output.size(); i++){ REPCommand r = output.get(i); switch(r.cmd){ @@ -28,17 +29,11 @@ break; } } - return reverse(output); + java.util.Collections.reverse(output); + return output; } - - private List reverse(List outp) { - LinkedList reverse = new LinkedList(); - for(REPCommand r : outp){ - reverse.addFirst(r); - } - return reverse; - } + private void optimizedAdd(List output, REPCommand r, int ln) { int lineno = r.lineno; int minln = output.size(); @@ -61,6 +56,8 @@ if(s.lineno < lineno){ lineno ++; } + }else if(s.cmd==REP.REPCMD_NOP){ + output.remove(s); }else{ System.out.println("There are no such commands."); } diff -r ddfc786811b9 -r f9fa876d3539 rep/optimizers/NullOptimizer.java --- a/rep/optimizers/NullOptimizer.java Sun Oct 12 04:23:57 2008 +0900 +++ b/rep/optimizers/NullOptimizer.java Sun Oct 12 09:43:17 2008 +0900 @@ -4,9 +4,9 @@ import rep.REPCommand; -public class NullOptimizer extends REPCommandOptimizer { +public class NullOptimizer implements REPCommandOptimizer { - protected List optimize0(List cmdlist){ + public List optimize(List cmdlist){ return cmdlist; } diff -r ddfc786811b9 -r f9fa876d3539 rep/optimizers/REPCommandOptimizer.java --- a/rep/optimizers/REPCommandOptimizer.java Sun Oct 12 04:23:57 2008 +0900 +++ b/rep/optimizers/REPCommandOptimizer.java Sun Oct 12 09:43:17 2008 +0900 @@ -1,11 +1,9 @@ package rep.optimizers; -import java.util.LinkedList; import java.util.List; - import rep.REPCommand; -public abstract class REPCommandOptimizer { +public interface REPCommandOptimizer { // なんで、Interfaceじゃないの? // Interface じゃないせいで、NullOptimizer でも余計なコピーが生じている。 @@ -16,16 +14,16 @@ // final だとoverride できないので、このコピーを外すことは誰にも出来なくなって // しまう。kono - public final List optimize(List cmdlist){ - List copied = new LinkedList(); - for (REPCommand cmd: cmdlist){ - // ちゃんと new しないといけません! - copied.add(new REPCommand(cmd)); - } - return optimize0(copied); - } +// public final List optimize(List cmdlist){ +// List copied = new LinkedList(); +// for (REPCommand cmd: cmdlist){ +// // ちゃんと new しないといけません! +// copied.add(new REPCommand(cmd)); +// } +// return optimize0(copied); +// } // 継承したクラスでこれを実装してください 直接cmdlistを返すのもあり. - abstract protected List optimize0(List cmdlist); + public List optimize(List cmdlist); } diff -r ddfc786811b9 -r f9fa876d3539 test/RepCommandOptimizeTest.java --- a/test/RepCommandOptimizeTest.java Sun Oct 12 04:23:57 2008 +0900 +++ b/test/RepCommandOptimizeTest.java Sun Oct 12 09:43:17 2008 +0900 @@ -23,15 +23,18 @@ Integer.toString(REP.REPCMD_DELETE.id),"d","1","7", Integer.toString(REP.REPCMD_INSERT.id),"A","5","8", Integer.toString(REP.REPCMD_DELETE.id),"d","1","9", - Integer.toString(REP.REPCMD_DELETE.id),"d","1","10", + Integer.toString(REP.REPCMD_DELETE.id),"d","0","10", Integer.toString(REP.REPCMD_INSERT.id),"B","10","11", - Integer.toString(REP.REPCMD_INSERT.id),"B","1","12", Integer.toString(REP.REPCMD_INSERT.id),"C","3","13", Integer.toString(REP.REPCMD_DELETE.id),"d","2","14", + Integer.toString(REP.REPCMD_DELETE.id),"d","0","14", Integer.toString(REP.REPCMD_DELETE.id),"d","3","15", Integer.toString(REP.REPCMD_DELETE.id),"d","1","16", - Integer.toString(REP.REPCMD_INSERT.id),"A","3","17", - Integer.toString(REP.REPCMD_DELETE.id),"d","1","18" + Integer.toString(REP.REPCMD_INSERT.id),"A","0","17", + Integer.toString(REP.REPCMD_INSERT.id),"K","0","17", + Integer.toString(REP.REPCMD_DELETE.id),"d","1","18", + Integer.toString(REP.REPCMD_NOP.id),"","0","19", + Integer.toString(REP.REPCMD_NOP.id),"","0","20", }; static private String[] text1d = { @@ -48,7 +51,9 @@ "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrr", "sss", "ttt", "uuu", "vvv", "www", "xxx", "yyy", "zzz" - }; + }; + + private static int err=0; public static List makeCommandList(String[] str){ int seq = 0; @@ -86,41 +91,63 @@ if (true) rco = new DeleteInsertOptimizer(); // else rco = new NullOptimizer(); // なにも最適化しない - List result = new LinkedList(); List cmdlist; - Text text1 = new Text(text1d); - Text text2 = new Text(text2d); cmdlist = makeCommandList(test1); - java.util.Collections.shuffle(cmdlist); - + int total = 0; + while(cmdlist.size()>0) { + Text text1 = new Text(text1d); + Text text2 = new Text(text2d); + java.util.Collections.shuffle(cmdlist); + test(rco, cmdlist, text1, text2); + total++; + cmdlist.remove(0); + } + System.out.println("Errors "+err+"/"+total+"."); + + } + + + private static void test(REPCommandOptimizer rco, List cmdlist, + Text text1, Text text2) { + List result; // optimize + // this command list is applied to a text. and print the text. + text1.edit(cmdlist); + result = rco.optimize(cmdlist); + // this command list applied to other text, and print it. + text2.edit(result); + // check two texts. + if(!text1.equals(text2)){ + System.out.println("two texts not match"); + print(cmdlist, result, text1, text2); + err++; + } + } + + private static void print(List cmdlist, + List result, + Text text1, Text text2) { + // print non optimized command list System.out.println("---------- CmdList before optimized ----------"); printCmdList(cmdlist); - // this command list is applied to a text. and print the text. - text1.edit(cmdlist); - System.out.println("---text which applied above commands---"); - printText(text1); - - // optimize - result = rco.optimize(cmdlist); - // print optimized command list. System.out.println("---------- CmdList after optimized ----------"); printCmdList(result); - // this command list applied to other text, and print it. - text2.edit(result); - System.out.println("---text which applied above commands---"); - printText(text1); + System.out.println("---------- Text difference ------------------"); + int max = max(text1.size(),text2.size()); + for(int i=0;isize2?size:size2; + } } -} + \ No newline at end of file