changeset 331:f9fa876d3539

Optimizer test
author kono
date Sun, 12 Oct 2008 09:43:17 +0900
parents ddfc786811b9
children 36faf76a087c
files rep/optimizers/DeleteInsertOptimizer.java rep/optimizers/NullOptimizer.java rep/optimizers/REPCommandOptimizer.java test/RepCommandOptimizeTest.java
diffstat 4 files changed, 80 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- 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<REPCommand> optimize0(List<REPCommand> inp){
-		List<REPCommand> output;
-		output = reverse(inp);
-		
+	public List<REPCommand> optimize(List<REPCommand> cmdlist){
+		List<REPCommand> output = new LinkedList<REPCommand>();
+		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<REPCommand> reverse(List<REPCommand> outp) {
-		LinkedList<REPCommand> reverse = new LinkedList<REPCommand>();
-		for(REPCommand r : outp){
-			reverse.addFirst(r);
-		}
-		return reverse;
-	}
+
 	private void optimizedAdd(List<REPCommand> 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.");
 			}
--- 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<REPCommand> optimize0(List<REPCommand> cmdlist){
+	public List<REPCommand> optimize(List<REPCommand> cmdlist){
 		return cmdlist;
 	}
 
--- 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<REPCommand> optimize(List<REPCommand> cmdlist){
-		List<REPCommand> copied = new LinkedList<REPCommand>();
-		for (REPCommand cmd: cmdlist){
-			// ちゃんと new しないといけません!
-			copied.add(new REPCommand(cmd));
-		}
-		return optimize0(copied);
-	}
+//	public final List<REPCommand> optimize(List<REPCommand> cmdlist){
+//		List<REPCommand> copied = new LinkedList<REPCommand>();
+//		for (REPCommand cmd: cmdlist){
+//			// ちゃんと new しないといけません!
+//			copied.add(new REPCommand(cmd));
+//		}
+//		return optimize0(copied);
+//	}
 
 	// 継承したクラスでこれを実装してください 直接cmdlistを返すのもあり.
-	abstract protected List<REPCommand> optimize0(List<REPCommand> cmdlist);
+	public List<REPCommand> optimize(List<REPCommand> cmdlist);
 
 }
--- 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<REPCommand> makeCommandList(String[] str){
 		int seq = 0;
@@ -86,41 +91,63 @@
 		if (true)  rco = new DeleteInsertOptimizer();  //
 		else       rco = new NullOptimizer();  // なにも最適化しない
 
-		List<REPCommand> result = new LinkedList<REPCommand>();
 		List<REPCommand> 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<REPCommand> cmdlist,
+			Text text1, Text text2) {
+		List<REPCommand> 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<REPCommand> cmdlist,
+				List<REPCommand> 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;i<max;i++) {
+			System.out.println(i+":\t"+text1.get(i)+"\t"+text2.get(i));
+		}
+	}
 
-		// check two texts.
-		if(text1.equals(text2)){
-			System.out.println("two texts match.");
-		}else{
-			System.out.println("two texts not match");
-		}
+
+
+	private static int max(int size, int size2) {
+		return size>size2?size:size2;
+	}
 
 	}
-}
+	
\ No newline at end of file