• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Testcase generation tool for combinatorial interaction testing


Commit MetaInfo

Revision52f55c273aad45c38fc6812416d95c7028da6c2f (tree)
Time2015-05-25 19:02:21
Authort-tutiya <tatsuhiro@ieee...>
Commitert-tutiya

Log Message

Merge Japanese and English versions
Change licence from BSD to zlib
Reflect missing updates made in Jar files of v1.01 but lost in source
files

Change Summary

Incremental Difference

--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,11 +1,12 @@
11 eclipse.preferences.version=1
22 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
3+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
4+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
45 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
5-org.eclipse.jdt.core.compiler.compliance=1.7
6+org.eclipse.jdt.core.compiler.compliance=1.6
67 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
78 org.eclipse.jdt.core.compiler.debug.localVariable=generate
89 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
910 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
1011 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
11-org.eclipse.jdt.core.compiler.source=1.7
12+org.eclipse.jdt.core.compiler.source=1.6
--- a/src/v1/ConstraintHandler.java
+++ b/src/v1/ConstraintHandler.java
@@ -7,24 +7,24 @@ import java.util.ArrayList;
77 import java.util.List;
88
99 class ConstraintHandler {
10- static final int sizeOfNodetable = 1000;
11- static final int sizeOfCache = 1000;
12-
10+ static final int sizeOfNodetable = 10000;
11+ static final int sizeOfCache = 10000;
12+
1313 List<VariableAndBDD> parameters = null;
1414 BDD bdd;
1515 int bddConstraint;
1616 int numOfBDDvariables;
17-
17+
1818 ConstraintHandler(PList parameterList, List<Node> constraintList) {
1919 bdd = new BDD(sizeOfNodetable, sizeOfCache);
20- bdd = new jdd.bdd.debug.DebugBDD(1000,1000);
21-
22- //parameterのリスト
20+ // bdd = new jdd.bdd.debug.DebugBDD(1000,1000);
21+
22+ // parameterのリスト
2323 parameters = setBDDforParameter(parameterList);
24-
25- //contrainListから、ノードを呼ぶ
24+
25+ // contrainListから、ノードを呼ぶ
2626 bddConstraint = setBddConstraint(constraintList);
27-
27+
2828 // boolean 変数の総数を計算
2929 // numOfBooleanVariable = computeNumOfBooleanVariables
3030 }
@@ -32,35 +32,35 @@ class ConstraintHandler {
3232 void printConstraintBDD() {
3333 bdd.printSet(bddConstraint);
3434 }
35-
35+
3636 // 各パラメータにboolean変数を割り当て.総数も計算
3737 private List<VariableAndBDD> setBDDforParameter(PList parameterList) {
3838 List<VariableAndBDD> res = new ArrayList<VariableAndBDD>();
3939 this.numOfBDDvariables = 0;
40-
41- for (Parameter p: parameterList) {
40+
41+ for (Parameter p : parameterList) {
4242 // BDD変数の設定
4343 int num_vars = 1;
44- for (int levels = 2; ; levels *= 2) {
45- if (p.value_name.size() < levels)
44+ for (int levels = 2;; levels *= 2) {
45+ if (p.value_name.size() < levels)
4646 break;
4747 num_vars++;
48- }
48+ }
4949 // BDD変数の総数を計算
5050 numOfBDDvariables += num_vars;
51-
51+
5252 // boolean variables
5353 // 生成された順に getVar(v): 0, 1, 2, ..
5454 int[] var = new int[num_vars];
5555 for (int i = num_vars - 1; i >= 0; i--) {
5656 var[i] = bdd.createVar();
5757 }
58-
58+
5959 // 制約のBDDの設定
6060 // constraint for invalid values
6161 // domain-1以下の数字のみ有効
6262 // bool variables の数はdomain-1をあらわせるだけはある
63- //
63+ //
6464 // domain-1の2進表現では,最上位の変数にあたるビットは常に1
6565 // とは限らない
6666 int f = bdd.getZero();
@@ -68,36 +68,48 @@ class ConstraintHandler {
6868 // domain-1より小さい数
6969 for (int i = var.length - 1; i >= 0; i--) {
7070 if ((p.value_name.size() - 1 & (0x01 << i)) > 0) {
71- int g = bdd.getOne();
71+ int g = bdd.getOne();
7272 bdd.ref(g);
7373 for (int j = var.length - 1; j > i; j--) {
7474 if ((p.value_name.size() - 1 & (0x01 << j)) > 0) {
75- int tmp = bdd.ref(bdd.and(g, var[j])); bdd.deref(g); g = tmp;
75+ int tmp = bdd.ref(bdd.and(g, var[j]));
76+ bdd.deref(g);
77+ g = tmp;
7678 } else {
77- int tmp = bdd.ref(bdd.and(g, bdd.not(var[j]))); bdd.deref(g); g = tmp;
79+ int tmp = bdd.ref(bdd.and(g, bdd.not(var[j])));
80+ bdd.deref(g);
81+ g = tmp;
7882 }
7983 }
80- int tmp = bdd.ref(bdd.and(g, bdd.not(var[i]))); bdd.deref(g); g = tmp;
81- tmp = bdd.ref(bdd.or(f, g)); bdd.deref(g); f = tmp;
84+ int tmp = bdd.ref(bdd.and(g, bdd.not(var[i])));
85+ bdd.deref(g);
86+ g = tmp;
87+ tmp = bdd.ref(bdd.or(f, g));
88+ bdd.deref(g);
89+ f = tmp;
8290 }
8391 }
84-
92+
8593 // domain - 1自身
86- int g = bdd.getOne();
94+ int g = bdd.getOne();
8795 bdd.ref(g);
8896 for (int i = var.length - 1; i >= 0; i--) {
8997 if ((p.value_name.size() - 1 & (0x01 << i)) > 0) {
90- int tmp = bdd.ref(bdd.and(g, var[i])); bdd.deref(g); g = tmp;
98+ int tmp = bdd.ref(bdd.and(g, var[i]));
99+ bdd.deref(g);
100+ g = tmp;
91101 } else {
92- int tmp = bdd.ref(bdd.and(g, bdd.not(var[i]))); bdd.deref(g); g = tmp;
102+ int tmp = bdd.ref(bdd.and(g, bdd.not(var[i])));
103+ bdd.deref(g);
104+ g = tmp;
93105 }
94106 }
95-
107+
96108 int d = bdd.or(f, g);
97109 bdd.ref(d);
98110 bdd.deref(f);
99111 bdd.deref(g);
100-
112+
101113 // var, d を listに追加
102114 res.add(new VariableAndBDD(var, d));
103115 }
@@ -107,36 +119,43 @@ class ConstraintHandler {
107119 private int setBddConstraint(List<Node> constraintList) {
108120 int f = bdd.getOne();
109121 bdd.ref(f);
110-
122+
111123 // パラメータでつかわない領域をfalseにする
112124 for (VariableAndBDD vb : parameters) {
113- int tmp = bdd.ref(bdd.and(f, vb.constraint)); bdd.deref(f); f = tmp;
125+ int tmp = bdd.ref(bdd.and(f, vb.constraint));
126+ bdd.deref(f);
127+ f = tmp;
114128 }
115-
129+
116130 // 制約式の論理積をとる
117- for (Node n: constraintList) {
131+ for (Node n : constraintList) {
118132 int g = n.evaluate(bdd, parameters);
119- int tmp = bdd.ref(bdd.and(f, g)); bdd.deref(f); bdd.deref(g); f = tmp;
133+ int tmp = bdd.ref(bdd.and(f, g));
134+ bdd.deref(f);
135+ bdd.deref(g);
136+ f = tmp;
120137 }
121-
138+
122139 // *を付加
123140 f = extendBddConstraint(f);
124-
141+
125142 return f;
126143 }
127-
144+
128145 private int extendBddConstraint(int constraint) {
129146 int f = constraint;
130147 for (VariableAndBDD p : parameters) {
131148 int cube = p.var[0];
132149 bdd.ref(cube);
133150 for (int i = 1; i < p.var.length; i++) {
134- int tmp = bdd.ref(bdd.and(cube, p.var[i])); bdd.deref(cube); cube = tmp;
151+ int tmp = bdd.ref(bdd.and(cube, p.var[i]));
152+ bdd.deref(cube);
153+ cube = tmp;
135154 }
136155 int tmp0 = bdd.ref(bdd.exists(f, cube));
137156 int tmp = bdd.ref(bdd.and(tmp0, cube));
138157 int newf = bdd.ref(bdd.or(f, tmp));
139-
158+
140159 bdd.deref(cube);
141160 bdd.deref(tmp0);
142161 bdd.deref(tmp);
@@ -145,29 +164,31 @@ class ConstraintHandler {
145164 }
146165 return f;
147166 }
148-
167+
149168 // テストケースが制約を満たすか
150- boolean isPossible (Testcase test) {
169+ boolean isPossible(Testcase test) {
151170 int node = bddConstraint;
152171 boolean[] bv = binarize(test);
153-
172+
154173 while (true) {
155174 // 恒真,恒偽
156- if (node == 0) return false;
157- else if (node == 1) return true;
175+ if (node == 0)
176+ return false;
177+ else if (node == 1)
178+ return true;
158179
159180 // このposの0, 1はノードなし
160- if (bv[bdd.getVar(node)] == true)
181+ if (bv[bdd.getVar(node)] == true)
161182 node = bdd.getHigh(node);
162183 else
163184 node = bdd.getLow(node);
164185 }
165186 }
166-
187+
167188 private boolean[] binarize(Testcase test) {
168- // assert(testcaseの長さ = parameterの数)
189+ // assert(testcaseの長さ = parameterの数)
169190 boolean[] res = new boolean[numOfBDDvariables];
170- int pos = 0;
191+ int pos = 0;
171192 // 各因子の値を2値で表現
172193 for (int i = 0; i < test.value.length; i++) {
173194 VariableAndBDD p = parameters.get(i);
@@ -177,21 +198,20 @@ class ConstraintHandler {
177198 res[pos + j] = true;
178199 } else {
179200 int j0 = 0;
180- for (int j = p.var.length -1 ; j >= 0; j--) {
181- if ((lv & (0x01 << j)) > 0)
182- res[pos + j0]= true;
183- else res[pos + j0] = false;
201+ for (int j = p.var.length - 1; j >= 0; j--) {
202+ if ((lv & (0x01 << j)) > 0)
203+ res[pos + j0] = true;
204+ else
205+ res[pos + j0] = false;
184206 j0++;
185207 }
186208 }
187209 pos += p.var.length;
188210 }
189211 /*
190- this.print();
191- for (int k = 0; k < res.length; k++)
192- System.out.print(res[k] ? 1 : 0);
193- System.out.println("<-");
194- */
212+ * this.print(); for (int k = 0; k < res.length; k++)
213+ * System.out.print(res[k] ? 1 : 0); System.out.println("<-");
214+ */
195215 return res;
196216 }
197217 }
--- a/src/v1/Error.java
+++ b/src/v1/Error.java
@@ -6,14 +6,14 @@ import java.io.IOException;
66 import java.io.OutputStreamWriter;
77
88 public class Error {
9-
9+
1010 // default でエラーは標準出力
1111 static String filename = null;
1212
1313 static void setOutputFile(String filename) {
1414 Error.filename = filename;
1515 }
16-
16+
1717 static void printError(String str) {
1818 BufferedWriter writer;
1919 try {
@@ -24,7 +24,9 @@ public class Error {
2424 writer.write("#ERROR," + str + "\n");
2525 writer.close();
2626 } catch (IOException e) {
27- System.err.print("出力ファイル" + filename + "が作成できません.");
27+ System.err.print(Main.language == Main.Language.JP ? "出力ファイル"
28+ + filename + "が作成できません." : "Output file " + filename
29+ + " could not be created.");
2830 }
2931 System.exit(1);
3032 }
--- a/src/v1/Generator.java
+++ b/src/v1/Generator.java
@@ -7,23 +7,27 @@ import java.util.Random;
77 class GeneratorFactor {
88
99 // requires parametermodel.size >= 2
10- static Generator newGenerator(ParameterModel parametermodel, GList groupList, ConstraintHandler constrainthandler,
11- List<Testcase> seed,
12- long randomseed, int strength) {
10+ static Generator newGenerator(ParameterModel parametermodel,
11+ GList groupList, ConstraintHandler constrainthandler,
12+ List<Testcase> seed, long randomseed, int strength) {
1313 if (strength > parametermodel.size)
1414 strength = parametermodel.size;
15-
15+
1616 if (strength == 2) {
17- return new Generator2(parametermodel, groupList, constrainthandler, seed, randomseed);
18- }
17+ return new Generator2(parametermodel, groupList, constrainthandler,
18+ seed, randomseed);
19+ }
1920 if (strength == 3) {
20- return new Generator3(parametermodel, groupList, constrainthandler, seed, randomseed);
21+ return new Generator3(parametermodel, groupList, constrainthandler,
22+ seed, randomseed);
2123 }
2224 if (strength == 4) {
23- return new Generator4(parametermodel, groupList, constrainthandler, seed, randomseed);
25+ return new Generator4(parametermodel, groupList, constrainthandler,
26+ seed, randomseed);
2427 }
2528 if (strength == 5) {
26- return new Generator5(parametermodel, groupList, constrainthandler, seed, randomseed);
29+ return new Generator5(parametermodel, groupList, constrainthandler,
30+ seed, randomseed);
2731 }
2832
2933 return null;
@@ -37,11 +41,11 @@ abstract class Generator {
3741 final List<Testcase> seed;
3842 final int numOfParameters;
3943 final Random rnd;
40-
44+
4145 static final int MaxNumOfTestcases = 65532;
42-
43- Generator (ParameterModel parametermodel, GList groupList, ConstraintHandler constrainthandler,
44- List<Testcase> seed,
46+
47+ Generator(ParameterModel parametermodel, GList groupList,
48+ ConstraintHandler constrainthandler, List<Testcase> seed,
4549 long randomseed) {
4650 this.parametermodel = parametermodel;
4751 this.groupList = groupList;
@@ -55,10 +59,10 @@ abstract class Generator {
5559
5660 // groupで全網羅するtupleの列を生成
5761 protected List<List<Testcase>> generateTupleSequenceList() {
58-// protected List<TupleSequence> generateTupleSequence() {
62+ // protected List<TupleSequence> generateTupleSequence() {
5963 // TODO Auto-generated method stub
6064 List<List<Testcase>> listOfTupleSequence = new ArrayList<List<Testcase>>();
61- for (Group g: groupList) {
65+ for (Group g : groupList) {
6266 listOfTupleSequence.add(generateTupleSequence(g));
6367 }
6468 return listOfTupleSequence;
@@ -69,9 +73,9 @@ abstract class Generator {
6973 for (int i = 0; i < g.member.length; i++) {
7074 numOfCombinations *= parametermodel.range[g.member[i]];
7175 }
72-
76+
7377 List<Testcase> testSet = new ArrayList<Testcase>();
74-
78+
7579 Testcase tmptest = new Testcase(parametermodel.size);
7680 tmptest.quantify();
7781 for (int i = 0; i < g.member.length; i++) {
@@ -79,7 +83,7 @@ abstract class Generator {
7983 }
8084 if (constrainthandler.isPossible(tmptest))
8185 testSet.add(tmptest);
82-
86+
8387 for (int i = 1; i < numOfCombinations; i++) {
8488 tmptest = tmptest.makeClone();
8589 for (int j = 0; j < g.member.length; j++) {
@@ -93,17 +97,20 @@ abstract class Generator {
9397 }
9498 if (constrainthandler.isPossible(tmptest)) {
9599 testSet.add(tmptest);
96- if (testSet.size() > MaxNumOfTestcases)
97- Error.printError("特定因子の全網羅に上限" + MaxNumOfTestcases + "を超えるテストケースが必要です");
100+ if (testSet.size() > MaxNumOfTestcases)
101+ Error.printError(Main.language == Main.Language.JP ? "特定因子の全網羅に上限"
102+ + MaxNumOfTestcases + "を超えるテストケースが必要です"
103+ : "The number of test cases exceeds the upper bound "
104+ + MaxNumOfTestcases);
98105 }
99106 }
100107 return testSet;
101108 }
102-
109+
103110 protected boolean hasTuplesToCover(List<List<Testcase>> tupleSequenceList) {
104111 // TODO Auto-generated method stub
105112 for (List<Testcase> tupleSequence : tupleSequenceList) {
106- if (tupleSequence.size() > 0)
113+ if (tupleSequence.size() > 0)
107114 return true;
108115 }
109116 return false;
@@ -112,29 +119,21 @@ abstract class Generator {
112119 }
113120
114121 class Generator2 extends Generator {
115-/*
116- final ParameterModel parametermodel;
117- final GList groupList;
118- final ConstraintHandler constrainthandler;
119- final List<Testcase> seed;
120- final int numOfParameters;
121- final Random rnd;
122-
123- //TODO groupの追加
124- Generator2 (ParameterModel parametermodel, GList groupList, ConstraintHandler constrainthandler,
125- List<Testcase> seed,
126- long randomseed){
127- this.parametermodel = parametermodel;
128- this.groupList = groupList;
129- this.constrainthandler = constrainthandler;
130- this.seed = seed;
131- this.numOfParameters = parametermodel.size;
132- this.rnd = new Random(randomseed);
133- }
134- */
135-
122+ /*
123+ * final ParameterModel parametermodel; final GList groupList; final
124+ * ConstraintHandler constrainthandler; final List<Testcase> seed; final int
125+ * numOfParameters; final Random rnd;
126+ *
127+ * //TODO groupの追加 Generator2 (ParameterModel parametermodel, GList
128+ * groupList, ConstraintHandler constrainthandler, List<Testcase> seed, long
129+ * randomseed){ this.parametermodel = parametermodel; this.groupList =
130+ * groupList; this.constrainthandler = constrainthandler; this.seed = seed;
131+ * this.numOfParameters = parametermodel.size; this.rnd = new
132+ * Random(randomseed); }
133+ */
134+
136135 final int NumOfIterationForEachTest = 20;
137-
136+
138137 Generator2(ParameterModel parametermodel, GList groupList,
139138 ConstraintHandler constrainthandler, List<Testcase> seed,
140139 long randomseed) {
@@ -142,14 +141,14 @@ class Generator2 extends Generator {
142141 }
143142
144143 List<Testcase> generate() throws OutOfMaxNumOfTestcasesException {
145-
144+
146145 List<Testcase> res = new ArrayList<Testcase>();
147146 PairTable tab = new PairTable(parametermodel);
148-
147+
149148 // group毎,tuple列の作成
150149 List<List<Testcase>> tupleSequenceList = generateTupleSequenceList();
151150
152- //
151+ //
153152 int numOfUncoveredTuples = checkAllTuples(tab);
154153
155154 // 各<因子・値> に それが含まれる未カバーのtupleの総数を設定
@@ -158,61 +157,50 @@ class Generator2 extends Generator {
158157
159158 // debug
160159 /*
161- for (int p1 = 0; p1 < parametermodel.size; p1++) {
162- System.err.print(p1 + ": ");
163- for (int i : uncovTab[p1]) {
164- System.err.print(i + ", ");
165- }
166- System.err.println();
167- }
168- */
169-
160+ * for (int p1 = 0; p1 < parametermodel.size; p1++) {
161+ * System.err.print(p1 + ": "); for (int i : uncovTab[p1]) {
162+ * System.err.print(i + ", "); } System.err.println(); }
163+ */
164+
170165 int seedrownum = 0;
171166 while (numOfUncoveredTuples > 0 || hasTuplesToCover(tupleSequenceList)) {
172167 // testcase 1個生成
173- ResultOfGenerateOneTest newresult = generateOneTest(tab, seedrownum, uncovTab, tupleSequenceList);
174-
168+ ResultOfGenerateOneTest newresult = generateOneTest(tab,
169+ seedrownum, uncovTab, tupleSequenceList);
170+
175171 // debug
176172 /*
177- newresult.test.print();
178- */
179-
173+ * newresult.test.print();
174+ */
175+
180176 res.add(newresult.test);
181- if (res.size() > MaxNumOfTestcases)
177+ if (res.size() > MaxNumOfTestcases)
182178 throw new OutOfMaxNumOfTestcasesException();
183-
179+
184180 numOfUncoveredTuples -= newresult.numOfCoveredTuples;
185181 seedrownum = newresult.nextSeedRow;
186-
182+
187183 // debug
188184 /*
189- System.err.println(numOfUncoveredTuples + ", " + seedrownum);
190- */
191-
185+ * System.err.println(numOfUncoveredTuples + ", " + seedrownum);
186+ */
187+
192188 // debug
193189 /*
194- for (int p1 = 0; p1 < parametermodel.size; p1++) {
195- System.err.print(p1 + ": ");
196- for (int i : uncovTab[p1]) {
197- System.err.print(i + ", ");
198- }
199- System.err.println();
200- }
201- */
190+ * for (int p1 = 0; p1 < parametermodel.size; p1++) {
191+ * System.err.print(p1 + ": "); for (int i : uncovTab[p1]) {
192+ * System.err.print(i + ", "); } System.err.println(); }
193+ */
202194 }
203195 return res;
204196 }
205197
206198 /*
207- private boolean hasTuplesToCover(List<List<Testcase>> tupleSequenceList) {
208- // TODO Auto-generated method stub
209- for (List<Testcase> tupleSequence : tupleSequenceList) {
210- if (tupleSequence.size() > 0)
211- return true;
212- }
213- return false;
214- }
215- */
199+ * private boolean hasTuplesToCover(List<List<Testcase>> tupleSequenceList)
200+ * { // TODO Auto-generated method stub for (List<Testcase> tupleSequence :
201+ * tupleSequenceList) { if (tupleSequence.size() > 0) return true; } return
202+ * false; }
203+ */
216204
217205 private void initializeUncovTab(ArrayList<Integer>[] uncovTab, PairTable tab) {
218206 assert (parametermodel.size == uncovTab.length);
@@ -233,72 +221,74 @@ class Generator2 extends Generator {
233221 }
234222 }
235223 }
236-
237-
238- private ResultOfGenerateOneTest generateOneTest(PairTable tab, int seedrownum, ArrayList<Integer>[] uncovTab, List<List<Testcase>> tupleSequenceList) {
224+
225+ private ResultOfGenerateOneTest generateOneTest(PairTable tab,
226+ int seedrownum, ArrayList<Integer>[] uncovTab,
227+ List<List<Testcase>> tupleSequenceList) {
239228 // 空のテストケースを1つつくる
240229 Testcase tmp = new Testcase(parametermodel.size);
241230 tmp.quantify();
242-
231+
243232 boolean isSeedUsed = false;
244-
233+
245234 // seedのコピー 制約を満たさなかったらエラー
246- if (seed.size() > 0 && seedrownum < seed.size() ) {
235+ if (seed.size() > 0 && seedrownum < seed.size()) {
247236 isSeedUsed = true;
248- Testcase seedrow = seed.get(seedrownum);
237+ Testcase seedrow = seed.get(seedrownum);
249238 for (int i = 0; i < parametermodel.size; i++) {
250239 tmp.set(i, seedrow.get(i));
251240 }
252241 }
253242 if (constrainthandler.isPossible(tmp) == false) {
254- Error.printError("seedの" + (seedrownum + 1) + "行目が制約違反です");
243+ Error.printError(Main.language == Main.Language.JP ? "seedの"
244+ + (seedrownum + 1) + "行目が制約違反です" : "The" + (seedrownum + 1)
245+ + "th seeding row violates the constraints.");
255246 return null;
256247 }
257-
248+
258249 // TODO tmpにグループを追加
259250 addGroupedTuples(tmp, tupleSequenceList);
260-
251+
261252 // TODO 繰り返させる
262253 // generateTempTest では tabを更新しない
263- Testcase temptest = generateTempTest(tmp, tab, uncovTab);
254+ Testcase temptest = generateTempTest(tmp, tab, uncovTab);
264255 int count = this.computeNewlyCoveredTuples(tab, temptest);
265-
256+
266257 // System.err.print(count + ", ");
267258 for (int i = 1; i < this.NumOfIterationForEachTest; i++) {
268259 Testcase newtemptest = generateTempTest(tmp, tab, uncovTab);
269260 int newcount = this.computeNewlyCoveredTuples(tab, newtemptest);
270261
271262 // System.err.print(newcount + ", ");
272-
263+
273264 if (count < newcount) {
274265 count = newcount;
275266 temptest = newtemptest;
276267 }
277268 }
278-
269+
279270 // System.err.println(computeNewlyCoveredTuples(tab, temptest));
280-
281-
271+
282272 // カバーしたペアーを実際にuncovTabに反映
283273 // finalizePairTableより前でないとだめ
284274 finallizeUncoverTable(uncovTab, tab, temptest);
285275
286276 // カバーしたペアーを実際にtabに反映
287277 int newtuples = finalizePairTable(tab, temptest);
288-
278+
289279 // 返り値の設定
290280 ResultOfGenerateOneTest res = new ResultOfGenerateOneTest();
291281 res.test = temptest;
292282 res.numOfCoveredTuples = newtuples;
293283 if (isSeedUsed) {
294284 res.nextSeedRow = seedrownum + 1;
295- } else
285+ } else
296286 res.nextSeedRow = seedrownum;
297287 return res;
298288 }
299289
300-
301- private void addGroupedTuples(Testcase tmp, List<List<Testcase>> tupleSequenceList) {
290+ private void addGroupedTuples(Testcase tmp,
291+ List<List<Testcase>> tupleSequenceList) {
302292 // TODO Auto-generated method stub
303293 for (List<Testcase> TupleSequence : tupleSequenceList) {
304294 for (int i = 0; i < TupleSequence.size(); i++) {
@@ -308,7 +298,7 @@ class Generator2 extends Generator {
308298 break;
309299 }
310300 }
311- }
301+ }
312302 }
313303
314304 private void finallizeUncoverTable(ArrayList<Integer>[] uncovTab,
@@ -316,42 +306,45 @@ class Generator2 extends Generator {
316306 for (int p1 = 0; p1 < this.parametermodel.size; p1++) {
317307 int numCovered = 0;
318308 byte v1 = temptest.get(p1);
319- if (v1 < 0) continue;
309+ if (v1 < 0)
310+ continue;
320311 for (int p2 = 0; p2 < this.parametermodel.size; p2++) {
321- if (p1 == p2) continue;
312+ if (p1 == p2)
313+ continue;
322314 byte v2 = temptest.get(p2);
323- if (v2 < 0) continue;
315+ if (v2 < 0)
316+ continue;
324317 if (tab.get(p1, v1, p2, v2) == false)
325318 numCovered++;
326319 }
327320 int numUncovered = uncovTab[p1].get(v1);
328321 uncovTab[p1].set(v1, numUncovered - numCovered);
329322 }
330-
323+
331324 }
332325
333- private Testcase generateTempTest(Testcase seedrow, PairTable tab, ArrayList<Integer>[] uncovTab) {
334-
326+ private Testcase generateTempTest(Testcase seedrow, PairTable tab,
327+ ArrayList<Integer>[] uncovTab) {
328+
335329 // tmpをコピー
336330 Testcase tmp = seedrow.makeClone();
337-
331+
338332 // TODO ランダムな因子列を生成
339333 int[] parametersequence = new int[parametermodel.size];
340- for (int i = 0; i < parametermodel.size; i++)
334+ for (int i = 0; i < parametermodel.size; i++)
341335 parametersequence[i] = i;
342336 // シャッフル
343337 for (int i = 1; i < parametermodel.size; i++) {
344338 int dst = this.rnd.nextInt(i + 1);
345339 int tmppara = parametersequence[i];
346- parametersequence[i] = parametersequence[dst];
347- parametersequence[dst] = tmppara;
340+ parametersequence[i] = parametersequence[dst];
341+ parametersequence[dst] = tmppara;
348342 }
349343
350- /* debug
351- for (int i = 0; i < parametermodel.size; i++)
352- System.out.print(parametersequence[i] + " ");
353- System.out.println();
354- */
344+ /*
345+ * debug for (int i = 0; i < parametermodel.size; i++)
346+ * System.out.print(parametersequence[i] + " "); System.out.println();
347+ */
355348
356349 // 各因子について
357350 for (int i = 0; i < parametermodel.size; i++) {
@@ -373,18 +366,20 @@ class Generator2 extends Generator {
373366 }
374367 // assert (bestValue >= 0) : "error in chosing a value";
375368 if (bestValue == -1) {
376- Error.printError("seedに制約違反の行があります");
369+ Error.printError(Main.language == Main.Language.JP ? "seedに制約違反の行があります"
370+ : "Some seeding row violates the constraints.");
371+
377372 return null;
378373 }
379374 if (newlyCoveredTuples == 0) {
380375 // TODO カバー数 0 なら,期待されるペア数を数え,最大のものを選択
381376 // TODO 期待するペア数には,絶対にむりなものもある(すでに値が決まっている因子とのペア)
382377 bestValue = -1;
383- int possibleTuples = -1;
378+ int possibleTuples = -1;
384379
385380 // for tie breaking
386- List<Byte>candidateValues = new ArrayList<Byte>();
387-
381+ List<Byte> candidateValues = new ArrayList<Byte>();
382+
388383 for (byte v = 0; v < this.parametermodel.range[p]; v++) {
389384 tmp.set(p, v);
390385 if (constrainthandler.isPossible(tmp)) {
@@ -394,33 +389,35 @@ class Generator2 extends Generator {
394389 possibleTuples = newtuples;
395390 }
396391 // for tie breaking
397- if (newtuples == 0 && possibleTuples == 0)
392+ if (newtuples == 0 && possibleTuples == 0)
398393 candidateValues.add(v);
399394 }
400395 }
401396 // どれを選んでも同じなら,ランダムに選ぶ
402397 // for tie breaking
403- if (possibleTuples == 0)
404- bestValue = candidateValues.get(this.rnd.nextInt(candidateValues.size()));
398+ if (possibleTuples == 0)
399+ bestValue = candidateValues.get(this.rnd
400+ .nextInt(candidateValues.size()));
405401 }
406402 tmp.set(p, bestValue);
407403 }
408404 }
409-
405+
410406 // 新カバーが0ということもある
411407 return tmp;
412408 }
413409
414-
415410 private int computeNewlyCoveredTuples(Testcase test, int p, PairTable tab) {
416411 int numOfNewlyCoveredTuples = 0;
417412 // bug?
418-// for (int i = 0; i < numOfParameters - 1; i++) {
413+ // for (int i = 0; i < numOfParameters - 1; i++) {
419414 for (int i = 0; i < numOfParameters; i++) {
420- if (p == i) continue;
421- if (test.get(i) < 0) continue;
415+ if (p == i)
416+ continue;
417+ if (test.get(i) < 0)
418+ continue;
422419 if (tab.get(p, test.get(p), i, test.get(i)) == false) {
423- numOfNewlyCoveredTuples++;
420+ numOfNewlyCoveredTuples++;
424421 }
425422 }
426423 return numOfNewlyCoveredTuples;
@@ -444,7 +441,7 @@ class Generator2 extends Generator {
444441 // strength = 2
445442 int numOfPairs = 0;
446443 for (int i = 0; i < numOfParameters - 1; i++) {
447- for (int j = i + 1; j < numOfParameters; j++) {
444+ for (int j = i + 1; j < numOfParameters; j++) {
448445 for (byte v1 = 0; v1 < parametermodel.range[i]; v1++)
449446 for (byte v2 = 0; v2 < parametermodel.range[j]; v2++) {
450447 // pairの生成
@@ -456,14 +453,14 @@ class Generator2 extends Generator {
456453 // 禁則違反ならset
457454 if (constrainthandler.isPossible(pair) == false) {
458455 tab.set(i, v1, j, v2);
459- } else
456+ } else
460457 numOfPairs++;
461458 }
462459 }
463460 }
464461 return numOfPairs;
465462 }
466-
463+
467464 // 2.20
468465 // copy from finalize....
469466 private int computeNewlyCoveredTuples(PairTable tab, Testcase test) {
@@ -491,15 +488,16 @@ abstract class TupleTable {
491488 class PairTable extends TupleTable {
492489 PairList[][] table;
493490 ParameterModel parametermodel;
494-
491+
495492 PairTable(ParameterModel parametermodel) {
496493 this.parametermodel = parametermodel;
497- int n = parametermodel.size;
494+ int n = parametermodel.size;
498495 table = new PairList[n][n];
499496 for (int i = 0; i < n; i++) {
500497 for (int j = 0; j < n; j++) {
501498 if (i < j)
502- table[i][j] = new PairList(parametermodel.range[i], parametermodel.range[j]);
499+ table[i][j] = new PairList(parametermodel.range[i],
500+ parametermodel.range[j]);
503501 else if (i > j) {
504502 // TODO: エラーがでる?なんで?
505503 // table[i][j].list = table[j][i].list.clone();
@@ -508,27 +506,37 @@ class PairTable extends TupleTable {
508506 }
509507 }
510508 }
511-
509+
512510 boolean get(int p1, byte v1, int p2, byte v2) {
513511 // TODO Auto-generated method stub
514512 if (p2 < p1) {
515- int tmp = p1; p1 = p2; p2 = tmp;
516- byte tmv = v1; v1 = v2; v2 = tmv;
513+ int tmp = p1;
514+ p1 = p2;
515+ p2 = tmp;
516+ byte tmv = v1;
517+ v1 = v2;
518+ v2 = tmv;
517519 }
518520 // y * xrange + x
519-/* if (this.table[p1][p2].list.length <= v1 + v2 * (parametermodel.range[p1])) {
520- if (0 > v1 + v2 * (parametermodel.range[p1])) {
521- System.out.println("size p1 p2 v1 v2" + this.table[p1][p2].list.length + "," + p1+","+p2+"," + v1 + "," +v2);
522- }
523- */
521+ /*
522+ * if (this.table[p1][p2].list.length <= v1 + v2 *
523+ * (parametermodel.range[p1])) { if (0 > v1 + v2 *
524+ * (parametermodel.range[p1])) { System.out.println("size p1 p2 v1 v2" +
525+ * this.table[p1][p2].list.length + "," + p1+","+p2+"," + v1 + "," +v2);
526+ * }
527+ */
524528 return this.table[p1][p2].list[v1 + v2 * (parametermodel.range[p1])];
525529 }
526530
527531 // 現れない場合.すでにカバーした場合
528- void set(int p1, byte v1, int p2, byte v2) {
532+ void set(int p1, byte v1, int p2, byte v2) {
529533 if (p2 < p1) {
530- int tmp = p1; p1 = p2; p2 = tmp;
531- byte tmv = v1; v1 = v2; v2 = tmv;
534+ int tmp = p1;
535+ p1 = p2;
536+ p2 = tmp;
537+ byte tmv = v1;
538+ v1 = v2;
539+ v2 = tmv;
532540 }
533541 // y * xrange + x
534542 this.table[p1][p2].list[v1 + v2 * (parametermodel.range[p1])] = true;
@@ -537,6 +545,7 @@ class PairTable extends TupleTable {
537545
538546 class PairList {
539547 boolean[] list;
548+
540549 PairList(byte range1, byte range2) {
541550 this.list = new boolean[range1 * range2];
542551 }
--- a/src/v1/Generator3.java
+++ b/src/v1/Generator3.java
@@ -32,19 +32,19 @@ class Generator3 extends Generator {
3232 int seedrownum = 0;
3333 while (numOfUncoveredTuples > 0 || hasTuplesToCover(tupleSequenceList)) {
3434 // testcase 1個生成
35- ResultOfGenerateOneTest newresult
36- = generateOneTest(tab, seedrownum, uncovTab, tupleSequenceList);
35+ ResultOfGenerateOneTest newresult = generateOneTest(tab,
36+ seedrownum, uncovTab, tupleSequenceList);
3737
3838 res.add(newresult.test);
39- if (res.size() > MaxNumOfTestcases)
39+ if (res.size() > MaxNumOfTestcases)
4040 throw new OutOfMaxNumOfTestcasesException();
41-
41+
4242 numOfUncoveredTuples -= newresult.numOfCoveredTuples;
4343 seedrownum = newresult.nextSeedRow;
4444 }
4545 return res;
4646 }
47-
47+
4848 private int checkAllTuples(TripleTable tab) {
4949 // strength = 3
5050 int numOfTriples = 0;
@@ -54,7 +54,7 @@ class Generator3 extends Generator {
5454 for (byte v1 = 0; v1 < parametermodel.range[i]; v1++)
5555 for (byte v2 = 0; v2 < parametermodel.range[j]; v2++)
5656 for (byte v3 = 0; v3 < parametermodel.range[k]; v3++) {
57- assert(i < j && j < k);
57+ assert (i < j && j < k);
5858 // tripleの生成
5959 Testcase triple = new Testcase(numOfParameters);
6060 triple.quantify();
@@ -73,8 +73,9 @@ class Generator3 extends Generator {
7373 }
7474 return numOfTriples;
7575 }
76-
77- private void initializeUncovTab(ArrayList<Integer>[] uncovTab, TripleTable tab) {
76+
77+ private void initializeUncovTab(ArrayList<Integer>[] uncovTab,
78+ TripleTable tab) {
7879 assert (parametermodel.size == uncovTab.length);
7980 // uncovTabの計算.triple (strength = 3) の場合
8081 for (int p = 0; p < parametermodel.size; p++) {
@@ -97,90 +98,102 @@ class Generator3 extends Generator {
9798 }
9899 }
99100 }
100-
101- private ResultOfGenerateOneTest generateOneTest(TripleTable tab, int seedrownum, ArrayList<Integer>[] uncovTab, List<List<Testcase>> tupleSequenceList) {
101+
102+ private ResultOfGenerateOneTest generateOneTest(TripleTable tab,
103+ int seedrownum, ArrayList<Integer>[] uncovTab,
104+ List<List<Testcase>> tupleSequenceList) {
102105 // 空のテストケースを1つつくる
103106 Testcase tmp = new Testcase(parametermodel.size);
104107 tmp.quantify();
105-
108+
106109 boolean isSeedUsed = false;
107110 // seedのコピー 制約を満たさなかったらエラー
108- if (seed.size() > 0 && seedrownum < seed.size() ) {
111+ if (seed.size() > 0 && seedrownum < seed.size()) {
109112 isSeedUsed = true;
110- Testcase seedrow = seed.get(seedrownum);
113+ Testcase seedrow = seed.get(seedrownum);
111114 for (int i = 0; i < parametermodel.size; i++) {
112115 tmp.set(i, seedrow.get(i));
113116 }
114117 }
115118 if (constrainthandler.isPossible(tmp) == false) {
116- Error.printError("seedの" + (seedrownum + 1) + "行目が制約違反です");
119+ Error.printError(Main.language == Main.Language.JP ? "seedの"
120+ + (seedrownum + 1) + "行目が制約違反です" : "The" + (seedrownum + 1)
121+ + "th seeding row violates the constraints.");
122+
117123 return null;
118124 }
119125
120126 // 2.20
121127 // tmpにグループを追加
122128 boolean isGroupUsed = addGroupedTuples(tmp, tupleSequenceList);
123-
129+
124130 // TODO 繰り返させる
125131 // generateTempTest では tabを更新しない
126132 Testcase temptest = generateTempTest(tmp, tab, uncovTab);
127133 // 2.20
128134 // 0カバーの場合
129- if (isSeedUsed == false && isGroupUsed == false && computeNewlyCoveredTuples(tab, temptest) == 0) {
135+ if (isSeedUsed == false && isGroupUsed == false
136+ && computeNewlyCoveredTuples(tab, temptest) == 0) {
130137 addUncoveredTuple(tmp, tab, uncovTab);
131138 temptest = generateTempTest(tmp, tab, uncovTab);
132139 }
133-
140+
134141 // カバーしたペアーを実際にuncovTabに反映
135142 // finalizePairTableより前でないとだめ
136143 finallizeUncoverTable(uncovTab, tab, temptest);
137144
138145 // カバーしたペアーを実際にtabに反映
139146 int newtuples = finalizeTupleTable(tab, temptest);
140-
147+
141148 // 返り値の設定
142149 ResultOfGenerateOneTest res = new ResultOfGenerateOneTest();
143150 res.test = temptest;
144151 res.numOfCoveredTuples = newtuples;
145152 if (isSeedUsed) {
146153 res.nextSeedRow = seedrownum + 1;
147- } else
154+ } else
148155 res.nextSeedRow = seedrownum;
149156 return res;
150157 }
151-
158+
152159 private void finallizeUncoverTable(ArrayList<Integer>[] uncovTab,
153160 TripleTable tab, Testcase temptest) {
154161 for (int p = 0; p < this.parametermodel.size; p++) {
155162 int numCovered = 0;
156163 byte v = temptest.get(p);
157- if (v < 0) continue;
158-
164+ if (v < 0)
165+ continue;
166+
159167 for (int p1 = 0; p1 < this.parametermodel.size - 1; p1++) {
160168 for (int p2 = p1 + 1; p2 < this.parametermodel.size; p2++) {
161- if (p == p1 || p == p2) continue;
169+ if (p == p1 || p == p2)
170+ continue;
162171 byte v1 = temptest.get(p1);
163- if (v1 < 0) continue;
172+ if (v1 < 0)
173+ continue;
164174 byte v2 = temptest.get(p2);
165- if (v2 < 0) continue;
175+ if (v2 < 0)
176+ continue;
166177 if (tab.get(p, v, p1, v1, p2, v2) == false)
167178 numCovered++;
168179 }
169180 }
170-
181+
171182 int numUncovered = uncovTab[p].get(v);
172183 uncovTab[p].set(v, numUncovered - numCovered);
173184 }
174-
185+
175186 }
176-
187+
177188 private int finalizeTupleTable(TripleTable tab, Testcase test) {
178189 int numOfNewlyCoveredTuples = 0;
179190 for (int p0 = 0; p0 < numOfParameters - 2; p0++) {
180191 for (int p1 = p0 + 1; p1 < numOfParameters - 1; p1++) {
181192 for (int p2 = p1 + 1; p2 < numOfParameters; p2++) {
182- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2)) == false) {
183- tab.set(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2));
193+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
194+ test.get(p2)) == false) {
195+ tab.set(p0, test.get(p0), p1, test.get(p1), p2,
196+ test.get(p2));
184197 numOfNewlyCoveredTuples++;
185198 }
186199 }
@@ -188,19 +201,22 @@ class Generator3 extends Generator {
188201 }
189202 return numOfNewlyCoveredTuples;
190203 }
191-
204+
192205 // 2.20
193206 // 前の位置をおぼえておく
194- private void addUncoveredTuple(Testcase tmp, TripleTable tab, ArrayList<Integer>[] uncovTab) {
195-
196- for (int p0 = 0; p0 < numOfParameters - 2; p0++)
207+ private void addUncoveredTuple(Testcase tmp, TripleTable tab,
208+ ArrayList<Integer>[] uncovTab) {
209+
210+ for (int p0 = 0; p0 < numOfParameters - 2; p0++)
197211 for (byte v0 = 0; v0 < this.parametermodel.range[p0]; v0++) {
198- if (uncovTab[p0].get(v0) == 0) continue;
199- for (int p1 = p0 + 1; p1 < numOfParameters - 1; p1++)
212+ if (uncovTab[p0].get(v0) == 0)
213+ continue;
214+ for (int p1 = p0 + 1; p1 < numOfParameters - 1; p1++)
200215 for (byte v1 = 0; v1 < this.parametermodel.range[p1]; v1++) {
201- if (uncovTab[p1].get(v1) == 0) continue;
202- for (int p2 = p1 + 1; p2 < numOfParameters; p2++)
203- for (byte v2 = 0; v2 < this.parametermodel.range[p2]; v2++)
216+ if (uncovTab[p1].get(v1) == 0)
217+ continue;
218+ for (int p2 = p1 + 1; p2 < numOfParameters; p2++)
219+ for (byte v2 = 0; v2 < this.parametermodel.range[p2]; v2++)
204220 if (tab.get(p0, v0, p1, v1, p2, v2) == false) {
205221 tmp.set(p0, v0);
206222 tmp.set(p1, v1);
@@ -210,10 +226,11 @@ class Generator3 extends Generator {
210226 }
211227 }
212228 }
213-
229+
214230 // 2.20
215231 // return true if tuples from at least one group are added.
216- private boolean addGroupedTuples(Testcase tmp, List<List<Testcase>> tupleSequenceList) {
232+ private boolean addGroupedTuples(Testcase tmp,
233+ List<List<Testcase>> tupleSequenceList) {
217234 boolean isGroupAdded = false;
218235 for (List<Testcase> TupleSequence : tupleSequenceList) {
219236 for (int i = 0; i < TupleSequence.size(); i++) {
@@ -224,25 +241,26 @@ class Generator3 extends Generator {
224241 break;
225242 }
226243 }
227- }
244+ }
228245 return isGroupAdded;
229246 }
230247
231- private Testcase generateTempTest(Testcase seedrow, TripleTable tab, ArrayList<Integer>[] uncovTab) {
232-
248+ private Testcase generateTempTest(Testcase seedrow, TripleTable tab,
249+ ArrayList<Integer>[] uncovTab) {
250+
233251 // tmpをコピー
234252 Testcase tmp = seedrow.makeClone();
235-
253+
236254 // TODO ランダムな因子列を生成
237255 int[] parametersequence = new int[parametermodel.size];
238- for (int i = 0; i < parametermodel.size; i++)
256+ for (int i = 0; i < parametermodel.size; i++)
239257 parametersequence[i] = i;
240258 // シャッフル
241259 for (int i = 1; i < parametermodel.size; i++) {
242260 int dst = this.rnd.nextInt(i + 1);
243261 int tmppara = parametersequence[i];
244- parametersequence[i] = parametersequence[dst];
245- parametersequence[dst] = tmppara;
262+ parametersequence[i] = parametersequence[dst];
263+ parametersequence[dst] = tmppara;
246264 }
247265
248266 // 各因子について
@@ -265,17 +283,18 @@ class Generator3 extends Generator {
265283 }
266284 // assert (bestValue >= 0) : "error in chosing a value";
267285 if (bestValue == -1) {
268- Error.printError("seedに制約違反の行があります");
286+ Error.printError(Main.language == Main.Language.JP ? "seedに制約違反の行があります"
287+ : "Some seeding row violates the constraints.");
269288 return null;
270289 }
271290 if (newlyCoveredTuples == 0) {
272291 // TODO カバー数 0 なら,期待されるペア数を数え,最大のものを選択
273292 // TODO 期待するペア数には,絶対にむりなものもある(すでに値が決まっている因子とのペア)
274293 bestValue = -1;
275- int possibleTuples = -1;
294+ int possibleTuples = -1;
276295 // for tie breaking
277- List<Byte>candidateValues = new ArrayList<Byte>();
278-
296+ List<Byte> candidateValues = new ArrayList<Byte>();
297+
279298 for (byte v = 0; v < this.parametermodel.range[p]; v++) {
280299 tmp.set(p, v);
281300 if (constrainthandler.isPossible(tmp)) {
@@ -285,19 +304,20 @@ class Generator3 extends Generator {
285304 possibleTuples = newtuples;
286305 }
287306 // for tie breaking
288- if (newtuples == 0 && possibleTuples == 0)
307+ if (newtuples == 0 && possibleTuples == 0)
289308 candidateValues.add(v);
290309 }
291310 }
292311 // どれを選んでも同じなら,ランダムに選ぶ
293312 // for tie breaking
294- if (possibleTuples == 0)
295- bestValue = candidateValues.get(this.rnd.nextInt(candidateValues.size()));
313+ if (possibleTuples == 0)
314+ bestValue = candidateValues.get(this.rnd
315+ .nextInt(candidateValues.size()));
296316 }
297317 tmp.set(p, bestValue);
298318 }
299319 }
300-
320+
301321 // 新カバーが0ということもある
302322 return tmp;
303323 }
@@ -306,8 +326,10 @@ class Generator3 extends Generator {
306326 int numOfNewlyCoveredTuples = 0;
307327 for (int p1 = 0; p1 < numOfParameters - 1; p1++) {
308328 for (int p2 = p1 + 1; p2 < numOfParameters; p2++) {
309- if (p == p1 || p == p2) continue;
310- if (test.get(p1) < 0 || test.get(p2) < 0) continue;
329+ if (p == p1 || p == p2)
330+ continue;
331+ if (test.get(p1) < 0 || test.get(p2) < 0)
332+ continue;
311333 if (tab.get(p, test.get(p), p1, test.get(p1), p2, test.get(p2)) == false) {
312334 numOfNewlyCoveredTuples++;
313335 }
@@ -315,7 +337,7 @@ class Generator3 extends Generator {
315337 }
316338 return numOfNewlyCoveredTuples;
317339 }
318-
340+
319341 // 2.20
320342 // copy from finalize....
321343 private int computeNewlyCoveredTuples(TripleTable tab, Testcase test) {
@@ -323,7 +345,8 @@ class Generator3 extends Generator {
323345 for (int p0 = 0; p0 < numOfParameters - 2; p0++) {
324346 for (int p1 = p0 + 1; p1 < numOfParameters - 1; p1++) {
325347 for (int p2 = p1 + 1; p2 < numOfParameters; p2++) {
326- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2)) == false) {
348+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
349+ test.get(p2)) == false) {
327350 numOfNewlyCoveredTuples++;
328351 }
329352 }
@@ -333,11 +356,10 @@ class Generator3 extends Generator {
333356 }
334357 }
335358
336-
337359 class TripleTable extends TupleTable {
338360 TripleList[][][] table;
339361 ParameterModel parametermodel;
340-
362+
341363 TripleTable(ParameterModel parametermodel) {
342364 this.parametermodel = parametermodel;
343365 int n = parametermodel.size;
@@ -346,8 +368,10 @@ class TripleTable extends TupleTable {
346368 for (int j = 0; j < n; j++) {
347369 for (int k = 0; k < n; k++) {
348370 if (i < j && j < k)
349- table[i][j][k] = new TripleList(parametermodel.range[i],
350- parametermodel.range[j], parametermodel.range[k]);
371+ table[i][j][k] = new TripleList(
372+ parametermodel.range[i],
373+ parametermodel.range[j],
374+ parametermodel.range[k]);
351375 else if (i > j) {
352376 // TODO: エラーがでる?なんで?
353377 // table[i][j].list = table[j][i].list.clone();
@@ -356,7 +380,7 @@ class TripleTable extends TupleTable {
356380 }
357381 }
358382 }
359-
383+
360384 // requires p1 != p2 != p3
361385 boolean get(int p1, byte v1, int p2, byte v2, int p3, byte v3) {
362386 // TODO Auto-generated method stub
@@ -367,25 +391,25 @@ class TripleTable extends TupleTable {
367391 pv[1] = new ParameterValuePair(p2, v2);
368392 pv[2] = new ParameterValuePair(p3, v3);
369393 Arrays.sort(pv, new ParameterValuePairComparator());
370-
371-// return this.table[pv[1].p][pv[2].p][pv[3].p].list[getOffset(p1, v1, p2, v2, p3, v3)];
394+
395+ // return this.table[pv[1].p][pv[2].p][pv[3].p].list[getOffset(p1, v1,
396+ // p2, v2, p3, v3)];
372397 return this.table[pv[0].p][pv[1].p][pv[2].p].list[getOffset(pv)];
373398
374399 }
375400
376401 // 現れない場合.すでにカバーした場合
377402 // requires p1 != p2 != p3
378- void set(int p1, byte v1, int p2, byte v2, int p3, byte v3) {
403+ void set(int p1, byte v1, int p2, byte v2, int p3, byte v3) {
379404 ParameterValuePair[] pv = new ParameterValuePair[3];
380405 pv[0] = new ParameterValuePair(p1, v1);
381406 pv[1] = new ParameterValuePair(p2, v2);
382407 pv[2] = new ParameterValuePair(p3, v3);
383408 Arrays.sort(pv, new ParameterValuePairComparator());
384-
409+
385410 this.table[pv[0].p][pv[1].p][pv[2].p].list[getOffset(pv)] = true;
386411 }
387-
388-
412+
389413 private int getOffset(ParameterValuePair[] pv) {
390414 int offset = pv[0].v;
391415 for (int i = 1; i < pv.length; i++) {
@@ -399,9 +423,9 @@ class TripleTable extends TupleTable {
399423 }
400424 }
401425
402-
403426 class TripleList {
404427 boolean[] list;
428+
405429 TripleList(byte range1, byte range2, byte range3) {
406430 this.list = new boolean[range1 * range2 * range3];
407431 }
@@ -410,7 +434,8 @@ class TripleList {
410434 class ParameterValuePair {
411435 int p;
412436 byte v;
413- ParameterValuePair (int p, byte v) {
437+
438+ ParameterValuePair(int p, byte v) {
414439 this.p = p;
415440 this.v = v;
416441 }
@@ -420,9 +445,11 @@ class ParameterValuePairComparator implements Comparator<ParameterValuePair> {
420445 @Override
421446 public int compare(ParameterValuePair o1, ParameterValuePair o2) {
422447 // TODO Auto-generated method stub
423- if (o1.p < o2.p) return -1;
424- if (o1.p > o2.p) return 1;
448+ if (o1.p < o2.p)
449+ return -1;
450+ if (o1.p > o2.p)
451+ return 1;
425452 return 0;
426453 }
427-
454+
428455 }
--- a/src/v1/Generator4.java
+++ b/src/v1/Generator4.java
@@ -31,19 +31,19 @@ class Generator4 extends Generator {
3131 int seedrownum = 0;
3232 while (numOfUncoveredTuples > 0 || hasTuplesToCover(tupleSequenceList)) {
3333 // testcase 1個生成
34- ResultOfGenerateOneTest newresult
35- = generateOneTest(tab, seedrownum, uncovTab, tupleSequenceList);
34+ ResultOfGenerateOneTest newresult = generateOneTest(tab,
35+ seedrownum, uncovTab, tupleSequenceList);
3636
3737 res.add(newresult.test);
38- if (res.size() > MaxNumOfTestcases)
38+ if (res.size() > MaxNumOfTestcases)
3939 throw new OutOfMaxNumOfTestcasesException();
40-
40+
4141 numOfUncoveredTuples -= newresult.numOfCoveredTuples;
4242 seedrownum = newresult.nextSeedRow;
4343 }
4444 return res;
4545 }
46-
46+
4747 private int checkAllTuples(QuadTable tab) {
4848 // strength = 4
4949 int numOfTuples = 0;
@@ -56,7 +56,8 @@ class Generator4 extends Generator {
5656 for (byte v2 = 0; v2 < parametermodel.range[p2]; v2++) {
5757 for (byte v3 = 0; v3 < parametermodel.range[p3]; v3++) {
5858 // tupleの生成
59- Testcase tuple = new Testcase(numOfParameters);
59+ Testcase tuple = new Testcase(
60+ numOfParameters);
6061 tuple.quantify();
6162 tuple.set(p0, v0);
6263 tuple.set(p1, v1);
@@ -65,7 +66,8 @@ class Generator4 extends Generator {
6566 // tupleのチェック
6667 // 禁則違反ならset
6768 if (constrainthandler.isPossible(tuple) == false) {
68- tab.set(p0, v0, p1, v1, p2, v2, p3, v3);
69+ tab.set(p0, v0, p1, v1, p2, v2, p3,
70+ v3);
6971 } else
7072 numOfTuples++;
7173 }
@@ -78,7 +80,7 @@ class Generator4 extends Generator {
7880 }
7981 return numOfTuples;
8082 }
81-
83+
8284 private void initializeUncovTab(ArrayList<Integer>[] uncovTab, QuadTable tab) {
8385 assert (parametermodel.size == uncovTab.length);
8486 // uncovTabの計算. strength = 4 の場合
@@ -86,16 +88,17 @@ class Generator4 extends Generator {
8688 uncovTab[p] = new ArrayList<Integer>();
8789 for (byte v = 0; v < parametermodel.range[p]; v++) {
8890 int sum = 0;
89-
91+
9092 for (int p1 = 0; p1 < parametermodel.size - 2; p1++) {
91- for (int p2 = p1 + 1; p2 < parametermodel.size -1; p2++) {
93+ for (int p2 = p1 + 1; p2 < parametermodel.size - 1; p2++) {
9294 for (int p3 = p2 + 1; p3 < parametermodel.size; p3++) {
9395 if (p == p1 || p == p2 || p == p3)
9496 continue;
9597 for (byte v1 = 0; v1 < parametermodel.range[p1]; v1++) {
9698 for (byte v2 = 0; v2 < parametermodel.range[p2]; v2++) {
9799 for (byte v3 = 0; v3 < parametermodel.range[p3]; v3++) {
98- if (tab.get(p, v, p1, v1, p2, v2, p3, v3) == false)
100+ if (tab.get(p, v, p1, v1, p2, v2, p3,
101+ v3) == false)
99102 sum++;
100103 }
101104 }
@@ -103,101 +106,113 @@ class Generator4 extends Generator {
103106 }
104107 }
105108 }
106-
109+
107110 uncovTab[p].add(sum);
108111 }
109112 }
110113 }
111-
112- private ResultOfGenerateOneTest generateOneTest(QuadTable tab, int seedrownum, ArrayList<Integer>[] uncovTab, List<List<Testcase>> tupleSequenceList) {
114+
115+ private ResultOfGenerateOneTest generateOneTest(QuadTable tab,
116+ int seedrownum, ArrayList<Integer>[] uncovTab,
117+ List<List<Testcase>> tupleSequenceList) {
113118 // 空のテストケースを1つつくる
114119 Testcase tmp = new Testcase(parametermodel.size);
115120 tmp.quantify();
116-
121+
117122 boolean isSeedUsed = false;
118-
123+
119124 // seedのコピー 制約を満たさなかったらエラー
120- if (seed.size() > 0 && seedrownum < seed.size() ) {
125+ if (seed.size() > 0 && seedrownum < seed.size()) {
121126 isSeedUsed = true;
122- Testcase seedrow = seed.get(seedrownum);
127+ Testcase seedrow = seed.get(seedrownum);
123128 for (int i = 0; i < parametermodel.size; i++) {
124129 tmp.set(i, seedrow.get(i));
125130 }
126131 }
127132 if (constrainthandler.isPossible(tmp) == false) {
128- Error.printError("seedの" + (seedrownum + 1) + "行目が制約違反です");
133+ Error.printError(Main.language == Main.Language.JP ? "seedの"
134+ + (seedrownum + 1) + "行目が制約違反です" : "The" + (seedrownum + 1)
135+ + "th seeding row violates the constraints.");
129136 return null;
130137 }
131-
138+
132139 // tmpにグループを追加
133140 // 2.20
134141 boolean isGroupUsed = addGroupedTuples(tmp, tupleSequenceList);
135-
142+
136143 // TODO 繰り返させる
137144 // generateTempTest では tabを更新しない
138145 Testcase temptest = generateTempTest(tmp, tab, uncovTab);
139146 // 2.20
140147 // 0カバーの場合
141- if (isSeedUsed == false && isGroupUsed == false && computeNewlyCoveredTuples(tab, temptest) == 0) {
148+ if (isSeedUsed == false && isGroupUsed == false
149+ && computeNewlyCoveredTuples(tab, temptest) == 0) {
142150 addUncoveredTuple(tmp, tab, uncovTab);
143151 temptest = generateTempTest(tmp, tab, uncovTab);
144152 }
145-
153+
146154 // カバーしたペアーを実際にuncovTabに反映
147155 // finalizePairTableより前でないとだめ
148156 finallizeUncoverTable(uncovTab, tab, temptest);
149157
150158 // カバーしたペアーを実際にtabに反映
151159 int newtuples = finalizeTupleTable(tab, temptest);
152-
160+
153161 // 返り値の設定
154162 ResultOfGenerateOneTest res = new ResultOfGenerateOneTest();
155163 res.test = temptest;
156164 res.numOfCoveredTuples = newtuples;
157165 if (isSeedUsed) {
158166 res.nextSeedRow = seedrownum + 1;
159- } else
167+ } else
160168 res.nextSeedRow = seedrownum;
161169 return res;
162170 }
163-
171+
164172 private void finallizeUncoverTable(ArrayList<Integer>[] uncovTab,
165173 QuadTable tab, Testcase temptest) {
166174 for (int p = 0; p < this.parametermodel.size; p++) {
167175 int numCovered = 0;
168176 byte v = temptest.get(p);
169- if (v < 0) continue;
170-
177+ if (v < 0)
178+ continue;
179+
171180 for (int p1 = 0; p1 < this.parametermodel.size - 2; p1++) {
172181 for (int p2 = p1 + 1; p2 < this.parametermodel.size - 1; p2++) {
173182 for (int p3 = p2 + 1; p3 < this.parametermodel.size; p3++) {
174- if (p == p1 || p == p2 || p == p3) continue;
183+ if (p == p1 || p == p2 || p == p3)
184+ continue;
175185 byte v1 = temptest.get(p1);
176- if (v1 < 0) continue;
186+ if (v1 < 0)
187+ continue;
177188 byte v2 = temptest.get(p2);
178- if (v2 < 0) continue;
189+ if (v2 < 0)
190+ continue;
179191 byte v3 = temptest.get(p3);
180- if (v3 < 0) continue;
192+ if (v3 < 0)
193+ continue;
181194 if (tab.get(p, v, p1, v1, p2, v2, p3, v3) == false)
182195 numCovered++;
183196 }
184197 }
185198 }
186-
199+
187200 int numUncovered = uncovTab[p].get(v);
188201 uncovTab[p].set(v, numUncovered - numCovered);
189202 }
190-
203+
191204 }
192-
205+
193206 private int finalizeTupleTable(QuadTable tab, Testcase test) {
194207 int numOfNewlyCoveredTuples = 0;
195208 for (int p0 = 0; p0 < numOfParameters - 3; p0++) {
196209 for (int p1 = p0 + 1; p1 < numOfParameters - 2; p1++) {
197210 for (int p2 = p1 + 1; p2 < numOfParameters - 1; p2++) {
198211 for (int p3 = p2 + 1; p3 < numOfParameters; p3++) {
199- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3)) == false) {
200- tab.set(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3));
212+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
213+ test.get(p2), p3, test.get(p3)) == false) {
214+ tab.set(p0, test.get(p0), p1, test.get(p1), p2,
215+ test.get(p2), p3, test.get(p3));
201216 numOfNewlyCoveredTuples++;
202217 }
203218 }
@@ -206,38 +221,43 @@ class Generator4 extends Generator {
206221 }
207222 return numOfNewlyCoveredTuples;
208223 }
209-
210-
224+
211225 // 2.20
212226 // 前の位置をおぼえておく
213- private void addUncoveredTuple(Testcase tmp, QuadTable tab, ArrayList<Integer>[] uncovTab) {
214- for (int p0 = 0; p0 < numOfParameters - 3; p0++)
227+ private void addUncoveredTuple(Testcase tmp, QuadTable tab,
228+ ArrayList<Integer>[] uncovTab) {
229+ for (int p0 = 0; p0 < numOfParameters - 3; p0++)
215230 for (byte v0 = 0; v0 < this.parametermodel.range[p0]; v0++) {
216- if (uncovTab[p0].get(v0) == 0) continue;
217- for (int p1 = p0 + 1; p1 < numOfParameters - 2; p1++)
231+ if (uncovTab[p0].get(v0) == 0)
232+ continue;
233+ for (int p1 = p0 + 1; p1 < numOfParameters - 2; p1++)
218234 for (byte v1 = 0; v1 < this.parametermodel.range[p1]; v1++) {
219- if (uncovTab[p1].get(v1) == 0) continue;
235+ if (uncovTab[p1].get(v1) == 0)
236+ continue;
220237 for (int p2 = p1 + 1; p2 < numOfParameters - 1; p2++)
221238 for (byte v2 = 0; v2 < this.parametermodel.range[p2]; v2++) {
222- if (uncovTab[p2].get(v2) == 0) continue;
223- for (int p3 = p2 + 1; p3 < numOfParameters; p3++)
239+ if (uncovTab[p2].get(v2) == 0)
240+ continue;
241+ for (int p3 = p2 + 1; p3 < numOfParameters; p3++)
224242 for (byte v3 = 0; v3 < this.parametermodel.range[p3]; v3++) {
225- if (tab.get(p0, v0, p1, v1, p2, v2, p3, v3) == false) {
243+ if (tab.get(p0, v0, p1, v1, p2, v2, p3,
244+ v3) == false) {
226245 tmp.set(p0, v0);
227246 tmp.set(p1, v1);
228247 tmp.set(p2, v2);
229248 tmp.set(p3, v3);
230249 return;
231250 }
232- }
251+ }
233252 }
234253 }
235254 }
236255 }
237-
256+
238257 // 2.20
239258 // return true if tuples from at least one group are added.
240- private boolean addGroupedTuples(Testcase tmp, List<List<Testcase>> tupleSequenceList) {
259+ private boolean addGroupedTuples(Testcase tmp,
260+ List<List<Testcase>> tupleSequenceList) {
241261 boolean isGroupAdded = false;
242262 for (List<Testcase> TupleSequence : tupleSequenceList) {
243263 for (int i = 0; i < TupleSequence.size(); i++) {
@@ -248,25 +268,26 @@ class Generator4 extends Generator {
248268 break;
249269 }
250270 }
251- }
271+ }
252272 return isGroupAdded;
253273 }
254274
255- private Testcase generateTempTest(Testcase seedrow, QuadTable tab, ArrayList<Integer>[] uncovTab) {
256-
275+ private Testcase generateTempTest(Testcase seedrow, QuadTable tab,
276+ ArrayList<Integer>[] uncovTab) {
277+
257278 // tmpをコピー
258279 Testcase tmp = seedrow.makeClone();
259-
280+
260281 // TODO ランダムな因子列を生成
261282 int[] parametersequence = new int[parametermodel.size];
262- for (int i = 0; i < parametermodel.size; i++)
283+ for (int i = 0; i < parametermodel.size; i++)
263284 parametersequence[i] = i;
264285 // シャッフル
265286 for (int i = 1; i < parametermodel.size; i++) {
266287 int dst = this.rnd.nextInt(i + 1);
267288 int tmppara = parametersequence[i];
268- parametersequence[i] = parametersequence[dst];
269- parametersequence[dst] = tmppara;
289+ parametersequence[i] = parametersequence[dst];
290+ parametersequence[dst] = tmppara;
270291 }
271292
272293 // 各因子について
@@ -288,17 +309,18 @@ class Generator4 extends Generator {
288309 }
289310 }
290311 if (bestValue == -1) {
291- Error.printError("seedに制約違反の行があります");
312+ Error.printError(Main.language == Main.Language.JP ? "seedに制約違反の行があります"
313+ : "Some seeding row violates the constraints.");
292314 return null;
293315 }
294316 if (newlyCoveredTuples == 0) {
295317 // TODO カバー数 0 なら,期待されるペア数を数え,最大のものを選択
296318 // TODO 期待するペア数には,絶対にむりなものもある(すでに値が決まっている因子とのペア)
297319 bestValue = -1;
298- int possibleTuples = -1;
320+ int possibleTuples = -1;
299321 // for tie breaking
300- List<Byte>candidateValues = new ArrayList<Byte>();
301-
322+ List<Byte> candidateValues = new ArrayList<Byte>();
323+
302324 for (byte v = 0; v < this.parametermodel.range[p]; v++) {
303325 tmp.set(p, v);
304326 if (constrainthandler.isPossible(tmp)) {
@@ -308,19 +330,20 @@ class Generator4 extends Generator {
308330 possibleTuples = newtuples;
309331 }
310332 // for tie breaking
311- if (newtuples == 0 && possibleTuples == 0)
333+ if (newtuples == 0 && possibleTuples == 0)
312334 candidateValues.add(v);
313335 }
314336 }
315337 // どれを選んでも同じなら,ランダムに選ぶ
316338 // for tie breaking
317- if (possibleTuples == 0)
318- bestValue = candidateValues.get(this.rnd.nextInt(candidateValues.size()));
339+ if (possibleTuples == 0)
340+ bestValue = candidateValues.get(this.rnd
341+ .nextInt(candidateValues.size()));
319342 }
320343 tmp.set(p, bestValue);
321344 }
322345 }
323-
346+
324347 // 新カバーが0ということもある
325348 return tmp;
326349 }
@@ -330,9 +353,13 @@ class Generator4 extends Generator {
330353 for (int p1 = 0; p1 < numOfParameters - 2; p1++) {
331354 for (int p2 = p1 + 1; p2 < numOfParameters - 1; p2++) {
332355 for (int p3 = p2 + 1; p3 < numOfParameters; p3++) {
333- if (p == p1 || p == p2 || p == p3) continue;
334- if (test.get(p1) < 0 || test.get(p2) < 0 || test.get(p3) < 0) continue;
335- if (tab.get(p, test.get(p), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3)) == false) {
356+ if (p == p1 || p == p2 || p == p3)
357+ continue;
358+ if (test.get(p1) < 0 || test.get(p2) < 0
359+ || test.get(p3) < 0)
360+ continue;
361+ if (tab.get(p, test.get(p), p1, test.get(p1), p2,
362+ test.get(p2), p3, test.get(p3)) == false) {
336363 numOfNewlyCoveredTuples++;
337364 }
338365 }
@@ -340,8 +367,7 @@ class Generator4 extends Generator {
340367 }
341368 return numOfNewlyCoveredTuples;
342369 }
343-
344-
370+
345371 // 2.20
346372 // copy from finalize....
347373 private int computeNewlyCoveredTuples(QuadTable tab, Testcase test) {
@@ -350,7 +376,8 @@ class Generator4 extends Generator {
350376 for (int p1 = p0 + 1; p1 < numOfParameters - 2; p1++) {
351377 for (int p2 = p1 + 1; p2 < numOfParameters - 1; p2++) {
352378 for (int p3 = p2 + 1; p3 < numOfParameters; p3++) {
353- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3)) == false) {
379+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
380+ test.get(p2), p3, test.get(p3)) == false) {
354381 numOfNewlyCoveredTuples++;
355382 }
356383 }
@@ -361,11 +388,10 @@ class Generator4 extends Generator {
361388 }
362389 }
363390
364-
365391 class QuadTable extends TupleTable {
366392 QuadList[][][][] table;
367393 ParameterModel parametermodel;
368-
394+
369395 QuadTable(ParameterModel parametermodel) {
370396 this.parametermodel = parametermodel;
371397 int n = parametermodel.size;
@@ -375,16 +401,20 @@ class QuadTable extends TupleTable {
375401 for (int p2 = p1 + 1; p2 < n - 1; p2++) {
376402 for (int p3 = p2 + 1; p3 < n; p3++) {
377403 assert (p0 < p1 && p1 < p2 && p2 < p3);
378- table[p0][p1][p2][p3] = new QuadList(parametermodel.range[p0],
379- parametermodel.range[p1], parametermodel.range[p2], parametermodel.range[p3]);
404+ table[p0][p1][p2][p3] = new QuadList(
405+ parametermodel.range[p0],
406+ parametermodel.range[p1],
407+ parametermodel.range[p2],
408+ parametermodel.range[p3]);
380409 }
381410 }
382411 }
383412 }
384413 }
385-
414+
386415 // requires p1 != p2 != p3 != p4
387- boolean get(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4, byte v4) {
416+ boolean get(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4,
417+ byte v4) {
388418 // pairの場合にも反映?
389419 // 因子の昇順にソート
390420 ParameterValuePair[] pv = new ParameterValuePair[4];
@@ -393,24 +423,23 @@ class QuadTable extends TupleTable {
393423 pv[2] = new ParameterValuePair(p3, v3);
394424 pv[3] = new ParameterValuePair(p4, v4);
395425 Arrays.sort(pv, new ParameterValuePairComparator());
396-
426+
397427 return this.table[pv[0].p][pv[1].p][pv[2].p][pv[3].p].list[getOffset(pv)];
398428 }
399429
400430 // 現れない場合.すでにカバーした場合
401431 // requires p1 != p2 != p3 != p4
402- void set(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4, byte v4) {
432+ void set(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4, byte v4) {
403433 ParameterValuePair[] pv = new ParameterValuePair[4];
404434 pv[0] = new ParameterValuePair(p1, v1);
405435 pv[1] = new ParameterValuePair(p2, v2);
406436 pv[2] = new ParameterValuePair(p3, v3);
407437 pv[3] = new ParameterValuePair(p4, v4);
408438 Arrays.sort(pv, new ParameterValuePairComparator());
409-
439+
410440 this.table[pv[0].p][pv[1].p][pv[2].p][pv[3].p].list[getOffset(pv)] = true;
411441 }
412-
413-
442+
414443 private int getOffset(ParameterValuePair[] pv) {
415444 int offset = pv[0].v;
416445 for (int i = 1; i < pv.length; i++) {
@@ -424,9 +453,9 @@ class QuadTable extends TupleTable {
424453 }
425454 }
426455
427-
428456 class QuadList {
429457 boolean[] list;
458+
430459 QuadList(byte range1, byte range2, byte range3, byte range4) {
431460 this.list = new boolean[range1 * range2 * range3 * range4];
432461 }
--- a/src/v1/Generator5.java
+++ b/src/v1/Generator5.java
@@ -16,7 +16,7 @@ class Generator5 extends Generator {
1616 List<Testcase> generate() throws OutOfMaxNumOfTestcasesException {
1717
1818 List<Testcase> res = new ArrayList<Testcase>();
19- //TODO: テスト数の下限見積もり if > 上限 then エラー
19+ // TODO: テスト数の下限見積もり if > 上限 then エラー
2020 QuintTable tab = new QuintTable(parametermodel);
2121
2222 // group毎,tuple列の作成
@@ -32,20 +32,20 @@ class Generator5 extends Generator {
3232 int seedrownum = 0;
3333 while (numOfUncoveredTuples > 0 || hasTuplesToCover(tupleSequenceList)) {
3434 // testcase 1個生成
35- ResultOfGenerateOneTest newresult
36- = generateOneTest(tab, seedrownum, uncovTab, tupleSequenceList);
35+ ResultOfGenerateOneTest newresult = generateOneTest(tab,
36+ seedrownum, uncovTab, tupleSequenceList);
3737
3838 res.add(newresult.test);
39-
40- if (res.size() > MaxNumOfTestcases)
39+
40+ if (res.size() > MaxNumOfTestcases)
4141 throw new OutOfMaxNumOfTestcasesException();
42-
42+
4343 numOfUncoveredTuples -= newresult.numOfCoveredTuples;
4444 seedrownum = newresult.nextSeedRow;
4545 }
4646 return res;
4747 }
48-
48+
4949 private int checkAllTuples(QuintTable tab) {
5050 // strength = 5
5151 int numOfTuples = 0;
@@ -60,7 +60,8 @@ class Generator5 extends Generator {
6060 for (byte v3 = 0; v3 < parametermodel.range[p3]; v3++) {
6161 for (byte v4 = 0; v4 < parametermodel.range[p4]; v4++) {
6262 // tupleの生成
63- Testcase tuple = new Testcase(numOfParameters);
63+ Testcase tuple = new Testcase(
64+ numOfParameters);
6465 tuple.quantify();
6566 tuple.set(p0, v0);
6667 tuple.set(p1, v1);
@@ -69,8 +70,10 @@ class Generator5 extends Generator {
6970 tuple.set(p4, v4);
7071 // tupleのチェック
7172 // 禁則違反ならset
72- if (constrainthandler.isPossible(tuple) == false) {
73- tab.set(p0, v0, p1, v1, p2, v2, p3, v3, p4, v4);
73+ if (constrainthandler
74+ .isPossible(tuple) == false) {
75+ tab.set(p0, v0, p1, v1, p2,
76+ v2, p3, v3, p4, v4);
7477 } else
7578 numOfTuples++;
7679 }
@@ -86,7 +89,8 @@ class Generator5 extends Generator {
8689 return numOfTuples;
8790 }
8891
89- private void initializeUncovTab(ArrayList<Integer>[] uncovTab, QuintTable tab) {
92+ private void initializeUncovTab(ArrayList<Integer>[] uncovTab,
93+ QuintTable tab) {
9094 assert (parametermodel.size == uncovTab.length);
9195 // uncovTabの計算. strength = 5 の場合
9296 for (int p = 0; p < parametermodel.size; p++) {
@@ -104,7 +108,8 @@ class Generator5 extends Generator {
104108 for (byte v2 = 0; v2 < parametermodel.range[p2]; v2++) {
105109 for (byte v3 = 0; v3 < parametermodel.range[p3]; v3++) {
106110 for (byte v4 = 0; v4 < parametermodel.range[p4]; v4++) {
107- if (tab.get(p, v, p1, v1, p2, v2, p3, v3, p4, v4) == false)
111+ if (tab.get(p, v, p1, v1, p2,
112+ v2, p3, v3, p4, v4) == false)
108113 sum++;
109114 }
110115 }
@@ -119,92 +124,104 @@ class Generator5 extends Generator {
119124 }
120125 }
121126 }
122-
123- private ResultOfGenerateOneTest generateOneTest(QuintTable tab, int seedrownum, ArrayList<Integer>[] uncovTab, List<List<Testcase>> tupleSequenceList) {
127+
128+ private ResultOfGenerateOneTest generateOneTest(QuintTable tab,
129+ int seedrownum, ArrayList<Integer>[] uncovTab,
130+ List<List<Testcase>> tupleSequenceList) {
124131 // 空のテストケースを1つつくる
125132 Testcase tmp = new Testcase(parametermodel.size);
126133 tmp.quantify();
127-
134+
128135 boolean isSeedUsed = false;
129-
136+
130137 // seedのコピー 制約を満たさなかったらエラー
131- if (seed.size() > 0 && seedrownum < seed.size() ) {
138+ if (seed.size() > 0 && seedrownum < seed.size()) {
132139 isSeedUsed = true;
133- Testcase seedrow = seed.get(seedrownum);
140+ Testcase seedrow = seed.get(seedrownum);
134141 for (int i = 0; i < parametermodel.size; i++) {
135142 tmp.set(i, seedrow.get(i));
136143 }
137144 }
138145 if (constrainthandler.isPossible(tmp) == false) {
139- Error.printError("seedの" + (seedrownum + 1) + "行目が制約違反です");
146+ Error.printError(Main.language == Main.Language.JP ? "seedの"
147+ + (seedrownum + 1) + "行目が制約違反です" : "The" + (seedrownum + 1)
148+ + "th seeding row violates the constraints.");
149+
140150 return null;
141151 }
142-
152+
143153 // tmpにグループを追加
144154 // 2.20
145155 boolean isGroupUsed = addGroupedTuples(tmp, tupleSequenceList);
146-
156+
147157 // TODO 繰り返させる
148158 // generateTempTest では tabを更新しない
149159 Testcase temptest = generateTempTest(tmp, tab, uncovTab);
150160 // 2.20
151161 // 0カバーの場合
152- if (isSeedUsed == false && isGroupUsed == false && computeNewlyCoveredTuples(tab, temptest) == 0) {
162+ if (isSeedUsed == false && isGroupUsed == false
163+ && computeNewlyCoveredTuples(tab, temptest) == 0) {
153164 addUncoveredTuple(tmp, tab, uncovTab);
154165 temptest = generateTempTest(tmp, tab, uncovTab);
155166 }
156-
167+
157168 // カバーしたペアーを実際にuncovTabに反映
158169 // finalizePairTableより前でないとだめ
159170 finallizeUncoverTable(uncovTab, tab, temptest);
160171
161172 // カバーしたペアーを実際にtabに反映
162173 int newtuples = finalizeTupleTable(tab, temptest);
163-
174+
164175 // 返り値の設定
165176 ResultOfGenerateOneTest res = new ResultOfGenerateOneTest();
166177 res.test = temptest;
167178 res.numOfCoveredTuples = newtuples;
168179 if (isSeedUsed) {
169180 res.nextSeedRow = seedrownum + 1;
170- } else
181+ } else
171182 res.nextSeedRow = seedrownum;
172183 return res;
173184 }
174-
185+
175186 private void finallizeUncoverTable(ArrayList<Integer>[] uncovTab,
176187 QuintTable tab, Testcase temptest) {
177188 for (int p = 0; p < this.parametermodel.size; p++) {
178189 int numCovered = 0;
179190 byte v = temptest.get(p);
180- if (v < 0) continue;
181-
191+ if (v < 0)
192+ continue;
193+
182194 for (int p1 = 0; p1 < this.parametermodel.size - 3; p1++) {
183195 for (int p2 = p1 + 1; p2 < this.parametermodel.size - 2; p2++) {
184196 for (int p3 = p2 + 1; p3 < this.parametermodel.size - 1; p3++) {
185197 for (int p4 = p3 + 1; p4 < this.parametermodel.size; p4++) {
186- if (p == p1 || p == p2 || p == p3 || p == p4) continue;
198+ if (p == p1 || p == p2 || p == p3 || p == p4)
199+ continue;
187200 byte v1 = temptest.get(p1);
188- if (v1 < 0) continue;
201+ if (v1 < 0)
202+ continue;
189203 byte v2 = temptest.get(p2);
190- if (v2 < 0) continue;
204+ if (v2 < 0)
205+ continue;
191206 byte v3 = temptest.get(p3);
192- if (v3 < 0) continue;
207+ if (v3 < 0)
208+ continue;
193209 byte v4 = temptest.get(p4);
194- if (v4 < 0) continue;
210+ if (v4 < 0)
211+ continue;
195212 if (tab.get(p, v, p1, v1, p2, v2, p3, v3, p4, v4) == false)
196213 numCovered++;
197214 }
198215 }
199216 }
200217 }
201-
218+
202219 int numUncovered = uncovTab[p].get(v);
203220 uncovTab[p].set(v, numUncovered - numCovered);
204221 }
205-
222+
206223 }
207-
224+
208225 private int finalizeTupleTable(QuintTable tab, Testcase test) {
209226 int numOfNewlyCoveredTuples = 0;
210227 for (int p0 = 0; p0 < numOfParameters - 4; p0++) {
@@ -212,8 +229,12 @@ class Generator5 extends Generator {
212229 for (int p2 = p1 + 1; p2 < numOfParameters - 2; p2++) {
213230 for (int p3 = p2 + 1; p3 < numOfParameters - 1; p3++) {
214231 for (int p4 = p3 + 1; p4 < numOfParameters; p4++) {
215- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3), p4, test.get(p4)) == false) {
216- tab.set(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3), p4, test.get(p4));
232+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
233+ test.get(p2), p3, test.get(p3), p4,
234+ test.get(p4)) == false) {
235+ tab.set(p0, test.get(p0), p1, test.get(p1), p2,
236+ test.get(p2), p3, test.get(p3), p4,
237+ test.get(p4));
217238 numOfNewlyCoveredTuples++;
218239 }
219240 }
@@ -223,25 +244,31 @@ class Generator5 extends Generator {
223244 }
224245 return numOfNewlyCoveredTuples;
225246 }
226-
247+
227248 // 2.20
228249 // 前の位置をおぼえておく
229- private void addUncoveredTuple(Testcase tmp, QuintTable tab, ArrayList<Integer>[] uncovTab) {
230- for (int p0 = 0; p0 < numOfParameters - 4; p0++)
250+ private void addUncoveredTuple(Testcase tmp, QuintTable tab,
251+ ArrayList<Integer>[] uncovTab) {
252+ for (int p0 = 0; p0 < numOfParameters - 4; p0++)
231253 for (byte v0 = 0; v0 < this.parametermodel.range[p0]; v0++) {
232- if (uncovTab[p0].get(v0) == 0) continue;
233- for (int p1 = p0 + 1; p1 < numOfParameters - 3; p1++)
254+ if (uncovTab[p0].get(v0) == 0)
255+ continue;
256+ for (int p1 = p0 + 1; p1 < numOfParameters - 3; p1++)
234257 for (byte v1 = 0; v1 < this.parametermodel.range[p1]; v1++) {
235- if (uncovTab[p1].get(v1) == 0) continue;
258+ if (uncovTab[p1].get(v1) == 0)
259+ continue;
236260 for (int p2 = p1 + 1; p2 < numOfParameters - 2; p2++)
237261 for (byte v2 = 0; v2 < this.parametermodel.range[p2]; v2++) {
238- if (uncovTab[p2].get(v2) == 0) continue;
262+ if (uncovTab[p2].get(v2) == 0)
263+ continue;
239264 for (int p3 = p2 + 1; p3 < numOfParameters - 1; p3++)
240265 for (byte v3 = 0; v3 < this.parametermodel.range[p3]; v3++) {
241- if (uncovTab[p3].get(v3) == 0) continue;
242- for (int p4 = p3 + 1; p4 < numOfParameters; p4++)
266+ if (uncovTab[p3].get(v3) == 0)
267+ continue;
268+ for (int p4 = p3 + 1; p4 < numOfParameters; p4++)
243269 for (byte v4 = 0; v4 < this.parametermodel.range[p4]; v4++) {
244- if (tab.get(p0, v0, p1, v1, p2, v2, p3, v3, p4, v4) == false) {
270+ if (tab.get(p0, v0, p1, v1, p2,
271+ v2, p3, v3, p4, v4) == false) {
245272 tmp.set(p0, v0);
246273 tmp.set(p1, v1);
247274 tmp.set(p2, v2);
@@ -255,10 +282,11 @@ class Generator5 extends Generator {
255282 }
256283 }
257284 }
258-
285+
259286 // 2.20
260287 // return true if tuples from at least one group are added.
261- private boolean addGroupedTuples(Testcase tmp, List<List<Testcase>> tupleSequenceList) {
288+ private boolean addGroupedTuples(Testcase tmp,
289+ List<List<Testcase>> tupleSequenceList) {
262290 boolean isGroupAdded = false;
263291 for (List<Testcase> TupleSequence : tupleSequenceList) {
264292 for (int i = 0; i < TupleSequence.size(); i++) {
@@ -269,27 +297,28 @@ class Generator5 extends Generator {
269297 break;
270298 }
271299 }
272- }
300+ }
273301 return isGroupAdded;
274302 }
275303
276- private Testcase generateTempTest(Testcase seedrow, QuintTable tab, ArrayList<Integer>[] uncovTab) {
277-
304+ private Testcase generateTempTest(Testcase seedrow, QuintTable tab,
305+ ArrayList<Integer>[] uncovTab) {
306+
278307 // tmpをコピー
279308 Testcase tmp = seedrow.makeClone();
280-
309+
281310 // TODO ランダムな因子列を生成
282311 int[] parametersequence = new int[parametermodel.size];
283- for (int i = 0; i < parametermodel.size; i++)
312+ for (int i = 0; i < parametermodel.size; i++)
284313 parametersequence[i] = i;
285314 // シャッフル
286315 for (int i = 1; i < parametermodel.size; i++) {
287316 int dst = this.rnd.nextInt(i + 1);
288317 int tmppara = parametersequence[i];
289- parametersequence[i] = parametersequence[dst];
290- parametersequence[dst] = tmppara;
318+ parametersequence[i] = parametersequence[dst];
319+ parametersequence[dst] = tmppara;
291320 }
292-
321+
293322 // 各因子について
294323 for (int i = 0; i < parametermodel.size; i++) {
295324 int p = parametersequence[i];
@@ -309,17 +338,18 @@ class Generator5 extends Generator {
309338 }
310339 }
311340 if (bestValue == -1) {
312- Error.printError("seedに制約違反の行があります");
341+ Error.printError(Main.language == Main.Language.JP ? "seedに制約違反の行があります"
342+ : "Some seeding row violates the constraints.");
313343 return null;
314344 }
315345 if (newlyCoveredTuples == 0) {
316346 // TODO カバー数 0 なら,期待されるペア数を数え,最大のものを選択
317347 // TODO 期待するペア数には,絶対にむりなものもある(すでに値が決まっている因子とのペア)
318348 bestValue = -1;
319- int possibleTuples = -1;
349+ int possibleTuples = -1;
320350 // for tie breaking
321- List<Byte>candidateValues = new ArrayList<Byte>();
322-
351+ List<Byte> candidateValues = new ArrayList<Byte>();
352+
323353 for (byte v = 0; v < this.parametermodel.range[p]; v++) {
324354 tmp.set(p, v);
325355 if (constrainthandler.isPossible(tmp)) {
@@ -329,19 +359,20 @@ class Generator5 extends Generator {
329359 possibleTuples = newtuples;
330360 }
331361 // for tie breaking
332- if (newtuples == 0 && possibleTuples == 0)
362+ if (newtuples == 0 && possibleTuples == 0)
333363 candidateValues.add(v);
334364 }
335365 }
336366 // どれを選んでも同じなら,ランダムに選ぶ
337367 // for tie breaking
338- if (possibleTuples == 0)
339- bestValue = candidateValues.get(this.rnd.nextInt(candidateValues.size()));
368+ if (possibleTuples == 0)
369+ bestValue = candidateValues.get(this.rnd
370+ .nextInt(candidateValues.size()));
340371 }
341372 tmp.set(p, bestValue);
342373 }
343374 }
344-
375+
345376 // 新カバーが0ということもある
346377 return tmp;
347378 }
@@ -352,9 +383,14 @@ class Generator5 extends Generator {
352383 for (int p2 = p1 + 1; p2 < numOfParameters - 2; p2++) {
353384 for (int p3 = p2 + 1; p3 < numOfParameters - 1; p3++) {
354385 for (int p4 = p3 + 1; p4 < numOfParameters; p4++) {
355- if (p == p1 || p == p2 || p == p3 || p == p4) continue;
356- if (test.get(p1) < 0 || test.get(p2) < 0 || test.get(p3) < 0 || test.get(p4) < 0) continue;
357- if (tab.get(p, test.get(p), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3), p4, test.get(p4)) == false) {
386+ if (p == p1 || p == p2 || p == p3 || p == p4)
387+ continue;
388+ if (test.get(p1) < 0 || test.get(p2) < 0
389+ || test.get(p3) < 0 || test.get(p4) < 0)
390+ continue;
391+ if (tab.get(p, test.get(p), p1, test.get(p1), p2,
392+ test.get(p2), p3, test.get(p3), p4,
393+ test.get(p4)) == false) {
358394 numOfNewlyCoveredTuples++;
359395 }
360396 }
@@ -363,7 +399,7 @@ class Generator5 extends Generator {
363399 }
364400 return numOfNewlyCoveredTuples;
365401 }
366-
402+
367403 // 2.20
368404 // copy from finalize....
369405 private int computeNewlyCoveredTuples(QuintTable tab, Testcase test) {
@@ -373,7 +409,9 @@ class Generator5 extends Generator {
373409 for (int p2 = p1 + 1; p2 < numOfParameters - 2; p2++) {
374410 for (int p3 = p2 + 1; p3 < numOfParameters - 1; p3++) {
375411 for (int p4 = p3 + 1; p4 < numOfParameters; p4++) {
376- if (tab.get(p0, test.get(p0), p1, test.get(p1), p2, test.get(p2), p3, test.get(p3), p4, test.get(p4)) == false) {
412+ if (tab.get(p0, test.get(p0), p1, test.get(p1), p2,
413+ test.get(p2), p3, test.get(p3), p4,
414+ test.get(p4)) == false) {
377415 numOfNewlyCoveredTuples++;
378416 }
379417 }
@@ -385,11 +423,10 @@ class Generator5 extends Generator {
385423 }
386424 }
387425
388-
389426 class QuintTable extends TupleTable {
390427 QuintList[][][][][] table;
391428 ParameterModel parametermodel;
392-
429+
393430 QuintTable(ParameterModel parametermodel) {
394431 this.parametermodel = parametermodel;
395432 int n = parametermodel.size;
@@ -400,10 +437,10 @@ class QuintTable extends TupleTable {
400437 for (int p3 = p2 + 1; p3 < n - 1; p3++) {
401438 for (int p4 = p3 + 1; p4 < n; p4++) {
402439 assert (p0 < p1 && p1 < p2 && p2 < p3 && p3 < p4);
403- table[p0][p1][p2][p3][p4] =
404- new QuintList(parametermodel.range[p0],
405- parametermodel.range[p1],
406- parametermodel.range[p2],
440+ table[p0][p1][p2][p3][p4] = new QuintList(
441+ parametermodel.range[p0],
442+ parametermodel.range[p1],
443+ parametermodel.range[p2],
407444 parametermodel.range[p3],
408445 parametermodel.range[p4]);
409446 }
@@ -412,9 +449,10 @@ class QuintTable extends TupleTable {
412449 }
413450 }
414451 }
415-
452+
416453 // requires p1 != p2 != p3 != p4
417- boolean get(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4, byte v4, int p5, byte v5) {
454+ boolean get(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4,
455+ byte v4, int p5, byte v5) {
418456 // pairの場合にも反映?
419457 // 因子の昇順にソート
420458 ParameterValuePair[] pv = new ParameterValuePair[5];
@@ -424,13 +462,14 @@ class QuintTable extends TupleTable {
424462 pv[3] = new ParameterValuePair(p4, v4);
425463 pv[4] = new ParameterValuePair(p5, v5);
426464 Arrays.sort(pv, new ParameterValuePairComparator());
427-
465+
428466 return this.table[pv[0].p][pv[1].p][pv[2].p][pv[3].p][pv[4].p].list[getOffset(pv)];
429467 }
430468
431469 // 現れない場合.すでにカバーした場合
432470 // requires p1 != p2 != p3 != p4
433- void set(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4, byte v4, int p5, byte v5) {
471+ void set(int p1, byte v1, int p2, byte v2, int p3, byte v3, int p4,
472+ byte v4, int p5, byte v5) {
434473 ParameterValuePair[] pv = new ParameterValuePair[5];
435474 pv[0] = new ParameterValuePair(p1, v1);
436475 pv[1] = new ParameterValuePair(p2, v2);
@@ -438,11 +477,10 @@ class QuintTable extends TupleTable {
438477 pv[3] = new ParameterValuePair(p4, v4);
439478 pv[4] = new ParameterValuePair(p5, v5);
440479 Arrays.sort(pv, new ParameterValuePairComparator());
441-
480+
442481 this.table[pv[0].p][pv[1].p][pv[2].p][pv[3].p][pv[4].p].list[getOffset(pv)] = true;
443482 }
444-
445-
483+
446484 private int getOffset(ParameterValuePair[] pv) {
447485 int offset = pv[0].v;
448486 for (int i = 1; i < pv.length; i++) {
@@ -456,9 +494,9 @@ class QuintTable extends TupleTable {
456494 }
457495 }
458496
459-
460497 class QuintList {
461498 boolean[] list;
499+
462500 QuintList(byte range1, byte range2, byte range3, byte range4, byte range5) {
463501 this.list = new boolean[range1 * range2 * range3 * range4 * range5];
464502 }
--- a/src/v1/GeneratorAll.java
+++ b/src/v1/GeneratorAll.java
@@ -5,17 +5,18 @@ import java.util.List;
55
66 class GeneratorAll {
77
8- static List<Testcase> generate(ParameterModel parameterModel, ConstraintHandler conhndl) throws OutOfMaxNumOfTestcasesException {
9- long numOfAllCombinations = 1;
8+ static List<Testcase> generate(ParameterModel parameterModel,
9+ ConstraintHandler conhndl) throws OutOfMaxNumOfTestcasesException {
10+ long numOfAllCombinations = 1;
1011 for (int p = 0; p < parameterModel.size; p++) {
1112 numOfAllCombinations *= parameterModel.range[p];
1213 }
13-
14+
1415 List<Testcase> testSet = new ArrayList<Testcase>();
1516 Testcase tmptest = new Testcase(parameterModel.size);
1617 if (conhndl.isPossible(tmptest))
1718 testSet.add(tmptest);
18-
19+
1920 for (int i = 1; i < numOfAllCombinations; i++) {
2021 tmptest = tmptest.makeClone();
2122 for (int p = 0; p < parameterModel.size; p++) {
@@ -28,7 +29,7 @@ class GeneratorAll {
2829 }
2930 if (conhndl.isPossible(tmptest)) {
3031 testSet.add(tmptest);
31- if (testSet.size() > Generator.MaxNumOfTestcases)
32+ if (testSet.size() > Generator.MaxNumOfTestcases)
3233 throw new OutOfMaxNumOfTestcasesException();
3334 }
3435 }
--- a/src/v1/Group.java
+++ b/src/v1/Group.java
@@ -7,10 +7,10 @@ import java.util.Comparator;
77 import java.util.Set;
88
99 class Group {
10- int[] member;
10+ int[] member;
1111 int size;
12-
13- Group(Set<Integer> memberSet) {
12+
13+ Group(Set<Integer> memberSet) {
1414 member = new int[memberSet.size()];
1515 int i = 0;
1616 for (Integer p : memberSet) {
@@ -20,7 +20,7 @@ class Group {
2020 Arrays.sort(member);
2121 size = member.length;
2222 }
23-
23+
2424 boolean equiv(Group g1) {
2525 Group g0 = this;
2626 if (g0.member.length != g1.member.length)
@@ -37,7 +37,7 @@ class Group {
3737 class GList extends ArrayList<Group> {
3838 private static final long serialVersionUID = -6705998890411938435L;
3939
40- //TODO
40+ // TODO
4141 void sort() {
4242 Collections.sort(this, new MyComparator());
4343 }
@@ -49,21 +49,20 @@ class MyComparator implements Comparator<Group> {
4949 Group g1 = (Group) arg1;
5050 if (g0.size < g1.size) {
5151 return 1;
52- }
53- else if (g0.size > g1.size) {
54- return -1;
52+ } else if (g0.size > g1.size) {
53+ return -1;
5554 }
5655
5756 // g0 と g1が同サイズ
5857 for (int i = 0; i < g0.member.length; i++) {
5958 if (g0.member[i] > g1.member[i])
6059 return 1;
61- else if (g0.member[i] < g1.member[i])
62- return -1;
60+ else if (g0.member[i] < g1.member[i])
61+ return -1;
6362 }
64-
63+
6564 return 0; // unreachable
66-
65+
6766 }
68-
67+
6968 }
--- a/src/v1/Inputer.java
+++ b/src/v1/Inputer.java
@@ -13,7 +13,7 @@ import java.util.TreeSet;
1313
1414 public class Inputer {
1515
16- // シードで指定された部分テストの列をかえす
16+ //  シードで指定された部分テストの列をかえす
1717 // filename がnullなら大きさ0の列を返す
1818 static List<Testcase> readSeed(String filename, InputFileData inputfiledata) {
1919 List<Testcase> seed = new ArrayList<Testcase>();
@@ -23,38 +23,33 @@ public class Inputer {
2323 BufferedReader reader = openFile(filename);
2424 List<String> row = parseCSVRow(reader);
2525
26- //debug
26+ // debug
2727 /*
28- System.out.print("seed:");
29- for (String str: row) {
30- System.out.print(str + "\t");
31- }
32- System.out.println();
33- */
34-
28+ * System.out.print("seed:"); for (String str: row) {
29+ * System.out.print(str + "\t"); } System.out.println();
30+ */
31+
3532 // seed file は空白
3633 if (row == null)
3734 return seed;
3835 // parameters
3936 if (isParameterConsistent(row, inputfiledata) == false) {
40- Error.printError("seedファイルの因子の記述に誤りがあります");
37+ Error.printError(Main.language == Main.Language.JP ? "seedファイルの因子の記述に誤りがあります"
38+ : "There is an invalid parameter in the seeding file.");
4139 return null;
4240 }
4341
4442 while ((row = parseCSVRow(reader)) != null) {
4543 // TODO debug
46- //debug
44+ // debug
4745 /*
48- System.out.print("seed:");
49- for (String str: row) {
50- System.out.print(str + "\t");
51- }
52- System.out.println();
53- */
54-
46+ * System.out.print("seed:"); for (String str: row) {
47+ * System.out.print(str + "\t"); } System.out.println();
48+ */
49+
5550 /*
56- System.err.print(row.size() +": "); for (String str: row) {
57- System.err.print(str + ","); } System.err.println();
51+ * System.err.print(row.size() +": "); for (String str: row) {
52+ * System.err.print(str + ","); } System.err.println();
5853 */
5954
6055 /*
@@ -62,50 +57,56 @@ public class Inputer {
6257 * Error.printError("seedファイルの値の記述に誤りがあります"); return null; }
6358 */
6459
65-
6660 // Testcase 生成と追加
6761 Testcase newtest = createTestcase(row, inputfiledata);
68-
69-
62+
7063 if (newtest == null) {
71- Error.printError("seedファイルの値の記述に誤りがあります");
64+ Error.printError(Main.language == Main.Language.JP ? "seedファイルの値の記述に誤りがあります"
65+ : "There is an invalid parameter value in the seeding file.");
7266 return null;
7367 } else {
7468 seed.add(newtest);
7569 // debug
7670 /*
77- newtest.print();
78- */
71+ * newtest.print();
72+ */
7973 }
8074 }
8175 try {
8276 reader.close();
8377 } catch (IOException e) {
84- Error.printError("seedファイルにアクセスできません");
78+ Error.printError(Main.language == Main.Language.JP ? "seedファイルにアクセスできません"
79+ : "Cannot access the seeding file.");
8580 }
8681
8782 return seed;
8883 }
89-
84+
9085 private static Testcase createTestcase(List<String> row,
9186 InputFileData inputfiledata) {
9287 // 値が正しいか?
9388 Testcase newtest = new Testcase(inputfiledata.parameterList.size());
9489 int i = 0;
95- for (i = 0; i < Math.min(row.size(), inputfiledata.parameterList.size()); i++) {
90+ for (i = 0; i < Math
91+ .min(row.size(), inputfiledata.parameterList.size()); i++) {
9692 String valuename = row.get(i);
9793 if (valuename.equals("")) {
9894 newtest.setWildCard(i);
9995 continue;
10096 }
10197 try {
102- newtest.set(i, (byte) inputfiledata.parameterList.get(i).getID(valuename));
98+ // 複数同じ値があれば,最初のものとみなす
99+ // newtest.set(i, (byte)
100+ // inputfiledata.parameterList.get(i).getID(valuename));
101+ newtest.set(i,
102+ inputfiledata.parameterList.get(i).getID(valuename)
103+ .get(0).byteValue());
103104 } catch (NoValueNameException e) {
104105 return null;
105106 }
106107 }
107108 // 行に全パラメータ分の値がなければ,空白を入れる
108- for(; i < inputfiledata.parameterList.size(); i++) {
109+ for (; i < inputfiledata.parameterList.size(); i++) {
109110 newtest.setWildCard(i);
110111 }
111112 return newtest;
@@ -113,13 +114,13 @@ public class Inputer {
113114
114115 private static boolean isParameterConsistent(List<String> row,
115116 InputFileData inputfiledata) {
116- // 因子数のチェック
117+ //  因子数のチェック
117118 if (inputfiledata.parameterList.size() != row.size())
118119 return false;
119-
120+
120121 for (int i = 0; i < row.size(); i++) {
121122 try {
122- if (inputfiledata.parameterList.getID(row.get(i)) != i)
123+ if (inputfiledata.parameterList.getID(row.get(i)) != i)
123124 return false;
124125 } catch (NoParameterNameException e) {
125126 return false;
@@ -136,9 +137,9 @@ public class Inputer {
136137 line = reader.readLine();
137138 if (line == null)
138139 break;
139-
140- //TODO ,の前後の空白と#の前の空白をとって、,をセパレータに
141- // line = line.replaceAll("#", ",#,");
140+
141+ // TODO ,の前後の空白と#の前の空白をとって、,をセパレータに
142+ // line = line.replaceAll("#", ",#,");
142143 // #以降を消去
143144 line = line.replaceAll("#.*", "");
144145 // ,から始まる場合,行頭にスペースを入れる
@@ -147,18 +148,18 @@ public class Inputer {
147148 while (st.hasMoreTokens()) {
148149 String token = st.nextToken();
149150 token = token.trim();
150-// if (token.equals("#"))
151-// break;
151+ // if (token.equals("#"))
152+ // break;
152153 token = token.trim();
153154 tokenList.add(token);
154155 }
155156 } catch (IOException e) {
156- Error.printError("IO エラー");
157+ Error.printError("IO error");
157158 return null;
158159 }
159160 // 空白だけ,コメントだけなら次の行をよむ
160161 boolean isAllEmpty = true;
161- for (String token: tokenList) {
162+ for (String token : tokenList) {
162163 if (token.equals("") == false) {
163164 isAllEmpty = false;
164165 break;
@@ -166,69 +167,60 @@ public class Inputer {
166167 }
167168 if (isAllEmpty)
168169 tokenList.clear();
169- // if (tokenList.size() == 1)
170- // if (tokenList.get(0).equals(""))
171- // tokenList.remove(0);
170+ // if (tokenList.size() == 1)
171+ // if (tokenList.get(0).equals(""))
172+ // tokenList.remove(0);
172173
173174 }
174-
175+
175176 if (tokenList.size() == 0)
176177 return null;
177- else
178+ else
178179 return tokenList;
179180 }
180181
182+ static InputFileData readModel(String filename) {
181183
182-
183- static InputFileData readModel(String filename){
184-
185184 BufferedReader reader = openFile(filename);
186185 List<String> tokenList = makeTokenList(reader);
187186 TokenHandler t = new TokenHandler(tokenList);
188-
187+
189188 // 因子、値のよみこみ
190189 PList parameterList = readParameter(t);
191-
190+
192191 // テスト
193192 /*
194- for(Parameter p: parameterList) {
195- System.err.print(p.name + ": ");
196- for (String name : p.value_name) {
197- System.err.print(name + ", ");
198- }
199- System.err.println();
200- }
201- */
202-
193+ * for(Parameter p: parameterList) { System.err.print(p.name + ": ");
194+ * for (String name : p.value_name) { System.err.print(name + ", "); }
195+ * System.err.println(); }
196+ */
197+
203198 // グループ
204199 GList groupList = readGroup(t, parameterList);
205200
206201 // テスト
207-
202+
208203 /*
209- for(Group g: groupList) {
210- for (int i = 0; i < g.size; i++)
211- System.out.print(g.member[i] + ", ");
212- System.out.println();
213- }
214- */
215-
216-
204+ * for(Group g: groupList) { for (int i = 0; i < g.size; i++)
205+ * System.out.print(g.member[i] + ", "); System.out.println(); }
206+ */
207+
217208 // 制約
218209 List<Node> constraintList = readConstraint(t, parameterList);
219-
220- // close
210+
211+ // close
221212 try {
222213 reader.close();
223214 } catch (IOException e) {
224- Error.printError("入力ファイルにアクセスできません");
215+ Error.printError(Main.language == Main.Language.JP ? "入力ファイルにアクセスできません"
216+ : "Cannot access the input file");
225217 }
226218 return new InputFileData(parameterList, groupList, constraintList);
227219 }
228-
220+
229221 private static List<Node> readConstraint(TokenHandler t, PList parameterList) {
230222 List<Node> constraintList = new ArrayList<Node>();
231- while (true){
223+ while (true) {
232224 if (t.peepToken() == null) {
233225 break;
234226 }
@@ -238,13 +230,11 @@ public class Inputer {
238230 return constraintList;
239231 }
240232
241-
242233 // グループの読み込み
243234 private static GList readGroup(TokenHandler t, PList parameterList) {
244235 GList groupList = new GList();
245- while (true){
246- if (t.peepToken() == null ||
247- t.peepToken().equals("(")) {
236+ while (true) {
237+ if (t.peepToken() == null || t.peepToken().equals("(")) {
248238 break;
249239 }
250240 try {
@@ -252,43 +242,49 @@ public class Inputer {
252242 Error.printError("{ expected");
253243 }
254244 } catch (OutOfTokenStreamException e) {
255- Error.printError("パラメータ指定に誤りがあります");
245+ Error.printError(Main.language == Main.Language.JP ? "パラメータ指定に誤りがあります"
246+ : "Invalid parameter");
256247 }
257248 // グループのパラメータ
258- Set<Integer> memberSet = new TreeSet<Integer>();
249+ Set<Integer> memberSet = new TreeSet<Integer>();
259250 do {
260251 String name = null;
261252 try {
262- name = t.getToken(); //チェックしてない
253+ name = t.getToken(); // チェックしてない
263254 } catch (OutOfTokenStreamException e) {
264- Error.printError("グループ指定に誤りがあります");
255+ Error.printError(Main.language == Main.Language.JP ? "グループ指定に誤りがあります"
256+ : "Invalid grouping");
265257 }
266258 try {
267- /* debug
268- System.out.print(name + " " + parameterList.getID(name) + ", ");
269- */
259+ /*
260+ * debug System.out.print(name + " " +
261+ * parameterList.getID(name) + ", ");
262+ */
270263 memberSet.add(Integer.valueOf(parameterList.getID(name)));
271264 } catch (NoParameterNameException e) {
272- Error.printError("グループ指定で因子名に誤りがあります");
265+ Error.printError(Main.language == Main.Language.JP ? "グループ指定で因子名に誤りがあります"
266+ : "Invalid parameter in group");
273267 }
274268 if (t.peepToken() == null) {
275- Error.printError("グループ指定に誤りがあります");
269+ Error.printError(Main.language == Main.Language.JP ? "グループ指定に誤りがあります"
270+ : "Invalid grouping");
276271 }
277272 } while (t.peepToken().equals("}") == false);
278273 Group g = new Group(memberSet);
279274 groupList.add(g);
280-
275+
281276 // } のよみこみ
282277 try {
283278 t.getToken();
284279 } catch (OutOfTokenStreamException e) {
285- Error.printError("グループ指定に誤りがあります");
280+ Error.printError(Main.language == Main.Language.JP ? "グループ指定に誤りがあります"
281+ : "Invalid grouping");
286282 }
287283 }
288- //TODO groupの整列
284+ // TODO groupの整列
289285 groupList.sort();
290286 // TODO 重複要素の削除
291-
287+
292288 return groupList;
293289 }
294290
@@ -298,15 +294,16 @@ public class Inputer {
298294 // default: standard input
299295 return new BufferedReader(new InputStreamReader(System.in));
300296 }
301-
297+
302298 try {
303299 reader = new BufferedReader(new FileReader(filename));
304300 } catch (FileNotFoundException e) {
305- Error.printError("ファイル" + filename + "が見つかりません.");
301+ Error.printError(Main.language == Main.Language.JP ? "ファイル"
302+ + filename + "が見つかりません." : "Cannot find file " + filename);
306303 }
307304 return reader;
308305 }
309-
306+
310307 private static List<String> makeTokenList(BufferedReader reader) {
311308 List<String> tokenList = new ArrayList<String>();
312309 String line;
@@ -319,13 +316,13 @@ public class Inputer {
319316
320317 line = line.replaceAll("\\{", " { ");
321318 line = line.replaceAll("\\}", " } ");
322-
319+
323320 line = line.replaceAll("\\[", " [ ");
324321 line = line.replaceAll("\\]", " ] ");
325-
326-// line = line.replaceAll(":", " : ");
322+
323+ // line = line.replaceAll(":", " : ");
327324 line = line.replaceAll(";", " ; ");
328-
325+
329326 StringTokenizer st = new StringTokenizer(line);
330327 while (st.hasMoreTokens()) {
331328 String token = st.nextToken();
@@ -344,7 +341,7 @@ public class Inputer {
344341 // パラメータの読み込み
345342 private static PList readParameter(TokenHandler t) {
346343 PList parameterList = new PList();
347-
344+
348345 while (true) {
349346 try {
350347 if (t.peepToken() == null || t.peepToken().equals("{")
@@ -359,7 +356,8 @@ public class Inputer {
359356 Parameter p = new Parameter(parameter_name);
360357
361358 if (t.getToken().equals("(") == false) {
362- Error.printError("( がありません.");
359+ Error.printError(Main.language == Main.Language.JP ? "( がありません."
360+ : "( expected");
363361 }
364362 // レベルの名前
365363 do {
@@ -367,7 +365,8 @@ public class Inputer {
367365 checkLevelName(level_name);
368366 p.addName(level_name);
369367 if (t.peepToken() == null) {
370- Error.printError("パラメータ指定に誤りがあります");
368+ Error.printError(Main.language == Main.Language.JP ? "パラメータ指定に誤りがあります"
369+ : "Invalid parameters");
371370 }
372371 } while (t.peepToken().equals(")") == false);
373372 // ) のよみこみ
@@ -378,42 +377,44 @@ public class Inputer {
378377
379378 parameterList.add(p);
380379 } catch (OutOfTokenStreamException e) {
381- Error.printError("パラメータ指定に誤りがあります");
380+ Error.printError(Main.language == Main.Language.JP ? "パラメータ指定に誤りがあります"
381+ : "Invalid parameters");
382382 }
383383 }
384-
385- // 因子名の重複チェック
384+
385+ //  因子名の重複チェック
386386 if (parameterList.checkNameDuplication())
387- Error.printError("因子名が重複しています");
388-
387+ Error.printError(Main.language == Main.Language.JP ? "因子名が重複しています"
388+ : "Duplicated parameters");
389+
389390 // 因子数 >= 2
390391 if (parameterList.size() < 2)
391- Error.printError("因子は2個以上必要です");
392-
392+ Error.printError(Main.language == Main.Language.JP ? "因子は2個以上必要です"
393+ : "Multiple parameters required");
394+
393395 return parameterList;
394396 }
395397
396398 private static void checkParameterName(String name) {
397399 // TODO Auto-generated method stub
398- if (name.contains("(") || name.contains(")")
399- || name.contains("{") || name.contains("}")
400- || name.contains("[") || name.contains("]")
401- || name.contains(";") || name.contains(",")
402- ) {
403- Error.printError("因子名に禁止文字が含まれています");
404- }
400+ if (name.contains("(") || name.contains(")") || name.contains("{")
401+ || name.contains("}") || name.contains("[")
402+ || name.contains("]") || name.contains(";")
403+ || name.contains(",")) {
404+ Error.printError(Main.language == Main.Language.JP ? "因子名に禁止文字が含まれています"
405+ : "Invalid symbol in parameter name");
406+ }
405407 }
406408
407409 private static void checkLevelName(String name) {
408410 // TODO Auto-generated method stub
409- if (name.contains("(") || name.contains(")")
410- || name.contains("{") || name.contains("}")
411- || name.contains("[") || name.contains("]")
412- || name.contains(";") || name.contains(",")
413- ) {
414- Error.printError("水準名に禁止文字が含まれています");
415- }
411+ if (name.contains("(") || name.contains(")") || name.contains("{")
412+ || name.contains("}") || name.contains("[")
413+ || name.contains("]") || name.contains(";")
414+ || name.contains(",")) {
415+ Error.printError(Main.language == Main.Language.JP ? "水準名に禁止文字が含まれています"
416+ : "Invalid symbol in parameter value");
417+ }
416418 }
417419
418-
419420 }
--- a/src/v1/Main.java
+++ b/src/v1/Main.java
@@ -9,16 +9,22 @@ public class Main {
99 static String seedFile;
1010 static String outputFile;
1111 static int strength = 2; // default strength
12-
12+
1313 static final int MAX_LEVEL = 63;
14-
14+
1515 static final int MAX_ITERATIONS = 100000;
1616 static final int MAX_STRENGTH = 5;
1717 static final int Max_RandomSeed = 65535;
18- //static final int Max_RandomSeed = 10;
19-
18+ // static final int Max_RandomSeed = 10;
19+
2020 static boolean debugMode = false;
21-
21+
22+ enum Language {
23+ JP, EN
24+ };
25+
26+ static Language language = Language.JP;
27+
2228 // Start the whole process
2329 public static void main(String[] args) {
2430
@@ -28,41 +34,44 @@ public class Main {
2834
2935 // エラー出力先設定
3036 Error.setOutputFile(outputFile);
31-
37+
3238 // コマンド引数でのエラー出力
33- if (errorMessage != null)
39+ if (errorMessage != null)
3440 Error.printError(errorMessage);
35-
36- // モデル読み込み
37- InputFileData inputfiledata = Inputer.readModel(modelFile);
41+
42+ // モデル読み込み
43+ InputFileData inputfiledata = Inputer.readModel(modelFile);
3844
3945 // 制約処理 BDD作成
40- ConstraintHandler conhndl = new ConstraintHandler(inputfiledata.parameterList, inputfiledata.constraintList);
46+ ConstraintHandler conhndl = new ConstraintHandler(
47+ inputfiledata.parameterList, inputfiledata.constraintList);
4148 // DEBUG: BDDの表示
4249 /* conhndl.printConstraintBDD(); */
4350
44- // シード読み込み
51+ //  シード読み込み
4552 List<Testcase> seed = Inputer.readSeed(seedFile, inputfiledata);
4653
47-
48- //テストケース生成
54+ // テストケース生成
4955 List<Testcase> testSet = null;
5056 if (strength == -1) {
5157 // 全網羅
5258 try {
53- testSet = GeneratorAll.generate(new ParameterModel(inputfiledata.parameterList), conhndl);
59+ testSet = GeneratorAll.generate(new ParameterModel(
60+ inputfiledata.parameterList), conhndl);
5461 } catch (OutOfMaxNumOfTestcasesException e) {
55- Error.printError("テストケース数が上限" + Generator.MaxNumOfTestcases + "を超えました");
62+ Error.printError(Main.language == Main.Language.JP ? "テストケース数が上限"
63+ + Generator.MaxNumOfTestcases + "を超えました"
64+ : "The number of test cases exceeded the upper bound "
65+ + Generator.MaxNumOfTestcases);
5666 }
5767
58- new Outputer(outputFile).outputResult(testSet, inputfiledata,
68+ new Outputer(outputFile).outputResult(testSet, inputfiledata,
5969 modelFile, outputFile);
60- }
61- else { // strength >= 2
70+ } else { // strength >= 2
6271 Generator generator = GeneratorFactor.newGenerator(
6372 new ParameterModel(inputfiledata.parameterList),
64- inputfiledata.groupList,
65- conhndl, seed, randomSeed, strength);
73+ inputfiledata.groupList, conhndl, seed, randomSeed,
74+ strength);
6675 try {
6776 testSet = generator.generate();
6877 } catch (OutOfMaxNumOfTestcasesException e) {
@@ -73,11 +82,12 @@ public class Main {
7382 System.err.println("random seed: " + randomSeed);
7483 // 繰り返す場合
7584 for (int i = 2; i < numOfIterations; i++) {
76- int nextRandomSeed = (int) Math.floor(Math.random() * (Max_RandomSeed + 1));
85+ int nextRandomSeed = (int) Math.floor(Math.random()
86+ * (Max_RandomSeed + 1));
7787 generator = GeneratorFactor.newGenerator(
7888 new ParameterModel(inputfiledata.parameterList),
79- inputfiledata.groupList,
80- conhndl, seed, nextRandomSeed, strength);
89+ inputfiledata.groupList, conhndl, seed,
90+ nextRandomSeed, strength);
8191
8292 if (debugMode)
8393 System.err.println("random seed: " + nextRandomSeed);
@@ -94,17 +104,20 @@ public class Main {
94104 testSet = nextTestSet;
95105 randomSeed = nextRandomSeed;
96106 }
97- }
98- else if (testSet == null && nextTestSet != null) {
107+ } else if (testSet == null && nextTestSet != null) {
99108 testSet = nextTestSet;
100109 randomSeed = nextRandomSeed;
101110 }
102111 }
103- if (testSet == null)
104- Error.printError("テストケース数が上限" + Generator.MaxNumOfTestcases + "を超えました");
112+ if (testSet == null)
113+ Error.printError(Main.language == Main.Language.JP ? "テストケース数が上限"
114+ + Generator.MaxNumOfTestcases + "を超えました"
115+ : "The number of test cases exceeded the upper bound "
116+ + Generator.MaxNumOfTestcases);
105117
106- new Outputer(outputFile).outputResult(testSet, inputfiledata,
107- randomSeed, modelFile, seedFile, outputFile, strength, numOfIterations);
118+ new Outputer(outputFile).outputResult(testSet, inputfiledata,
119+ randomSeed, modelFile, seedFile, outputFile, strength,
120+ numOfIterations);
108121 }
109122
110123 /* debug */
@@ -112,56 +125,87 @@ public class Main {
112125 System.err.println("test set size: " + testSet.size());
113126 }
114127 } catch (OutOfMemoryError e) {
115- Error.printError("メモリ不足です.");
128+ Error.printError(Main.language == Main.Language.JP ? "メモリ不足です."
129+ : "Out of memory");
116130 } catch (Exception e) {
117- Error.printError("プログラムが異常終了しました.");
131+ Error.printError(Main.language == Main.Language.JP ? "プログラムが異常終了しました."
132+ : "Abnormal termination");
118133 }
119- }
134+ }
120135
121136 // コマンド引数処理
122137 private static String processCommandArgument(String[] args) {
123138 if (args.length == 0) {
124- Error.printError("usage: java -jar Program.jar ...");
139+ Error.printError("usage: java -jar Program.jar [-i input] [-o output] [-policy] ...");
140+ }
141+
142+ // policyの表示
143+ if (args.length == 1 && args[0].equals("-policy")) {
144+ System.out
145+ .println("This software (CIT-BACH 1.02) is distributed under the zlib license.\n"
146+ + "The software contains Java classes from JDD, a Java BDD library "
147+ + "developed by Arash Vahidi.\n"
148+ + "JDD is free software distributed under the zlib license.\n"
149+ + "\n"
150+ + "Copyright (c) 2015, Tatsuhiro Tsuchiya\n"
151+ + "This software is provided 'as-is', without any express or implied \n"
152+ + "warranty. In no event will the authors be held liable for any damages \n"
153+ + "arising from the use of this software. \n"
154+ + "\n"
155+ + "Permission is granted to anyone to use this software for any purpose, \n"
156+ + "including commercial applications, and to alter it and redistribute it \n"
157+ + "freely, subject to the following restrictions: \n"
158+ + " \n"
159+ + " 1. The origin of this software must not be misrepresented; you must not \n"
160+ + " claim that you wrote the original software. If you use this software \n"
161+ + " in a product, an acknowledgment in the product documentation would be \n"
162+ + " appreciated but is not required. \n"
163+ + " \n"
164+ + " 2. Altered source versions must be plainly marked as such, and must not be \n"
165+ + " misrepresented as being the original software. \n"
166+ + " \n"
167+ + " 3. This notice may not be removed or altered from any source \n"
168+ + " distribution. \n");
169+ System.exit(0);
125170 }
126-
171+
127172 // エラー表示を出力ファイルが指定されるまで遅らせる
128- String errorMessage = null;
129-
173+ String errorMessage = null;
174+
130175 for (int i = 0; i + 1 < args.length; i += 2) {
131176 String option = args[i];
132- String str = args[i+1];
177+ String str = args[i + 1];
133178 if (option.equals("-i")) {
134179 modelFile = str;
135- }
136- else if (option.equals("-o")) {
180+ } else if (option.equals("-o")) {
137181 outputFile = str;
138- }
139- else if (option.equals("-random")) {
182+ } else if (option.equals("-random")) {
140183 try {
141184 randomSeed = Integer.parseInt(str);
142185 } catch (NumberFormatException e) {
143- //Error.printError("invalid number");
144- errorMessage = "ランダムシードに無効な値が指定されています.";
186+ // Error.printError("invalid number");
187+ errorMessage = Main.language == Main.Language.JP ? "ランダムシードに無効な値が指定されています."
188+ : "Invalid random seed";
145189 continue;
146190 }
147191 randomSeed = Math.abs(randomSeed) % (Max_RandomSeed + 1);
148- }
149- else if (option.equals("-c")) {
192+ } else if (option.equals("-c")) {
150193 if (str.equals("all")) {
151194 // 全網羅
152195 strength = -1;
153- }
154- else {
196+ } else {
155197 try {
156198 strength = Integer.parseInt(str);
157199 } catch (NumberFormatException e) {
158200 // Error.printError("invalid number");
159- errorMessage = "網羅度に無効な値が指定されています.";
201+ errorMessage = Main.language == Main.Language.JP ? "網羅度に無効な値が指定されています."
202+ : "Invalid strength";
160203 continue;
161204 }
162205 if (strength < 2 || MAX_STRENGTH < strength) {
163- //Error.printError("invalid strength");
164- errorMessage = "網羅度に無効な値が指定されています.";
206+ // Error.printError("invalid strength");
207+ errorMessage = Main.language == Main.Language.JP ? "網羅度に無効な値が指定されています."
208+ : "Invalid strength";
165209 continue;
166210 }
167211 }
@@ -171,34 +215,43 @@ public class Main {
171215 try {
172216 numOfIterations = Integer.parseInt(str);
173217 } catch (NumberFormatException e) {
174- //Error.printError("invalid repeating number");
175- errorMessage = "くり返し数に無効な値が指定されています.";
218+ // Error.printError("invalid repeating number");
219+ errorMessage = Main.language == Main.Language.JP ? "くり返し数に無効な値が指定されています."
220+ : "Invalid number of repetition times";
176221 continue;
177222 }
178223 if (numOfIterations <= 0 || numOfIterations > MAX_ITERATIONS) {
179224 // Error.printError("invalid repeating number");
180- errorMessage = "くり返し数に無効な値が指定されています.";
225+ errorMessage = Main.language == Main.Language.JP ? "くり返し数に無効な値が指定されています."
226+ : "Invalid number of repetition times";
181227 continue;
182228 }
183- }
184- else if (option.equals("-s")) {
185- seedFile = str;
186- }
187- else if (option.equals("-debug")) {
229+ } else if (option.equals("-s")) {
230+ seedFile = str;
231+ } else if (option.equals("-debug")) {
188232 debugMode = true;
189233 // 次の引数はダミー
190- }
191- else {
234+ } else if (option.equals("-lang")) {
235+ if (str.matches("JP|jp")) {
236+ Main.language = Main.Language.JP;
237+ } else if (str.matches("EN|en")) {
238+ Main.language = Main.Language.EN;
239+ } else {
240+ errorMessage = "無効な言語が指定されています (Invalid Language)";
241+ continue;
242+ }
243+ } else {
192244 // Error.printError("Invalid option");
193- errorMessage = "無効なオプションが指定されています.";
245+ errorMessage = Main.language == Main.Language.JP ? "無効なオプションが指定されています."
246+ : "Invalid option";
194247 continue;
195248 }
196249 }
197-
250+
198251 if (randomSeed == -1) {
199252 randomSeed = (int) Math.floor(Math.random() * (Max_RandomSeed + 1));
200253 }
201-
254+
202255 return errorMessage;
203256 }
204257 }
--- a/src/v1/Node.java
+++ b/src/v1/Node.java
@@ -1,4 +1,5 @@
11 package v1;
2+
23 import jdd.bdd.*;
34
45 import java.util.*;
@@ -7,7 +8,7 @@ abstract class Node {
78 abstract int evaluate(BDD bdd, List<VariableAndBDD> parameters);
89 }
910
10-abstract class BooleanOperator extends Node{
11+abstract class BooleanOperator extends Node {
1112 }
1213
1314 abstract class BooleanUnaryOperator extends BooleanOperator {
@@ -15,8 +16,8 @@ abstract class BooleanUnaryOperator extends BooleanOperator {
1516 }
1617
1718 class NotOperator extends BooleanUnaryOperator {
18- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
19- int tmp = Child.evaluate(bdd, parameters);
19+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
20+ int tmp = Child.evaluate(bdd, parameters);
2021 int res = bdd.not(tmp);
2122 bdd.ref(res);
2223 bdd.deref(tmp);
@@ -29,34 +30,37 @@ abstract class BooleanBinaryOperator extends BooleanOperator {
2930 }
3031
3132 class IfOperator extends BooleanBinaryOperator {
32- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
33+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
3334 int f1 = Left.evaluate(bdd, parameters);
3435 int f2 = Right.evaluate(bdd, parameters);
3536 int f = bdd.imp(f1, f2);
3637 bdd.ref(f);
37- bdd.deref(f1); bdd.deref(f2);
38+ bdd.deref(f1);
39+ bdd.deref(f2);
3840 return f;
3941 }
4042 }
4143
4244 class EqualityOperator extends BooleanBinaryOperator {
43- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
45+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
4446 int f1 = Left.evaluate(bdd, parameters);
4547 int f2 = Right.evaluate(bdd, parameters);
4648 int f = bdd.not(bdd.xor(f1, f2));
4749 bdd.ref(f);
48- bdd.deref(f1); bdd.deref(f2);
50+ bdd.deref(f1);
51+ bdd.deref(f2);
4952 return f;
5053 }
5154 }
5255
5356 class InequalityOperator extends BooleanBinaryOperator {
54- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
57+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
5558 int f1 = Left.evaluate(bdd, parameters);
5659 int f2 = Right.evaluate(bdd, parameters);
5760 int f = bdd.xor(f1, f2);
5861 bdd.ref(f);
59- bdd.deref(f1); bdd.deref(f2);
62+ bdd.deref(f1);
63+ bdd.deref(f2);
6064 return f;
6165 }
6266 }
@@ -66,13 +70,15 @@ abstract class BooleanTrinaryOperator extends BooleanOperator {
6670 }
6771
6872 class IfthenelseOperator extends BooleanTrinaryOperator {
69- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
70- int f1 = Left.evaluate(bdd, parameters);
73+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
74+ int f1 = Left.evaluate(bdd, parameters);
7175 int f2 = Middle.evaluate(bdd, parameters);
7276 int f3 = Right.evaluate(bdd, parameters);
7377 int f = bdd.ite(f1, f2, f3);
7478 bdd.ref(f);
75- bdd.deref(f1); bdd.deref(f2); bdd.deref(f3);
79+ bdd.deref(f1);
80+ bdd.deref(f2);
81+ bdd.deref(f3);
7682 return f;
7783 }
7884 }
@@ -82,45 +88,49 @@ abstract class BooleanMultinaryOperator extends BooleanOperator {
8288 }
8389
8490 class OrOperator extends BooleanMultinaryOperator {
85-
86- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
91+
92+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
8793 int f1 = ChildList.get(0).evaluate(bdd, parameters);
8894 int f2 = ChildList.get(1).evaluate(bdd, parameters);
8995 int f = bdd.or(f1, f2);
9096 bdd.ref(f);
91- bdd.deref(f1); bdd.deref(f2);
97+ bdd.deref(f1);
98+ bdd.deref(f2);
9299
93100 for (int i = 2; i < ChildList.size(); i++) {
94101 f1 = f;
95102 f2 = ChildList.get(i).evaluate(bdd, parameters);
96103 f = bdd.or(f1, f2);
97104 bdd.ref(f);
98- bdd.deref(f1); bdd.deref(f2);
105+ bdd.deref(f1);
106+ bdd.deref(f2);
99107 }
100108 return f;
101109 }
102110 }
103111
104112 class AndOperator extends BooleanMultinaryOperator {
105- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
113+ int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
106114 int f1 = ChildList.get(0).evaluate(bdd, parameters);
107115 int f2 = ChildList.get(1).evaluate(bdd, parameters);
108116 int f = bdd.and(f1, f2);
109117 bdd.ref(f);
110- bdd.deref(f1); bdd.deref(f2);
118+ bdd.deref(f1);
119+ bdd.deref(f2);
111120
112121 for (int i = 2; i < ChildList.size(); i++) {
113122 f1 = f;
114123 f2 = ChildList.get(i).evaluate(bdd, parameters);
115124 f = bdd.and(f1, f2);
116125 bdd.ref(f);
117- bdd.deref(f1); bdd.deref(f2);
126+ bdd.deref(f1);
127+ bdd.deref(f2);
118128 }
119129 return f;
120130 }
121131 }
122132
123-abstract class AtomicExpression extends Node{
133+abstract class AtomicExpression extends Node {
124134 }
125135
126136 abstract class Constant extends AtomicExpression {
@@ -128,11 +138,11 @@ abstract class Constant extends AtomicExpression {
128138
129139 class TrueValue extends Constant {
130140 int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
131-
141+
132142 int f = bdd.getOne();
133143 bdd.ref(f);
134144 return f;
135- }
145+ }
136146 }
137147
138148 class FalseValue extends Constant {
@@ -140,7 +150,7 @@ class FalseValue extends Constant {
140150 int f = bdd.getZero();
141151 bdd.ref(f);
142152 return f;
143- }
153+ }
144154 }
145155
146156 abstract class ComparisonOfValueAndValue extends AtomicExpression {
@@ -148,12 +158,10 @@ abstract class ComparisonOfValueAndValue extends AtomicExpression {
148158 int v2;
149159 }
150160
151-/* not used
152-abstract class ComparisonOfParameterAndParameter extends AtomicExpression {
153- int p1;
154- int p2;
155-}
156-*/
161+/*
162+ * not used abstract class ComparisonOfParameterAndParameter extends
163+ * AtomicExpression { int p1; int p2; }
164+ */
157165
158166 abstract class ComparisonOfParameterAndValue extends AtomicExpression {
159167 int p;
@@ -161,15 +169,10 @@ abstract class ComparisonOfParameterAndValue extends AtomicExpression {
161169 }
162170
163171 /*
164-class EqualityOfValueAndValue extends ComparisonOfValueAndValue {
165- int evaluate (BDD bdd, List<VariableAndBDD> parameters) {
166- if (v1 == v2)
167- return bdd.getOne();
168- else
169- return bdd.getZero();
170- }
171-}
172-*/
172+ * class EqualityOfValueAndValue extends ComparisonOfValueAndValue { int
173+ * evaluate (BDD bdd, List<VariableAndBDD> parameters) { if (v1 == v2) return
174+ * bdd.getOne(); else return bdd.getZero(); } }
175+ */
173176
174177 class EqualityOfParameterAndValue extends ComparisonOfParameterAndValue {
175178 int evaluate(BDD bdd, List<VariableAndBDD> parameters) {
@@ -178,10 +181,13 @@ class EqualityOfParameterAndValue extends ComparisonOfParameterAndValue {
178181 int[] var = parameters.get(this.p).var;
179182 for (int i = var.length - 1; i >= 0; i--) {
180183 if ((this.v & (0x01 << i)) > 0) {
181- int tmp = bdd.ref(bdd.and(res, var[i])); bdd.deref(res); res = tmp;
182- }
183- else {
184- int tmp = bdd.ref(bdd.and(res, bdd.not(var[i]))); bdd.deref(res); res = tmp;
184+ int tmp = bdd.ref(bdd.and(res, var[i]));
185+ bdd.deref(res);
186+ res = tmp;
187+ } else {
188+ int tmp = bdd.ref(bdd.and(res, bdd.not(var[i])));
189+ bdd.deref(res);
190+ res = tmp;
185191 }
186192 }
187193 bdd.ref(res);
--- a/src/v1/Outputer.java
+++ b/src/v1/Outputer.java
@@ -7,9 +7,9 @@ import java.io.OutputStreamWriter;
77 import java.util.List;
88
99 public class Outputer {
10-
10+
1111 BufferedWriter writer;
12-
12+
1313 Outputer(String filename) {
1414 this.writer = openFile(filename);
1515 }
@@ -20,42 +20,44 @@ public class Outputer {
2020 // default: standard output
2121 return new BufferedWriter(new OutputStreamWriter(System.out));
2222 }
23-
23+
2424 try {
2525 writer = new BufferedWriter(new FileWriter(filename));
2626 } catch (IOException e) {
27- //System.err.print(filename + " cannot be created.");
27+ // System.err.print(filename + " cannot be created.");
2828 // エラーを書き込めないので直接標準エラーへ
29- System.err.print("出力ファイル" + filename + "が作成できません.");
29+ System.err.print(Main.language == Main.Language.JP ? "出力ファイル"
30+ + filename + "が作成できません." : "Cannot create output file "
31+ + filename);
3032 System.exit(1);
3133 }
3234 return writer;
3335 }
34-
35- void outputResult(List<Testcase> testSet, InputFileData inputfiledata,
36- int randomSeed, String modelFile, String seedFile, String outputFile, int strength, int numOfIterations){
36+
37+ void outputResult(List<Testcase> testSet, InputFileData inputfiledata,
38+ int randomSeed, String modelFile, String seedFile,
39+ String outputFile, int strength, int numOfIterations) {
3740 try {
38- String firstline = "#SUCCESS" + "," + randomSeed + ","
39- + "i" + "," + (modelFile == null ? "" : modelFile) + ","
40- + "s" + "," + (seedFile == null ? "" : seedFile) + ","
41- + "o" + "," + (outputFile == null ? "" : outputFile) + ","
42- + "c" + "," + (strength < 0 ? "all" : strength) + ","
43- + "random" + "," + randomSeed + ","
44- + "repeat" + "," + numOfIterations + "\n"
45- ;
41+ String firstline = "#SUCCESS" + "," + randomSeed + "," + "i" + ","
42+ + (modelFile == null ? "" : modelFile) + "," + "s" + ","
43+ + (seedFile == null ? "" : seedFile) + "," + "o" + ","
44+ + (outputFile == null ? "" : outputFile) + "," + "c" + ","
45+ + (strength < 0 ? "all" : strength) + "," + "random" + ","
46+ + randomSeed + "," + "repeat" + "," + numOfIterations
47+ + "\n";
4648 this.writer.write(firstline);
47-
49+
4850 for (int i = 0; i < inputfiledata.parameterList.size(); i++) {
4951 if (i > 0)
5052 writer.write(",");
5153 writer.write(inputfiledata.parameterList.get(i).name);
5254 }
5355 writer.write("\n");
54-
56+
5557 for (Testcase test : testSet)
5658 test.print(writer, inputfiledata);
57-
58- //close
59+
60+ // close
5961 this.writer.close();
6062 } catch (IOException e) {
6163 System.err.print("Cannot write the file");
@@ -67,30 +69,27 @@ public class Outputer {
6769 InputFileData inputfiledata, String modelFile, String outputFile) {
6870 // TODO Auto-generated method stub
6971 try {
70- String firstline = "#SUCCESS" + "," + 0 + ","
71- + "i" + "," + (modelFile == null ? "" : modelFile) + ","
72- + "s" + "," + ","
73- + "o" + "," + (outputFile == null ? "" : outputFile) + ","
74- + "c" + "," + "all" + ","
75- + "random" + "," + 0 + ","
76- + "repeat" + "," + 1 + "\n"
77- ;
72+ String firstline = "#SUCCESS" + "," + 0 + "," + "i" + ","
73+ + (modelFile == null ? "" : modelFile) + "," + "s" + ","
74+ + "," + "o" + "," + (outputFile == null ? "" : outputFile)
75+ + "," + "c" + "," + "all" + "," + "random" + "," + 0 + ","
76+ + "repeat" + "," + 1 + "\n";
7877 this.writer.write(firstline);
79-
78+
8079 for (int i = 0; i < inputfiledata.parameterList.size(); i++) {
8180 if (i > 0)
8281 writer.write(",");
8382 writer.write(inputfiledata.parameterList.get(i).name);
8483 }
8584 writer.write("\n");
86-
85+
8786 for (Testcase test : testSet)
8887 test.print(writer, inputfiledata);
89-
90- //close
88+
89+ // close
9190 this.writer.close();
9291 } catch (IOException e) {
9392 System.err.print("Cannot write the file");
94- }
93+ }
9594 }
9695 }
--- a/src/v1/Parameter.java
+++ b/src/v1/Parameter.java
@@ -9,7 +9,7 @@ public class Parameter {
99 Parameter(String name) {
1010 this.name = name;
1111 }
12-
12+
1313 void addName(String name) {
1414 value_name.add(name);
1515 }
@@ -17,22 +17,36 @@ public class Parameter {
1717 // 値名の重複のチェック 重複していればエラー
1818 void check() {
1919 if (value_name.size() <= 0 || value_name.size() > Main.MAX_LEVEL) {
20- Error.printError("水準数に誤りがあります");
21- }
22- for (int i = 0; i < value_name.size() - 1; i++) {
23- for (int j = i+1; j < value_name.size(); j++) {
24- if (value_name.get(i).equals(value_name.get(j)))
25- Error.printError("水準名が重複しています");
26- }
20+ Error.printError(Main.language == Main.Language.JP ? "水準数に誤りがあります"
21+ : "Invalid number of values");
2722 }
23+
24+ /* 水準名の重複を禁止-> comment out */
25+ /*
26+ * for (int i = 0; i < value_name.size() - 1; i++) { for (int j = i+1; j
27+ * < value_name.size(); j++) { if
28+ * (value_name.get(i).equals(value_name.get(j)))
29+ * Error.printError(Main.language == Main.Language.JP ? "水準名が重複しています" :
30+ * "Overlap of parameter value name"); } }
31+ */
2832 }
29-
30- int getID(String str) throws NoValueNameException {
33+
34+ /*
35+ * int getID(String str) throws NoValueNameException { for (int i = 0; i <
36+ * value_name.size(); i++) { if (value_name.get(i).equals(str)) return i; }
37+ * throw new NoValueNameException(); }
38+ */
39+
40+ List<Integer> getID(String str) throws NoValueNameException {
41+ List<Integer> ids = new ArrayList<Integer>();
3142 for (int i = 0; i < value_name.size(); i++) {
3243 if (value_name.get(i).equals(str))
33- return i;
44+ ids.add(i);
3445 }
35- throw new NoValueNameException();
46+ if (ids.size() == 0)
47+ throw new NoValueNameException();
48+ else
49+ return ids;
3650 }
3751
3852 }
@@ -45,7 +59,7 @@ class PList extends LinkedList<Parameter> {
4559
4660 boolean checkNameDuplication() {
4761 for (int i = 0; i < this.size() - 1; i++)
48- for (int j = i + 1; j < this.size(); j++) {
62+ for (int j = i + 1; j < this.size(); j++) {
4963 if (this.get(i).name.equals(this.get(j).name)) {
5064 return true;
5165 }
@@ -55,7 +69,7 @@ class PList extends LinkedList<Parameter> {
5569
5670 int getID(String str) throws NoParameterNameException {
5771 for (int i = 0; i < this.size(); i++) {
58- if (this.get(i).name.equals(str))
72+ if (this.get(i).name.equals(str))
5973 return i;
6074 }
6175 throw new NoParameterNameException();
@@ -69,6 +83,7 @@ class NoParameterNameException extends Exception {
6983 */
7084 private static final long serialVersionUID = 6603037538755301907L;
7185 }
86+
7287 class NoValueNameException extends Exception {
7388
7489 /**
--- a/src/v1/ParameterModel.java
+++ b/src/v1/ParameterModel.java
@@ -13,5 +13,5 @@ public class ParameterModel {
1313 range[i] = (byte) plist.get(i).value_name.size();
1414 }
1515 }
16-
16+
1717 }
--- a/src/v1/Parse.java
+++ b/src/v1/Parse.java
@@ -6,50 +6,57 @@ import java.util.List;
66 public class Parse {
77 private TokenHandler t;
88 private PList parameterList;
9+
910 Parse(TokenHandler t, PList parameterList) {
10- this.t = t;
11+ this.t = t;
1112 this.parameterList = parameterList;
1213 }
13-
14+
1415 public Node parseExpression() {
1516 String token = t.peepToken();
1617 try {
1718 if (token == null) {
18- Error.printError("制約式に誤りがあります");
19+ Error.printError(Main.language == Main.Language.JP ? "制約式に誤りがあります"
20+ : "Invalid constraints");
1921 return null;
2022 } else if (token.equals("("))
2123 return expressionWithParentheses();
2224 else {
2325 // error
24- Error.printError("制約に'('がありません");
26+ Error.printError(Main.language == Main.Language.JP ? "制約に'('がありません"
27+ : "( expected in constraints");
2528 return null;
2629 }
2730 } catch (OutOfTokenStreamException e) {
28- Error.printError("制約式に誤りがあります");
31+ Error.printError(Main.language == Main.Language.JP ? "制約式に誤りがあります"
32+ : "Invalid constraints");
2933 return null;
3034 }
3135 }
32-
36+
3337 private Node expressionWithParentheses() throws OutOfTokenStreamException {
3438 Node res; // 戻り値
3539 String token = t.getToken();
3640 if (token.equals("(") == false) {
3741 // error
3842 // this block is unreachable
39- Error.printError("制約に'('がありません");
43+ Error.printError(Main.language == Main.Language.JP ? "制約に'('がありません"
44+ : "( expected in constraints");
4045 return null;
4146 }
4247 // expression :: (expression)
43- if (t.peepToken() == null)
48+ if (t.peepToken() == null)
4449 throw new OutOfTokenStreamException();
45- if (t.peepToken().equals("("))
50+ if (t.peepToken().equals("("))
4651 res = expressionWithParentheses();
47- else // otherwise
52+ else
53+ // otherwise
4854 res = expressionBody();
4955 // closed with ')' ?
5056 if (t.getToken().equals(")") == false) {
5157 // error
52- Error.printError("制約に')'がありません");
58+ Error.printError(Main.language == Main.Language.JP ? "制約に')'がありません"
59+ : ") expected in constraints");
5360 return null;
5461 }
5562 return res;
@@ -58,20 +65,20 @@ public class Parse {
5865 private Node expressionBody() throws OutOfTokenStreamException {
5966 // 演算子の次のトークンが ( か どうかで判断
6067 // case 1: ( <> (
61- // case 2: ( <> [ foo, ( <> foo
68+ // case 2: ( <> [ foo, ( <> foo
6269 String token = t.peepNextToken();
63- if (token == null)
70+ if (token == null)
6471 throw new OutOfTokenStreamException();
6572 if (token.equals("("))
6673 return boolExpression();
67- else
74+ else
6875 return atomExpression();
6976 }
7077
7178 private Node boolExpression() throws OutOfTokenStreamException {
7279 // boolean expression with operator
7380 String token = t.peepToken();
74- if (t.peepToken() == null)
81+ if (t.peepToken() == null)
7582 throw new OutOfTokenStreamException();
7683 if (token.equals("not"))
7784 return notExpression();
@@ -87,7 +94,7 @@ public class Parse {
8794 return ifExpression();
8895 else if (token.equals("ite"))
8996 return iteExpression();
90- else
97+ else
9198 Error.printError(token + " is not a valid operator");
9299 return null; // unreachable
93100 }
@@ -98,7 +105,7 @@ public class Parse {
98105 res.Child = parseExpression();
99106 return res;
100107 }
101-
108+
102109 private Node equalityExpression() throws OutOfTokenStreamException {
103110 BooleanBinaryOperator res = new EqualityOperator();
104111 t.getToken();
@@ -114,17 +121,17 @@ public class Parse {
114121 res.Right = parseExpression();
115122 return res;
116123 }
117-
124+
118125 private Node orExpression() throws OutOfTokenStreamException {
119126 BooleanMultinaryOperator res = new OrOperator();
120127 t.getToken();
121128 res.ChildList.add(parseExpression());
122129 res.ChildList.add(parseExpression());
123- if (t.peepToken() == null)
130+ if (t.peepToken() == null)
124131 throw new OutOfTokenStreamException();
125132 while (t.peepToken().equals(")") == false) {
126133 res.ChildList.add(parseExpression());
127- if (t.peepToken() == null)
134+ if (t.peepToken() == null)
128135 throw new OutOfTokenStreamException();
129136 }
130137 return res;
@@ -135,16 +142,16 @@ public class Parse {
135142 t.getToken();
136143 res.ChildList.add(parseExpression());
137144 res.ChildList.add(parseExpression());
138- if (t.peepToken() == null)
145+ if (t.peepToken() == null)
139146 throw new OutOfTokenStreamException();
140147 while (t.peepToken().equals(")") == false) {
141148 res.ChildList.add(parseExpression());
142- if (t.peepToken() == null)
149+ if (t.peepToken() == null)
143150 throw new OutOfTokenStreamException();
144151 }
145152 return res;
146153 }
147-
154+
148155 private Node ifExpression() throws OutOfTokenStreamException {
149156 BooleanBinaryOperator res = new IfOperator();
150157 t.getToken();
@@ -152,7 +159,7 @@ public class Parse {
152159 res.Right = parseExpression();
153160 return res;
154161 }
155-
162+
156163 private Node iteExpression() throws OutOfTokenStreamException {
157164 BooleanTrinaryOperator res = new IfthenelseOperator();
158165 t.getToken();
@@ -161,53 +168,55 @@ public class Parse {
161168 res.Right = parseExpression();
162169 return res;
163170 }
164-
165- private Node atomExpression() throws OutOfTokenStreamException {
171+
172+ private Node atomExpression() throws OutOfTokenStreamException {
166173 // 次のトークンをチェック: 演算子でないといけない
167174 String token = t.getToken();
168- if (token.equals("=="))
175+ if (token.equals("=="))
169176 return equalityAtomExpression();
170- else if (token.equals("<>"))
177+ else if (token.equals("<>"))
171178 return inequalityAtomExpression();
172- else
173- Error.printError("制約式に == か <> が必要です");
179+ else
180+ Error.printError(Main.language == Main.Language.JP ? "制約式に == か <> が必要です"
181+ : "== or <> expected in constraints");
174182 return null;
175183 }
176184
177185 private Node inequalityAtomExpression() throws OutOfTokenStreamException {
178186 BooleanUnaryOperator res = new NotOperator();
179- res.Child = equalityAtomExpression();
187+ res.Child = equalityAtomExpression();
180188 return res;
181189 }
182190
183191 private Node equalityAtomExpression() throws OutOfTokenStreamException {
184192 // case 1 val1 val2
185- // case 2 val1 [para1]
193+ // case 2 val1 [para1]
186194 // case 3 [para1] val1
187195 // case 4 [para1] [para2]
188196 String val1, val2, para1, para2;
189197 String token1, token2;
190-
198+
191199 token1 = t.peepToken();
192200 token2 = t.peepNextToken();
193-
194- if (token1 == null || token2 == null)
201+
202+ if (token1 == null || token2 == null)
195203 throw new OutOfTokenStreamException();
196-
197- //case 1
204+
205+ // case 1
198206 if ((token1.equals("[") == false) && (token2.equals("[") == false)) {
199- val1 = t.getToken();
207+ val1 = t.getToken();
200208 val2 = t.getToken();
201209 return compareValueAndValue(val1, val2);
202210 }
203-
204- //case 2
211+
212+ // case 2
205213 if ((token1.equals("[") == false) && (token2.equals("[") == true)) {
206214 val1 = t.getToken();
207215 t.getToken(); // must be [
208216 para1 = t.getToken();
209217 if (t.getToken().equals("]") == false) {
210- Error.printError("制約式に]が必要です");
218+ Error.printError(Main.language == Main.Language.JP ? "制約式に]が必要です"
219+ : "] expected in constraints");
211220 }
212221 return compareParameterAndValue(para1, val1);
213222 }
@@ -216,59 +225,79 @@ public class Parse {
216225 t.getToken(); // must be "["
217226 para1 = t.getToken();
218227 if (t.getToken().equals("]") == false) {
219- Error.printError("制約式に]が必要です");
228+ Error.printError(Main.language == Main.Language.JP ? "制約式に]が必要です"
229+ : "] expected in constraints");
220230 }
221231 token1 = t.peepToken();
222- if (token1 == null)
232+ if (token1 == null)
223233 throw new OutOfTokenStreamException();
224-
234+
225235 // case 3
226236 if (token1.equals("[") == false) {
227237 val1 = t.getToken();
228238 return compareParameterAndValue(para1, val1);
229239 }
230-
240+
231241 // case 4
232242 t.getToken(); // must be [
233243 para2 = t.getToken();
234244 if (t.getToken().equals("]") == false) {
235- Error.printError("制約式に]が必要です");
245+ Error.printError(Main.language == Main.Language.JP ? "制約式に]が必要です"
246+ : "] expected in constraints");
236247 }
237248 return compareParameterAndParameter(para1, para2);
238249 }
239-
250+
240251 private Node compareValueAndValue(String val1, String val2) {
241- if (val1.equals(val2))
252+ if (val1.equals(val2))
242253 return new TrueValue();
243- else
254+ else
244255 return new FalseValue();
245256 }
246-
257+
247258 private Node compareParameterAndValue(String para, String val) {
248259 int parameterID = 0;
249260 Parameter p;
250- int value = 0;
261+ // int value = 0;
262+ List<Integer> valueIDs = null;
263+
251264 // 因子名が正しいかチェック
252265 try {
253266 parameterID = parameterList.getID(para);
254267 } catch (NoParameterNameException e) {
255- Error.printError("制約中の因子名に誤りがあります");
268+ Error.printError(Main.language == Main.Language.JP ? "制約中の因子名に誤りがあります"
269+ : "Invalid parameter name in constraints");
256270 }
257271 p = parameterList.get(parameterID);
258-
272+
259273 // 値名が正しいかチェック
260274 try {
261- value = p.getID(val);
275+ valueIDs = p.getID(val);
262276 } catch (NoValueNameException e) {
263- Error.printError("制約中の値名に誤りがあります");
264- }
265-
266- ComparisonOfParameterAndValue res = new EqualityOfParameterAndValue();
267- res.p = parameterID;
268- res.v = value;
269- return res;
277+ Error.printError(Main.language == Main.Language.JP ? "制約中の値名に誤りがあります"
278+ : "Invalid parameter value in constraints");
279+ }
280+
281+ // 値名に重複なし
282+ if (valueIDs.size() == 1) {
283+ ComparisonOfParameterAndValue res = new EqualityOfParameterAndValue();
284+ res.p = parameterID;
285+ res.v = valueIDs.get(0);
286+ return res;
287+ }
288+ // 値名に重複あり
289+ else {
290+ BooleanMultinaryOperator res = new OrOperator();
291+ for (Integer vid : valueIDs) {
292+ ComparisonOfParameterAndValue child = new EqualityOfParameterAndValue();
293+ child.p = parameterID;
294+ child.v = vid;
295+ res.ChildList.add(child);
296+ }
297+ return res;
298+ }
270299 }
271-
300+
272301 private Node compareParameterAndParameter(String para1, String para2) {
273302 int parameterID1 = 0;
274303 int parameterID2 = 0;
@@ -278,55 +307,243 @@ public class Parse {
278307 parameterID1 = parameterList.getID(para1);
279308 parameterID2 = parameterList.getID(para2);
280309 } catch (NoParameterNameException e) {
281- Error.printError("制約中の因子名に誤りがあります");
310+ Error.printError(Main.language == Main.Language.JP ? "制約中の因子名に誤りがあります"
311+ : "Invalid parameter name in constraints");
282312 }
283313 p1 = parameterList.get(parameterID1);
284314 p2 = parameterList.get(parameterID2);
285-
286- List<String> commonValueName = new ArrayList<String>(p1.value_name);
287- commonValueName.retainAll(p2.value_name);
315+
316+ // 値名が一致するペアを数える
317+ int count = 0;
318+ for (String valName1 : p1.value_name) {
319+ for (String valName2 : p2.value_name) {
320+ if (valName1.equals(valName2))
321+ count++;
322+ }
323+ }
288324
289325 // case 1: 値名で同じものがない
290- if (commonValueName.size() == 0)
326+ if (count == 0)
291327 return new FalseValue();
292-
328+
293329 // case 2: 値名で同じものがひとつ
294- if (commonValueName.size() == 1) {
295- String valueName = commonValueName.get(0);
296- BooleanMultinaryOperator res = new AndOperator();
297- ComparisonOfParameterAndValue sub1 = new EqualityOfParameterAndValue();
298- ComparisonOfParameterAndValue sub2 = new EqualityOfParameterAndValue();
299- try {
300- sub1.p = parameterID1;
301- sub1.v = p1.getID(valueName);
302- sub2.p = parameterID2;
303- sub2.v = p2.getID(valueName);
304- } catch (NoValueNameException e) {
305- Error.printError("内部エラー");
330+ if (count == 1) {
331+ for (String valName1 : p1.value_name) {
332+ for (String valName2 : p2.value_name) {
333+ if (valName1.equals(valName2)) {
334+ BooleanMultinaryOperator res = new AndOperator();
335+ ComparisonOfParameterAndValue sub1 = new EqualityOfParameterAndValue();
336+ ComparisonOfParameterAndValue sub2 = new EqualityOfParameterAndValue();
337+ try {
338+ sub1.p = parameterID1;
339+ sub1.v = p1.getID(valName1).get(0).byteValue(); // .size()
340+ // should
341+ // be
342+ // 1
343+ sub2.p = parameterID2;
344+ sub2.v = p2.getID(valName2).get(0).byteValue();
345+ } catch (NoValueNameException e) {
346+ Error.printError("Inner error");
347+ }
348+ res.ChildList.add(sub1);
349+ res.ChildList.add(sub2);
350+ return res;
351+ }
352+ }
306353 }
307- res.ChildList.add(sub1);
308- res.ChildList.add(sub2);
309- return res;
310354 }
311-
355+
312356 // case 3: 値名で同じものが2個以上
313357 BooleanMultinaryOperator res = new OrOperator();
314- for (String valueName: commonValueName) {
315- BooleanMultinaryOperator child = new AndOperator();
316- ComparisonOfParameterAndValue sub1 = new EqualityOfParameterAndValue();
317- ComparisonOfParameterAndValue sub2 = new EqualityOfParameterAndValue();
318- try {
319- sub1.p = parameterID1;
320- sub1.v = p1.getID(valueName);
321- sub2.p = parameterID2;
322- sub2.v = p2.getID(valueName);
323- } catch (NoValueNameException e) {
324- Error.printError("内部エラー");
358+ for (int vid1 = 0; vid1 < p1.value_name.size(); vid1++) {
359+ for (int vid2 = 0; vid2 < p2.value_name.size(); vid2++) {
360+ if (p1.value_name.get(vid1).equals(p2.value_name.get(vid2))) {
361+ BooleanMultinaryOperator child = new AndOperator();
362+ ComparisonOfParameterAndValue sub1 = new EqualityOfParameterAndValue();
363+ ComparisonOfParameterAndValue sub2 = new EqualityOfParameterAndValue();
364+ sub1.p = parameterID1;
365+ sub1.v = vid1;
366+ sub2.p = parameterID2;
367+ sub2.v = vid2;
368+ child.ChildList.add(sub1);
369+ child.ChildList.add(sub2);
370+ res.ChildList.add(child);
371+ }
325372 }
326- child.ChildList.add(sub1);
327- child.ChildList.add(sub2);
328- res.ChildList.add(child);
329373 }
330374 return res;
331375 }
376+
332377 }
378+
379+/*
380+ * old one public class Parse { private TokenHandler t; private PList
381+ * parameterList; Parse(TokenHandler t, PList parameterList) { this.t = t;
382+ * this.parameterList = parameterList; }
383+ *
384+ * public Node parseExpression() { String token = t.peepToken(); try { if (token
385+ * == null) { Error.printError(Main.language == Main.Language.JP ? "制約式に誤りがあります"
386+ * : "Invalid constraints"); return null; } else if (token.equals("(")) return
387+ * expressionWithParentheses(); else { // error Error.printError(Main.language
388+ * == Main.Language.JP ? "制約に'('がありません" : "( expected in constraints"); return
389+ * null; } } catch (OutOfTokenStreamException e) {
390+ * Error.printError(Main.language == Main.Language.JP ? "制約式に誤りがあります" :
391+ * "Invalid constraints"); return null; } }
392+ *
393+ * private Node expressionWithParentheses() throws OutOfTokenStreamException {
394+ * Node res; // 戻り値 String token = t.getToken(); if (token.equals("(") == false)
395+ * { // error // this block is unreachable Error.printError(Main.language ==
396+ * Main.Language.JP ? "制約に'('がありません" : "( expected in constraints"); return
397+ * null; } // expression :: (expression) if (t.peepToken() == null) throw new
398+ * OutOfTokenStreamException(); if (t.peepToken().equals("(")) res =
399+ * expressionWithParentheses(); else // otherwise res = expressionBody(); //
400+ * closed with ')' ? if (t.getToken().equals(")") == false) { // error
401+ * Error.printError(Main.language == Main.Language.JP ? "制約に')'がありません" :
402+ * ") expected in constraints"); return null; } return res; }
403+ *
404+ * private Node expressionBody() throws OutOfTokenStreamException { //
405+ * 演算子の次のトークンが ( か どうかで判断 // case 1: ( <> ( // case 2: ( <> [ foo, ( <> foo
406+ * String token = t.peepNextToken(); if (token == null) throw new
407+ * OutOfTokenStreamException(); if (token.equals("(")) return boolExpression();
408+ * else return atomExpression(); }
409+ *
410+ * private Node boolExpression() throws OutOfTokenStreamException { // boolean
411+ * expression with operator String token = t.peepToken(); if (t.peepToken() ==
412+ * null) throw new OutOfTokenStreamException(); if (token.equals("not")) return
413+ * notExpression(); else if (token.equals("==")) return equalityExpression();
414+ * else if (token.equals("<>")) return inequalityExpression(); else if
415+ * (token.equals("or")) return orExpression(); else if (token.equals("and"))
416+ * return andExpression(); else if (token.equals("if")) return ifExpression();
417+ * else if (token.equals("ite")) return iteExpression(); else
418+ * Error.printError(token + " is not a valid operator"); return null; //
419+ * unreachable }
420+ *
421+ * private Node notExpression() throws OutOfTokenStreamException {
422+ * BooleanUnaryOperator res = new NotOperator(); t.getToken(); res.Child =
423+ * parseExpression(); return res; }
424+ *
425+ * private Node equalityExpression() throws OutOfTokenStreamException {
426+ * BooleanBinaryOperator res = new EqualityOperator(); t.getToken(); res.Left =
427+ * parseExpression(); res.Right = parseExpression(); return res; }
428+ *
429+ * private Node inequalityExpression() throws OutOfTokenStreamException {
430+ * BooleanBinaryOperator res = new InequalityOperator(); t.getToken(); res.Left
431+ * = parseExpression(); res.Right = parseExpression(); return res; }
432+ *
433+ * private Node orExpression() throws OutOfTokenStreamException {
434+ * BooleanMultinaryOperator res = new OrOperator(); t.getToken();
435+ * res.ChildList.add(parseExpression()); res.ChildList.add(parseExpression());
436+ * if (t.peepToken() == null) throw new OutOfTokenStreamException(); while
437+ * (t.peepToken().equals(")") == false) { res.ChildList.add(parseExpression());
438+ * if (t.peepToken() == null) throw new OutOfTokenStreamException(); } return
439+ * res; }
440+ *
441+ * private Node andExpression() throws OutOfTokenStreamException {
442+ * BooleanMultinaryOperator res = new AndOperator(); t.getToken();
443+ * res.ChildList.add(parseExpression()); res.ChildList.add(parseExpression());
444+ * if (t.peepToken() == null) throw new OutOfTokenStreamException(); while
445+ * (t.peepToken().equals(")") == false) { res.ChildList.add(parseExpression());
446+ * if (t.peepToken() == null) throw new OutOfTokenStreamException(); } return
447+ * res; }
448+ *
449+ * private Node ifExpression() throws OutOfTokenStreamException {
450+ * BooleanBinaryOperator res = new IfOperator(); t.getToken(); res.Left =
451+ * parseExpression(); res.Right = parseExpression(); return res; }
452+ *
453+ * private Node iteExpression() throws OutOfTokenStreamException {
454+ * BooleanTrinaryOperator res = new IfthenelseOperator(); t.getToken(); res.Left
455+ * = parseExpression(); res.Middle = parseExpression(); res.Right =
456+ * parseExpression(); return res; }
457+ *
458+ * private Node atomExpression() throws OutOfTokenStreamException { //
459+ * 次のトークンをチェック: 演算子でないといけない String token = t.getToken(); if (token.equals("=="))
460+ * return equalityAtomExpression(); else if (token.equals("<>")) return
461+ * inequalityAtomExpression(); else Error.printError(Main.language ==
462+ * Main.Language.JP ? "制約式に == か <> が必要です" :
463+ * "== or <> expected in constraints"); return null; }
464+ *
465+ * private Node inequalityAtomExpression() throws OutOfTokenStreamException {
466+ * BooleanUnaryOperator res = new NotOperator(); res.Child =
467+ * equalityAtomExpression(); return res; }
468+ *
469+ * private Node equalityAtomExpression() throws OutOfTokenStreamException { //
470+ * case 1 val1 val2 // case 2 val1 [para1] // case 3 [para1] val1 // case 4
471+ * [para1] [para2] String val1, val2, para1, para2; String token1, token2;
472+ *
473+ * token1 = t.peepToken(); token2 = t.peepNextToken();
474+ *
475+ * if (token1 == null || token2 == null) throw new OutOfTokenStreamException();
476+ *
477+ * //case 1 if ((token1.equals("[") == false) && (token2.equals("[") == false))
478+ * { val1 = t.getToken(); val2 = t.getToken(); return compareValueAndValue(val1,
479+ * val2); }
480+ *
481+ * //case 2 if ((token1.equals("[") == false) && (token2.equals("[") == true)) {
482+ * val1 = t.getToken(); t.getToken(); // must be [ para1 = t.getToken(); if
483+ * (t.getToken().equals("]") == false) { Error.printError(Main.language ==
484+ * Main.Language.JP ? "制約式に]が必要です" : "] expected in constraints"); } return
485+ * compareParameterAndValue(para1, val1); }
486+ *
487+ * // case 3, 4 t.getToken(); // must be "[" para1 = t.getToken(); if
488+ * (t.getToken().equals("]") == false) { Error.printError(Main.language ==
489+ * Main.Language.JP ? "制約式に]が必要です" : "] expected in constraints"); } token1 =
490+ * t.peepToken(); if (token1 == null) throw new OutOfTokenStreamException();
491+ *
492+ * // case 3 if (token1.equals("[") == false) { val1 = t.getToken(); return
493+ * compareParameterAndValue(para1, val1); }
494+ *
495+ * // case 4 t.getToken(); // must be [ para2 = t.getToken(); if
496+ * (t.getToken().equals("]") == false) { Error.printError(Main.language ==
497+ * Main.Language.JP ? "制約式に]が必要です" : "] expected in constraints"); } return
498+ * compareParameterAndParameter(para1, para2); }
499+ *
500+ * private Node compareValueAndValue(String val1, String val2) { if
501+ * (val1.equals(val2)) return new TrueValue(); else return new FalseValue(); }
502+ *
503+ * private Node compareParameterAndValue(String para, String val) { int
504+ * parameterID = 0; Parameter p; int value = 0; // 因子名が正しいかチェック try {
505+ * parameterID = parameterList.getID(para); } catch (NoParameterNameException e)
506+ * { Error.printError(Main.language == Main.Language.JP ? "制約中の因子名に誤りがあります" :
507+ * "Invalid parameter name in constraints"); } p =
508+ * parameterList.get(parameterID);
509+ *
510+ * // 値名が正しいかチェック try { value = p.getID(val); } catch (NoValueNameException e) {
511+ * Error.printError(Main.language == Main.Language.JP ? "制約中の値名に誤りがあります" :
512+ * "Invalid parameter value in constraints"); }
513+ *
514+ * ComparisonOfParameterAndValue res = new EqualityOfParameterAndValue(); res.p
515+ * = parameterID; res.v = value; return res; }
516+ *
517+ * private Node compareParameterAndParameter(String para1, String para2) { int
518+ * parameterID1 = 0; int parameterID2 = 0; Parameter p1, p2; // 因子名が正しいかチェック try
519+ * { parameterID1 = parameterList.getID(para1); parameterID2 =
520+ * parameterList.getID(para2); } catch (NoParameterNameException e) {
521+ * Error.printError(Main.language == Main.Language.JP ? "制約中の因子名に誤りがあります" :
522+ * "Invalid parameter name in constraints"); } p1 =
523+ * parameterList.get(parameterID1); p2 = parameterList.get(parameterID2);
524+ *
525+ * List<String> commonValueName = new ArrayList<String>(p1.value_name);
526+ * commonValueName.retainAll(p2.value_name);
527+ *
528+ * // case 1: 値名で同じものがない if (commonValueName.size() == 0) return new
529+ * FalseValue();
530+ *
531+ * // case 2: 値名で同じものがひとつ if (commonValueName.size() == 1) { String valueName =
532+ * commonValueName.get(0); BooleanMultinaryOperator res = new AndOperator();
533+ * ComparisonOfParameterAndValue sub1 = new EqualityOfParameterAndValue();
534+ * ComparisonOfParameterAndValue sub2 = new EqualityOfParameterAndValue(); try {
535+ * sub1.p = parameterID1; sub1.v = p1.getID(valueName); sub2.p = parameterID2;
536+ * sub2.v = p2.getID(valueName); } catch (NoValueNameException e) {
537+ * Error.printError("Inner error"); } res.ChildList.add(sub1);
538+ * res.ChildList.add(sub2); return res; }
539+ *
540+ * // case 3: 値名で同じものが2個以上 BooleanMultinaryOperator res = new OrOperator(); for
541+ * (String valueName: commonValueName) { BooleanMultinaryOperator child = new
542+ * AndOperator(); ComparisonOfParameterAndValue sub1 = new
543+ * EqualityOfParameterAndValue(); ComparisonOfParameterAndValue sub2 = new
544+ * EqualityOfParameterAndValue(); try { sub1.p = parameterID1; sub1.v =
545+ * p1.getID(valueName); sub2.p = parameterID2; sub2.v = p2.getID(valueName); }
546+ * catch (NoValueNameException e) { Error.printError("Inner error"); }
547+ * child.ChildList.add(sub1); child.ChildList.add(sub2);
548+ * res.ChildList.add(child); } return res; } }
549+ */
--- a/src/v1/TestcaseHandler.java
+++ b/src/v1/TestcaseHandler.java
@@ -8,7 +8,6 @@ package v1;
88 *
99 */
1010
11-
1211 import java.io.BufferedWriter;
1312 import java.io.IOException;
1413 import java.util.LinkedList;
@@ -16,19 +15,20 @@ import java.util.List;
1615
1716 public class TestcaseHandler {
1817 final int numOfParameters;
18+
1919 TestcaseHandler(int numOfParameters) {
2020 this.numOfParameters = numOfParameters;
2121 }
22-
22+
2323 Testcase getTestcase() {
2424 return new Testcase(numOfParameters);
2525 }
2626 }
2727
2828 class Testcase {
29- byte[] value; // 0..level-1, or <0 (wildcard)
30-
31- //これを他から読んでるとまずいかも?
29+ byte[] value; // 0..level-1, or <0 (wildcard)
30+
31+ // これを他から読んでるとまずいかも?
3232 Testcase(int n) {
3333 this.value = new byte[n];
3434 }
@@ -44,16 +44,16 @@ class Testcase {
4444 byte get(int parameter) {
4545 return value[parameter];
4646 }
47-
47+
4848 int getint(int parameter) {
4949 return (int) value[parameter];
5050 }
51-
51+
5252 void quantify() {
53- for (int i = 0; i < this.value.length; i++)
53+ for (int i = 0; i < this.value.length; i++)
5454 this.value[i] = -1;
5555 }
56-
56+
5757 Testcase makeClone() {
5858 Testcase newtest = new Testcase(this.value.length);
5959 for (int i = 0; i < newtest.value.length; i++) {
@@ -61,58 +61,64 @@ class Testcase {
6161 }
6262 return newtest;
6363 }
64-
64+
6565 void print() {
66- for (int i = 0; i < value.length; i++)
66+ for (int i = 0; i < value.length; i++)
6767 System.err.print(value[i] + ",");
6868 System.err.println();
6969 }
7070
71- //TODO Outputer.java に移動
72- void print(BufferedWriter writer, InputFileData inputfiledata) throws IOException {
73- for (int i = 0; i < value.length; i++)
74- writer.write((i == 0 ? "": ",") + inputfiledata.parameterList.get(i).value_name.get(value[i]));
71+ // TODO Outputer.java に移動
72+ void print(BufferedWriter writer, InputFileData inputfiledata)
73+ throws IOException {
74+ for (int i = 0; i < value.length; i++)
75+ writer.write((i == 0 ? "" : ",")
76+ + inputfiledata.parameterList.get(i).value_name
77+ .get(value[i]));
7578 writer.write("\n");
7679 }
7780
78- // tupleを重ねる
79- // return true if a tuple is superimposed
80- // 重ねた時に禁則に違反することあり->チェックする
81- boolean superimpose(Testcase tuple, ConstraintHandler h) {
82- Testcase tmp = this.makeClone();
83- if (tmp.superimpose(tuple) == false)
84- return false;
85- if (h.isPossible(tmp) == false)
86- return false;
87- return this.superimpose(tuple);
88- // must be true;
89- }
90-
9181 // tupleを重ねる
9282 // return true if a tuple is superimposed
93- // 重ねた時に禁則に違反することあり->チェックしない
83+ // 重ねた時に禁則に違反することあり->チェックする
84+ boolean superimpose(Testcase tuple, ConstraintHandler h) {
85+ Testcase tmp = this.makeClone();
86+ if (tmp.superimpose(tuple) == false)
87+ return false;
88+ if (h.isPossible(tmp) == false)
89+ return false;
90+ return this.superimpose(tuple);
91+ // must be true;
92+ }
93+
94+ // tupleを重ねる
95+ // return true if a tuple is superimposed
96+ // 重ねた時に禁則に違反することあり->チェックしない
9497 private boolean superimpose(Testcase tuple) {
9598 // TODO Auto-generated method stu
96- for (int i = 0 ; i < value.length; i++) {
97- if (value[i] < 0 || tuple.value[i] < 0) continue;
98- if (value[i] == tuple.value[i]) continue;
99+ for (int i = 0; i < value.length; i++) {
100+ if (value[i] < 0 || tuple.value[i] < 0)
101+ continue;
102+ if (value[i] == tuple.value[i])
103+ continue;
99104 return false;
100105 }
101106
102- for (int i = 0 ; i < value.length; i++) {
107+ for (int i = 0; i < value.length; i++) {
103108 if (value[i] < 0)
104109 this.set(i, tuple.get(i));
105110 }
106111 return true;
107- }
112+ }
108113 }
109114
110115 class Testsuite {
111116 List<Testcase> test;
117+
112118 Testsuite() {
113119 test = new LinkedList<Testcase>();
114120 }
115-
121+
116122 void add(Testcase newtest) {
117123 this.test.add(newtest);
118124 }
--- a/src/v1/TokenHandler.java
+++ b/src/v1/TokenHandler.java
@@ -5,10 +5,11 @@ import java.util.List;
55 public class TokenHandler {
66 final List<String> tokenList;
77 int index = 0;
8-
8+
99 TokenHandler(List<String> tokenList) {
1010 this.tokenList = tokenList;
1111 }
12+
1213 // 次のToken を取り出す
1314 String getToken() throws OutOfTokenStreamException {
1415 if (index >= tokenList.size())
@@ -16,14 +17,16 @@ public class TokenHandler {
1617 String str = tokenList.get(index++);
1718 return str;
1819 }
20+
1921 // 次のToken を見る.取り出さない
20- String peepToken() {
22+ String peepToken() {
2123 if (index >= tokenList.size())
2224 return null;
2325 return tokenList.get(index);
2426 }
27+
2528 // 次の次のToken を見る.取り出さない
26- String peepNextToken() {
29+ String peepNextToken() {
2730 if (index + 1 >= tokenList.size())
2831 return null;
2932 return tokenList.get(index + 1);