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); } }
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); }
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); }
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); } }
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); } }
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); }
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]]]); } }
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); } }
/// <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)); }