/// <summary>
        /// Attempt to compile delta function code entered. Any compiler
        /// messages are displayed.
        /// </summary>
        private void compile(object sender, RoutedEventArgs e)
        {
            // Gather information entered
            string deltaStr = deltaInputBox.Text;
            int numStates = (numStatesInputBox.Text == "") ? 1 : int.Parse(numStatesInputBox.Text);
            uint defaultState = (defaultStateInputBox.Text == "") ? 0 : uint.Parse(defaultStateInputBox.Text);
            CPoint[] neighbors = new CPoint[Neighborhood.Count];
            int i = 0;
            foreach (OPoint p in Neighborhood) {
                neighbors[i] = new CPoint(p.X, p.Y);
                i++;
            }

            // Attempt to compile a new CA with the entered information
            ca = new CA(numStates, defaultState, neighbors, deltaStr);
            compileMesseageOutputBox.Text = ca.compileDelta();
        }
        /// <summary>
        /// Load the specified CA into this simulation, and clear the grid if necessary
        /// </summary>
        /// <param name="newCA">A CA representing a CA and its parameters</param>
        /// <returns>True if the CA is valid, or false otherwise</returns>
        public bool initCA(CA newCA)
        {
            // If an incompatible CA has previously been run, clear the grid
            if (getNumStates() > newCA.NumStates) initGridBlank(gridSizeX, gridSizeY);

            // Load and compile the new CA
            string result;
            lock (ca) {
                ca = newCA;
                result = newCA.compileDelta();
                if (ca.Neighborhood != null) optimizing = true;
                else optimizing = false;
            }

            // Return true if the CA's delta function compiled successfully
            return (result == "Delta function successfully compiled");
        }