1 | PROBLEM MultiOutputMultiplier
|
---|
2 |
|
---|
3 | CODE <<
|
---|
4 | const int N = 4;
|
---|
5 | class State { public bool[] x1; public bool[] x2; public bool[] output; }
|
---|
6 | private void GenerateProblemData(int n, out bool[][] a, out bool[][] b, out bool[][] expectedOutput) {
|
---|
7 | var nConfigurations = (int)Math.Pow(2, n);
|
---|
8 | var e = from i in Enumerable.Range(0, nConfigurations)
|
---|
9 | from j in Enumerable.Range(0, i+1)
|
---|
10 | select new {a = ToBitArray(N, i), b = ToBitArray(N, j), res = ToBitArray(2*N, i*j) };
|
---|
11 |
|
---|
12 | a = e.Select(x=>x.a).ToArray();
|
---|
13 | b = e.Select(x=>x.b).ToArray();
|
---|
14 | expectedOutput = e.Select(x=>x.res).ToArray();
|
---|
15 | }
|
---|
16 |
|
---|
17 | private bool[] ToBitArray(int n, int x) {
|
---|
18 | var b = new bool[n];
|
---|
19 | for(int i=0; i<n; i++) {
|
---|
20 | b[n - i - 1] = (x % 2) == 0;
|
---|
21 | x = x / 2;
|
---|
22 | }
|
---|
23 | if(x>0) throw new ArgumentException();
|
---|
24 | return b;
|
---|
25 | }
|
---|
26 | >>
|
---|
27 |
|
---|
28 | NONTERMINALS
|
---|
29 | Expr<<State state, out bool res>>.
|
---|
30 | Assign<<State state, out bool res>>.
|
---|
31 | AND<<State state, out bool res>>.
|
---|
32 | AND1<<State state, out bool res>>.
|
---|
33 | XOR<<State state, out bool res>>.
|
---|
34 | OR<<State state, out bool res>>.
|
---|
35 |
|
---|
36 |
|
---|
37 | TERMINALS
|
---|
38 | InputA<<out int id>>
|
---|
39 | CONSTRAINTS
|
---|
40 | id IN SET << Enumerable.Range(0, N) >>
|
---|
41 | .
|
---|
42 |
|
---|
43 | InputB<<out int id>>
|
---|
44 | CONSTRAINTS
|
---|
45 | id IN SET << Enumerable.Range(0, N) >>
|
---|
46 | .
|
---|
47 |
|
---|
48 | Output<<out int id>>
|
---|
49 | CONSTRAINTS
|
---|
50 | id IN SET << Enumerable.Range(0, 2 * N) >>
|
---|
51 | .
|
---|
52 |
|
---|
53 | RULES
|
---|
54 | Expr<<State state, out bool res>> = LOCAL << int id; >>
|
---|
55 | Assign<<state, out res>>
|
---|
56 | | AND<<state, out res>>
|
---|
57 | | AND1<<state, out res>>
|
---|
58 | | XOR<<state, out res>>
|
---|
59 | | OR<<state, out res>>
|
---|
60 | | InputA<<out id>> SEM<< res = state.x1[id]; >>
|
---|
61 | | InputB<<out id>> SEM<< res = state.x2[id]; >>
|
---|
62 | | Output<<out id>> SEM<< res = state.output[id]; >>
|
---|
63 | .
|
---|
64 |
|
---|
65 | Assign<<State state, out bool res>> = LOCAL << int outId; >>
|
---|
66 | Output<<out outId>> Expr<<state, out res>> SEM<< state.output[outId] = res; >>
|
---|
67 | .
|
---|
68 |
|
---|
69 | AND<<State state, out bool res>> = LOCAL << bool resA, resB; >>
|
---|
70 | Expr<<state, out resA>> Expr<<state, out resB>> SEM << res = resA & resB; >>
|
---|
71 | .
|
---|
72 | AND1<<State state, out bool res>> = LOCAL << bool resA, resB; >>
|
---|
73 | Expr<<state, out resA>> Expr<<state, out resB>> SEM << res = resA & !resB; >>
|
---|
74 | .
|
---|
75 | XOR<<State state, out bool res>> = LOCAL << bool resA, resB; >>
|
---|
76 | Expr<<state, out resA>> Expr<<state, out resB>> SEM << res = resA ^ !resB; >>
|
---|
77 | .
|
---|
78 | OR<<State state, out bool res>> = LOCAL << bool resA, resB; >>
|
---|
79 | Expr<<state, out resA>> Expr<<state, out resB>> SEM << res = resA | resB; >>
|
---|
80 | .
|
---|
81 |
|
---|
82 | MINIMIZE
|
---|
83 | <<
|
---|
84 | bool[][] a, b, expectedOutput;
|
---|
85 | GenerateProblemData(N, out a, out b, out expectedOutput);
|
---|
86 |
|
---|
87 | int sumErr = 0;
|
---|
88 | for(int i=0; i<expectedOutput.Length; i++) {
|
---|
89 | bool tmp;
|
---|
90 | // evaluate tree for inputs a and b
|
---|
91 | var state = new State();
|
---|
92 | state.x1 = a[i]; state.x2 = b[i]; state.output = new bool[2*N];
|
---|
93 | Expr(state, out tmp);
|
---|
94 |
|
---|
95 | // count incorrect bits
|
---|
96 | for(int j=0;j<state.output.Length;j++) {
|
---|
97 | if(state.output[j] != expectedOutput[i][j]) sumErr++;
|
---|
98 | }
|
---|
99 | }
|
---|
100 | return (double)sumErr;
|
---|
101 | >>
|
---|
102 | END MultiOutputMultiplier.
|
---|