comparison lib/PseudoHeap.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 PseudoHeap;
2 #
3 # $RCSfile: PseudoHeap.pm,v $
4 # $Date: 2015/02/28 20:47:18 $
5 # $Revision: 1.10 $
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 TextUtil ();
33
34 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
35
36 @ISA = qw(Exporter);
37 @EXPORT = qw();
38 @EXPORT_OK = qw();
39
40 %EXPORT_TAGS = (
41 all => [@EXPORT, @EXPORT_OK]
42 );
43
44 # Setup class variables...
45 my($ClassName);
46 _InitializeClass();
47
48 use overload '""' => 'StringifyPseudoHeap';
49
50 # PseudoHeap is designed to support tracking of a specific number of largest or smallest key/value
51 # pairs with numeric or alphanumeric keys along with corresponding scalar or reference values.
52 #
53 # Although PseudoHeap is similar to a heap, it lacks number of key properties of a traditional heap data
54 # structure: no concept of root, parent and child nodes; no ordering of keys in any particular order; no
55 # specific localtion greatest or smallest key.
56 #
57 # The keys are simply stored in a hash with each key poining to an array containing specified values.
58 # The min/max keys are updated during addition and deletion of key/value pairs; these can be retrieved
59 # by accessing corresponding hash.
60 #
61 # Addition and deletion of key/value is also straightforward using hashes. However, min/max keys
62 # need to be identified which is done using Perl sort on the keys.
63 #
64 #
65 # Class constructor...
66 #
67 sub new {
68 my($Class, %NamesAndValues) = @_;
69
70 # Initialize object...
71 my $This = {};
72 bless $This, ref($Class) || $Class;
73 $This->_InitializePseudoHeap();
74
75 $This->_InitializePseudoHeapProperties(%NamesAndValues);
76
77 return $This;
78 }
79
80 # Initialize object data...
81 #
82 sub _InitializePseudoHeap {
83 my($This) = @_;
84
85 # Type of pseudo heap:
86 #
87 # KeepTopN - Keep track of a specified number largest of key/value pairs
88 # KeepBottomN - Keep track of a specified number smallest of key/value pairs
89 #
90 $This->{Type} = undef;
91
92 # Type of keys: Numeric or Alphanumeric
93 #
94 # The value of KeyType determines comparison function used to sort and
95 # and compare keys for a specific heap type as shown below:
96 #
97 # Type KeyType Comp Sorting
98 #
99 # KeepTopN Numeric < Descending
100 # KeepTopN AlphaNumeric lt Descending
101 # KeepBottomN Numeric > Ascending
102 # KeepBottomN AlphaNumeric gt Ascending
103 #
104 $This->{KeyType} = undef;
105
106 # Maximum number of largest or smallest key/value pairs to keep...
107 #
108 $This->{MaxSize} = 10;
109
110 # Keys and values associated with each key as an array...
111 %{$This->{Keys}} = ();
112
113 # Min and max keys...
114 $This->{MinKey} = undef;
115 $This->{MaxKey} = undef;
116
117 # Number of key/valur pairs currently present...
118 $This->{CurrentSize} = 0;
119
120 # Number of keys currently present where each key correspond to multiple values...
121 $This->{KeysCount} = 0;
122 }
123
124 # Initialize class ...
125 sub _InitializeClass {
126 #Class name...
127 $ClassName = __PACKAGE__;
128
129 }
130
131 # Initialize object properties....
132 #
133 sub _InitializePseudoHeapProperties {
134 my($This, %NamesAndValues) = @_;
135 my($Name, $Value, $MethodName);
136
137 while (($Name, $Value) = each %NamesAndValues) {
138 $MethodName = "Set${Name}";
139 $This->$MethodName($Value);
140 }
141
142 if (!exists $NamesAndValues{Type}) {
143 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying Type...";
144 }
145
146 if (!exists $NamesAndValues{KeyType}) {
147 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying KeyType...";
148 }
149 }
150
151 # Set heap type...
152 #
153 sub SetType {
154 my($This, $Type) = @_;
155
156 if (defined $This->{Type}) {
157 croak "Error: ${ClassName}->SetType: Can't change Type...";
158 }
159
160 if ($Type !~ /^(KeepTopN|KeepBottomN)$/i) {
161 croak "Error: ${ClassName}->SetType: Unknown PseudoHeap type: $Type; Supported types: KeepTopN or KeepBottomN...";
162 }
163 $This->{Type} = $Type;
164
165 return $This;
166 }
167
168 # Get heap type..
169 #
170 sub GetType {
171 my($This) = @_;
172
173 return defined $This->{Type} ? $This->{Type} : 'None';
174 }
175
176 # Set key type...
177 #
178 sub SetKeyType {
179 my($This, $KeyType) = @_;
180
181 if (defined $This->{KeyType}) {
182 croak "Error: ${ClassName}->SetType: Can't change KeyType...";
183 }
184
185 if ($KeyType !~ /^(Numeric|Alphanumeric)$/i) {
186 croak "Error: ${ClassName}->SetType: Unknown PseudoHeap key type: $KeyType; Supported key types: Numeric or Alphanumeric...";
187 }
188 $This->{KeyType} = $KeyType;
189
190 return $This;
191 }
192
193 # Get key type..
194 #
195 sub GetKeyType {
196 my($This) = @_;
197
198 return defined $This->{KeyType} ? $This->{KeyType} : 'None';
199 }
200
201 # Add a key/value pair...
202 #
203 sub AddKeyValuePair {
204 my($This, $Key, $Value) = @_;
205
206 if (!(defined($Key) && defined($Value))) {
207 carp "Warning: ${ClassName}->AddKeyValuePair: No key added: Both key and value must be defined...";
208 return undef;
209 }
210
211 $This->_AddKeyValuePair($Key, $Value);
212
213 return $This;
214 }
215
216 # Add multiple key/value pairs...
217 #
218 sub AddKeyValuePairs {
219 my($This, @KeyValuePairs) = @_;
220
221 if (!@KeyValuePairs) {
222 carp "Warning: ${ClassName}->AddKeyValuePairs: No keys added: Key/Value pairs list is empty...";
223 return undef;
224 }
225 if (@KeyValuePairs % 2) {
226 carp "Warning: ${ClassName}->AddKeyValuePairs: No keys pairs added: Invalid key/value pairs data: Input list must contain even number of values...";
227 return undef;
228 }
229
230 my($Key, $Value, $Index);
231 for ($Index = 0; $Index < $#KeyValuePairs; $Index += 2) {
232 $Key = $KeyValuePairs[$Index]; $Value = $KeyValuePairs[$Index + 1];
233 $This->AddKeyValuePair($Key, $Value);
234 }
235
236 return $This;
237 }
238
239 # Delete specified keys along with all associated values for each key...
240 #
241 sub DeleteKeys {
242 my($This, @Keys) = @_;
243
244 if (!@Keys) {
245 carp "Warning: ${ClassName}->DeleteKeys: No keys deleted: Keys list is empty...";
246 return undef;
247 }
248 my($Key);
249 for $Key (@Keys) {
250 $This->DeleteKey($Key);
251 }
252
253 return $This;
254 }
255
256 # Delete a sepcified key along with all of its associated values...
257 #
258 sub DeleteKey {
259 my($This, $Key) = @_;
260
261 if (!defined $Key ) {
262 carp "Warning: ${ClassName}->DeleteKey: No key deleted: Key must be specified...";
263 return undef;
264 }
265
266 return $This->_DeleteKey($Key);
267 }
268
269 # Delete min key along with all of its associated values...
270 #
271 sub DeleteMinKey {
272 my($This) = @_;
273
274 return $This->DeleteKey($This->{MinKey});
275 }
276
277 # Delete max key along with all of its associated values...
278 #
279 sub DeleteMaxKey {
280 my($This) = @_;
281
282 return $This->DeleteKey($This->{MaxKey});
283 }
284
285 # Set max size...
286 #
287 sub SetMaxSize {
288 my($This, $Size) = @_;
289
290 if (!TextUtil::IsPositiveInteger($Size)) {
291 croak "Error: ${ClassName}->SetMaxSize: Max size value, $Size, is not valid: It must be a positive integer...";
292 }
293
294 if (defined($This->{MinKey}) || defined($This->{MaxKey})) {
295 croak "Error: ${ClassName}->SetMaxSize: Can't change max size: Keys are already present...";
296 }
297
298 $This->{MaxSize} = $Size;
299
300 return $This;
301 }
302
303 # Get max size...
304 #
305 sub GetMaxSize {
306 my($This) = @_;
307
308 return $This->{MaxMaxSize};
309 }
310
311 # Get current size...
312 #
313 sub GetCurrentSize {
314 my($This) = @_;
315
316 return $This->{CurrentSize};
317 }
318
319 # Get min key...
320 #
321 sub GetMinKey {
322 my($This) = @_;
323
324 return defined $This->{MinKey} ? $This->{MinKey} : 'None';
325 }
326
327 # Get max key...
328 #
329 sub GetMaxKey {
330 my($This) = @_;
331
332 return defined $This->{MaxKey} ? $This->{MaxKey} : 'None';
333 }
334
335 # Get keys...
336 #
337 sub GetKeys {
338 my($This) = @_;
339
340 return wantarray ? keys %{$This->{Keys}} : scalar keys %{$This->{Keys}};
341 }
342
343 # Get sorted keys...
344 #
345 sub GetSortedKeys {
346 my($This) = @_;
347 my(@SortedKeys);
348
349 @SortedKeys = ();
350 if ($This->{Type} =~ /^KeepTopN$/i) {
351 @SortedKeys = ($This->{KeyType} =~ /^Numeric$/i) ? (sort { $b <=> $a } keys %{$This->{Keys}}) : (sort { $b cmp $a } keys %{$This->{Keys}});
352 }
353 elsif ($This->{Type} =~ /^KeepBottomN$/i) {
354 @SortedKeys = ($This->{KeyType} =~ /^Numeric$/i) ? (sort { $a <=> $b } keys %{$This->{Keys}}) : (sort { $a cmp $b } keys %{$This->{Keys}});
355 }
356
357 return wantarray ? @SortedKeys : scalar @SortedKeys;
358 }
359
360 # Get values associated with a specified key...
361 sub GetKeyValues {
362 my($This, $Key) = @_;
363 my(@KeyValues);
364
365 @KeyValues = ();
366 if (defined($Key) && exists($This->{Keys}{$Key})) {
367 @KeyValues = @{$This->{Keys}{$Key}};
368 }
369 return wantarray ? @KeyValues : scalar @KeyValues;
370 }
371
372 # Add key/value pair...
373 #
374 sub _AddKeyValuePair{
375 my($This, $Key, $Value) = @_;
376
377 if ($This->{CurrentSize} < $This->{MaxSize}) {
378 return $This->_AppendKeyValuePair($Key, $Value);
379 }
380 else {
381 return $This->_InsertKeyValuePair($Key, $Value);
382 }
383 }
384
385 # Append key/value pair...
386 #
387 sub _AppendKeyValuePair {
388 my($This, $Key, $Value) = @_;
389
390 if (!exists $This->{Keys}{$Key}) {
391 @{$This->{Keys}{$Key}} = ();
392 $This->{KeysCount} += 1;
393
394 $This->_CompareAndSetMinKey($Key);
395 $This->_CompareAndSetMaxKey($Key);
396 }
397
398 push @{$This->{Keys}{$Key}}, $Value;
399 $This->{CurrentSize} += 1;
400
401 return $This;
402 }
403
404 # Insert key/value pair...
405 #
406 sub _InsertKeyValuePair {
407 my($This, $Key, $Value) = @_;
408
409 # Is this key need to be inserted?
410 if (!$This->_IsKeyNeedToBeInserted($Key)) {
411 return $This;
412 }
413
414 # Insert key/value pair...
415 if (!exists $This->{Keys}{$Key}) {
416 @{$This->{Keys}{$Key}} = ();
417 $This->{KeysCount} += 1;
418 }
419 push @{$This->{Keys}{$Key}}, $Value;
420 $This->{CurrentSize} += 1;
421
422 # Remove min or max key/value pair along with its update...
423 my($KeyToDetele);
424
425 $KeyToDetele = ($This->{Type} =~ /^KeepTopN$/i) ? $This->{MinKey} : $This->{MaxKey};
426 $This->_DeleteKeyValuePair($KeyToDetele);
427
428 return $This;
429 }
430
431 # Check whether it makes sense to insert specified key...
432 #
433 sub _IsKeyNeedToBeInserted {
434 my($This, $Key) = @_;
435
436 if ($This->{Type} =~ /^KeepTopN$/i) {
437 if ($This->{KeyType} =~ /^Numeric$/i) {
438 return ($Key < $This->{MinKey}) ? 0 : ((($This->{KeysCount} == 1) && ($This->{MinKey} == $Key)) ? 0 : 1);
439 }
440 else {
441 return ($Key lt $This->{MinKey}) ? 0 : ((($This->{KeysCount} == 1) && ($This->{MinKey} eq $Key)) ? 0 : 1);
442 }
443 }
444 elsif ($This->{Type} =~ /^KeepBottomN$/i) {
445 if ($This->{KeyType} =~ /^Numeric$/i) {
446 return ($Key > $This->{MaxKey}) ? 0 : ((($This->{KeysCount} == 1) && ($This->{MaxKey} == $Key)) ? 0 : 1);
447 }
448 else {
449 return ($Key gt $This->{MaxKey}) ? 0 : ((($This->{KeysCount} == 1) && ($This->{MaxKey} eq $Key)) ? 0 : 1);
450 }
451 }
452
453 return 1;
454 }
455
456 # Set min key...
457 #
458 sub _CompareAndSetMinKey {
459 my($This, $Key) = @_;
460
461 if (!defined $This->{MinKey}) {
462 $This->{MinKey} = $Key;
463 return $This;
464 }
465
466 if ($This->{KeyType} =~ /^Numeric$/i) {
467 if ($Key < $This->{MinKey}) {
468 $This->{MinKey} = $Key;
469 }
470 }
471 else {
472 if ($Key lt $This->{MinKey}) {
473 $This->{MinKey} = $Key;
474 }
475 }
476
477 return $This;
478 }
479
480 # Set max key...
481 #
482 sub _CompareAndSetMaxKey {
483 my($This, $Key) = @_;
484
485 if (!defined $This->{MaxKey}) {
486 $This->{MaxKey} = $Key;
487 return $This;
488 }
489
490 if ($This->{KeyType} =~ /^Numeric$/i) {
491 if ($Key > $This->{MaxKey}) {
492 $This->{MaxKey} = $Key;
493 }
494 }
495 else {
496 if ($Key gt $This->{MaxKey}) {
497 $This->{MaxKey} = $Key;
498 }
499 }
500
501 return $This;
502 }
503
504 # Delete a sepcified key along with all of its values added to the list...
505 #
506 sub _DeleteKey {
507 my($This, $Key) = @_;
508 my($NumOfValues);
509
510 if (!exists $This->{Keys}{$Key}) {
511 return undef;
512 }
513
514 # Delete all key values...
515 $NumOfValues = scalar @{$This->{Keys}{$Key}};
516 @{$This->{Keys}{$Key}} = ();
517 $This->{CurrentSize} -= $NumOfValues;
518
519 # Delete key...
520 delete $This->{Keys}{$Key};
521 $This->{KeysCount} -= 1;
522
523 # Set min and max keys...
524 $This->_FindAndSetMinAndMaxKeys();
525
526 return $This;
527 }
528
529 # Delete a sepcified key along with its most recent value added to the list...
530 #
531 sub _DeleteKeyValuePair {
532 my($This, $Key) = @_;
533
534 if (!exists $This->{Keys}{$Key}) {
535 return undef;
536 }
537
538 # Delete value...
539 pop @{$This->{Keys}{$Key}};
540 $This->{CurrentSize} -= 1;
541
542 # Delete key...
543 if (!@{$This->{Keys}{$Key}}) {
544 delete $This->{Keys}{$Key};
545 $This->{KeysCount} -= 1;
546 }
547
548 # Set min and max keys...
549 $This->_FindAndSetMinAndMaxKeys();
550
551 return $This;
552 }
553
554 # Set min and max key...
555 #
556 sub _FindAndSetMinAndMaxKeys {
557 my($This) = @_;
558 my(@SortedKeys);
559
560 @SortedKeys = ($This->{KeyType} =~ /^Numeric$/i) ? (sort { $a <=> $b } keys %{$This->{Keys}}) : (sort { $a cmp $b } keys %{$This->{Keys}});
561
562 if (@SortedKeys) {
563 $This->{MinKey} = $SortedKeys[0];
564 $This->{MaxKey} = $SortedKeys[$#SortedKeys];
565 }
566 else {
567 $This->{MinKey} = undef;
568 $This->{MaxKey} = undef;
569 }
570
571 return $This;
572 }
573
574 # Return a string containing vector values...
575 sub StringifyPseudoHeap {
576 my($This) = @_;
577 my($PseudoHeapString, $Key, $Value, $KeyValuesString, @KeysAndValues);
578
579 $PseudoHeapString = "PseudoHeap: Type: " . $This->GetType() . "; KeyType: " . $This->GetKeyType() . "; MaxSize: $This->{MaxSize}; CurrentSize: $This->{CurrentSize}; MinKey: " . $This->GetMinKey() . "; MaxKey: " . $This->GetMaxKey() . "; NumOfUniqueKeys: $This->{KeysCount}";
580
581 @KeysAndValues = ();
582 for $Key ($This->GetSortedKeys()) {
583 for $Value ($This->GetKeyValues($Key)) {
584 push @KeysAndValues, "$Key - $Value";
585 }
586 }
587 if (@KeysAndValues) {
588 $KeyValuesString = TextUtil::JoinWords(\@KeysAndValues, "; ", 0);
589 }
590 else {
591 $KeyValuesString = "None";
592 }
593
594 $PseudoHeapString .= "; Sorted Key - Value pairs: [$KeyValuesString]";
595
596 return $PseudoHeapString;
597 }
598
599 1;
600
601 __END__
602
603 =head1 NAME
604
605 PseudoHeap
606
607 =head1 SYNOPSIS
608
609 use PseudoHeap;
610
611 use PseudoHeap qw(:all);
612
613 =head1 DESCRIPTION
614
615 B<PseudoHeap> class provides the following methods:
616
617 new, AddKeyValuePair, AddKeyValuePairs, DeleteKey, DeleteKeys, DeleteMaxKey,
618 DeleteMinKey, GetCurrentSize, GetKeyType, GetKeyValues, GetKeys, GetMaxKey,
619 GetMaxSize, GetMinKey, GetSortedKeys, GetType, SetKeyType, SetMaxSize, SetType,
620 StringifyPseudoHeap
621
622 PseudoHeap is designed to support tracking of a specific number of largest or smallest key/value
623 pairs with numeric or alphanumeric keys along with corresponding scalar or reference values.
624
625 Although PseudoHeap is conceptually similar to a heap, it lacks number of key properties of a traditional
626 heap data structure: no concept of root, parent and child nodes; no ordering of keys in any particular
627 order; no specific location greatest or smallest key.
628
629 The keys are simply stored in a hash with each key pointing to an array containing specified values.
630 The min/max keys are updated during addition and deletion of key/value pairs; these can be retrieved
631 by accessing corresponding hash.
632
633 Addition and deletion of key/value is also straightforward using hashes. However, min/max keys
634 need to be identified which is done using Perl sort function on the keys.
635
636 =head2 FUNCTIONS
637
638 =over 4
639
640 =item B<new>
641
642 $NewPseudoHeap = new PseudoHeap(%NamesAndValues);
643
644 Using specified parameters I<NamesAndValues> names and values hash, B<new> method creates
645 a new object and returns a reference to a newly created B<NewPseudoHeap> object. By default,
646 the following property names are initialized:
647
648 Type = undef;
649 KeyType = undef;
650 MaxSize = 10;
651
652 Examples:
653
654 $NewPseudoHeap = new PseudoHeap(
655 'Type' => 'KeepTopN',
656 'KeyType' => 'Numeric');
657
658 $NewPseudoHeap = new PseudoHeap(
659 'Type' => 'KeepTopN',
660 'KeyType' => 'AlphaNumeric',
661 'MaxSize' => '20');
662
663 $NewPseudoHeap = new PseudoHeap(
664 'Type' => 'KeepBottomN',
665 'KeyType' => 'AlphaNumeric',
666 'MaxSize' => '20');
667
668 =item B<AddKeyValuePair>
669
670 $PseudoHeap->AddKeyValuePair($Key, $Value);
671
672 Add specified I<Key> and I<Value> pair to pseudo heap using a new or an existing
673 key and returns B<PseudoHeap>.
674
675 =item B<AddKeyValuePairs>
676
677 $PseudoHeap->AddKeyValuePairs(@KeyValuePairs);
678
679 Adds multiple key and value pairs specified in array I<KeyValuePairs> to pseudo heap
680 using a new or existing keys and returns B<PseudoHeap>.
681
682 =item B<DeleteKey>
683
684 $PseudoHeap->DeleteKey($Key);
685
686 Deletes a specified I<Key> from pseudo heap and returns B<PseudoHeap>.
687
688 =item B<DeleteKeys>
689
690 $PseudoHeap->DeleteKeys(@Keys);
691
692 Deletes a specified I<Keys> from pseudo heap and returns B<PseudoHeap>.
693
694 =item B<DeleteMaxKey>
695
696 $PseudoHeap->DeleteMaxKey();
697
698 Deletes a I<MaxKey> along with its associated values from pseudo heap and returns
699 B<PseudoHeap>.
700
701 =item B<DeleteMinKey>
702
703 $PseudoHeap->DeleteMinKey();
704
705 Deletes a I<MinKey> along with its associated values from pseudo heap and returns
706 B<PseudoHeap>.
707
708 =item B<GetCurrentSize>
709
710 $Size = $PseudoHeap->GetCurrentSize();
711
712 Returns current I<Size> of pseudo heap corresponding to number to keys in heap.
713
714 =item B<GetKeyType>
715
716 $KeyType = $PseudoHeap->GetKeyType();
717
718 Returns I<KeyType> of pseudo heap. Possible B<KeyType> values: I<Numeric or Alphanumeric>.
719
720 =item B<GetKeyValues>
721
722 @Values = $PseudoHeap->GetKeyValues($Key);
723 $NumOfValues = $PseudoHeap->GetKeyValues($Key);
724
725 Returns an array containing B<Values> associated with a specified I<Key> in pseudo heap. In
726 scalar context, it returns number of values associated with a key.
727
728 =item B<GetKeys>
729
730 @Keys = $PseudoHeap->GetKeys();
731 $NumOfKeys = $PseudoHeap->GetKeys();
732
733 Returns an array containing all B<Keys> in pseudo heap. In scalar context, it returns total
734 number of keys.
735
736 =item B<GetMaxKey>
737
738 $MaxKey = $PseudoHeap->GetMaxKey();
739
740 Returns I<MaxKey> present in pseudo heap.
741
742 =item B<GetMaxSize>
743
744 $MaxSize = $PseudoHeap->GetMaxSize();
745
746 Returns I<MaxSize> of pseudo heap.
747
748 =item B<GetMinKey>
749
750 $MinKey = $PseudoHeap->GetMinKey();
751
752 Returns I<MinKey> present in pseudo heap.
753
754 =item B<GetSortedKeys>
755
756 @Keys = $PseudoHeap->GetSortedKeys();
757 $NumOfKeys = $PseudoHeap->GetSortedKeys();
758
759 Returns an array containing all sorted B<Keys> in pseudo heap. In scalar context, it retruns
760 total number of keys.
761
762 Keys are sorted based on values of B<Type> and B<KeyType> for pseudo heap:
763
764 Type KeyType SortOrder SortOperator
765 KeepTopN Numeric Descending <=>
766 KeepTopN Alphanumeric Descending cmp
767 KeepBottomN Numeric Ascending <=>
768 KeepBottomN Alphanumeric Ascending cmp
769
770 =item B<GetType>
771
772 $Type = $PseudoHeap->GetType();
773
774 Returns I<Type> of pseudo heap.
775
776 =item B<SetKeyType>
777
778 $PseudoHeap->SetKeyType($KeyType);
779
780 Sets I<KeyType> of pseudo heap and returns B<PseudoHeap>.
781
782 =item B<SetMaxSize>
783
784 $PseudoHeap->SetMaxSize($MaxSize);
785
786 Sets I<MaxSize> of pseudo heap and returns B<PseudoHeap>.
787
788 =item B<SetType>
789
790 $PseudoHeap->SetType($Type);
791
792 Sets I<Type> of pseudo heap and returns B<PseudoHeap>.
793
794 =item B<StringifyPseudoHeap>
795
796 $PseudoHeapString = $PseudoHeap->StringifyPseudoHeap();
797
798 Returns a string containing information about I<PseudoHeap> object
799
800 =back
801
802 =head1 AUTHOR
803
804 Manish Sud <msud@san.rr.com>
805
806 =head1 COPYRIGHT
807
808 Copyright (C) 2015 Manish Sud. All rights reserved.
809
810 This file is part of MayaChemTools.
811
812 MayaChemTools is free software; you can redistribute it and/or modify it under
813 the terms of the GNU Lesser General Public License as published by the Free
814 Software Foundation; either version 3 of the License, or (at your option)
815 any later version.
816
817 =cut