public override bool GetMaxCommonFragments( HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap) { string debugInfo = ""; HasseFingerprint fp1 = ((FingerprintChemHasseNode)Node1).hFingerprint; HasseFingerprint fp1_clone = fp1.CloneHasseFingerprint(); HasseFingerprint fp2 = ((FingerprintChemHasseNode)Node2).hFingerprint; fp1_clone.AndBits(fp2); if(fp1_clone.bitCount >= MinimumOverlap ){ string strMCS = fp1_clone.ToHex(); HasseFingerprint test = new HasseFingerprint(); test.FromHex(strMCS); NewFragmentList.Add( new HasseNode[1] { this }, // this is lower than new frag new HasseNode[2] { Node1, Node2 }, // those are higher than new frag strMCS, // string to use for new node creation later debugInfo, HasseNode.HasseNodeTypes.FRAGMENT | HasseNode.HasseNodeTypes.MAX_COMMON_FRAGMENT, // type of frag null // this new frag is not associated with a single edge ); return true; } return false; }
public abstract bool GetMaxCommonFragments(HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap);
public override bool GetMaxCommonFragments(HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap) { return(true); }
// ========================================== public HasseDiagram(HasseNodeFactory.NodeType t ) { // construct new HasseDiagram HasseDiagramNodes = new HasseNodeCollection(); //collection nodes in diagram DifferenceNodes = new HasseNodeCollection(); //collection of objects expressing difference //ElementaryHasseNodes = new HasseNodeCollection(); // collection of elements // factory for nodes, set its nodetype and let it have access to global elements collection diagramNodeFactory = new HasseNodeFactory(t); differenceNodeFactory = new HasseNodeFactory(t); // a queue for nodes to be created after current node is fully processed FragmentInsertionQueue = new HasseFragmentInsertionQueue(HasseDiagramNodes); // create the root node as part of construction RootNode = diagramNodeFactory.NewNode("", HasseNode.HasseNodeTypes.ROOT,""); HasseDiagramNodes.Add("{}", RootNode); }
public override bool GetMaxCommonFragments( HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap) { return ChemObject.GetMaxCommonFragments(this, Node1, Node2, dbg, NewFragmentList, MinimumOverlap ); }
private bool ProcessMatch(Match M, int MinimumOverlap, HasseFragmentInsertionQueue NewFragmentList ,HasseNode [] PartlyMatchingNodes, string debugInfo) { string StringMCS = M.GetMatchString(); bool matchWasNew = false; if (StringMCS.Length >= MinimumOverlap) { // if (M.StrA.Equals("*t")) System.Diagnostics.Debugger.Break(); // deal with the max common substructure: // star to left? Both strings must then have one pos matching star if (M.FirstPosInA > 0 && M.FirstPosInB > 0) { StringMCS = "*" + StringMCS; } // star to right? Both strings must then have one pos matching star if ((M.LastPosInA < M.StrA.Length - 1) && (M.LastPosInB < M.StrB.Length - 1)) { StringMCS = StringMCS + "*"; } // Do not return back what was started from: if (StringMCS.Equals(PartlyMatchingNodes[0].KeyString) | StringMCS.Equals(PartlyMatchingNodes[1].KeyString )) { return false; } if (StringMCS.Equals("**")) System.Diagnostics.Debugger.Break(); if (!StringMCS.Equals("*")) { if (true == NewFragmentList.Add(new HasseNode[1] { this }, PartlyMatchingNodes, StringMCS, debugInfo, HasseNodeTypes.FRAGMENT | HasseNodeTypes.MAX_COMMON_FRAGMENT, null)) matchWasNew = true; } } //if (matchWasNew) { System.Diagnostics.Debugger.Break(); } return matchWasNew; }
public bool GetMaxCommonFragmentsNotUsed(HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap) { // this Node is directly below both Node1 and Node2 // it can match several places CountMCS ++; string strSeed = this.KeyString.Replace("*", ""); string str1 = Node1.KeyString; string str2 = Node2.KeyString; bool FoundMCS = false; // we are only interested in matches strictly larger than seed if (strSeed.Length + 1 > MinimumOverlap) { MinimumOverlap = strSeed.Length + 1; } int MatchPosA = GetNextMatch(0,strSeed,str1); while(MatchPosA>-1){ int MatchPosB = GetNextMatch(0,strSeed,str2); while(MatchPosB>-1){ Match M = new Match( strSeed,MatchPosA, 0, str1, MatchPosB, 0, str2); M.ExpandMCSMatch(); //MatchPosA= M.LastPosInA; //MatchPosB = M.LastPosInB; string debugInfo = "MCS " + Node1.GetID().ToString () + " " + Node2.GetID().ToString (); if (true == ProcessMatch(M, MinimumOverlap, NewFragmentList, new HasseNode[2] { Node1, Node2 }, debugInfo)) { FoundMCS = true; } MatchPosB = GetNextMatch(MatchPosB +1,strSeed,str2); } MatchPosA = GetNextMatch(MatchPosA +1,strSeed,str1); } return FoundMCS; }
public override bool GetMaxCommonFragments(HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap) { CountMCS++; string str1 = Node1.KeyString; string str2 = Node2.KeyString; bool FoundMCS = false; StringMatcher sm = new StringMatcher(); sm.Initialise(str1, str2); Match m = null; do { m = sm.nextMatch(); if (m == null) break; if (m.LastPosInA - m.FirstPosInA < MinimumOverlap-1) continue; //System.Diagnostics.Debug.WriteLine(m.StrA.Substring(m.FirstPosInA, m.LastPosInA - m.FirstPosInA + 1)); //System.Diagnostics.Debug.WriteLine(m.StrB.Substring(m.FirstPosInB, m.LastPosInB - m.FirstPosInB + 1)); string debugInfo = "MCS " + Node1.GetID().ToString() + " " + Node2.GetID().ToString(); if (true == ProcessMatch(m, MinimumOverlap, NewFragmentList, new HasseNode[2] { Node1, Node2 }, debugInfo)) { FoundMCS = true; } } while (true); return FoundMCS; }