line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# Defining the Package for the modules. |
2
|
|
|
|
|
|
|
package Text::SenseClusters::LabelEvaluation::AssigningLabelUsingHungarianAlgo; |
3
|
|
|
|
|
|
|
|
4
|
5
|
|
|
5
|
|
43537
|
use Algorithm::Munkres; |
|
5
|
|
|
|
|
22702
|
|
|
5
|
|
|
|
|
6477
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
# Defining the class variables. |
8
|
|
|
|
|
|
|
my $matrixToArrangeRef= "matrixRef"; |
9
|
|
|
|
|
|
|
my $columnHeaderRef = "colHeaderRef"; |
10
|
|
|
|
|
|
|
my $rowHeaderRef = "rowHeaderRef"; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
my $INFINTE_NUMBER = 999999999; |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
####################################################################################################################### |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
=head1 Name |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
Text::SenseClusters::LabelEvaluation::AssigningLabelUsingHungarianAlgo - Module which uses Hungarian Algorithm for assigning labels to the clusters. |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
=head1 SYNOPSIS |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
The following code snippet will show how to use this module. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
# Including the AssigningLabelUsingHungarianAlgo Module. |
25
|
|
|
|
|
|
|
use Text::SenseClusters::LabelEvaluation::AssigningLabelUsingHungarianAlgo; |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
# Defining the matrix which contains the similarity scores for labels and clusters. |
28
|
|
|
|
|
|
|
my @mat = ( [ 2, 4, 7 ], [ 3, 9, 5 ], [ 8, 2, 9 ], ); |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
# Defining the header for these matrix. |
31
|
|
|
|
|
|
|
my @topicHeader = ("BillClinton", "TonyBlair", "EhudBarak"); |
32
|
|
|
|
|
|
|
my @clusterHeader = ("Cluster0", "Cluster1", "Cluster2"); |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
# Uncomment these to test unbalanced scenarios where number of cluster and labels are different. |
35
|
|
|
|
|
|
|
# Test Case 2: |
36
|
|
|
|
|
|
|
#my @mat = ( [ 7, 1, 6, 8, 4 ], [ 8, 6, 5, 9, 8 ], [ 7, 6, 5, 8, 2 ], ); |
37
|
|
|
|
|
|
|
#my @topicHeader = ("BillClinton", "TonyBlair", "EhudBarak", "SaddamHussien", "VladmirPutin"); |
38
|
|
|
|
|
|
|
#my @clusterHeader = ("Cluster0", "Cluster1", "Cluster2"); |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
# Test Case 3: |
41
|
|
|
|
|
|
|
#my @mat = ( [ 7, 1, 6 ], [ 8, 6, 5 ], [ 7, 6, 5 ], [ 8, 9, 8 ], [ 1, 0, 1 ]); |
42
|
|
|
|
|
|
|
#my @topicHeader = ("BillClinton", "TonyBlair", "SaddamHussien"); |
43
|
|
|
|
|
|
|
#my @clusterHeader = ("Cluster0", "Cluster1", "Cluster2", "Cluster3", "Cluster4"); |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
# Creating the Hungarian object. |
47
|
|
|
|
|
|
|
my $hungarainObject = Text::SenseClusters::LabelEvaluation::AssigningLabelUsingHungarianAlgo |
48
|
|
|
|
|
|
|
->new(\@mat, \@topicHeader, \@clusterHeader); |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
# Assigning the labels to clusters using Hungarian algorithm. |
51
|
|
|
|
|
|
|
my $accuracy = $hungarainObject->reAssigningWithHungarianAlgo(); |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
# Assigning the labels to clusters using Hungarian algorithm. In this case, |
54
|
|
|
|
|
|
|
# user will get new matrix which contains the mapping between clusters and labels. |
55
|
|
|
|
|
|
|
#my ($accuracy,$finalMatrixRef,$newColumnHeaderRef) = |
56
|
|
|
|
|
|
|
# $hungarainObject->reAssigningWithHungarianAlgo(); |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
# Following function will just print matrix for you. |
59
|
|
|
|
|
|
|
#Text::SenseClusters::LabelEvaluation::AssigningLabelUsingHungarianAlgo::printMatrix |
60
|
|
|
|
|
|
|
# ($finalMatrixRef, $newColumnHeaderRef, \@clusterHeader); |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
print "\n\nAccuracy of labels is $accuracy. "; |
63
|
|
|
|
|
|
|
print "\n"; |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
=head1 DESCRIPTION |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
This module assign labels for the clusters using the hungarian algorithm. |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
Please refer the following for detailed explaination of hungarian algorithm: |
71
|
|
|
|
|
|
|
http://search.cpan.org/~tpederse/Algorithm-Munkres-0.08/lib/Algorithm/Munkres.pm |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=cut |
74
|
|
|
|
|
|
|
########################################################################################## |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
########################################################################################## |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=head1 Constructor: new() |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
This is the constructor which will create object for this class. |
85
|
|
|
|
|
|
|
Reference : http://perldoc.perl.org/perlobj.html |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
This constructor takes these argument and intialize it for the class: |
88
|
|
|
|
|
|
|
1. Matrix : |
89
|
|
|
|
|
|
|
This is the two dimensional array, containing the similarity |
90
|
|
|
|
|
|
|
score. We will take the inverse of these scores for hungarian |
91
|
|
|
|
|
|
|
algorithm. As the Hungarian algorithm, uses the minimum scores |
92
|
|
|
|
|
|
|
in assignment(as diagonal score) while we need the maximum scores |
93
|
|
|
|
|
|
|
for the assignment. |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
2. Column Header: |
96
|
|
|
|
|
|
|
This is 1D array, which contains the header information for each |
97
|
|
|
|
|
|
|
Column. |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
2. Row Header: |
100
|
|
|
|
|
|
|
This is 1D array, which contains the header information for each |
101
|
|
|
|
|
|
|
Row. |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
=cut |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
########################################################################################## |
106
|
|
|
|
|
|
|
sub new { |
107
|
|
|
|
|
|
|
# Creating the object. |
108
|
3
|
|
|
3
|
0
|
40
|
my $class = shift; |
109
|
3
|
|
|
|
|
9
|
my $hungrarianObject = {}; |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
# Explicit association is created by the built-in bless function. |
112
|
3
|
|
|
|
|
14
|
bless $hungrarianObject, $class; |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
# Getting the Reference of Matrix-to-print as the argument. |
115
|
3
|
|
|
|
|
7
|
my $matRef = shift; |
116
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
117
|
3
|
|
|
|
|
36
|
$hungrarianObject->{$matrixToArrangeRef} = $matRef; |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
# Getting the Reference of Column-Header matrix as the argument. |
120
|
3
|
|
|
|
|
10
|
my $columnHeadersRef = shift; |
121
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
122
|
3
|
|
|
|
|
10
|
$hungrarianObject->{$columnHeaderRef} = $columnHeadersRef; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
# Getting the Reference of Column-Header matrix as the argument. |
125
|
3
|
|
|
|
|
7
|
my $rowHeadersRef = shift; |
126
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
127
|
3
|
|
|
|
|
11
|
$hungrarianObject->{$rowHeaderRef} = $rowHeadersRef; |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
# Returning the blessed hash refered by $self. |
130
|
3
|
|
|
|
|
13
|
return $hungrarianObject; |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
########################################################################################## |
135
|
|
|
|
|
|
|
=head1 function: reAssigningWithHungarianAlgo |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
This method will assign the labels to each cluster using the Hugarian Algorithm. |
138
|
|
|
|
|
|
|
While assigning the labels it will consider the similarity score of these labels |
139
|
|
|
|
|
|
|
with the gold standard keys. |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
@argument : $hungrarianObject DataType(Reference of the object of this class) |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
@return : $accuracy : DataType(Float) |
144
|
|
|
|
|
|
|
Indicates the overall accuracy of the assignments. |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
OR |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
@return : $accuracy : DataType(Float) |
149
|
|
|
|
|
|
|
Indicates the overall accuracy of the assignments. |
150
|
|
|
|
|
|
|
\@final : DataType(Reference of 2-D Array.) |
151
|
|
|
|
|
|
|
Reference of two dimensional array whose diagonal values contains |
152
|
|
|
|
|
|
|
the similarity score for clusters labels and gold standard keys. |
153
|
|
|
|
|
|
|
\@newColumnHeader: DataType(Reference of 1-D Array.) |
154
|
|
|
|
|
|
|
Reference to new order of the column headers which corresponds |
155
|
|
|
|
|
|
|
to changed diagonal elements. |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
@description : |
158
|
|
|
|
|
|
|
1). It will read the Matrix contianing the similarity score of each cluster |
159
|
|
|
|
|
|
|
labels and gold keys data. |
160
|
|
|
|
|
|
|
2). It will than call a function which will inverse the similarity scores. |
161
|
|
|
|
|
|
|
3). Then, it will call the 'assign' function from the "Algorithm::Munkres" with |
162
|
|
|
|
|
|
|
this similarity scores. |
163
|
|
|
|
|
|
|
4). It will calculate the accuracy for the assignment as |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
Sum (Diagonal Scores) |
166
|
|
|
|
|
|
|
Accuracy = ------------------------- |
167
|
|
|
|
|
|
|
Sum (All the Scores) |
168
|
|
|
|
|
|
|
5). Finally, the new arrangement is used to determine the new headers for |
169
|
|
|
|
|
|
|
each column. |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
=cut |
172
|
|
|
|
|
|
|
########################################################################################## |
173
|
|
|
|
|
|
|
sub reAssigningWithHungarianAlgo{ |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
# Getting the Reference of Matrix-to-print as the argument. |
176
|
3
|
|
|
3
|
0
|
12
|
my $hungrarianObject = shift; |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
# Getting the matrix-to-rearranged from the class object. |
179
|
3
|
|
|
|
|
9
|
my $matRef = $hungrarianObject->{$matrixToArrangeRef}; |
180
|
3
|
|
|
|
|
8
|
my @mat = @$matRef; |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
# Getting the Column-Header-Matrix as Array from the class object. |
183
|
3
|
|
|
|
|
9
|
my $columnHeaderRefer = $hungrarianObject->{$columnHeaderRef}; |
184
|
3
|
|
|
|
|
9
|
my @columnHeaderArray = @$columnHeaderRefer; |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
# Getting the Row-Header matrix as Array from the class object. |
187
|
3
|
|
|
|
|
8
|
my $rowHeaderRefer = $hungrarianObject->{$rowHeaderRef}; |
188
|
3
|
|
|
|
|
12
|
my @rowHeaderArray = @$rowHeaderRefer; |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
# Variable to store the total count of the matrix. |
191
|
3
|
|
|
|
|
6
|
my $totalMatrixCount = 0; |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
# Variable to store the total diagonal count of the matrix. |
194
|
3
|
|
|
|
|
7
|
my $totalDiagonalCount = 0; |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
# Variable used to storing the final matrix. |
197
|
3
|
|
|
|
|
7
|
my @final; |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
# Variable used for iteration of the matrix. |
200
|
3
|
|
|
|
|
8
|
my $rowIndex = 0; |
201
|
|
|
|
|
|
|
|
202
|
3
|
|
|
|
|
475
|
print STDERR "\nOriginal Contigency Matrix: \n "; |
203
|
3
|
|
|
|
|
25
|
printMatrix(\@mat,\@columnHeaderArray,\@rowHeaderArray); |
204
|
|
|
|
|
|
|
|
205
|
3
|
|
|
|
|
20
|
my $inversedMatrixRef = inverseMatrixCellValue(\@mat); |
206
|
3
|
|
|
|
|
11
|
my @inversedMatrix = @$inversedMatrixRef; |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
# Calling the "Algorithm::Munkres" to calculate the assignment. |
209
|
3
|
|
|
|
|
23
|
assign( \@inversedMatrix, \@out_mat ); |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
# Rearranging the original matrix to get the new matrix. |
213
|
3
|
|
|
|
|
1828
|
foreach $row (0..@out_mat-1){ |
214
|
9
|
|
|
|
|
24
|
foreach $col (0..@out_mat-1){ |
215
|
27
|
50
|
|
|
|
67
|
if($mat[$row][$out_mat[$col]]){ |
216
|
27
|
|
|
|
|
91
|
$final[$row][$col]=$mat[$row][$out_mat[$col]]; |
217
|
|
|
|
|
|
|
}else{ |
218
|
0
|
|
|
|
|
0
|
$final[$row][$col]= 0; |
219
|
|
|
|
|
|
|
} |
220
|
|
|
|
|
|
|
# Getting the diagonal Count. |
221
|
27
|
100
|
|
|
|
63
|
if($row == $col){ |
222
|
9
|
|
|
|
|
16
|
$totalDiagonalCount = $totalDiagonalCount + $final[$row][$col]; |
223
|
|
|
|
|
|
|
} |
224
|
|
|
|
|
|
|
# Getting the total Count of the matrix. |
225
|
27
|
|
|
|
|
55
|
$totalMatrixCount = $totalMatrixCount + $final[$row][$col]; |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
# This array will hold the rearranged column information. |
231
|
3
|
|
|
|
|
9
|
my @newColumnHeader = (); |
232
|
3
|
|
|
|
|
20
|
my $newColIndex=0; |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
# Getting the new rearranged Column header. |
235
|
3
|
|
|
|
|
11
|
foreach $col (0..@out_mat-1){ |
236
|
9
|
50
|
|
|
|
25
|
if($columnHeaderArray[$out_mat[$col]]){ |
237
|
9
|
|
|
|
|
23
|
$newColumnHeader[$newColIndex++] = $columnHeaderArray[$out_mat[$col]]; |
238
|
|
|
|
|
|
|
}else{ |
239
|
0
|
|
|
|
|
0
|
$newColumnHeader[$newColIndex++] = "Unknown"; |
240
|
|
|
|
|
|
|
} |
241
|
|
|
|
|
|
|
} |
242
|
|
|
|
|
|
|
|
243
|
3
|
|
|
|
|
220
|
print STDERR " \n\n\nContigency Matrix after Hungarian Algorithm: \n "; |
244
|
3
|
|
|
|
|
78
|
printMatrix(\@final, \@newColumnHeader,\@rowHeaderArray); |
245
|
3
|
|
|
|
|
151
|
print STDERR "\n\n\nFinal Conclusion using Hungarian Algorithm::"; |
246
|
3
|
|
|
|
|
9
|
$rowIndex = 0; |
247
|
3
|
|
|
|
|
9
|
foreach my $colValue (@newColumnHeader){ |
248
|
9
|
50
|
|
|
|
28
|
if($rowHeaderArray[$rowIndex]){ |
249
|
9
|
|
|
|
|
527
|
print STDERR "\n\t$rowHeaderArray[$rowIndex]\t<-->\t$colValue"; |
250
|
|
|
|
|
|
|
}else{ |
251
|
0
|
|
|
|
|
0
|
print STDERR "\n\tUnknown\t\t<-->\t$colValue"; |
252
|
|
|
|
|
|
|
} |
253
|
9
|
|
|
|
|
23
|
$rowIndex++; |
254
|
|
|
|
|
|
|
} |
255
|
|
|
|
|
|
|
|
256
|
3
|
|
|
|
|
169
|
print STDERR "\n\n"; |
257
|
|
|
|
|
|
|
|
258
|
3
|
|
|
|
|
9
|
my $accuracy = 0; |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
# Calculating the total accuracy of the assignment. |
261
|
3
|
50
|
|
|
|
25
|
if($totalMatrixCount !=0 ){ |
262
|
3
|
|
|
|
|
12
|
$accuracy = ($totalDiagonalCount / $totalMatrixCount); |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
#print STDERR "\n\nAccuracy of labels is $accuracy-->$totalDiagonalCount-->$totalMatrixCount-->\n\n\n"; |
266
|
|
|
|
|
|
|
# Reference : http://perldoc.perl.org/functions/wantarray.html |
267
|
3
|
100
|
|
|
|
34
|
return wantarray ? ($accuracy,\@final,\@newColumnHeader) : $accuracy; |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
########################################################################################## |
272
|
|
|
|
|
|
|
=head1 function: inverseMatrixCellValue |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
Method will inverse the value of the cell of the input matrix. |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
@argument : $matRef : DataType(Reference of the 2-D Matrix) |
277
|
|
|
|
|
|
|
This is 2-D array containing the integeral values which will be |
278
|
|
|
|
|
|
|
inversed. |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
@return : $inverseMatrixRef : DataType(Reference of the 2-D Matrix) |
281
|
|
|
|
|
|
|
This is 2-D array containing the inversed values for the input |
282
|
|
|
|
|
|
|
2-D array. |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
@description : |
285
|
|
|
|
|
|
|
1). For the input 2-D array containing the array, each value is inversed |
286
|
|
|
|
|
|
|
and store in the new 2-D array |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
1 |
289
|
|
|
|
|
|
|
New-value = ------------------- |
290
|
|
|
|
|
|
|
Original-Value |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
2). If the Original-Value = 0, New-value = 0. |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
=cut |
295
|
|
|
|
|
|
|
########################################################################################## |
296
|
|
|
|
|
|
|
sub inverseMatrixCellValue{ |
297
|
|
|
|
|
|
|
# Getting the Reference of Matrix as the argument. |
298
|
3
|
|
|
3
|
0
|
9
|
my $matRef = shift; |
299
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
300
|
3
|
|
|
|
|
11
|
my @mat = @$matRef; |
301
|
|
|
|
|
|
|
# Defining the matix which will contains the inverse values of the original matrix. |
302
|
3
|
|
|
|
|
7
|
my @inversedMatrix = (); |
303
|
|
|
|
|
|
|
|
304
|
3
|
|
|
|
|
13
|
foreach $row (0..@mat-1){ |
305
|
9
|
|
|
|
|
15
|
foreach $column (0..@{$mat[$row]}-1){ |
|
9
|
|
|
|
|
23
|
|
306
|
|
|
|
|
|
|
# If the matrix is zero, than do not divide it by zero. |
307
|
27
|
50
|
|
|
|
66
|
if($mat[$row][$column]==0){ |
308
|
0
|
|
|
|
|
0
|
$inverseMatrix[$row][$column] = $INFINTE_NUMBER; |
309
|
0
|
|
|
|
|
0
|
next; |
310
|
|
|
|
|
|
|
} |
311
|
27
|
|
|
|
|
96
|
$inverseMatrix[$row][$column] = 1/$mat[$row][$column] ; |
312
|
|
|
|
|
|
|
} |
313
|
|
|
|
|
|
|
} |
314
|
|
|
|
|
|
|
# Returning the inversed matrix. |
315
|
3
|
|
|
|
|
14
|
return \@inverseMatrix; |
316
|
|
|
|
|
|
|
} |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
########################################################################################## |
320
|
|
|
|
|
|
|
=head1 function: printMatrix |
321
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
Method will print the content of 2-D array in the matrix format. |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
@argument1 : $matRef : DataType(Reference of the 2-D Array) |
325
|
|
|
|
|
|
|
This is 2-D array which has to be printed in the matrix format. |
326
|
|
|
|
|
|
|
@argument2 : $colHeaderRef : DataType(Reference of the 1-D array) |
327
|
|
|
|
|
|
|
Reference to array containing header info for columns |
328
|
|
|
|
|
|
|
@argument3 : $rowHeaderRef : DataType(Reference of the 1-D array) |
329
|
|
|
|
|
|
|
Reference to array containing header info for rows. |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
@description : |
332
|
|
|
|
|
|
|
1. Method for printing the matrix. If user provide his/her own headers |
333
|
|
|
|
|
|
|
then this method will use it, otherwise this method will present |
334
|
|
|
|
|
|
|
default headers. |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
=cut |
337
|
|
|
|
|
|
|
########################################################################################## |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
sub printMatrix{ |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
# Getting the Reference of Matrix-to-print as the argument. |
342
|
8
|
|
|
8
|
0
|
24
|
my $matrixToPrintRef = shift; |
343
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
344
|
8
|
|
|
|
|
27
|
my @matrixToPrint = @$matrixToPrintRef; |
345
|
|
|
|
|
|
|
|
346
|
|
|
|
|
|
|
# Getting the Reference of Column-Header matrix as the argument. |
347
|
8
|
|
|
|
|
16
|
my $columnHeaderRef = shift; |
348
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
349
|
8
|
|
|
|
|
22
|
my @columnHeader = @$columnHeaderRef; |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
# Getting the Reference of Column-Header matrix as the argument. |
352
|
8
|
|
|
|
|
13
|
my $rowHeaderRef = shift; |
353
|
|
|
|
|
|
|
# Getting the matrix from the reference. |
354
|
8
|
|
|
|
|
30
|
my @rowHeader = @$rowHeaderRef; |
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
# Defining the row index. |
357
|
8
|
|
|
|
|
17
|
my $rowIndex = 0; |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
# Printing the Column Header. If user provide the column header, then use it |
360
|
|
|
|
|
|
|
# otherwise use the default one. |
361
|
8
|
50
|
|
|
|
29
|
if(@columnHeader){ |
362
|
8
|
|
|
|
|
585
|
print STDERR "\n"; |
363
|
8
|
|
|
|
|
27
|
foreach my $colIndex (@columnHeader){ |
364
|
24
|
|
|
|
|
1263
|
print STDERR "\t$colIndex"; |
365
|
|
|
|
|
|
|
} |
366
|
|
|
|
|
|
|
}else{ |
367
|
0
|
|
|
|
|
0
|
print STDERR "\tColumn1\tColumn2\tColumn3"; |
368
|
|
|
|
|
|
|
} |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
# Printing the Content of the Matrix. |
371
|
8
|
|
|
|
|
430
|
print STDERR "\n-------------------------------------------------"; |
372
|
8
|
|
|
|
|
33
|
foreach $row (0..@matrixToPrint-1){ |
373
|
|
|
|
|
|
|
# If user provide its own row header then use it, otherwise print default header. |
374
|
24
|
50
|
|
|
|
87
|
if($rowHeader[$rowIndex]){ |
375
|
24
|
|
|
|
|
1290
|
print STDERR "\n ".$rowHeader[$rowIndex++]; |
376
|
|
|
|
|
|
|
}else{ |
377
|
0
|
|
|
|
|
0
|
print STDERR "\n Row".++$rowIndex."\t"; |
378
|
|
|
|
|
|
|
} |
379
|
|
|
|
|
|
|
# Printing the cell of the matrix. |
380
|
24
|
|
|
|
|
42
|
foreach $column (0..@{$matrixToPrint[$row]}-1){ |
|
24
|
|
|
|
|
77
|
|
381
|
72
|
|
|
|
|
3367
|
print STDERR "\t$matrixToPrint[$row][$column]"; |
382
|
|
|
|
|
|
|
} |
383
|
24
|
|
|
|
|
1247
|
print STDERR "\n-------------------------------------------------"; |
384
|
|
|
|
|
|
|
} |
385
|
|
|
|
|
|
|
} |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
1; |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
####################################################################################################### |
391
|
|
|
|
|
|
|
=pod |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
=head1 SEE ALSO |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
http://senseclusters.cvs.sourceforge.net/viewvc/senseclusters/LabelEvaluation/ |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
Last modified by : |
398
|
|
|
|
|
|
|
$Id: AssigningLabelUsingHungarianAlgo.pm,v 1.5 2013/03/07 23:19:41 jhaxx030 Exp $ |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
=head1 AUTHORS |
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
Anand Jha, University of Minnesota, Duluth |
403
|
|
|
|
|
|
|
jhaxx030 at d.umn.edu |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
Ted Pedersen, University of Minnesota, Duluth |
406
|
|
|
|
|
|
|
tpederse at d.umn.edu |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
Copyright (C) 2012,2013 Ted Pedersen, Anand Jha |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
See http://dev.perl.org/licenses/ for more information. |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
416
|
|
|
|
|
|
|
it under the terms of the GNU General Public License as published by |
417
|
|
|
|
|
|
|
the Free Software Foundation; either version 2 of the License, or |
418
|
|
|
|
|
|
|
(at your option) any later version. |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, |
421
|
|
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
422
|
|
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
423
|
|
|
|
|
|
|
GNU General Public License for more details. |
424
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License |
426
|
|
|
|
|
|
|
along with this program; if not, write to: |
427
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
The Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
430
|
|
|
|
|
|
|
Boston, MA 02111-1307 USA |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
=cut |
434
|
|
|
|
|
|
|
####################################################################################################### |