Ejemplo n.º 1
0
        public VfState(
            IGraphLoader <TV, TE> loader1,
            IGraphLoader <TV, TE> loader2,
            bool fIsomorphism  = false,
            bool fContextCheck = false)
        {
            LstIn1           = new SortedListNoValue <int>();
            LstOut1          = new SortedListNoValue <int>();
            LstIn2           = new SortedListNoValue <int>();
            LstOut2          = new SortedListNoValue <int>();
            LstDisconnected2 = new SortedListNoValue <int>();
            LstDisconnected1 = new SortedListNoValue <int>();
            _ldr1            = loader1;
            _ldr2            = loader2;

            _fContextCheck = fContextCheck;

            if (fIsomorphism)
            {
                // normal isomorphism - degrees must match exactly
                FnCompareDegrees = CmpIsomorphism;
            }
            else
            {
                // Subgraph isomorphism - degrees in graph2 must be less than
                // those of graph1.
                FnCompareDegrees = CmpSubgraphIsomorphism;
            }

            // Vertex indices in VfGraphs are sorted by vertex degree
            _degreeSortedToOriginal1 = new CmpVertexDegrees <TV, TE>(loader1).Permutation;
            _degreeSortedToOriginal2 = new CmpVertexDegrees <TV, TE>(loader2).Permutation;
            VfGraph1 = new VfGraph <TV, TE>(loader1, _degreeSortedToOriginal1);
            VfGraph2 = new VfGraph <TV, TE>(loader2, _degreeSortedToOriginal2);

            // Set up space for isomorphism mappings
            _vfGraphIvtx1To2Isomorphism = new Dictionary <int, int>(loader1.VertexCount);
            _vfGraphIvtx2To1Isomorphism = new Dictionary <int, int>(loader2.VertexCount);

            // When we start no isomorphic mappings and all vertices are disconnected
            // from the isomorphism.
            for (var i = 0; i < loader1.VertexCount; i++)
            {
                _vfGraphIvtx1To2Isomorphism[i] = MapIllegal;
                LstDisconnected1.Add(i);
            }
            for (var i = 0; i < loader2.VertexCount; i++)
            {
                _vfGraphIvtx2To1Isomorphism[i] = MapIllegal;
                LstDisconnected2.Add(i);
            }
        }
Ejemplo n.º 2
0
        private List <int> GetList(List <int> lstOfNodes, VfGraph vfgr, Groups grp)
        {
            List <int> lstRet = new List <int>();

            foreach (int inod in lstOfNodes)
            {
                if (((int)vfgr.GetGroup(inod) & (int)grp) != 0)
                {
                    lstRet.Add(inod);
                }
            }

            return(lstRet);
        }
Ejemplo n.º 3
0
        private int GetGroupCountInList(IEnumerable <int> lstOfNodes, VfGraph vfgr, Groups grp)
        {
            int cnod = 0;

            foreach (int inod in lstOfNodes)
            {
                if (((int)vfgr.GetGroup(inod) & (int)grp) != 0)
                {
                    cnod++;
                }
            }

            return(cnod);
        }
Ejemplo n.º 4
0
        internal void MoveToGroup(int iGraph, int inod, Groups grpNew, VfState vfs)
        {
            VfGraph vfg    = iGraph == 1 ? vfs.Vfgr1 : vfs.Vfgr2;
            Groups  grpOld = vfg.GetGroup(inod);

            if (grpOld == Groups.FromMapping && grpNew == Groups.ToMapping ||
                grpOld == Groups.ToMapping && grpNew == Groups.FromMapping)
            {
                grpNew = Groups.FromMapping | Groups.ToMapping;
            }
            if (grpOld != (grpOld | grpNew))
            {
                AddAction(new BacktrackAction(Action.groupMove, iGraph, inod, grpOld));
                vfs.MakeMove(iGraph, inod, grpNew);
            }
        }
Ejemplo n.º 5
0
        void MassagePermutationList()
        {
            int count1 = _arinodMap1To2.Length;
            int count2 = _arinodMap2To1.Length;

            // Permutations to move from VfGraph inods to Graph inods
            int[] armpInodGraphInodVf1 = VfGraph.ReversePermutation(_armpInodVfInodGraph1);
            int[] armpInodGraphInodVf2 = VfGraph.ReversePermutation(_armpInodVfInodGraph2);
            _lstfm = new List <FullMapping>(_lstMappings.Count);

            foreach (FullMapping fm in _lstMappings)
            {
                FullMapping fmTmp = new FullMapping(count1, count2);
                MassagePermutations(fm.arinodMap1To2, fm.arinodMap2To1, armpInodGraphInodVf1, armpInodGraphInodVf2, ref fmTmp.arinodMap1To2, ref fmTmp.arinodMap2To1);
                _lstfm.Add(fmTmp);
            }
        }
Ejemplo n.º 6
0
            public void TestPermutations()
            {
                Graph graph = new Graph();

                Assert.AreEqual(0, graph.InsertNode());
                Assert.AreEqual(1, graph.InsertNode());
                Assert.AreEqual(2, graph.InsertNode());
                graph.InsertEdge(1, 0);
                graph.InsertEdge(1, 2);
                int[]   mpPermutation = (new CmpNodeDegrees(graph)).Permutation;
                VfGraph vfg           = new VfGraph(graph, mpPermutation);

                Assert.AreEqual(mpPermutation[1], 0);
                int[] arOut = new int[vfg._arNodes[0].OutNeighbors.Count];
                vfg._arNodes[0].OutNeighbors.CopyTo(arOut, 0);
                int inodNeighbor1 = arOut[0];
                int inodNeighbor2 = arOut[1];

                Assert.IsTrue(inodNeighbor1 == 1 && inodNeighbor2 == 2 || inodNeighbor1 == 2 && inodNeighbor2 == 1);
            }
Ejemplo n.º 7
0
        private void MassagePermutation()
        {
            // Permutations to move from VfGraph inods to Graph inods
            int[] armpInodGraphInodVf1 = VfGraph.ReversePermutation(_armpInodVfInodGraph1);
            int[] armpInodGraphInodVf2 = VfGraph.ReversePermutation(_armpInodVfInodGraph2);

            // Holding areas for new permutations
            _armpNid1Nid2 = new int[_arinodMap1To2.Length];
            _armpNid2Nid1 = new int[_arinodMap2To1.Length];

            for (int i = 0; i < _arinodMap1To2.Length; i++)
            {
                int inodMap = _arinodMap1To2[armpInodGraphInodVf1[i]];
                _armpNid1Nid2[i] = (inodMap == map_Illegal ? map_Illegal : (int)_ldr2.IdFromPos(_armpInodVfInodGraph2[inodMap]));
            }

            for (int i = 0; i < _arinodMap2To1.Length; i++)
            {
                // Shouldn't be any map_illegal values in the second graph's array
                _armpNid2Nid1[i] = _ldr1.IdFromPos(_armpInodVfInodGraph1[_arinodMap2To1[armpInodGraphInodVf2[i]]]);
            }
        }
Ejemplo n.º 8
0
        public VfState(IGraphLoader loader1, IGraphLoader loader2, bool fIsomorphism, bool fContextCheck, bool fFindAll)
        {
            _ldr1 = loader1;
            _ldr2 = loader2;

            _fContextCheck = fContextCheck;
            _fFindAll      = fFindAll;

            if (fIsomorphism)
            {
                fnCmp = new FCompareDegreesDelegate(CmpIsomorphism);
            }
            else
            {
                fnCmp = new FCompareDegreesDelegate(CmpSubgraphIsomorphism);
            }

            // Salmon commend becuase never used.
            // _fIsomorphism = fIsomorphism;

            _armpInodVfInodGraph1 = new CmpNodeDegrees(loader1).Permutation;
            _armpInodVfInodGraph2 = new CmpNodeDegrees(loader2).Permutation;
            _vfgr1         = new VfGraph(loader1, _armpInodVfInodGraph1);
            _vfgr2         = new VfGraph(loader2, _armpInodVfInodGraph2);
            _arinodMap1To2 = new int[loader1.NodeCount];
            _arinodMap2To1 = new int[loader2.NodeCount];
            for (int i = 0; i < loader1.NodeCount; i++)
            {
                _arinodMap1To2[i] = map_Illegal;
                _lstDisconnected1.Add(i);
            }
            for (int i = 0; i < loader2.NodeCount; i++)
            {
                _arinodMap2To1[i] = map_Illegal;
                _lstDisconnected2.Add(i);
            }
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Count vertices in a list which are in a particular classification
 /// </summary>
 /// <param name="lstOfVertexIndices">List of vertex indices to check</param>
 /// <param name="vfgr">Graph which contains the vertex</param>
 /// <param name="grp">Classification to check for</param>
 /// <returns>Count of vertices in list which are classified properly</returns>
 private int GetGroupCountInList(IEnumerable <int> lstOfVertexIndices, VfGraph <TV, TE> vfgr, Group grp)
 {
     return(lstOfVertexIndices.Count(ivtx => ((int)vfgr.GetGroup(ivtx) & (int)grp) != 0));
 }