comparison lib/Graph/GraphMatrix.pm @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4816e4a8ae95
1 package Graph::GraphMatrix;
2 #
3 # $RCSfile: GraphMatrix.pm,v $
4 # $Date: 2015/02/28 20:49:06 $
5 # $Revision: 1.17 $
6 #
7 # Author: Manish Sud <msud@san.rr.com>
8 #
9 # Copyright (C) 2015 Manish Sud. All rights reserved.
10 #
11 # This file is part of MayaChemTools.
12 #
13 # MayaChemTools is free software; you can redistribute it and/or modify it under
14 # the terms of the GNU Lesser General Public License as published by the Free
15 # Software Foundation; either version 3 of the License, or (at your option) any
16 # later version.
17 #
18 # MayaChemTools is distributed in the hope that it will be useful, but without
19 # any warranty; without even the implied warranty of merchantability of fitness
20 # for a particular purpose. See the GNU Lesser General Public License for more
21 # details.
22 #
23 # You should have received a copy of the GNU Lesser General Public License
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
26 # Boston, MA, 02111-1307, USA.
27 #
28
29 use strict;
30 use Carp;
31 use Exporter;
32 use Graph;
33 use Matrix;
34 use Constants;
35
36 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
37
38 @ISA = qw(Exporter);
39 @EXPORT = qw();
40 @EXPORT_OK = qw();
41
42 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
43
44 # Setup class variables...
45 my($ClassName);
46 _InitializeClass();
47
48 # Overload Perl functions...
49 use overload '""' => 'StringifyGraphMatrix';
50
51 # Class constructor...
52 sub new {
53 my($Class, $Graph) = @_;
54
55 # Initialize object...
56 my $This = {};
57 bless $This, ref($Class) || $Class;
58 $This->_InitializeGraphMatrix($Graph);
59
60 return $This;
61 }
62
63 # Initialize object data...
64 sub _InitializeGraphMatrix {
65 my($This, $Graph) = @_;
66
67 # Specified graph object...
68 $This->{Graph} = $Graph;
69
70 # Generated matrix...
71 $This->{Matrix} = undef;
72 $This->{MatrixType} = undef;
73
74 # Row and columns IDs...
75 @{$This->{RowIDs}} = ();
76 @{$This->{ColumnIDs}} = ();
77
78 return $This;
79 }
80
81 # Initialize class ...
82 sub _InitializeClass {
83 #Class name...
84 $ClassName = __PACKAGE__;
85 }
86
87 # Generate the adjacency matrix for a simple graph.
88 #
89 # For a simple graph G with n vertices, the adjacency matrix for G is a n x n square matrix and
90 # its elements Mij are:
91 #
92 # . 0 if i == j
93 # . 1 if i != j and vertex Vi is adjacent to vertex Vj
94 # . 0 if i != j and vertex Vi is not adjacent to vertex Vj
95 #
96 sub GenerateAdjacencyMatrix {
97 my($This) = @_;
98 my($Graph, $NumOfVertices, @VertexIDs);
99
100 # Get graph vertices...
101 $Graph = $This->{Graph};
102 @VertexIDs = $Graph->GetVertices();
103 $NumOfVertices = scalar @VertexIDs;
104
105 if ($NumOfVertices == 0) {
106 carp "Warning: ${ClassName}->GenerateAdjacencyMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
107 return $This;
108 }
109
110 # Create adjacency matrix...
111 my($Matrix, $RowIndex, $ColIndex, $RowVertexID, $ColVertexID, $Value, $SkipIndexCheck);
112
113 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
114 $SkipIndexCheck = 1;
115
116 for $RowIndex (0 .. ($NumOfVertices - 1)) {
117 $RowVertexID = $VertexIDs[$RowIndex];
118 for $ColIndex (0 .. ($NumOfVertices - 1)) {
119 $ColVertexID = $VertexIDs[$ColIndex];
120 $Value = ($RowIndex == $ColIndex) ? 0 : ($Graph->HasEdge($RowVertexID, $ColVertexID) ? 1 : 0);
121 $Matrix->SetValue($RowIndex, $ColIndex, $Value, $SkipIndexCheck);
122 }
123 }
124 $This->_SetMatrixAndAssociatedInformation($Matrix, "AdjacencyMatrix", \@VertexIDs);
125
126 return $This;
127 }
128
129 # Generate the Siedel adjacency matrix for a simple graph.
130 #
131 # For a simple graph G with n vertices, the Siedal adjacency matrix for G is a n x n square matrix and
132 # its elements Mij are:
133 #
134 # . 0 if i == j
135 # . -1 if i != j and vertex Vi is adjacent to vertex Vj
136 # . 1 if i != j and vertex Vi is not adjacent to vertex Vj
137 #
138 sub GenerateSiedelAdjacencyMatrix {
139 my($This) = @_;
140 my($Graph, $NumOfVertices, @VertexIDs);
141
142 # Get graph vertices...
143 $Graph = $This->{Graph};
144 @VertexIDs = $Graph->GetVertices();
145 $NumOfVertices = scalar @VertexIDs;
146
147 if ($NumOfVertices == 0) {
148 carp "Warning: ${ClassName}->GenerateSiedelAdjacencyMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
149 return $This;
150 }
151
152 # Create Siedel adjacency matrix...
153 my($Matrix, $RowIndex, $ColIndex, $RowVertexID, $ColVertexID, $Value, $SkipIndexCheck);
154
155 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
156 $SkipIndexCheck = 1;
157
158 for $RowIndex (0 .. ($NumOfVertices - 1)) {
159 $RowVertexID = $VertexIDs[$RowIndex];
160 for $ColIndex (0 .. ($NumOfVertices - 1)) {
161 $ColVertexID = $VertexIDs[$ColIndex];
162 $Value = ($RowIndex == $ColIndex) ? 0 : ($Graph->HasEdge($RowVertexID, $ColVertexID) ? -1 : 1);
163 $Matrix->SetValue($RowIndex, $ColIndex, $Value, $SkipIndexCheck);
164 }
165 }
166 $This->_SetMatrixAndAssociatedInformation($Matrix, "SiedelAdjacencyMatrix", \@VertexIDs);
167
168 return $This;
169 }
170
171 # Generate distance matrix for a simple graph using Floyd-Marshall algorithm [Ref 67].
172 #
173 # For a simple graph G with n vertices, the distance matrix for G is a n x n square matrix and
174 # its elements Mij are:
175 #
176 # . 0 if i == j
177 # . d if i != j and d is the shortest distance between vertex Vi and vertex Vj
178 #
179 # Note:
180 # . In the final matrix, BigNumber values correspond to vertices with no edges.
181 #
182 sub GenerateDistanceMatrix {
183 my($This) = @_;
184 my($Graph, $NumOfVertices, @VertexIDs);
185
186 # Get graph vertices...
187 $Graph = $This->{Graph};
188 @VertexIDs = $Graph->GetVertices();
189 $NumOfVertices = scalar @VertexIDs;
190
191 if ($NumOfVertices == 0) {
192 carp "Warning: ${ClassName}->GenerateDistanceMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
193 return $This;
194 }
195
196 # Initialize matrix...
197 my($Matrix, $MatrixValuesRef, $RowIndex, $ColIndex, $RowVertexID, $ColVertexID, $Value);
198
199 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
200 $MatrixValuesRef = $Matrix->GetMatrixValuesReference();
201
202 for $RowIndex (0 .. ($NumOfVertices - 1)) {
203 $RowVertexID = $VertexIDs[$RowIndex];
204 for $ColIndex (0 .. ($NumOfVertices - 1)) {
205 $ColVertexID = $VertexIDs[$ColIndex];
206 $Value = ($RowIndex == $ColIndex) ? 0 : ($Graph->HasEdge($RowVertexID, $ColVertexID) ? 1 : BigNumber);
207 $MatrixValuesRef->[$RowIndex][$ColIndex] = $Value;
208 }
209 }
210
211 # Create distance matrix...
212 my($i, $j, $k, $Valuejk);
213
214 for $i (0 .. ($NumOfVertices - 1)) {
215 for $j (0 .. ($NumOfVertices - 1)) {
216 for $k (0 .. ($NumOfVertices - 1)) {
217 $Valuejk = $MatrixValuesRef->[$j][$i] + $MatrixValuesRef->[$i][$k];
218 if ($Valuejk < $MatrixValuesRef->[$j][$k]) {
219 $MatrixValuesRef->[$j][$k] = $Valuejk;
220 }
221 }
222 }
223 }
224 $This->_SetMatrixAndAssociatedInformation($Matrix, "DistanceMatrix", \@VertexIDs);
225
226 return $This;
227 }
228
229 # Generate the incidence matrix for a simple graph.
230 #
231 # For a simple graph G with n vertices and e edges, the incidence matrix for G is a n x e matrix
232 # its elements Mij are:
233 #
234 # . 1 if vertex Vi and the edge Ej are incident; in other words, Vi and Ej are related
235 # . 0 otherwise
236 #
237 sub GenerateIncidenceMatrix {
238 my($This) = @_;
239 my($Graph, $NumOfVertices, $NumOfEdges, @VertexIDs, @EdgeVertexIDs);
240
241 # Get graph vertices and edges...
242 $Graph = $This->{Graph};
243 @VertexIDs = $Graph->GetVertices();
244 $NumOfVertices = scalar @VertexIDs;
245
246 @EdgeVertexIDs = $Graph->GetEdges();
247 $NumOfEdges = @EdgeVertexIDs/2;
248
249 if ($NumOfVertices == 0) {
250 carp "Warning: ${ClassName}->GenerateIncidenceMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
251 return $This;
252 }
253
254 # Create incidence matrix...
255 my($Matrix, $RowIndex, $ColIndex, $EdgeVertexIndex, $VertexID, $EdgeVertexID1, $EdgeVertexID2, $Value, $SkipIndexCheck);
256
257 $Matrix = new Matrix($NumOfVertices, $NumOfEdges);
258
259 $SkipIndexCheck = 1;
260 for $RowIndex (0 .. ($NumOfVertices - 1)) {
261 $VertexID = $VertexIDs[$RowIndex];
262 $EdgeVertexIndex = 0;
263 for $ColIndex (0 .. ($NumOfEdges - 1)) {
264 $EdgeVertexID1 = $EdgeVertexIDs[$EdgeVertexIndex]; $EdgeVertexIndex++;
265 $EdgeVertexID2 = $EdgeVertexIDs[$EdgeVertexIndex]; $EdgeVertexIndex++;
266
267 $Value = ($VertexID == $EdgeVertexID1 || $VertexID == $EdgeVertexID2) ? 1 : 0;
268 $Matrix->SetValue($RowIndex, $ColIndex, $Value, $SkipIndexCheck);
269 }
270 }
271 $This->_SetMatrixAndAssociatedInformation($Matrix, "IncidenceMatrix", \@VertexIDs, \@EdgeVertexIDs);
272
273 return $This;
274 }
275
276 # Generate the degree matrix for a simple graph.
277 #
278 # For a simple graph G with n vertices, the degree matrix for G is a n x n square matrix and
279 # its elements Mij are:
280 #
281 # . deg(Vi) if i == j and deg(Vi) is the degree of vertex Vi
282 # . 0 otherwise
283 #
284 sub GenerateDegreeMatrix {
285 my($This) = @_;
286 my($Graph, $NumOfVertices, @VertexIDs);
287
288 # Get graph vertices...
289 $Graph = $This->{Graph};
290 @VertexIDs = $Graph->GetVertices();
291 $NumOfVertices = scalar @VertexIDs;
292
293 if ($NumOfVertices == 0) {
294 carp "Warning: ${ClassName}->GenerateDegreeMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
295 return $This;
296 }
297
298 # Create degree matrix...
299 my($Matrix, $Index, $VertexID, $Degree, $SkipIndexCheck);
300
301 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
302 $SkipIndexCheck = 1;
303
304 for $Index (0 .. ($NumOfVertices - 1)) {
305 $VertexID = $VertexIDs[$Index];
306 $Degree = $Graph->GetDegree($VertexID);
307 $Matrix->SetValue($Index, $Index, $Degree, $SkipIndexCheck);
308 }
309 $This->_SetMatrixAndAssociatedInformation($Matrix, "DegreeMatrix", \@VertexIDs);
310
311 return $This;
312 }
313
314 # Generate the Laplacian matrix for a simple graph.
315 #
316 # For a simple graph G with n vertices, the Laplacian matrix for G is a n x n square matrix and
317 # its elements Mij are:
318 #
319 # . deg(Vi) if i == j and deg(Vi) is the degree of vertex Vi
320 # . -1 if i != j and vertex Vi is adjacent to vertex Vj
321 # . 0 otherwise
322 #
323 # Note: The Laplacian matrix is the difference between the degree matrix and adjacency matrix.
324 #
325 sub GenerateLaplacianMatrix {
326 my($This) = @_;
327 my($Graph, $NumOfVertices, @VertexIDs);
328
329 # Get graph vertices...
330 $Graph = $This->{Graph};
331 @VertexIDs = $Graph->GetVertices();
332 $NumOfVertices = scalar @VertexIDs;
333
334 if ($NumOfVertices == 0) {
335 carp "Warning: ${ClassName}->GenerateLaplacianMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
336 return $This;
337 }
338
339 # Create adjacency matrix...
340 my($Matrix, $RowIndex, $ColIndex, $RowVertexID, $ColVertexID, $Value, $SkipIndexCheck);
341
342 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
343 $SkipIndexCheck = 1;
344
345 for $RowIndex (0 .. ($NumOfVertices - 1)) {
346 $RowVertexID = $VertexIDs[$RowIndex];
347 for $ColIndex (0 .. ($NumOfVertices - 1)) {
348 $ColVertexID = $VertexIDs[$ColIndex];
349 $Value = ($RowIndex == $ColIndex) ? $Graph->GetDegree($RowVertexID) : ($Graph->HasEdge($RowVertexID, $ColVertexID) ? -1 : 0);
350 $Matrix->SetValue($RowIndex, $ColIndex, $Value, $SkipIndexCheck);
351 }
352 }
353 $This->_SetMatrixAndAssociatedInformation($Matrix, "LaplacianMatrix", \@VertexIDs);
354
355 return $This;
356 }
357
358 # Generate the normalized Laplacian matrix for a simple graph.
359 #
360 # For a simple graph G with n vertices, the normalized Laplacian matrix L for G is a n x n square matrix and
361 # its elements Lij are:
362 #
363 # . 1 if i == j and deg(Vi) != 0
364 # . -1/SQRT(deg(Vi) * deg(Vj)) if i != j and vertex Vi is adjacent to vertex Vj
365 # . 0 otherwise
366 #
367 #
368 sub GenerateNormalizedLaplacianMatrix {
369 my($This) = @_;
370 my($Graph, $NumOfVertices, @VertexIDs);
371
372 # Get graph vertices...
373 $Graph = $This->{Graph};
374 @VertexIDs = $Graph->GetVertices();
375 $NumOfVertices = scalar @VertexIDs;
376
377 if ($NumOfVertices == 0) {
378 carp "Warning: ${ClassName}->GenerateNormalizedLaplacianMatrix: Specified graph doesn't contain any vertices: No matrix generated...";
379 return $This;
380 }
381
382 # Create adjacency matrix...
383 my($Matrix, $RowIndex, $ColIndex, $RowVertexID, $ColVertexID, $RowVertexDegree, $ColVertexDegree, $Value, $SkipIndexCheck);
384
385 $Matrix = new Matrix($NumOfVertices, $NumOfVertices);
386 $SkipIndexCheck = 1;
387
388 for $RowIndex (0 .. ($NumOfVertices - 1)) {
389 $RowVertexID = $VertexIDs[$RowIndex];
390 $RowVertexDegree = $Graph->GetDegree($RowVertexID);
391 for $ColIndex (0 .. ($NumOfVertices - 1)) {
392 $ColVertexID = $VertexIDs[$ColIndex];
393 $Value = 0;
394 if ($RowIndex == $ColIndex) {
395 $Value = ($RowVertexDegree == 0) ? 0 : 1;
396 }
397 else {
398 $ColVertexDegree = $Graph->GetDegree($ColVertexID);
399 $Value = $Graph->HasEdge($RowVertexID, $ColVertexID) ? (-1/sqrt($RowVertexDegree * $ColVertexDegree)) : 0;
400 }
401 $Matrix->SetValue($RowIndex, $ColIndex, $Value, $SkipIndexCheck);
402 }
403 }
404 $This->_SetMatrixAndAssociatedInformation($Matrix, "NormalizedLaplacianMatrix", \@VertexIDs);
405
406 return $This;
407 }
408
409 # Generate the admittance matrix for a simple graph.
410 #
411 sub GenerateAdmittanceMatrix {
412 my($This) = @_;
413
414 $This->GenerateLaplacianMatrix();
415 $This->{MatrixType} = "AdmittanceMatrix";
416
417 return $This;
418 }
419
420 # Generate the Kirchhoff matrix for a simple graph.
421 #
422 sub GenerateKirchhoffMatrix {
423 my($This) = @_;
424
425 $This->GenerateLaplacianMatrix();
426 $This->{MatrixType} = "KirchhoffMatrix";
427
428 return $This;
429 }
430
431 # Get generated matrix...
432 #
433 sub GetMatrix {
434 my($This) = @_;
435
436 return $This->{Matrix};
437 }
438
439 # Get matrix type...
440 #
441 sub GetMatrixType {
442 my($This) = @_;
443
444 return $This->{MatrixType};
445 }
446
447 # Get row IDs...
448 #
449 sub GetRowIDs {
450 my($This) = @_;
451
452 return @{$This->{RowIDs}};
453 }
454
455 # Get column IDs...
456 #
457 sub GetColumnIDs {
458 my($This) = @_;
459
460 return @{$This->{ColumnIDs}};
461 }
462
463
464 # Setup matrix and other associated information...
465 #
466 sub _SetMatrixAndAssociatedInformation {
467 my($This, $Matrix, $MatrixType, $VertexIDsRef, $EdgeVertexIDsRef) = @_;
468
469 $This->{Matrix} = $Matrix;
470 $This->{MatrixType} = $MatrixType;
471
472 @{$This->{RowIDs}} = ();
473 @{$This->{ColumnIDs}} = ();
474
475 @{$This->{RowIDs}} = @{$VertexIDsRef};
476
477 if ($MatrixType =~ /^IncidenceMatrix$/i) {
478 # Setup column IDs using edge vertex IDs...
479 my($NumOfEdges, $EdgeVertexIndex, $ColIndex, $EdgeVertexID1, $EdgeVertexID2, $EdgeID);
480
481 $NumOfEdges = (scalar @{$EdgeVertexIDsRef})/2;
482 $EdgeVertexIndex = 0;
483
484 for $ColIndex (0 .. ($NumOfEdges - 1)) {
485 $EdgeVertexID1 = $EdgeVertexIDsRef->[$EdgeVertexIndex]; $EdgeVertexIndex++;
486 $EdgeVertexID2 = $EdgeVertexIDsRef->[$EdgeVertexIndex]; $EdgeVertexIndex++;
487 $EdgeID = ($EdgeVertexID1 < $EdgeVertexID2) ? "${EdgeVertexID1}-${EdgeVertexID2}" : "${EdgeVertexID2}-${EdgeVertexID1}";
488
489 push @{$This->{ColumnIDs}}, $EdgeID;
490 }
491 }
492 else {
493 push @{$This->{ColumnIDs}}, @{$VertexIDsRef};
494 }
495 return $This;
496 }
497
498 # Return a string containg data for GraphMatrix object...
499 sub StringifyGraphMatrix {
500 my($This) = @_;
501 my($GraphMatrixString, $RowIDs);
502
503 $GraphMatrixString = "GraphMatrix:";
504
505 $GraphMatrixString .= (defined $This->{MatrixType}) ? " MatrixType: $This->{MatrixType}" : "MatrixType: <Undefined>";
506 $GraphMatrixString .= (scalar @{$This->{RowIDs}}) ? "; RowIDs: @{$This->{RowIDs}}" : "; RowIDs: <Undefined>";
507 $GraphMatrixString .= (scalar @{$This->{ColumnIDs}}) ? "; ColumnIDs: @{$This->{ColumnIDs}}" : "; ColumnIDs: <Undefined>";
508
509 $GraphMatrixString .= (defined $This->{Matrix}) ? "; Matrix: $This->{Matrix}" : "; Matrix: <Undefined>";
510
511 return $GraphMatrixString;
512 }
513
514 1;
515
516 __END__
517
518 =head1 NAME
519
520 GraphMatrix
521
522 =head1 SYNOPSIS
523
524 use Graph::GraphMatrix;
525
526 use Graph::GraphMatrix qw(:all);
527
528 =head1 DESCRIPTION
529
530 B<GraphMatrix> class provides the following methods:
531
532 new, GenerateAdjacencyMatrix, GenerateAdmittanceMatrix, GenerateDegreeMatrix,
533 GenerateDistanceMatrix, GenerateIncidenceMatrix, GenerateKirchhoffMatrix,
534 GenerateLaplacianMatrix, GenerateNormalizedLaplacianMatrix,
535 GenerateSiedelAdjacencyMatrix, GetColumnIDs, GetMatrix, GetMatrixType, GetRowIDs,
536 StringifyGraphMatrix
537
538 =head2 METHODS
539
540 =over 4
541
542 =item B<new>
543
544 $NewGraphMatrix = new Graph::GraphMatrix($Graph);
545
546 Using specified I<Graph>, B<new> method creates a new B<GraphMatrix> and returns
547 newly created B<GraphMatrix>.
548
549 =item B<GenerateAdjacencyMatrix>
550
551 $AdjacencyGraphMatrix = $GraphMatrix->GenerateAdjacencyMatrix();
552
553 Generates a new I<AdjacencyGraphMatrix> for specified B<Graph> and returns
554 I<AdjacencyGraphMatrix>.
555
556 For a simple graph G with n vertices, the adjacency matrix for G is a n x n square matrix and
557 its elements Mij are:
558
559 . 0 if i == j
560 . 1 if i != j and vertex Vi is adjacent to vertex Vj
561 . 0 if i != j and vertex Vi is not adjacent to vertex Vj
562
563 =item B<GenerateAdmittanceMatrix>
564
565 $AdmittanceGraphMatrix = $GraphMatrix->GenerateAdmittanceMatrix();
566
567 Generates a new I<AdmittanceGraphMatrix> for specified B<Graph> and returns
568 I<AdmittanceGraphMatrix>.
569
570 B<AdmittanceMatrix> is another name for B<LaplacianMatrix>.
571
572 =item B<GenerateDegreeMatrix>
573
574 $DegreeGraphMatrix = $GraphMatrix->GenerateDegreeMatrix();
575
576 Generates a new I<DegreeGraphMatrix> for specified B<Graph> and returns
577 I<DegreeGraphMatrix>.
578
579 For a simple graph G with n vertices, the degree matrix for G is a n x n square matrix and
580 its elements Mij are:
581
582 . deg(Vi) if i == j and deg(Vi) is the degree of vertex Vi
583 . 0 otherwise
584
585 =item B<GenerateDistanceMatrix>
586
587 $DistanceGraphMatrix = $GraphMatrix->GenerateDistanceMatrix();
588
589 Generates a new I<DistanceGraphMatrix> for specified B<Graph> using Floyd-Marshall
590 algorithm [Ref 67] and returns I<DistanceGraphMatrix>.
591
592 For a simple graph G with n vertices, the distance matrix for G is a n x n square matrix and
593 its elements Mij are:
594
595 . 0 if i == j
596 . d if i != j and d is the shortest distance between vertex Vi and vertex Vj
597
598 In the final matrix, value of constant B<BigNumber> defined in B<Constants.pm> module
599 corresponds to vertices with no edges.
600
601 =item B<GenerateIncidenceMatrix>
602
603 $IncidenceGraphMatrix = $GraphMatrix->GenerateIncidenceMatrix();
604
605 Generates a new I<IncidenceGraphMatrix> for specified B<Graph> and returns
606 I<IncidenceGraphMatrix>.
607
608 For a simple graph G with n vertices and e edges, the incidence matrix for G is a n x e matrix
609 its elements Mij are:
610
611 . 1 if vertex Vi and the edge Ej are incident; in other words, Vi and Ej are related
612 . 0 otherwise
613
614 =item B<GenerateKirchhoffMatrix>
615
616 $KirchhoffGraphMatrix = $GraphMatrix->GenerateKirchhoffMatrix();
617
618 Generates a new I<KirchhoffGraphMatrix> for specified B<Graph> and returns
619 I<KirchhoffGraphMatrix>.
620
621 B<KirchhoffMatrix> is another name for B<LaplacianMatrix>.
622
623 =item B<GenerateLaplacianMatrix>
624
625 $LaplacianGraphMatrix = $GraphMatrix->GenerateLaplacianMatrix();
626
627 Generates a new I<LaplacianGraphMatrix> for specified B<Graph> and returns
628 I<LaplacianGraphMatrix>.
629
630 For a simple graph G with n vertices, the Laplacian matrix for G is a n x n square matrix and
631 its elements Mij are:
632
633 . deg(Vi) if i == j and deg(Vi) is the degree of vertex Vi
634 . -1 if i != j and vertex Vi is adjacent to vertex Vj
635 . 0 otherwise
636
637 The Laplacian matrix is the difference between the degree matrix and adjacency matrix.
638
639 =item B<GenerateNormalizedLaplacianMatrix>
640
641 $NormalizedLaplacianGraphMatrix = $GraphMatrix->GenerateNormalizedLaplacianMatrix();
642
643 Generates a new I<NormalizedLaplacianGraphMatrix> for specified B<Graph> and returns
644 I<NormalizedLaplacianGraphMatrix>.
645
646 For a simple graph G with n vertices, the normalized Laplacian matrix L for G is a n x n square
647 matrix and its elements Lij are:
648
649 . 1 if i == j and deg(Vi) != 0
650 . -1/SQRT(deg(Vi) * deg(Vj)) if i != j and vertex Vi is adjacent to vertex Vj
651 . 0 otherwise
652
653 =item B<GenerateSiedelAdjacencyMatrix>
654
655 $SiedelAdjacencyGraphMatrix = $GraphMatrix->GenerateSiedelAdjacencyMatrix();
656
657 Generates a new I<SiedelAdjacencyGraphMatrix> for specified B<Graph> and returns
658 I<SiedelAdjacencyGraphMatrix>.
659
660 For a simple graph G with n vertices, the Siedal adjacency matrix for G is a n x n square matrix and
661 its elements Mij are:
662
663 . 0 if i == j
664 . -1 if i != j and vertex Vi is adjacent to vertex Vj
665 . 1 if i != j and vertex Vi is not adjacent to vertex Vj
666
667 =item B<GetColumnIDs>
668
669 @ColumnIDs = $GraphMatrix->GetColumnIDs();
670
671 Returns an array containing any specified column IDs for I<GraphMatrix>.
672
673 =item B<GetMatrix>
674
675 $Matrix = $GraphMatrix->GetMatrix();
676
677 Returns I<Matrix> object corresponding to I<GraphMatrix> object.
678
679 =item B<GetMatrixType>
680
681 $MatrixType = $GraphMatrix->GetMatrixType();
682
683 Returns B<MatrixType> of I<GraphMatrix>.
684
685 =item B<GetRowIDs>
686
687 @RowIDs = $GraphMatrix->GetRowIDs();
688
689 Returns an array containing any specified rowIDs IDs for I<GraphMatrix>.
690
691 =item B<StringifyGraphMatrix>
692
693 $String = $GraphMatrix->StringifyGraphMatrix();
694
695 Returns a string containing information about I<GraphMatrix> object.
696
697 =back
698
699 =head1 AUTHOR
700
701 Manish Sud <msud@san.rr.com>
702
703 =head1 SEE ALSO
704
705 Constants.pm, Graph.pm, Matrix.pm
706
707 =head1 COPYRIGHT
708
709 Copyright (C) 2015 Manish Sud. All rights reserved.
710
711 This file is part of MayaChemTools.
712
713 MayaChemTools is free software; you can redistribute it and/or modify it under
714 the terms of the GNU Lesser General Public License as published by the Free
715 Software Foundation; either version 3 of the License, or (at your option)
716 any later version.
717
718 =cut