Example #1
0
        public SimpleTiledModel(InputSimpleTiledModelData inputData, SimpleTiledModelParams modelParams) : base(modelParams)
        {
            periodic = modelParams.Periodic;

            var subset = inputData.GetSubset(modelParams.SubsetName);

            tiles     = new List <SimpleTiledModelTile>();
            tilenames = new List <string>();
            var tempStationary = new List <double>();

            List <int[]>             action          = new List <int[]>();
            Dictionary <string, int> firstOccurrence = new Dictionary <string, int>();

            foreach (var tileConfig in inputData.TileConfigData.ConfigsList)
            {
                if (subset != null && !subset.Contains(tileConfig.Id))
                {
                    continue;
                }

                Func <int, int> rotationTranfrom, mirrorTranform;
                int             cardinality;

                var symmmetry = tileConfig.Symmetry;
                Debug.Log(symmmetry);
                switch (symmmetry)
                {
                case SymmetryType.L:
                    cardinality      = 4;
                    rotationTranfrom = i => (i + 1) % 4;
                    mirrorTranform   = i => i % 2 == 0 ? i + 1 : i - 1;
                    break;

                case SymmetryType.T:
                    cardinality      = 4;
                    rotationTranfrom = i => (i + 1) % 4;
                    mirrorTranform   = i => i % 2 == 0 ? i : 4 - i;
                    break;

                case SymmetryType.I:
                    cardinality      = 2;
                    rotationTranfrom = i => 1 - i;
                    mirrorTranform   = i => i;
                    break;

                case SymmetryType.Slash:
                    cardinality      = 2;
                    rotationTranfrom = i => 1 - i;
                    mirrorTranform   = i => 1 - i;
                    break;

                default:
                    cardinality      = 1;
                    rotationTranfrom = i => i;
                    mirrorTranform   = i => i;
                    break;
                }

                T = action.Count;
                firstOccurrence.Add(tileConfig.Id, T);

                int[][] map = new int[cardinality][];
                for (int t = 0; t < cardinality; t++)
                {
                    map[t] = new int[8];

                    map[t][0] = t;
                    map[t][1] = rotationTranfrom(t);
                    map[t][2] = rotationTranfrom(rotationTranfrom(t));
                    map[t][3] = rotationTranfrom(rotationTranfrom(rotationTranfrom(t)));
                    map[t][4] = mirrorTranform(t);
                    map[t][5] = mirrorTranform(rotationTranfrom(t));
                    map[t][6] = mirrorTranform(rotationTranfrom(rotationTranfrom(t)));
                    map[t][7] = mirrorTranform(rotationTranfrom(rotationTranfrom(rotationTranfrom(t))));

                    for (int s = 0; s < 8; s++)
                    {
                        map[t][s] += T;
                    }

                    action.Add(map[t]);
                }

                for (int t = 0; t < cardinality; t++)
                {
                    tiles.Add(new SimpleTiledModelTile(tileConfig, t));

                    tilenames.Add(tileConfig.Id + " " + t);
                    Debug.Log(tilenames.Count + " >>>> " + tilenames[tilenames.Count - 1]);
                    tempStationary.Add(tileConfig.Weight);
                }
            }

            T          = action.Count;
            stationary = tempStationary.ToArray();

            var tempPropagator = new bool[4][][];

            propagator = new int[4][][];
            for (int d = 0; d < 4; d++)
            {
                tempPropagator[d] = new bool[T][];
                propagator[d]     = new int[T][];
                for (int t = 0; t < T; t++)
                {
                    tempPropagator[d][t] = new bool[T];
                }
            }

            InitWave();

            foreach (NeighborData neighbor in inputData.NeighborDatas)
            {
                var leftNeighbor  = neighbor.LeftNeighborConfig.Id;
                var rightNeighbor = neighbor.RightNeighborConfig.Id;
                if (subset != null && (!subset.Contains(leftNeighbor) || !subset.Contains(rightNeighbor)))
                {
                    continue;
                }

                var leftRotation  = neighbor.LeftRotation;
                var rightRotation = neighbor.RightRotation;

                int L = action[firstOccurrence[leftNeighbor]][leftRotation], D = action[L][1];
                int R = action[firstOccurrence[rightNeighbor]][rightRotation], U = action[R][1];

                tempPropagator[0][R][L] = true;
                tempPropagator[0][action[R][6]][action[L][6]] = true;
                tempPropagator[0][action[L][4]][action[R][4]] = true;
                tempPropagator[0][action[L][2]][action[R][2]] = true;

                tempPropagator[1][U][D] = true;
                tempPropagator[1][action[D][6]][action[U][6]] = true;
                tempPropagator[1][action[U][4]][action[D][4]] = true;
                tempPropagator[1][action[D][2]][action[U][2]] = true;
            }

            for (int t2 = 0; t2 < T; t2++)
            {
                for (int t1 = 0; t1 < T; t1++)
                {
                    tempPropagator[2][t2][t1] = tempPropagator[0][t1][t2];
                    tempPropagator[3][t2][t1] = tempPropagator[1][t1][t2];
                }
            }

            List <int>[][] sparsePropagator = new List <int> [4][];
            for (int d = 0; d < 4; d++)
            {
                sparsePropagator[d] = new List <int> [T];
                for (int t = 0; t < T; t++)
                {
                    sparsePropagator[d][t] = new List <int>();
                }
            }

            for (var d = 0; d < 4; d++)
            {
                for (var t1 = 0; t1 < T; t1++)
                {
                    List <int> sp = sparsePropagator[d][t1];
                    bool[]     tp = tempPropagator[d][t1];

                    for (int t2 = 0; t2 < T; t2++)
                    {
                        if (tp[t2])
                        {
                            sp.Add(t2);
                        }
                    }

                    int ST = sp.Count;
                    propagator[d][t1] = new int[ST];
                    for (int st = 0; st < ST; st++)
                    {
                        propagator[d][t1][st] = sp[st];
                    }
                }
            }
        }