//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(); }
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); }
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); }
//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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); } }
//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); }
//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++; }
public virtual T Visit(AtomNode node) { return(Visit(node as ExpressionNode)); }
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); }