annotate lib/Graph/CyclesDetection.pm @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
1 package Graph::CyclesDetection;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
2 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
3 # $RCSfile: CyclesDetection.pm,v $
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
4 # $Date: 2015/02/28 20:49:06 $
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
5 # $Revision: 1.27 $
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
6 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
7 # Author: Manish Sud <msud@san.rr.com>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
8 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
9 # Copyright (C) 2015 Manish Sud. All rights reserved.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
10 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
11 # This file is part of MayaChemTools.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
12 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
13 # MayaChemTools is free software; you can redistribute it and/or modify it under
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
14 # the terms of the GNU Lesser General Public License as published by the Free
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
15 # Software Foundation; either version 3 of the License, or (at your option) any
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
16 # later version.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
17 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
18 # MayaChemTools is distributed in the hope that it will be useful, but without
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
19 # any warranty; without even the implied warranty of merchantability of fitness
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
20 # for a particular purpose. See the GNU Lesser General Public License for more
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
21 # details.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
22 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
23 # You should have received a copy of the GNU Lesser General Public License
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
26 # Boston, MA, 02111-1307, USA.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
27 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
28
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
29 use strict;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
30 use Carp;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
31 use Exporter;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
32 use Graph;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
33 use Graph::Path;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
34 use Graph::PathGraph;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
35 use BitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
36
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
37 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
38
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
39 @ISA = qw(Exporter);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
40 @EXPORT = qw();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
41 @EXPORT_OK = qw();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
42
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
43 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
44
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
45 # Setup class variables...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
46 my($ClassName);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
47 _InitializeClass();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
48
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
49 # Overload Perl functions...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
50 use overload '""' => 'StringifyCyclesDetection';
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
51
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
52 # Class constructor...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
53 sub new {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
54 my($Class, $Graph) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
55
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
56 # Initialize object...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
57 my $This = {};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
58 bless $This, ref($Class) || $Class;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
59 $This->_InitializeCyclesDetection($Graph);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
60
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
61 return $This;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
62 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
63
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
64 # Initialize object data...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
65 sub _InitializeCyclesDetection {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
66 my($This, $Graph) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
67
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
68 $This->{Graph} = $Graph;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
69
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
70 # Cycles list...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
71 @{$This->{AllCyclicPaths}} = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
72
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
73 # Cyclic paths which are not part of any other cycle...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
74 @{$This->{IndependentCyclicPaths}} = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
75
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
76 return $This;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
77 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
78
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
79 # Initialize class ...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
80 sub _InitializeClass {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
81 #Class name...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
82 $ClassName = __PACKAGE__;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
83 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
84
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
85 # Detect all cycles in graph...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
86 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
87 sub DetectCycles {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
88 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
89
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
90 return $This->DetectCyclesUsingCollapsingPathGraphMethodology();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
91 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
92
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
93 # Detect all cycles in the graph using collapsing path graph [Ref 31] methodology...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
94 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
95 # Note:
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
96 # . For topologically complex graphs containing large number of cycles,
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
97 # CollapseVertexAndCollectCyclicPathsDetectCycles method implemented in
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
98 # PathGraph can time out in which case no cycles are detected or
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
99 # assigned.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
100 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
101 sub DetectCyclesUsingCollapsingPathGraphMethodology {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
102 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
103 my($PathGraph);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
104
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
105 # Create a path graph...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
106 $PathGraph = new Graph::PathGraph($This->{Graph});
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
107
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
108 # For a vertex to be in a cycle, its degree must be >=2. So delete vertices recursively
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
109 # till all vertices with degree less than 2 have been deleted...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
110 $PathGraph->DeleteVerticesWithDegreeLessThan(2);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
111
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
112 # Setup a VertexID and EdgeID to index map usage during retrieval of independent cycles to
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
113 # avoid going over all vertices in all cylic paths later...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
114 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
115 my($VertexIDsToIndicesRef, $LargestVertexIndex, $EdgeIDsToIndicesRef, $LargestEdgeIDIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
116 ($VertexIDsToIndicesRef, $LargestVertexIndex) = $This->_SetupVertexIDsToIndicesMap($PathGraph);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
117 ($EdgeIDsToIndicesRef, $LargestEdgeIDIndex) = $This->_SetupEdgeIDsToIndicesMap($PathGraph);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
118
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
119 # Recursively collapse vertices with lowest degree...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
120 my($VertexID, $CycleVertexID);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
121 while ($VertexID = $PathGraph->GetVertexWithSmallestDegree()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
122 if (!$PathGraph->CollapseVertexAndCollectCyclicPaths($VertexID)) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
123 # Cycles detection didn't finish...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
124 return undef;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
125 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
126 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
127
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
128 # Get detected cycles and save 'em sorted by size...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
129 push @{$This->{AllCyclicPaths}}, sort { $a->GetLength() <=> $b->GetLength() } $PathGraph->GetCyclicPaths();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
130
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
131 # Retrieve independent cyclic paths...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
132 return $This->_RetrieveIndependentCycles($VertexIDsToIndicesRef, $LargestVertexIndex, $EdgeIDsToIndicesRef, $LargestEdgeIDIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
133 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
134
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
135 # Retrieve and save independent cyclic paths...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
136 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
137 # Set of independent cycles identified using this method doesn't correspond to basis set of
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
138 # rings or smallest set of smallest rings (SSSR) [ Refs 29-30 ]; instead, set of cycles identified
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
139 # as independent cycles simply correspond to cycles which contain no other cycle as their
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
140 # subcycles and can't be described as linear combination of smaller cycles. And it also happen
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
141 # to contain all the rings in basis set of rings and SSSR. In other words, it's a superset of basis set
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
142 # of cycles and SSSR. For example, six four membered cycles are identified for cubane which is one
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
143 # more than the basis set of cycles.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
144 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
145 sub _RetrieveIndependentCycles {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
146 my($This, $VertexIDsToIndicesRef, $LargestVertexIndex, $EdgeIDsToIndicesRef, $LargestEdgeIDIndex) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
147
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
148 # Only 1 or 0 cyclic paths...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
149 if (@{$This->{AllCyclicPaths}} <= 1) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
150 push @{$This->{IndependentCyclicPaths}}, @{$This->{AllCyclicPaths}};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
151 return $This;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
152 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
153
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
154 # Setup bit vectors for each cyclic path with size of each bit vector corresponding to
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
155 # maximum vertex index plus one...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
156 my($CyclicPath, $BitVector, @BitNums, @CyclicPathBitVectors, @CyclicPathEdgeIDsBitVectors);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
157
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
158 @CyclicPathBitVectors = (); @CyclicPathEdgeIDsBitVectors = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
159
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
160 # Set bits corresponding to VertexIDs EdgeIDs using their indices...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
161 for $CyclicPath (@{$This->{AllCyclicPaths}}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
162 $BitVector = new BitVector($LargestVertexIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
163 @BitNums = map { $VertexIDsToIndicesRef->{$_} } $CyclicPath->GetVertices();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
164 $BitVector->SetBits(@BitNums);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
165 push @CyclicPathBitVectors, $BitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
166
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
167 $BitVector = new BitVector($LargestEdgeIDIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
168 @BitNums = map { $EdgeIDsToIndicesRef->{$_} } $This->_GetPathEdgeIDs($CyclicPath);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
169 $BitVector->SetBits(@BitNums);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
170 push @CyclicPathEdgeIDsBitVectors, $BitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
171 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
172
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
173 # First smallest cyclic path always ends up as an independent cyclic path...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
174 push @{$This->{IndependentCyclicPaths}}, $This->{AllCyclicPaths}[0];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
175
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
176 # Retrieve other independent cyclic paths...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
177 my($CurrentIndex, $PreviousIndex, $CurrentCyclicPath, $PreviousCyclicPath, $CurrentPathLength, $PreviousPathLength, $CurrentBitVector, $PreviousBitVector, $CurrentAndPreviousBitVectpor, $AllPreviousSmallerPathsBitVector, $AllPreviousSmallerPathsEdgeIDsBitVector, $CurrentEdgeIDsBitVector, $AndBitVector, %SmallerPathAlreadyAdded, %SkipPath);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
178
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
179 %SkipPath = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
180 %SmallerPathAlreadyAdded = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
181 $AllPreviousSmallerPathsBitVector = new BitVector($LargestVertexIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
182 $AllPreviousSmallerPathsEdgeIDsBitVector = new BitVector($LargestEdgeIDIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
183
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
184 CURRENT: for $CurrentIndex (1 .. $#{$This->{AllCyclicPaths}}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
185 if (exists $SkipPath{$CurrentIndex}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
186 next CURRENT;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
187 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
188 $CurrentCyclicPath = $This->{AllCyclicPaths}[$CurrentIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
189 $CurrentBitVector = $CyclicPathBitVectors[$CurrentIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
190 $CurrentPathLength = $CurrentCyclicPath->GetLength();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
191
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
192 PREVIOUS: for $PreviousIndex (0 .. ($CurrentIndex - 1)) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
193 if (exists $SkipPath{$PreviousIndex}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
194 next PREVIOUS;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
195 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
196 $PreviousCyclicPath = $This->{AllCyclicPaths}[$PreviousIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
197 $PreviousBitVector = $CyclicPathBitVectors[$PreviousIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
198
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
199 # Is previous path a subset of current path?
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
200 $CurrentAndPreviousBitVectpor = $PreviousBitVector & $CurrentBitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
201 if ($PreviousBitVector->GetNumOfSetBits() == $CurrentAndPreviousBitVectpor->GetNumOfSetBits()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
202 # Current path doesn't qualify an independent path...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
203 $SkipPath{$CurrentIndex} = 1;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
204 next CURRENT;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
205 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
206
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
207 $PreviousPathLength = $PreviousCyclicPath->GetLength();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
208 if ($PreviousPathLength < $CurrentPathLength) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
209 # Mark cycle vertices seen in cyclic paths with length smaller than current path...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
210 if (! exists $SmallerPathAlreadyAdded{$PreviousIndex}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
211 $SmallerPathAlreadyAdded{$PreviousIndex} = 1;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
212 $AllPreviousSmallerPathsBitVector = $AllPreviousSmallerPathsBitVector | $PreviousBitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
213 $AllPreviousSmallerPathsEdgeIDsBitVector = $AllPreviousSmallerPathsEdgeIDsBitVector | $CyclicPathEdgeIDsBitVectors[$PreviousIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
214 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
215 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
216 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
217 if ($AllPreviousSmallerPathsBitVector->GetNumOfSetBits()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
218 # Is current path a linear combination of smaller paths?
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
219 $AndBitVector = $AllPreviousSmallerPathsBitVector & $CurrentBitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
220 if ($CurrentBitVector->GetNumOfSetBits() == $AndBitVector->GetNumOfSetBits()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
221 # Are all edges in the current path already present in smaller paths?
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
222 $CurrentEdgeIDsBitVector = $CyclicPathEdgeIDsBitVectors[$CurrentIndex];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
223 $AndBitVector = $AllPreviousSmallerPathsEdgeIDsBitVector & $CurrentEdgeIDsBitVector;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
224
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
225 if ($CurrentEdgeIDsBitVector->GetNumOfSetBits() == $AndBitVector->GetNumOfSetBits()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
226 # Current path doesn't qualify an independent path...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
227 $SkipPath{$CurrentIndex} = 1;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
228 next CURRENT;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
229 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
230 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
231 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
232 # It's an independent cyclic path...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
233 push @{$This->{IndependentCyclicPaths}}, $CurrentCyclicPath;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
234 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
235 return $This;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
236 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
237
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
238 # Setup a VertexID to index map...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
239 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
240 sub _SetupVertexIDsToIndicesMap {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
241 my($This, $PathGraph) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
242 my($LargestVertexIndex, @VertexIDs, %VertexIDsMap);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
243
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
244 %VertexIDsMap = (); @VertexIDs = (); $LargestVertexIndex = 0;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
245
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
246 @VertexIDs = $PathGraph->GetVertices();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
247 if (! @VertexIDs) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
248 return (\%VertexIDsMap, $LargestVertexIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
249 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
250 @VertexIDsMap{ @VertexIDs } = (0 .. $#VertexIDs);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
251 $LargestVertexIndex = scalar @VertexIDs;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
252
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
253 return (\%VertexIDsMap, $LargestVertexIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
254 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
255
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
256 # Setup a Edge to index map using paths associated to egdes in an intial
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
257 # path graph...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
258 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
259 sub _SetupEdgeIDsToIndicesMap {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
260 my($This, $PathGraph) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
261 my($Path, $LargestEdgeIndex, @EdgeIDs, %EdgeIDsMap);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
262
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
263 %EdgeIDsMap = (); @EdgeIDs = (); $LargestEdgeIndex = 0;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
264
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
265 @EdgeIDs = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
266 for $Path ($PathGraph->GetPaths()) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
267 push @EdgeIDs, $This->_GetPathEdgeIDs($Path);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
268 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
269
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
270 if (! @EdgeIDs) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
271 return (\%EdgeIDsMap, $LargestEdgeIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
272 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
273
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
274 @EdgeIDsMap{ @EdgeIDs } = (0 .. $#EdgeIDs);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
275 $LargestEdgeIndex = scalar @EdgeIDs;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
276
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
277 return (\%EdgeIDsMap, $LargestEdgeIndex);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
278 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
279
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
280 # Get path edge IDs or number of edges. The edge IDs are generated from
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
281 # edge vertices and correpond to VertexID1-VertexID2 where VertexID1 <=
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
282 # VertexID2.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
283 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
284 sub _GetPathEdgeIDs {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
285 my($This, $Path) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
286 my(@EdgesVertexIDs, @EdgeIDs);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
287
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
288 @EdgesVertexIDs = (); @EdgeIDs = ();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
289 @EdgesVertexIDs = $Path->GetEdges();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
290 if (!@EdgesVertexIDs) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
291 return wantarray ? @EdgeIDs : (scalar @EdgeIDs);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
292 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
293
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
294 # Set up edge IDs...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
295 my($Index, $VertexID1, $VertexID2, $EdgeID);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
296
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
297 for ($Index = 0; $Index < $#EdgesVertexIDs; $Index += 2) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
298 $VertexID1 = $EdgesVertexIDs[$Index]; $VertexID2 = $EdgesVertexIDs[$Index + 1];
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
299 $EdgeID = ($VertexID1 <= $VertexID2) ? "$VertexID1-$VertexID2" : "$VertexID2-$VertexID1";
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
300 push @EdgeIDs, $EdgeID;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
301 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
302
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
303 return wantarray ? @EdgeIDs : (scalar @EdgeIDs);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
304 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
305
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
306 # Return an array containing references to cyclic paths or number of cylic paths...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
307 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
308 sub GetAllCyclicPaths {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
309 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
310
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
311 return wantarray ? @{$This->{AllCyclicPaths}} : scalar @{$This->{AllCyclicPaths}};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
312 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
313
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
314 # Get cyclic paths which are independent. In otherwords, cycles which don't contain any other
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
315 # cycle as their subset...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
316 #
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
317 sub GetIndependentCyclicPaths {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
318 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
319
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
320 return wantarray ? @{$This->{IndependentCyclicPaths}} : scalar @{$This->{IndependentCyclicPaths}};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
321 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
322
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
323 # Return a string containg data for CyclesDetection object...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
324 sub StringifyCyclesDetection {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
325 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
326 my($CyclesDetectionString, $CyclesCount, $CyclicPath);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
327
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
328 $CyclesCount = @{$This->{AllCyclicPaths}};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
329 $CyclesDetectionString = "AllCycles: Count - $CyclesCount";
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
330 for $CyclicPath (@{$This->{AllCyclicPaths}}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
331 $CyclesDetectionString .= "; Cycle: " . join('-', $CyclicPath->GetVertices());
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
332 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
333
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
334 $CyclesCount = @{$This->{IndependentCyclicPaths}};
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
335 $CyclesDetectionString .= "\nIndependentCycles: Count - $CyclesCount";
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
336 for $CyclicPath (@{$This->{IndependentCyclicPaths}}) {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
337 $CyclesDetectionString .= "; Cycle: " . join('-', $CyclicPath->GetVertices());
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
338 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
339
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
340 return $CyclesDetectionString;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
341 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
342
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
343 # Return a reference to new cycle detection object...
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
344 sub Copy {
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
345 my($This) = @_;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
346 my($NewCyclesDetection);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
347
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
348 $NewCyclesDetection = Storable::dclone($This);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
349
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
350 return $NewCyclesDetection;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
351 }
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
352
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
353 1;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
354
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
355 __END__
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
356
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
357 =head1 NAME
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
358
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
359 CyclesDetection
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
360
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
361 =head1 SYNOPSIS
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
362
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
363 use Graph::CyclesDetection;
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
364
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
365 use Graph::CyclesDetection qw(:all);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
366
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
367 =head1 DESCRIPTION
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
368
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
369 B<CyclesDetection> class provides the following methods:
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
370
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
371 new, Copy, DetectCycles, DetectCyclesUsingCollapsingPathGraphMethodology,
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
372 GetAllCyclicPaths, GetIndependentCyclicPaths, StringifyCyclesDetection
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
373
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
374 Cycles in a B<Graph> are detected using collapsing path graph [Ref 31]
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
375 methodology.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
376
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
377 =head2 METHODS
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
378
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
379 =over 4
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
380
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
381 =item B<new>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
382
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
383 $NewCyclesDetection = new Graph::CyclesDetection($Graph);
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
384
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
385 Using specified I<Graph>, B<new> method creates a new B<CyclesDetection> object and returns
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
386 newly created B<CyclesDetection> object.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
387
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
388 =item B<Copy>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
389
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
390 $NewCyclesDetection = $CyclesDetection->Copy();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
391
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
392 Copies I<CyclesDetection> and its associated data using B<Storable::dclone> and returns a new
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
393 B<CyclesDetection> object.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
394
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
395 =item B<DetectCycles>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
396
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
397 $CyclesDetection->DetectCycles();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
398
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
399 Detects all cycles in a graph and returns I<CyclesDetection>.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
400
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
401 =item B<DetectCyclesUsingCollapsingPathGraphMethodology>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
402
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
403 $CyclesDetection->DetectCyclesUsingCollapsingPathGraphMethodology();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
404
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
405 Detects all cycles in a graph using collapsing path graph [Ref 31] methodology
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
406 and returns I<CyclesDetection>.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
407
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
408 =item B<GetAllCyclicPaths>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
409
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
410 @AllCyclicPaths = $CyclesDetection->GetAllCyclicPaths();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
411 $NumOfAllCyclicPaths = $CyclesDetection->GetAllCyclicPaths();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
412
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
413 Returns an array containing references to all cyclic paths identified during cycles
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
414 detection. In scalar text, number of cycles is returned.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
415
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
416 =item B<GetIndependentCyclicPaths>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
417
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
418 @IndependentCyclicPaths = $CyclesDetection->GetAllCyclicPaths();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
419 $NumOfIndependentCyclicPaths = $CyclesDetection->GetAllCyclicPaths();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
420
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
421 Returns an array containing references to independent cyclic paths identified during cycles
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
422 detection. In scalar text, number of cycles is returned.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
423
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
424 A set of independent cycles identified during cycles detection doesn't correspond to the basis set of
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
425 rings or smallest set of smallest rings (SSSR) [ Refs 29-30 ]; instead, set of cycles indentified
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
426 as independent cycles simply correpond to cycles which contain no other cycle as their
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
427 subcycles and can't be described as a linear combination of smaller cycles. And it also happens
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
428 to contain all the rings in basis set of rings and SSSR. In other words, it's a superset of a basis set
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
429 of cycles and SSSR. For example, six four membered cycles are indentified for cubane, which is one
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
430 more than the basis set of cycles.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
431
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
432 =item B<StringifyCyclesDetection>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
433
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
434 $String = $CyclesDetection->StringifyCyclesDetection();
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
435
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
436 Returns a string containing information about I<CyclesDetection> object.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
437
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
438 =back
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
439
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
440 =head1 AUTHOR
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
441
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
442 Manish Sud <msud@san.rr.com>
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
443
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
444 =head1 SEE ALSO
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
445
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
446 Graph.pm, Path.pm, PathGraph.pm
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
447
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
448 =head1 COPYRIGHT
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
449
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
450 Copyright (C) 2015 Manish Sud. All rights reserved.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
451
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
452 This file is part of MayaChemTools.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
453
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
454 MayaChemTools is free software; you can redistribute it and/or modify it under
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
455 the terms of the GNU Lesser General Public License as published by the Free
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
456 Software Foundation; either version 3 of the License, or (at your option)
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
457 any later version.
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
458
4816e4a8ae95 Uploaded
deepakjadmin
parents:
diff changeset
459 =cut