コード例 #1
0
        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;
        }
コード例 #2
0
ファイル: HasseNode.cs プロジェクト: peter-lind/hasse-manager
 public abstract bool GetMaxCommonFragments(HasseNode Node1, HasseNode Node2, bool dbg, HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap);
コード例 #3
0
 public override bool GetMaxCommonFragments(HasseNode Node1, HasseNode Node2, bool dbg,
                                            HasseFragmentInsertionQueue NewFragmentList, int MinimumOverlap)
 {
     return(true);
 }
コード例 #4
0
        // ==========================================
        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);
        }
コード例 #5
0
 public override bool GetMaxCommonFragments(
     HasseNode Node1, HasseNode Node2,
     bool dbg, HasseFragmentInsertionQueue NewFragmentList,
     int MinimumOverlap)
 {
     return  ChemObject.GetMaxCommonFragments(this, Node1, Node2, dbg, NewFragmentList, MinimumOverlap );
 }
コード例 #6
0
        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;
        }
コード例 #7
0
        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;
        }
コード例 #8
0
        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;
        }