Example #1
0
        /// <summary>
        /// Deserialize given XML list of glue realations.
        /// </summary>
        /// <param name="glueRelations">XML element list of glue realations.</param>
        /// <exception cref="MissingXmlAttribute">If some attribute of floating object is missing.</exception>
        /// <exception cref="MissingXmlElement">If some element of floating object is missing.</exception>
        private void DeserializeGlueRelations(List <XElement> glueRelations)
        {
            GluePRelation = new GlueRelation();
            foreach (XElement glueRelation in glueRelations)
            {
                string nameOfTheGlue1 = Xmlizer.GetAttributeValueWithException(glueRelation, "glueTuple", "glue1");
                string nameOfTheGlue2 = Xmlizer.GetAttributeValueWithException(glueRelation, "glueTuple", "glue2");

                if (!Glues.ContainsKey(nameOfTheGlue1))
                {
                    throw new InvalidOperationException(string.Format("Glue named '{0}' is not defined in input xml file.",
                                                                      nameOfTheGlue1));
                }

                if (!Glues.ContainsKey(nameOfTheGlue2))
                {
                    throw new InvalidOperationException(string.Format("Glue named '{0}' is not defined in input xml file.",
                                                                      nameOfTheGlue2));
                }
                Glue glue1 = Glues[nameOfTheGlue1];
                Glue glue2 = Glues[nameOfTheGlue2];
                GluePRelation[Tuple.Create(glue1, glue2)] = new NamedMultiset();
            }
        }
Example #2
0
        public void TestConstructor()
        {
            MSystem mSystem = new MSystem(v_TestDeserializedMSystemObjects);

            // Tiles
            ReadOnlyDictionary <string, Tile> tiles = mSystem.Tiles;

            Assert.AreEqual(3, tiles.Count);
            Tile tileQ1     = tiles["q1"];
            var  connectors = tileQ1.Connectors;

            Assert.AreEqual(6, connectors.Count);
            var connectorC1 = connectors[0];

            Assert.AreEqual("c1", connectorC1.Name);
            Assert.AreEqual(Tile.SideType.undef, connectorC1.Side);
            Assert.AreEqual(v_TestDeserializedMSystemObjects.Glues["pa"], connectorC1.Glue);
            Assert.AreEqual(Angle.FromRadians(2.034443935795703), connectorC1.Angle);
            Assert.AreEqual(2, connectorC1.Positions.Count);
            Assert.AreEqual(new Point3D(0, 10, 0), connectorC1.Positions[0]);
            double posY = 10 * Math.Cos((1) * 2 * Math.PI / 5);
            double posX = 10 * Math.Sin((1) * 2 * Math.PI / 5);

            Assert.AreEqual(new Point3D(posX, posY, 0), connectorC1.Positions[1]);
            Glue surfaceGLuePx = tileQ1.SurfaceGlue;

            Assert.AreEqual("px", surfaceGLuePx.Name);
            Assert.AreEqual(4, tileQ1.Proteins.Count);
            Assert.AreEqual("p1", tileQ1.Proteins[0].Name);
            Assert.AreEqual("p1", tileQ1.Proteins[1].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[2].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[3].Name);
            foreach (var protein in tileQ1.Proteins)
            {
                Assert.AreEqual(Point3D.Origin, protein.Position);
            }

            Assert.AreEqual(Color.DeepSkyBlue, tileQ1.Color);
            Tile tileS1 = tiles["s1"];

            Assert.AreEqual(2, tileS1.Connectors.Count);
            Assert.AreEqual(1, tileS1.Proteins.Count);

            //Initial objects
            IReadOnlyList <TileInSpace> seedTiles = mSystem.SeedTiles;

            Assert.AreEqual(3, seedTiles.Count);
            TileInSpace seedTileQ1 = seedTiles[0];

            Assert.AreEqual("q1", seedTileQ1.Name);
            Assert.AreEqual(new Point3D(0, 0, 0), seedTileQ1.Position.Round(14));
            Assert.AreEqual(new EulerAngles(default(Angle), default(Angle), default(Angle)).ToQuaternion(), seedTileQ1.Quaternion);

            //Environmental objects
            var environmentalObjects = mSystem.FloatingObjects.Values.Where(obj => obj.Concentration > 0).ToList();

            Assert.AreEqual(1, environmentalObjects.Count);
            var environmentalObjectA = environmentalObjects[0];

            Assert.AreEqual("b", environmentalObjectA.Name);
            Assert.AreEqual(2, environmentalObjectA.Concentration);

            //GlueRadius
            Assert.AreEqual(0.1, mSystem.GlueRadius);

            //Mobility
            Assert.AreEqual(3, mSystem.Mobility);

            //Tolerance
            Assert.AreEqual(1E-10, MSystem.Tolerance);

            //SideDist
            Assert.AreEqual(5E-10, MSystem.SideDist);

            //GlueRelation
            GlueRelation glueTuples = mSystem.GlueRelation;

            Assert.AreEqual(3, glueTuples.Count);

            Tuple <Glue, Glue> glueTuplePaPb = glueTuples.Keys.ElementAt(0);

            Assert.AreEqual("pa", glueTuplePaPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePaPb.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(0).ToDictionary()["a"]);

            Tuple <Glue, Glue> glueTuplePaPa = glueTuples.Keys.ElementAt(1);

            Assert.AreEqual("pa", glueTuplePaPa.Item1.Name);
            Assert.AreEqual("pa", glueTuplePaPa.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(1).ToDictionary().Count);

            Tuple <Glue, Glue> glueTuplePbPb = glueTuples.Keys.ElementAt(2);

            Assert.AreEqual("pb", glueTuplePbPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePbPb.Item2.Name);
            Assert.AreEqual(0, glueTuples.Values.ElementAt(2).ToDictionary().Count);

            //MetabolicRules
            Dictionary <string, IReadOnlyList <EvoMetabolicRule> > metabolicRules = mSystem.MetabolicRules;

            Assert.AreEqual(2, metabolicRules.Count);
            Assert.IsNotNull(metabolicRules["p1"]);
            Assert.AreEqual(1, metabolicRules["p1"].Count);
            Assert.IsNotNull(metabolicRules["p2"]);
            Assert.AreEqual(0, metabolicRules["p2"].Count);

            EvoMetabolicRule metabolicRule = metabolicRules["p1"][0];

            Assert.AreEqual(0, metabolicRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Metabolic, metabolicRule.Type);
            Assert.AreEqual(EvoMetabolicRule.MetabolicRuleType.Symport, metabolicRule.SubType);
            Assert.AreEqual(2, metabolicRule.LeftSideObjects.Count);
            Assert.AreEqual("a", metabolicRule.LeftSideObjects[0].Name);
            Assert.AreEqual("p1", metabolicRule.LeftSideObjects[1].Name);
            Assert.AreEqual(2, metabolicRule.RightSideObjects.Count);
            Assert.AreEqual("p1", metabolicRule.RightSideObjects[0].Name);
            Assert.AreEqual("a", metabolicRule.RightSideObjects[1].Name);
            Assert.AreEqual(0, metabolicRule.MLeftInNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.ToDictionary()["a"]);
            Assert.AreEqual(1, metabolicRule.MRightInNames.Count);
            Assert.AreEqual(1, metabolicRule.MRightInNames.ToDictionary()["a"]);
            Assert.AreEqual(0, metabolicRule.MRightOutNames.Count);
            Assert.AreEqual("p1", metabolicRule.RProtein.Name);


            //CreationRules
            Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> > createRules = mSystem.CreationRules;

            Assert.AreEqual(3, createRules.Count);

            Glue pa = v_TestDeserializedMSystemObjects.Glues["pa"];
            Glue pb = v_TestDeserializedMSystemObjects.Glues["pb"];
            Glue px = v_TestDeserializedMSystemObjects.Glues["px"];

            Assert.IsNotNull(createRules[pa]);
            Assert.AreEqual(1, createRules[pa].Count);
            Assert.IsNotNull(createRules[pb]);
            Assert.AreEqual(1, createRules[pb].Count);
            Assert.IsNotNull(createRules[px]);
            Assert.AreEqual(0, createRules[px].Count);

            // For different glues there is the same creation rule - this is OK.
            EvoNonMetabolicRule createRulePA = createRules[pa][0];

            Assert.AreEqual(1, createRulePA.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Create, createRulePA.Type);
            Assert.AreEqual(3, createRulePA.LeftSideObjects.Count);
            Assert.AreEqual("a", createRulePA.LeftSideObjects[0].Name);
            Assert.AreEqual("a", createRulePA.LeftSideObjects[1].Name);
            Assert.AreEqual("a", createRulePA.LeftSideObjects[2].Name);
            Assert.AreEqual(1, createRulePA.RightSideObjects.Count);
            Assert.AreEqual("q1", createRulePA.RightSideObjects[0].Name);
            Assert.AreEqual(3, createRulePA.MLeftSideFloatingNames.Count);
            Assert.AreEqual(3, createRulePA.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, createRulePA.MRightSideFloatingNames.Count);

            // For different glues there is the same creation rule - this is OK.
            EvoNonMetabolicRule createRulePB = createRules[pb][0];

            Assert.AreEqual(1, createRulePB.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Create, createRulePB.Type);
            Assert.AreEqual(3, createRulePB.LeftSideObjects.Count);
            Assert.AreEqual("a", createRulePB.LeftSideObjects[0].Name);
            Assert.AreEqual("a", createRulePB.LeftSideObjects[1].Name);
            Assert.AreEqual("a", createRulePB.LeftSideObjects[2].Name);
            Assert.AreEqual(1, createRulePB.RightSideObjects.Count);
            Assert.AreEqual("q1", createRulePB.RightSideObjects[0].Name);
            Assert.AreEqual(3, createRulePB.MLeftSideFloatingNames.Count);
            Assert.AreEqual(3, createRulePB.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, createRulePB.MRightSideFloatingNames.Count);

            //DestructionRules
            var destructionRules = mSystem.DestructionRules;

            Assert.AreEqual(3, destructionRules.Count);
            Assert.IsNotNull(destructionRules["q1"]);
            Assert.AreEqual(0, destructionRules["q1"].Count);
            Assert.IsNotNull(destructionRules["s1"]);
            Assert.AreEqual(1, destructionRules["s1"].Count);

            EvoNonMetabolicRule destroyRule = destructionRules["s1"][0];

            Assert.AreEqual(1, destroyRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Destroy, destroyRule.Type);
            Assert.AreEqual(3, destroyRule.LeftSideObjects.Count);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[0].Name);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[1].Name);
            Assert.AreEqual("s1", destroyRule.LeftSideObjects[2].Name);
            Assert.AreEqual(2, destroyRule.RightSideObjects.Count);
            Assert.AreEqual("c", destroyRule.RightSideObjects[0].Name);
            Assert.AreEqual("c", destroyRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.ToDictionary()["c"]);

            //DivisionRules
            var divisionRules = mSystem.DivisionRules;

            Assert.AreEqual(1, divisionRules.Count);

            Assert.IsNotNull(divisionRules[pa]);
            Assert.AreEqual(1, divisionRules[pa].Count);

            Assert.IsNotNull(divisionRules[pa][pa]);
            Assert.AreEqual(1, divisionRules[pa][pa].Count);

            EvoNonMetabolicRule divideRule = divisionRules[pa][pa][0];

            Assert.AreEqual(1, divideRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Divide, divideRule.Type);
            Assert.AreEqual(4, divideRule.LeftSideObjects.Count);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[1].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[2].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[3].Name);
            Assert.AreEqual(2, divideRule.RightSideObjects.Count);
            Assert.AreEqual("pa", divideRule.RightSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, divideRule.MRightSideFloatingNames.Count);
        }
Example #3
0
        /// <summary>
        /// P system constructor used during simulation.
        /// </summary>
        /// <param name="mSystemObjects">Deserialized M System objects.</param>
        /// <exception cref="ArgumentException">
        /// If M System objects objecst list is null.
        /// </exception>
        public PSystem(DeserializedObjects mSystemObjects)
        {
            if (mSystemObjects == null)
            {
                throw new ArgumentException("M System objects can't be null.");
            }

            SeedTiles       = mSystemObjects.SeedTiles;
            GlueRadius      = mSystemObjects.GlueRadius;
            FloatingObjects = new ReadOnlyDictionary <string, FloatingObject>(mSystemObjects.FloatingObjects);
            if (FloatingObjects.Any())
            {
                Mobility = FloatingObjects.Values.Max(obj => obj.Mobility);
            }
            v_Proteins       = new ReadOnlyDictionary <string, Protein>(mSystemObjects.Proteins);
            Tiles            = new ReadOnlyDictionary <string, Tile>(mSystemObjects.Tiles);
            GlueRelation     = mSystemObjects.GluePRelation;
            v_EvolutionRules = mSystemObjects.EvolutionRules;

            //======================================================================
            MetabolicRules = new Dictionary <string, IReadOnlyList <EvoMetabolicRule> >();
            foreach (string proteinName in v_Proteins.Keys)
            {
                MetabolicRules[proteinName] = v_EvolutionRules.OfType <EvoMetabolicRule>().Where(rule => proteinName == rule.RProtein.Name).ToList();
            }

            //======================================================================
            CreationRules = new Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> >();
            foreach (Glue glue in mSystemObjects.Glues.Values)
            {
                var creationRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>().Where(rule => rule.Type == EvolutionRule.RuleType.Create).ToList();
                CreationRulesPriorities = new SortedSet <int>(creationRules.Select(rule => rule.Priority));
                CreationRules[glue]     = creationRules.Where(rule => rule.RightSideObjects.OfType <Tile>().Single()
                                                              .Connectors.Any(connector => GlueRelation.ContainsKey(Tuple.Create(glue, connector.Glue))))
                                          .ToList();
            }

            //======================================================================
            InsertionRules = new Dictionary <Glue, Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> > >();
            foreach (Glue glue1 in mSystemObjects.Glues.Values)
            {
                foreach (Glue glue2 in mSystemObjects.Glues.Values)
                {
                    var insRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>()
                                   .Where(rule => (rule.Type == EvolutionRule.RuleType.Insert) &&
                                          IsInsertable(rule.RightSideObjects.OfType <Tile>().Single(), glue1, glue2))
                                   .ToList();
                    if (insRules.Any())
                    {
                        AddRulesToDictionary(InsertionRules, glue1, glue2, insRules);
                        AddRulesToDictionary(InsertionRules, glue2, glue1, insRules);
                    }
                }
            }

            //======================================================================
            DestructionRules = new Dictionary <string, IReadOnlyList <EvoNonMetabolicRule> >();
            foreach (string tileName in Tiles.Keys)
            {
                DestructionRules[tileName] = v_EvolutionRules.OfType <EvoNonMetabolicRule>().Where(rule => (rule.Type == EvolutionRule.RuleType.Destroy) &&
                                                                                                   rule.LeftSideObjects.OfType <Tile>().Single().Name == tileName).ToList();
            }

            //======================================================================
            DivisionRules = new Dictionary <Glue, Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> > >();
            foreach (Glue glue1 in mSystemObjects.Glues.Values)
            {
                foreach (Glue glue2 in mSystemObjects.Glues.Values)
                {
                    var divRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>()
                                   .Where(rule => (rule.Type == EvolutionRule.RuleType.Divide) &&
                                          glue1 == (Glue)rule.RightSideObjects[0] &&
                                          glue2 == (Glue)rule.RightSideObjects[1])
                                   .ToList();
                    if (divRules.Any())
                    {
                        AddRulesToDictionary(DivisionRules, glue1, glue2, divRules);
                        AddRulesToDictionary(DivisionRules, glue2, glue1, divRules);
                    }
                }
            }
        }
Example #4
0
        public void TestDeserializationCreatesObjectWithCorrectValues()
        {
            //NOTE: We cannot test equivalence of objects as objects contains readonly parameters, which are never equal.
            //Due to this limitation we test only values of parameters.

            string              path = @"../../Classes/Xml/TestXML/testMSystemDescription.xml";
            XDocument           mSystemDescription      = XDocument.Load(path);
            DeserializedObjects testDeserializedObjects = new DeserializedObjects(mSystemDescription, path);

            //Floating objects
            Dictionary <string, FloatingObject> floatingObjects = testDeserializedObjects.FloatingObjects;

            Assert.AreEqual(3, floatingObjects.Count);
            Assert.AreEqual("a", floatingObjects["a"].Name);
            Assert.AreEqual(0, floatingObjects["a"].Concentration);
            Assert.AreEqual(2, floatingObjects["a"].Mobility);

            Assert.AreEqual("b", floatingObjects["b"].Name);
            Assert.AreEqual(2, floatingObjects["b"].Concentration);
            Assert.AreEqual(3, floatingObjects["b"].Mobility);

            //Proteins
            Dictionary <string, Protein> proteins = testDeserializedObjects.Proteins;

            Assert.AreEqual(2, proteins.Count);

            Assert.AreEqual("p1", proteins["p1"].Name);
            Assert.AreEqual("p2", proteins["p2"].Name);

            //Glues
            Dictionary <string, Glue> glues = testDeserializedObjects.Glues;

            Assert.AreEqual(3, glues.Count);

            Assert.AreEqual("pa", glues["pa"].Name);
            Assert.AreEqual("pb", glues["pb"].Name);
            Assert.AreEqual("px", glues["px"].Name);

            //Tiles
            Dictionary <string, Tile> tiles = testDeserializedObjects.Tiles;

            Assert.AreEqual(3, tiles.Count);

            Tile tileQ1 = tiles["q1"];

            //Connectors
            var connectors = tileQ1.Connectors;

            Assert.AreEqual(6, connectors.Count);

            var connectorC1 = connectors[0];

            Assert.AreEqual("c1", connectorC1.Name);
            Assert.AreEqual(Tile.SideType.undef, connectorC1.Side);
            Assert.AreEqual(glues["pa"], connectorC1.Glue);
            Assert.AreEqual(Angle.FromRadians(2.034443935795703), connectorC1.Angle);
            Assert.AreEqual(2, connectorC1.Positions.Count);
            Assert.AreEqual(new Point3D(0, 10, 0), connectorC1.Positions[0]);
            double posY = 10 * Math.Cos((1) * 2 * Math.PI / 5);
            double posX = 10 * Math.Sin((1) * 2 * Math.PI / 5);

            Assert.AreEqual(new Point3D(posX, posY, 0), connectorC1.Positions[1]);

            //Surface glue
            Glue surfaceGLuePx = tileQ1.SurfaceGlue;

            Assert.AreEqual("px", surfaceGLuePx.Name);

            //Proteins
            Assert.AreEqual(4, tileQ1.Proteins.Count);
            Assert.AreEqual("p1", tileQ1.Proteins[0].Name);
            Assert.AreEqual("p1", tileQ1.Proteins[1].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[2].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[3].Name);
            foreach (var protein in tileQ1.Proteins)
            {
                Assert.AreEqual(Point3D.Origin, protein.Position);
            }

            Assert.AreEqual(Color.DeepSkyBlue, tileQ1.Color);


            Tile tileS1 = tiles["s1"];

            Assert.AreEqual(2, tileS1.Connectors.Count);
            Assert.AreEqual(1, tileS1.Proteins.Count);

            //Initial objects
            List <TileInSpace> seedTiles = testDeserializedObjects.SeedTiles;

            Assert.AreEqual(3, seedTiles.Count);
            var seedTileQ1 = seedTiles[0];

            Assert.AreEqual("q1", seedTileQ1.Name);
            Assert.AreEqual(new Point3D(0, 0, 0), seedTileQ1.Position.Round());
            Assert.AreEqual(new EulerAngles(default(Angle), default(Angle), default(Angle)), seedTileQ1.Quaternion.ToEulerAngles());

            //Others
            Assert.AreEqual(0.1, testDeserializedObjects.GlueRadius);

            //Glue tuples
            GlueRelation glueTuples = testDeserializedObjects.GluePRelation;

            Assert.AreEqual(3, glueTuples.Count);

            Tuple <Glue, Glue> glueTuplePaPb = glueTuples.Keys.ElementAt(0);

            Assert.AreEqual("pa", glueTuplePaPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePaPb.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(0).ToDictionary()["a"]);

            Tuple <Glue, Glue> glueTuplePaPa = glueTuples.Keys.ElementAt(1);

            Assert.AreEqual("pa", glueTuplePaPa.Item1.Name);
            Assert.AreEqual("pa", glueTuplePaPa.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(1).ToDictionary().Count);

            Tuple <Glue, Glue> glueTuplePbPb = glueTuples.Keys.ElementAt(2);

            Assert.AreEqual("pb", glueTuplePbPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePbPb.Item2.Name);
            Assert.AreEqual(0, glueTuples.Values.ElementAt(2).ToDictionary().Count);

            //Evo rules
            List <EvolutionRule> evoRules = testDeserializedObjects.EvolutionRules;

            Assert.AreEqual(4, evoRules.Count);

            EvoMetabolicRule metabolicRule = TypeUtil.Cast <EvoMetabolicRule>(evoRules[0]);

            Assert.AreEqual(0, metabolicRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Metabolic, metabolicRule.Type);
            Assert.AreEqual(EvoMetabolicRule.MetabolicRuleType.Symport, metabolicRule.SubType);
            Assert.AreEqual(2, metabolicRule.LeftSideObjects.Count);
            Assert.AreEqual("a", metabolicRule.LeftSideObjects[0].Name);
            Assert.AreEqual("p1", metabolicRule.LeftSideObjects[1].Name);
            Assert.AreEqual(2, metabolicRule.RightSideObjects.Count);
            Assert.AreEqual("p1", metabolicRule.RightSideObjects[0].Name);
            Assert.AreEqual("a", metabolicRule.RightSideObjects[1].Name);
            Assert.AreEqual(0, metabolicRule.MLeftInNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.ToDictionary()["a"]);
            Assert.AreEqual(1, metabolicRule.MRightInNames.Count);
            Assert.AreEqual(1, metabolicRule.MRightInNames.ToDictionary()["a"]);
            Assert.AreEqual(0, metabolicRule.MRightOutNames.Count);
            Assert.AreEqual("p1", metabolicRule.RProtein.Name);

            EvoNonMetabolicRule createRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[1]);

            Assert.AreEqual(1, createRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Create, createRule.Type);
            Assert.AreEqual(3, createRule.LeftSideObjects.Count);
            Assert.AreEqual("a", createRule.LeftSideObjects[0].Name);
            Assert.AreEqual("a", createRule.LeftSideObjects[1].Name);
            Assert.AreEqual("a", createRule.LeftSideObjects[2].Name);
            Assert.AreEqual(1, createRule.RightSideObjects.Count);
            Assert.AreEqual("q1", createRule.RightSideObjects[0].Name);
            Assert.AreEqual(3, createRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(3, createRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, createRule.MRightSideFloatingNames.Count);

            EvoNonMetabolicRule divideRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[2]);

            Assert.AreEqual(1, divideRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Divide, divideRule.Type);
            Assert.AreEqual(4, divideRule.LeftSideObjects.Count);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[1].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[2].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[3].Name);
            Assert.AreEqual(2, divideRule.RightSideObjects.Count);
            Assert.AreEqual("pa", divideRule.RightSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, divideRule.MRightSideFloatingNames.Count);

            EvoNonMetabolicRule destroyRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[3]);

            Assert.AreEqual(1, destroyRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Destroy, destroyRule.Type);
            Assert.AreEqual(3, destroyRule.LeftSideObjects.Count);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[0].Name);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[1].Name);
            Assert.AreEqual("s1", destroyRule.LeftSideObjects[2].Name);
            Assert.AreEqual(2, destroyRule.RightSideObjects.Count);
            Assert.AreEqual("c", destroyRule.RightSideObjects[0].Name);
            Assert.AreEqual("c", destroyRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.ToDictionary()["c"]);
        }