Exemple #1
0
        //Just create one Vertex SubExpressionGraph with this node
        public override SubExpressionGraph Visit(AtomNode node)
        {
            var sub_graph = new SubExpressionGraph();

            sub_graph.LastNode = node;
            return(sub_graph);
        }
 public override void Visit(AtomNode node)
 {
     base.Visit(node);
     if (!ReferenceEquals(node.VariableType, null))
     {
         node.VariableType.Accept(this);
     }
 }
 /// <summary>Removes the specified <see cref="AtomNode"/> from this node.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to remove.</param>
 /// <exception cref="ArgumentNullException"><paramref name="node"/> is null.</exception>
 /// <exception cref="ArgumentException"><paramref name="node"/> cannot be removed.</exception>
 public void Remove(AtomNode node)
 {
   if(node == null) throw new ArgumentNullException("node");
   if(this.CanRemoveNode(node) == false) throw new ArgumentException(Errors.CannotRemoveNode, "node");
   XElement element = (XElement)node;
   if(element.Parent == this.Element)
     element.Remove();
 }
Exemple #4
0
        public SGChromosome Crossover(SGChromosome pair)
        {
            List <LinkEdge> childLinks = new List <LinkEdge>();

            childLinks.AddRange(LinkEdge.ListClone(this.Molecule.LinkEdges.Take(this.Molecule.LinkEdges.Count / 2).ToList()));
            childLinks.AddRange(LinkEdge.ListClone(pair.Molecule.LinkEdges.Skip(childLinks.Count).ToList()));

            return(new SGChromosome(new MoleculeGraph(this.Molecule.Nomenclature, AtomNode.ListClone(this.Molecule.AtomNodes), childLinks)));
        }
        public Atom GetCollectionFromNode(AtomNode atom)
        {
            var collection = new Atom();

            collection.AtomId = atom.AtomId;
            collection.Octet  = atom.Octet;
            collection.Symbol = atom.Symbol;
            return(collection);
        }
Exemple #6
0
        public List <char> GetAtomsPart(string part)
        {
            var atoms = new List <char>();

            foreach (var atom in part.Where(atom => AtomNode.IsAtom(atom) && !atoms.Contains(atom)))
            {
                atoms.Add(atom);
            }
            return(atoms);
        }
Exemple #7
0
        //Replace IfNodes and link sub_graph of childs
        public override SubExpressionGraph Visit(BlockExpressionNode node)
        {
            var sub_graph    = new SubExpressionGraph();
            var new_elements = new List <ExpressionNode>();

            VariableDefNode t = new VariableDefNode();

            t.ExpressionType = node.ExpressionType;
            t.Name           = "T" + temporary_counter;
            AtomNode _0 = new AtomNode(node.ExpressionType);

            _0.Value = "";
            t.Value  = _0;
            VariableUseNode t_use = new VariableUseNode();

            t_use.ExpressionType = node.ExpressionType;
            t_use.Declaration    = t;
            t_use.Name           = "T" + temporary_counter;

            if (!ReferenceEquals(node.Elements, null))
            {
                int counter = 0;
                foreach (var child in node.Elements)
                {
                    if (!ReferenceEquals(child, null))
                    {
                        var child_graph = child.Accept(this);
                        if (child_graph == null)
                        {
                            throw new Exception("SubGraph of child is null");
                        }
                        new_elements.Add(GetUpdatedExpressionNodeValue(child, child_graph));
                        if (counter == node.Elements.Count() - 1)
                        {
                            OperatorNode _temp_assing = new OperatorNode();
                            _temp_assing.Operator  = OperatorType.ASSIGN;
                            _temp_assing.Arguments = new List <ExpressionNode> {
                                t_use, child_graph.LastNode
                            };
                            child_graph.LastNode = _temp_assing;
                        }
                        child_graph = SubExpressionGraph.ConcatSubGraph(child_graph, SubExpressionGraph.CreateOneVertexSubGraph(child_graph.LastNode));
                        sub_graph   = SubExpressionGraph.ConcatSubGraph(sub_graph, child_graph);
                    }
                }
                node.Elements = new_elements;
            }

            sub_graph.ContainsExtracted = true;
            sub_graph.Temporary         = t_use;
            temporary_counter++;

            return(sub_graph);
        }
Exemple #8
0
        public void Formula4()
        {
            var c0 = new AtomNode("C");

            var mole = new Molecule(c0);

            for (int i = 0; i < 99; i++)
            {
                var c = new AtomNode("C");
                mole.AddBondToLast(BondOrder.Single, c);
            }

            var formula = mole.GetMolecularFormula();

            Assert.AreEqual("C100H202", formula);
        }
Exemple #9
0
        public void Mr4()
        {
            var c0 = new AtomNode("C");

            var mole = new Molecule(c0);

            for (int i = 0; i < 99; i++)
            {
                var c = new AtomNode("C");
                mole.AddBondToLast(BondOrder.Single, c);
            }

            var mass = float.Parse(mole.GetMolecularMass());

            Assert.AreEqual(1402, mass);
        }
        //try to find definition type on base of Value
        public override void Visit(AtomNode node)
        {
            base.Visit(node);
            if (node.Value == null)
            {
                throw new TypeCheckException("Value is not set.");
            }

            HashSet <TypeNode> deducedType = deduceType(node.Value);

            if (!deducedType.Contains(node.VariableType))
            {
                throw new TypeCheckException("Type of Const is not consistent with deduced Type.");
            }

            node.ExpressionType = node.VariableType;
        }
        public void Smiles3()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var n  = new AtomNode("N");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBondToLast(BondOrder.Single, c2);
            mole.AddBondToLast(BondOrder.Triple, n);

            var smiles = mole.ToSMILES();

            Assert.AreEqual("CCC#N", smiles);
        }
Exemple #12
0
        public void Formula3()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var n  = new AtomNode("N");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBondToLast(BondOrder.Single, c2);
            mole.AddBondToLast(BondOrder.Triple, n);

            var formula = mole.GetMolecularFormula();

            Assert.AreEqual("C3H5N", formula);
        }
Exemple #13
0
        public void Mr3()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var n  = new AtomNode("N");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBondToLast(BondOrder.Single, c2);
            mole.AddBondToLast(BondOrder.Triple, n);

            var mass = float.Parse(mole.GetMolecularMass());

            Assert.AreEqual(55, mass);
        }
        public void Smiles2()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var o  = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Double, o);

            var smiles = mole.ToSMILES();

            Assert.AreEqual("CCCC=O", smiles);
        }
        public void Smiles4()
        {
            var c0 = new AtomNode("C");

            var mole = new Molecule(c0);

            var s = "C";

            for (int i = 0; i < 20; i++)
            {
                var c = new AtomNode("C");
                mole.AddBondToLast(BondOrder.Single, c);
                s += "C";
            }

            var smiles = mole.ToSMILES();

            Assert.AreEqual(s, smiles);
        }
Exemple #16
0
        public void Formula2()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var o  = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Double, o);

            var formula = mole.GetMolecularFormula();

            Assert.AreEqual("C4H8O", formula);
        }
Exemple #17
0
        public void Mr2()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var o  = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Double, o);

            var mass = float.Parse(mole.GetMolecularMass());

            Assert.AreEqual(72, mass);
        }
Exemple #18
0
        public void Formula5()
        {
            var c0 = new AtomNode("C");
            var p  = new AtomNode("P");
            var h  = new AtomNode("H");
            var n  = new AtomNode("N");
            var o  = new AtomNode("O");
            var cl = new AtomNode("Cl");
            var o2 = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, p);
            mole.AddBondToLast(BondOrder.Single, cl);
            mole.AddBond(BondOrder.Single, c0, h);
            mole.AddBond(BondOrder.Single, p, n);
            mole.AddBondToLast(BondOrder.Double, o);
            mole.AddBond(BondOrder.Single, n, o2);

            var formula = mole.GetMolecularFormula();

            Assert.AreEqual("CH4PClNO2", formula);
        }
        public void Smiles5()
        {
            var c0 = new AtomNode("C");
            var p  = new AtomNode("P");
            var h  = new AtomNode("H");
            var n  = new AtomNode("N");
            var o  = new AtomNode("O");
            var cl = new AtomNode("Cl");
            var o2 = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, p);
            mole.AddBondToLast(BondOrder.Single, cl);
            mole.AddBond(BondOrder.Single, c0, h);
            mole.AddBond(BondOrder.Single, p, n);
            mole.AddBondToLast(BondOrder.Double, o);
            mole.AddBond(BondOrder.Single, n, o2);

            var smiles = mole.ToSMILES();

            Assert.AreEqual("CP(Cl)(N(=O)(O))", smiles);
        }
Exemple #20
0
        public void Mr5()
        {
            var c0 = new AtomNode("C");
            var p  = new AtomNode("P");
            var h  = new AtomNode("H");
            var n  = new AtomNode("N");
            var o  = new AtomNode("O");
            var cl = new AtomNode("Cl");
            var o2 = new AtomNode("O");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, p);
            mole.AddBondToLast(BondOrder.Single, cl);
            mole.AddBond(BondOrder.Single, c0, h);
            mole.AddBond(BondOrder.Single, p, n);
            mole.AddBondToLast(BondOrder.Double, o);
            mole.AddBond(BondOrder.Single, n, o2);

            var mass = float.Parse(mole.GetMolecularMass());

            Assert.AreEqual(128.5, mass);
        }
        public void Smiles1()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var c4 = new AtomNode("C");
            var c5 = new AtomNode("C");
            var h  = new AtomNode("H");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Single, c4);
            mole.AddBondToLast(BondOrder.Single, c5);
            mole.AddBondToLast(BondOrder.Single, c0);
            mole.AddBondToLast(BondOrder.Single, h);

            var smiles = mole.ToSMILES();

            Assert.AreEqual("C1CCCCC1", smiles);
        }
Exemple #22
0
        public void Formula1()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var c4 = new AtomNode("C");
            var c5 = new AtomNode("C");
            var h  = new AtomNode("H");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Single, c4);
            mole.AddBondToLast(BondOrder.Single, c5);
            mole.AddBondToLast(BondOrder.Single, c0);
            mole.AddBondToLast(BondOrder.Single, h);

            var formula = mole.GetMolecularFormula();

            Assert.AreEqual("C6H12", formula);
        }
Exemple #23
0
        public void Mr1()
        {
            var c0 = new AtomNode("C");
            var c1 = new AtomNode("C");
            var c2 = new AtomNode("C");
            var c3 = new AtomNode("C");
            var c4 = new AtomNode("C");
            var c5 = new AtomNode("C");
            var h  = new AtomNode("H");

            var mole = new Molecule(c0);

            mole.AddBondToLast(BondOrder.Single, c1);
            mole.AddBond(BondOrder.Single, c1, c2);
            mole.AddBond(BondOrder.Single, c2, c3);
            mole.AddBondToLast(BondOrder.Single, c4);
            mole.AddBondToLast(BondOrder.Single, c5);
            mole.AddBondToLast(BondOrder.Single, c0);
            mole.AddBondToLast(BondOrder.Single, h);

            var mass = float.Parse(mole.GetMolecularMass());

            Assert.AreEqual(84, mass);
        }
Exemple #24
0
        public void Mutate(double rate)
        {
            double randonrate = _random.NextDouble();

            if (randonrate < rate)
            {
                this.Molecule.LinkEdges.RemoveAt(_random.Next(this.Molecule.LinkEdges.Count));
                bool create = false;
                do
                {
                    var atom1 = this.Molecule.AtomNodes[_random.Next(this.Molecule.AtomNodes.Count)];
                    var atom2 = this.Molecule.AtomNodes[_random.Next(this.Molecule.AtomNodes.Count)];
                    create = atom1.AtomId != atom2.AtomId;
                    if (create)
                    {
                        var from = new AtomNode(atom1.Symbol, atom1.AtomId);
                        var to   = new AtomNode(atom2.Symbol, atom2.AtomId);
                        this.Molecule.LinkEdges.Add(new LinkEdge(from, to));
                    }
                } while (!create);

                this.CalcFitness();
            }
        }
Exemple #25
0
        //create cycle for while
        public override SubExpressionGraph Visit(WhileNode node)
        {
            while_stack.Add(node);

            var sub_graph = new SubExpressionGraph();

            var begin_while = SubExpressionGraph.CreateOneVertexSubGraph(new BlockExpressionNode());

            if (!ReferenceEquals(node.Condition, null))
            {
                node.Condition = ProcessSingleNode(node.Condition, ref sub_graph);
            }

            if (!ReferenceEquals(node.Body, null))
            {
                node.Body = ProcessSingleNode(node.Body, ref sub_graph);
            }

            if (node.HasElse)
            {
                node.Else = ProcessSingleNode(node.Else, ref sub_graph);
            }

            VariableDefNode t = new VariableDefNode();

            t.ExpressionType = node.ExpressionType;
            t.Name           = "T" + temporary_counter;
            AtomNode _0 = new AtomNode(node.ExpressionType);

            _0.Value = "";
            t.Value  = _0;
            VariableUseNode t_use = new VariableUseNode();

            t_use.ExpressionType = node.ExpressionType;
            t_use.Declaration    = t;
            t_use.Name           = "T" + temporary_counter;

            List <Vertex> while_graph_vertex = new List <Vertex>();

            OperatorNode assign_body = new OperatorNode();

            assign_body.Operator  = OperatorType.ASSIGN;
            assign_body.Arguments = new List <ExpressionNode> {
                t_use, node.Body
            };

            ConditionalJumpVertex condition_vertex = new ConditionalJumpVertex(null, null, node.Condition);

            while_graph_vertex.Add(condition_vertex);

            OneJumpVertex body_vertex = new OneJumpVertex(condition_vertex, assign_body);

            while_graph_vertex.Add(body_vertex);

            OneJumpVertex end_while_vertex = new OneJumpVertex(null, t_use);

            condition_vertex.TrueJump = body_vertex;
            body_vertex.Jump          = begin_while.Start;

            if (node.HasElse)
            {
                OperatorNode assign_else = new OperatorNode();
                assign_else.Operator  = OperatorType.ASSIGN;
                assign_else.Arguments = new List <ExpressionNode> {
                    t_use, node.Else
                };

                OneJumpVertex else_vertex = new OneJumpVertex(end_while_vertex, assign_else);
                while_graph_vertex.Add(else_vertex);
                condition_vertex.FalseJump = else_vertex;
            }
            else
            {
                condition_vertex.FalseJump = end_while_vertex;
            }

            while_graph_vertex.Add(end_while_vertex);

            sub_graph = SubExpressionGraph.ConcatSubGraph(sub_graph, new SubExpressionGraph(condition_vertex, while_graph_vertex, end_while_vertex, true, null));

            sub_graph.Temporary = t_use;
            temporary_counter++;

            if (while_for_loop_control.ContainsKey(LoopControlMode.LCM_BREAK) && while_for_loop_control[LoopControlMode.LCM_BREAK].ContainsKey(node))
            {
                foreach (var loop_control_vertex in while_for_loop_control[LoopControlMode.LCM_BREAK][node])
                {
                    ((OneJumpVertex)loop_control_vertex).Jump = sub_graph.End;
                }
            }
            if (while_for_loop_control.ContainsKey(LoopControlMode.LCM_CONTINUE) && while_for_loop_control[LoopControlMode.LCM_CONTINUE].ContainsKey(node))
            {
                foreach (var loop_control_vertex in while_for_loop_control[LoopControlMode.LCM_CONTINUE][node])
                {
                    ((OneJumpVertex)loop_control_vertex).Jump = sub_graph.Start;
                }
            }

            while_stack.Remove(node);

            return(sub_graph);
        }
Exemple #26
0
        //Create diamond graph with CondtionVertex, mark flag IF
        public override SubExpressionGraph Visit(IfNode node)
        {
            var sub_graph = new SubExpressionGraph();

            if (!ReferenceEquals(node.Condition, null))
            {
                node.Condition = ProcessSingleNode(node.Condition, ref sub_graph);
            }

            if (!ReferenceEquals(node.Then, null))
            {
                node.Then = ProcessSingleNode(node.Then, ref sub_graph);
            }

            if (node.HasElse)
            {
                node.Else = ProcessSingleNode(node.Else, ref sub_graph);
            }

            VariableDefNode t = new VariableDefNode();

            t.ExpressionType = node.ExpressionType;
            t.Name           = "T" + temporary_counter;
            AtomNode _0 = new AtomNode(node.ExpressionType);

            _0.Value = "";
            t.Value  = _0;
            VariableUseNode t_use = new VariableUseNode();

            t_use.ExpressionType = node.ExpressionType;
            t_use.Declaration    = t;
            t_use.Name           = "T" + temporary_counter;

            OperatorNode assign_then = new OperatorNode();

            assign_then.Operator  = OperatorType.ASSIGN;
            assign_then.Arguments = new List <ExpressionNode> {
                t_use, node.Then
            };

            OneJumpVertex         then_vertex      = new OneJumpVertex(null, assign_then);
            OneJumpVertex         end_if           = new OneJumpVertex(null, t_use);
            ConditionalJumpVertex condition_vertex = new ConditionalJumpVertex(then_vertex, end_if, node.Condition);

            var vertex_in_if = new List <Vertex> {
                condition_vertex, then_vertex
            };

            if (node.HasElse)
            {
                OperatorNode assign_else = new OperatorNode();
                assign_else.Operator  = OperatorType.ASSIGN;
                assign_else.Arguments = new List <ExpressionNode> {
                    t_use, node.Else
                };

                OneJumpVertex else_vertex = new OneJumpVertex(null, assign_else);

                condition_vertex.FalseJump = else_vertex;
                else_vertex.Jump           = end_if;

                vertex_in_if.Add(else_vertex);
            }
            else
            {
                condition_vertex.FalseJump = end_if;
            }

            vertex_in_if.Add(end_if);

            var if_sub_graph = new SubExpressionGraph(condition_vertex, vertex_in_if, end_if, true, null);

            sub_graph = SubExpressionGraph.ConcatSubGraph(sub_graph, if_sub_graph);

            sub_graph.Temporary = t_use;
            temporary_counter++;

            return(sub_graph);
        }
        public override void Visit(IfNode node)
        {
            base.Visit(node);

            if (changed_nodes.ContainsKey(node.Condition))
            {
                node.Condition = changed_nodes[node.Condition];
            }
            if (changed_nodes.ContainsKey(node.Then))
            {
                node.Then = changed_nodes[node.Then];
            }
            if (changed_nodes.ContainsKey(node.Else))
            {
                node.Else = changed_nodes[node.Else];
            }

            VariableDefNode t = new VariableDefNode();

            t.Name = "T" + temporary_counter;
            AtomNode _0 = new AtomNode(NamedTypeNode.IntType());

            _0.Value = "0";
            t.Value  = _0;
            VariableUseNode t_use = new VariableUseNode();

            t_use.Declaration = t;
            t_use.Name        = "T" + temporary_counter;

            OperatorNode assign_then = new OperatorNode();

            assign_then.Operator  = OperatorType.ASSIGN;
            assign_then.Arguments = new List <ExpressionNode> {
                t_use, node.Then
            };
            OneJumpVertex then_vertex = new OneJumpVertex(null, assign_then);

            graph_vertex.Add(then_vertex);

            ConditionalJumpVertex condition_vertex = new ConditionalJumpVertex(then_vertex, null, node.Condition);

            graph_vertex.Add(condition_vertex);
            AddNextJump(condition_vertex);

            nodes_to_next_jmp.Add(then_vertex);

            if (node.HasElse)
            {
                OperatorNode assign_else = new OperatorNode();
                assign_else.Operator  = OperatorType.ASSIGN;
                assign_else.Arguments = new List <ExpressionNode> {
                    t_use, node.Else
                };
                OneJumpVertex else_vertex = new OneJumpVertex(null, assign_else);
                graph_vertex.Add(else_vertex);
                nodes_to_next_jmp.Add(else_vertex);
                condition_vertex.FalseJump = else_vertex;
            }
            else
            {
                nodes_to_next_jmp.Add(condition_vertex);
            }

            changed_nodes[node] = t_use;
            temporary_counter++;
        }
Exemple #28
0
 public virtual T Visit(AtomNode node)
 {
     return(Visit(node as ExpressionNode));
 }
Exemple #29
0
 public ComparisonNode(AtomNode left, AtomNode right, string op)
 {
     _left  = left;
     _right = right;
     _op    = op;
 }
 /// <summary>Returns a value indicating whether the specified <see cref="AtomNode"/> can be removed.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to test.</param>
 /// <returns>True if the specified <see cref="AtomNode"/> can be removed; otherwise, false.</returns>
 protected override bool CanRemoveNode(AtomNode node)
 {
   return (node is AtomId || node is AtomTitle || node is AtomUpdated) == false;
 }
 public virtual void Visit(AtomNode node)
 {
     Visit(node as ExpressionNode);
 }
 /// <summary>Returns a value indicating whether the specified <see cref="AtomNode"/> can be added.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to test.</param>
 /// <returns>True if the specified <see cref="AtomNode"/> can be added; otherwise, false.</returns>
 protected override bool CanAddNode(AtomNode node)
 {
   return base.CanAddNode(node) || node is AtomEntry;
 }
 /// <summary>When overridden in a derived class, returns a value indicating whether the specified <see cref="AtomNode"/> can be removed.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to test.</param>
 /// <returns>True if the specified <see cref="AtomNode"/> can be removed; otherwise, false.</returns>
 protected abstract bool CanRemoveNode(AtomNode node);
 /// <summary>When overridden in a derived class, returns a value indicating whether the specified <see cref="AtomNode"/> can be added.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to test.</param>
 /// <returns>True if the specified <see cref="AtomNode"/> can be added; otherwise, false.</returns>
 protected abstract bool CanAddNode(AtomNode node);
 /// <summary>Adds the specified <see cref="AtomNode"/> to this node.</summary>
 /// <param name="node">The <see cref="AtomNode"/> to add.</param>
 /// <exception cref="ArgumentNullException"><paramref name="node"/> is null.</exception>
 /// <exception cref="ArgumentException"><paramref name="node"/> cannot be added.</exception>
 public void Add(AtomNode node)
 {
   if(node == null) throw new ArgumentNullException("node");
   if(this.CanAddNode(node) == false) throw new ArgumentException(Errors.CannotAddNode, "node");
   this.Element.Add((XElement)node);
 }
 public IBoundScope <TItem> GetScope(AtomNode node, IScope <TItem> parentScope)
 {
     // Ignore atom nodes
     return(null);
 }