BuildEqualityTable(IList <T> left, IList <T> right, IEqualityComparer <T> comparer)
        {
            BitArrayND eq = new BitArrayND(left.Count, right.Count);

            for (int l = 0; l < left.Count; l++)
            {
                for (int r = 0; r < right.Count; r++)
                {
                    eq [l, r] = comparer.Equals(left[l], right[r]);
                }
            }
            return(eq);
        }
        CountDiagonal(BitArrayND eq, int x, int y, int xLen, int yLen)
        {
            int count = 0;

            for (
                int i = x, j = y;
                i < xLen && j < yLen && eq [i, j];
                i++, j++)
            {
                count++;
            }
            return(new Diagonal {
                X = x, Y = y, Length = count
            });
        }
Beispiel #3
0
        static void TestBitArrayND()
        {
            int [] dimensions = new [] { 2, 3, 4, 5, 6 };

            BitArrayND a = new BitArrayND(dimensions);

            a.Clear();
            int expectedIndex = 0;

            for (int i = 0; i < dimensions [0]; i++)
            {
                for (int j = 0; j < dimensions [1]; j++)
                {
                    for (int k = 0; k < dimensions [2]; k++)
                    {
                        for (int l = 0; l < dimensions [3]; l++)
                        {
                            for (int m = 0; m < dimensions [4]; m++)
                            {
                                int [] index   = new [] { i, j, k, l, m };
                                int    index1d = a.GetIndex(index);
                                if (expectedIndex != index1d)
                                {
                                    throw new InvalidOperationException("Assertion failed: expected different index: " + index1d + ", actual: " + index1d);
                                }
                                if (a [index])
                                {
                                    throw new InvalidOperationException(
                                              index.Aggregate(
                                                  new StringBuilder("Assertion failed: "),
                                                  (s, n) => s.Append(n + ", "),
                                                  s => { s.Length -= 2; return(s.ToString()); }));
                                }
                                a [i, j, k, l, m] = true;
                                expectedIndex++;
                            }
                        }
                    }
                }
            }

            return;
        }
        AnalyzeEqualityTable(BitArrayND eq)
        {
            List <Diagonal> list = new List <SimpleSequenceComparer <T> .Diagonal> ();
            int             xLen = eq.GetLength(0);
            int             yLen = eq.GetLength(1);

            for (int x = 0; x < xLen; x++)
            {
                for (int y = 0; y < yLen; y++)
                {
                    Diagonal diag = CountDiagonal(eq, x, y, xLen, yLen);
                    if (diag.Length > 0)
                    {
                        list.Add(diag);
                    }
                }
            }

            return(list);
        }