示例#1
0
        public override (bool repairAttempted, bool repairSuccesfull) repair(Node n)
        {
            if (isMet(n))
            {
                return(false, false);
            }

            placeHolder.Value.Clear();
            n.gatherAllNodesInSubtree(placeHolder.Value);

            var sameTypeNodes = placeHolder.Value.Where(q => q.type == rootOfSubtreeToContain.type);

            if (sameTypeNodes.Any())                    //if it contains nodes of the same type, one of them is selected and replaced by copy of the required subtree
            {
                var list         = sameTypeNodes.ToList();
                var selectedNode = list[r.Next(list.Count)];
                var predecessor  = selectedNode.predecessor;
                predecessor.setSuccessor(rootOfSubtreeToContain.createDeepCopy(), selectedNode.indexInParrentsSlot);
                return(true, true);
            }

            var sameClassNodes = placeHolder.Value.Where(q => q.getNodeClass() == rootOfSubtreeToContain.getNodeClass());

            if (sameClassNodes.Any())                //if it contains nodes of the same class, one of them is selected and replaced by copy of the required subtree
            {
                var list         = sameClassNodes.ToList();
                var selectedNode = list[r.Next(list.Count)];
                var predecessor  = selectedNode.predecessor;
                predecessor.setSuccessor(rootOfSubtreeToContain.createDeepCopy(), selectedNode.indexInParrentsSlot);
                return(true, true);
            }
            return(true, false);
        }
示例#2
0
 public void setNodeConnectedToSlot(Node n)
 {
     if (n.getNodeClass() != this.argumentClass)
     {
         throw new Exception();
     }
     nodeConnectedToSlot = n;
 }