public Grid2d <ICell> BuildCellularGrid()
        {
            //create the grid
            cellularGrid = CreateCellularGrid();

            //add cells to the grid:
            PopulateGrid();

            //initialize cell state:

            ICAConfig initialConfiguration = GetInitialConfiguration();

            if (initialConfiguration != null)
            {
                foreach (ICell cell in cellularGrid.GetObjects())
                {
                    cell.SetState(initialConfiguration.GetCellState(cell));
                }
            }


            //build neighborhoods:
            foreach (ICell cell in cellularGrid.GetObjects())
            {
                ((ICell)cell).SetNeighbors(GetNeighborhoodStrategy().BuildNeighborhood(cell));
            }

            //return the grid
            return(cellularGrid);
        }
        /**
         * Does the computation
         */
        protected override void SolveRabbitInstance(IGH_DataAccess DA)
        {
            //Get the INPUT
            //GH_ObjectWrapper CAWrapper = null;
            //DA.GetData<GH_ObjectWrapper>(1, ref CAWrapper);//param index, place holder
            //CA CA = (CA)CAWrapper.Value;

            GH_ObjectWrapper CAConfigurationWrapper = null;

            DA.GetData <GH_ObjectWrapper>(0, ref CAConfigurationWrapper);//param index, place holder
            ICAConfig CAConfiguration = (ICAConfig)CAConfigurationWrapper.Value;

            int time = CAConfiguration.GetAssociatedTime();// CA.GetMemory().GetTime(CAConfiguration);
            IEnumerable <ICell> cells = null;


            //Filter the cells, if filter is specified
            IGH_Goo filterStateValue = null;

            DA.GetData <IGH_Goo>(1, ref filterStateValue);
            if (filterStateValue == null)           //no filter specified
            {
                cells = CAConfiguration.GetCells(); //CA.GetGrid().GetObjects();
            }
            else
            {
                //filter cells with the specified state
                CellState filterCS = new GH_CellState(filterStateValue);
                //CellState filterCS = new CellState(true);
                cells = filterCells(CAConfiguration, CAConfiguration.GetCells(), filterCS);
            }


            //OUTPUT
            ArrayList cellTimes   = new ArrayList();
            ArrayList cellIndexes = new ArrayList();
            ArrayList cellStates  = new ArrayList();

            foreach (ICell cell in cells)
            {
                cellTimes.Add(time);
                //cellTimes.Add(CAConfiguration.GetCellState(cell).Equals(filterCS));
                //cellTimes.Add(new GH_Boolean(true).Value.Equals(new GH_Boolean(true).Value));
                //cellTimes.Add(new GH_Colour(255,0,0,0).Value.Equals(new GH_Colour(255,0,0,0).Value));
                //cellIndexes.Add(cell.GetId());
                cellIndexes.Add(cell.GetAttachedObject());
                //the value of the state is a GH_Goo instance
                cellStates.Add(CAConfiguration.GetCellState(cell).GetValue());//.GetValue().GetType());
            }

            //set the output parameters
            DA.SetDataList(0, cellIndexes);
            DA.SetDataList(1, cellStates);
            DA.SetDataList(2, cellTimes);
        }
        private IList <ICell> filterCells(ICAConfig CAConfiguration, IEnumerable <ICell> cells, CellState filterCS)
        {
            //TODO: use an utility class
            IList <ICell> filteredCells = new List <ICell>();

            foreach (ICell cell in cells)
            {
                if (CAConfiguration.GetCellState(cell).Equals(filterCS))
                {
                    filteredCells.Add(cell);
                }
            }

            return(filteredCells);
        }