/// <summary>
        /// Fills the transition patches for the specified transition group
        /// </summary>
        /// <param name="transitionedCells"></param>
        /// <param name="stratum"></param>
        /// <param name="transitionGroup"></param>
        /// <param name="iteration"></param>
        /// <param name="timestep"></param>
        /// <remarks></remarks>
        private void FillTransitionPatches(
            Dictionary <int, Cell> transitionedCells, Stratum stratum,
            TransitionGroup transitionGroup, int iteration, int timestep)
        {
            Debug.Assert(this.IsSpatial);

            if (transitionGroup.PatchPrioritization == null)
            {
                return;
            }

            Debug.Assert(transitionGroup.PatchPrioritization.TransitionPatches.Count == 0);

            Dictionary <int, Cell> patchCells = new Dictionary <int, Cell>();

            foreach (Cell SimulationCell in stratum.Cells.Values)
            {
                Debug.Assert(SimulationCell.StratumId != 0);
                Debug.Assert(SimulationCell.StateClassId != 0);

                if (patchCells.ContainsKey(SimulationCell.CellId) | transitionedCells.ContainsKey(SimulationCell.CellId))
                {
                    continue;
                }

                if (this.SelectTransitionPathway(SimulationCell, transitionGroup.TransitionGroupId, iteration, timestep) == null)
                {
                    continue;
                }

                TransitionPatch Patch = new TransitionPatch(SimulationCell);

                this.GrowTransitionPatch(transitionedCells, patchCells, SimulationCell, Patch, transitionGroup, iteration, timestep);

                transitionGroup.PatchPrioritization.TransitionPatches.Add(Patch);
            }

            transitionGroup.PatchPrioritization.TransitionPatches.Sort((TransitionPatch p1, TransitionPatch p2) =>
            {
                return(p1.Size.CompareTo(p2.Size));
            });
        }
        /// <summary>
        /// Shuffles the order of the specified stratum's cells
        /// </summary>
        /// <param name="stratum"></param>
        /// <remarks></remarks>
        private void ShuffleStratumCells(Stratum stratum)
        {
            if (stratum.Cells.Count == 0)
            {
                return;
            }

            List <Cell> lst = new List <Cell>();

            foreach (Cell c in stratum.Cells.Values)
            {
                lst.Add(c);
            }

            ShuffleUtilities.ShuffleList(lst, this.m_RandomGenerator.Random);

            stratum.Cells.Clear();

            foreach (Cell c in lst)
            {
                stratum.Cells.Add(c.CellId, c);
            }
        }