annotate mayachemtool/mayachemtools/lib/Graph/CyclesDetection.pm @ 0:68300206e90d draft default tip

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