private bool addNode(HasseNode newNode, HasseNode[] AboveTheseNodes, HasseNode[] BelowTheseNodes) { // should return true if node was inserted // or false if corresponding node already exist bool debug = Convert.ToBoolean(DEBUGLEVEL & LOG_INSERTIONS); bool dbgTimings = Convert.ToBoolean(DEBUGLEVEL & LOG_ALL_TIMINGS); sw.Reset(); sw.Start(); if (newNode.Size() < MINIMUM_FRAGMENT_SIZE) return false; // do not add identical objects if (HasseDiagramNodes.ContainsKey(newNode.KeyString)) { // is already there - we will update type, set name, redraw image, then return. HasseDiagramNodes[newNode.KeyString].AddNodeType(newNode.NodeType); if(newNode.HasNodeType ( HasseNode.HasseNodeTypes.REAL )){ string n = newNode.GetName(); HasseDiagramNodes[newNode.KeyString].SetName(n); //if (CREATE_NODE_IMAGE) HasseDiagramNodes[newNode.KeyString].CreateImage(); System.Diagnostics.Debug.WriteLineIf(debug, " Skipping add of " + newNode.KeyString); } return false; } //if (CREATE_NODE_IMAGE) newNode.CreateImage(); CountAdditions += 1; if (DEBUGLEVEL > 0) { System.Diagnostics.Debug.WriteLine("Add Node " + newNode.KeyString + " " + CountAdditions.ToString()); } // loop elements of new object /* foreach (HasseNode Element in newNode.getElementarySubobjects().Values) { if (USE_ELEMENTS) { // add to diagram nodes list if not already there if (!HasseDiagramNodes.ContainsKey(Element.KeyString)) { HasseDiagramNodes.Add(Element.KeyString, Element); //Element.CreateImage(); this.MakeEdge(RootNode, Element); } } // add to elements collection if not there already if (!ElementaryHasseNodes.ContainsKey(Element.KeyString)) ElementaryHasseNodes.Add(Element.KeyString, Element); } */ System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks add 1 (init) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Start LUB and GLB for " + newNode.KeyString + " ==="); if (CountAdditions == -1) System.Diagnostics.Debugger.Break(); HasseNodeCollection NodesInGreatestLowerBound = null; HasseNodeCollection NodesInLeastUpperBound = null; FindLUBAndGLB(newNode, ref NodesInLeastUpperBound, ref NodesInGreatestLowerBound); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 2 (got lub and glb) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Done LUB and GLB ======="); List<HasseEdge> NewlyFormedEdges = InsertNodeBetweenGlbAndLub( newNode, NodesInLeastUpperBound, NodesInGreatestLowerBound, debug); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 3 (inserted new) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); if (Convert.ToBoolean(CHECK_LEVEL & CHECK_ALL)) newNode.validate(); if (MAKE_MCS_AT_ONCE) { FindCommonFragments(newNode); } System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 4 (made MCS)" + sw.ElapsedTicks.ToString()); // The node may be there already, just added, as element if it is both element and real // if (!newNode.HasNodeType(HasseNode.HasseNodeTypes.ELEMENT)) HasseDiagramNodes.Add(newNode.KeyString, newNode); return true; }
private bool addNode(HasseNode newNode, HasseNode[] AboveTheseNodes, HasseNode[] BelowTheseNodes) { // should return true if node was inserted // or false if corresponding node already exist bool debug = Convert.ToBoolean(DEBUGLEVEL & LOG_INSERTIONS); bool dbgTimings = Convert.ToBoolean(DEBUGLEVEL & LOG_ALL_TIMINGS); sw.Reset(); sw.Start(); if (newNode.Size() < MINIMUM_FRAGMENT_SIZE) { return(false); } // do not add identical objects if (HasseDiagramNodes.ContainsKey(newNode.KeyString)) { // is already there - we will update type, set name, redraw image, then return. HasseDiagramNodes[newNode.KeyString].AddNodeType(newNode.NodeType); if (newNode.HasNodeType(HasseNode.HasseNodeTypes.REAL)) { string n = newNode.GetName(); HasseDiagramNodes[newNode.KeyString].SetName(n); //if (CREATE_NODE_IMAGE) HasseDiagramNodes[newNode.KeyString].CreateImage(); System.Diagnostics.Debug.WriteLineIf(debug, " Skipping add of " + newNode.KeyString); } return(false); } //if (CREATE_NODE_IMAGE) newNode.CreateImage(); CountAdditions += 1; if (DEBUGLEVEL > 0) { System.Diagnostics.Debug.WriteLine("Add Node " + newNode.KeyString + " " + CountAdditions.ToString()); } // loop elements of new object /* * foreach (HasseNode Element in newNode.getElementarySubobjects().Values) * { * if (USE_ELEMENTS) * { * // add to diagram nodes list if not already there * if (!HasseDiagramNodes.ContainsKey(Element.KeyString)) * { * HasseDiagramNodes.Add(Element.KeyString, Element); * //Element.CreateImage(); * this.MakeEdge(RootNode, Element); * } * } * // add to elements collection if not there already * if (!ElementaryHasseNodes.ContainsKey(Element.KeyString)) * ElementaryHasseNodes.Add(Element.KeyString, Element); * } */ System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks add 1 (init) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Start LUB and GLB for " + newNode.KeyString + " ==="); if (CountAdditions == -1) { System.Diagnostics.Debugger.Break(); } HasseNodeCollection NodesInGreatestLowerBound = null; HasseNodeCollection NodesInLeastUpperBound = null; FindLUBAndGLB(newNode, ref NodesInLeastUpperBound, ref NodesInGreatestLowerBound); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 2 (got lub and glb) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Done LUB and GLB ======="); List <HasseEdge> NewlyFormedEdges = InsertNodeBetweenGlbAndLub( newNode, NodesInLeastUpperBound, NodesInGreatestLowerBound, debug); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 3 (inserted new) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); if (Convert.ToBoolean(CHECK_LEVEL & CHECK_ALL)) { newNode.validate(); } if (MAKE_MCS_AT_ONCE) { FindCommonFragments(newNode); } System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 4 (made MCS)" + sw.ElapsedTicks.ToString()); // The node may be there already, just added, as element if it is both element and real // if (!newNode.HasNodeType(HasseNode.HasseNodeTypes.ELEMENT)) HasseDiagramNodes.Add(newNode.KeyString, newNode); return(true); }