@@ -29,6 +29,25 @@ public class Node extends UnicastRemoteObject implements IComponent {
29
29
private Link testEdge ;
30
30
private Link inBranch ; //the adjacent edge leading to the core of the fragment
31
31
public AtomicInteger findCount ; // maybe atomic implementation
32
+ public AtomicInteger ConnectSent ;
33
+ public AtomicInteger TestSent ;
34
+ public AtomicInteger InitiateSent ;
35
+ public AtomicInteger ReportSent ;
36
+ public AtomicInteger AcceptSent ;
37
+ public AtomicInteger RejectSent ;
38
+ public AtomicInteger ChangeRootSent ;
39
+ public AtomicInteger ConnectReceived ;
40
+ public AtomicInteger TestReceived ;
41
+ public AtomicInteger InitiateReceived ;
42
+ public AtomicInteger ReportReceived ;
43
+ public AtomicInteger AcceptReceived ;
44
+ public AtomicInteger RejectReceived ;
45
+ public AtomicInteger ChangeRootReceived ;
46
+ public AtomicInteger merges ;
47
+ public AtomicInteger absorbs ;
48
+ public Map <Double ,Link > cores ;
49
+ public Map <Double ,Link > mstEdges ;
50
+ public Map <Integer ,List <Link >> levels ;
32
51
33
52
public Node (int id , Queue <Link > links ) throws RemoteException {
34
53
super ();
@@ -37,13 +56,36 @@ public Node(int id, Queue<Link> links) throws RemoteException {
37
56
level = 0 ;
38
57
this .links = new PriorityQueue <Link >(links );
39
58
fragmentName = id ;
40
- // bestEdge = links.peek();
59
+ initializeMetrics ();
60
+ cores = new HashMap <Double ,Link >();
61
+ mstEdges = new HashMap <Double ,Link >();
62
+ levels = new HashMap <Integer ,List <Link >>();
41
63
}
42
64
65
+ private void initializeMetrics (){
66
+ ConnectSent = new AtomicInteger (0 );
67
+ TestSent = new AtomicInteger (0 );
68
+ InitiateSent = new AtomicInteger (0 );
69
+ ReportSent = new AtomicInteger (0 );
70
+ AcceptSent = new AtomicInteger (0 );
71
+ RejectSent = new AtomicInteger (0 );
72
+ ChangeRootSent = new AtomicInteger (0 );
73
+ ConnectReceived = new AtomicInteger (0 );
74
+ TestReceived = new AtomicInteger (0 );
75
+ InitiateReceived = new AtomicInteger (0 );
76
+ ReportReceived = new AtomicInteger (0 );
77
+ AcceptReceived = new AtomicInteger (0 );
78
+ RejectReceived = new AtomicInteger (0 );
79
+ ChangeRootReceived = new AtomicInteger (0 );
80
+ merges = new AtomicInteger (0 );
81
+ absorbs = new AtomicInteger (0 );
82
+ }
83
+
43
84
@ Override
44
85
public void wakeUp () throws RemoteException {
45
86
Link edge = links .peek ();
46
87
edge .setState (LinkState .IN_MST );
88
+ mstEdges .put (edge .getWeight (), edge );
47
89
System .out .println (id + ":Wakeup" );
48
90
49
91
System .out .println (id + ": changing link to " + edge .getReceiver (id ) + " to IN_MST" );
@@ -52,6 +94,7 @@ public void wakeUp() throws RemoteException {
52
94
findCount = new AtomicInteger (0 );
53
95
Message msg = new Message (MessageType .CONNECT , 0 );
54
96
System .out .println (id + ":Sending Connect to " + edge .getReceiver (id ));
97
+ ConnectSent .getAndIncrement ();
55
98
new java .util .Timer ().schedule (
56
99
new java .util .TimerTask () {
57
100
@ Override
@@ -81,24 +124,31 @@ public synchronized void receive(Message message, Link link) throws RemoteExcept
81
124
Link myLink = getMyLink (link );
82
125
switch (message .getType ()) {
83
126
case TEST :
127
+ TestReceived .getAndIncrement ();
84
128
receiveTest (message , myLink );
85
129
break ;
86
130
case ACCEPT :
131
+ AcceptReceived .getAndIncrement ();
87
132
receiveAccept (message , myLink );
88
133
break ;
89
134
case CONNECT :
135
+ ConnectReceived .getAndIncrement ();
90
136
receiveConnect (message , myLink );
91
137
break ;
92
138
case INITIATE :
139
+ InitiateReceived .getAndIncrement ();
93
140
receiveInitiate (message , myLink );
94
141
break ;
95
142
case REPORT :
143
+ ReportReceived .getAndIncrement ();
96
144
receiveReport (message , myLink );
97
145
break ;
98
146
case REJECT :
147
+ RejectReceived .getAndIncrement ();
99
148
receiveReject (message , myLink );
100
149
break ;
101
150
case CHANGE_ROOT :
151
+ ChangeRootReceived .getAndIncrement ();
102
152
receiveChangeRoot (message , myLink );
103
153
break ;
104
154
}
@@ -144,7 +194,10 @@ public synchronized void receiveConnect(Message message, Link link) throws Remot
144
194
if (message .getLevel () < this .level ) {
145
195
System .out .println (id + ": changing link to " + link .getReceiver (id ) + " to IN_MST" );
146
196
link .setState (LinkState .IN_MST );
197
+ mstEdges .put (link .getWeight (), link );
147
198
Message msg = new Message (MessageType .INITIATE , level , fragmentName , state );
199
+ InitiateSent .getAndIncrement ();
200
+ absorbs .getAndIncrement ();
148
201
new java .util .Timer ().schedule (
149
202
new java .util .TimerTask () {
150
203
@ Override
@@ -176,7 +229,7 @@ public void run() {
176
229
public void run () {
177
230
try {
178
231
Thread .sleep (3000 );
179
- nodes [id ].receive (message , link );
232
+ nodes [id ].receiveConnect (message , link );
180
233
} catch (RemoteException e ) {
181
234
e .printStackTrace ();
182
235
} catch (InterruptedException e ) {
@@ -188,6 +241,16 @@ public void run() {
188
241
} else {
189
242
// the merging case: l == l' and MOE == MOE'
190
243
Message msg = new Message (MessageType .INITIATE , level + 1 , link .getWeight (), NodeState .FIND );
244
+ InitiateSent .getAndIncrement ();
245
+ merges .getAndIncrement ();
246
+ cores .put (link .getWeight (), link );
247
+ List <Link > tt ;
248
+ if (levels .containsKey (level +1 ))
249
+ tt = levels .get (level +1 );
250
+ else
251
+ tt = new ArrayList <Link >();
252
+ tt .add (link );
253
+ levels .put (level +1 , tt );
191
254
System .out .println (id + ":Sending Initiate to " + link .getReceiver (id ));
192
255
new java .util .Timer ().schedule (
193
256
new java .util .TimerTask () {
@@ -222,6 +285,7 @@ private synchronized void receiveInitiate(Message message, Link link) throws Rem
222
285
if (adjescentLink .compareTo (link ) != 0 && adjescentLink .getState () == LinkState .IN_MST ) {
223
286
Message msg = new Message (MessageType .INITIATE , level , fragmentName , state );
224
287
System .out .println (id + ": Sending Initiate to " + adjescentLink .getReceiver (id ));
288
+ InitiateSent .getAndIncrement ();
225
289
new java .util .Timer ().schedule (
226
290
new java .util .TimerTask () {
227
291
@ Override
@@ -258,6 +322,7 @@ private synchronized void test() throws RemoteException {
258
322
259
323
Message msg = new Message (MessageType .TEST , level , fragmentName );
260
324
System .out .println (id + ":Sending Receive test to " + testEdge .getReceiver (id ) + " fragment" + fragmentName );
325
+ TestSent .getAndIncrement ();
261
326
int reciverID = testEdge .getReceiver (id );
262
327
new java .util .Timer ().schedule (
263
328
new java .util .TimerTask () {
@@ -318,6 +383,7 @@ public void run() {
318
383
if (message .getfName () != fragmentName ) {
319
384
Message msg = new Message (MessageType .ACCEPT );
320
385
System .out .println (id + "Sending Accept to " + link .getReceiver (id ));
386
+ AcceptSent .getAndIncrement ();
321
387
new java .util .Timer ().schedule (
322
388
new java .util .TimerTask () {
323
389
@ Override
@@ -357,6 +423,7 @@ public void run() {
357
423
public void run () {
358
424
try {
359
425
System .out .println (id + ":Sending Reject to " + link .getReceiver (id ));
426
+ RejectSent .getAndIncrement ();
360
427
Message msg = new Message (MessageType .REJECT );
361
428
Thread .sleep (100 );
362
429
nodes [link .getReceiver (id )].receive (msg , link );
@@ -405,6 +472,7 @@ private synchronized void report() throws RemoteException {
405
472
this .state = NodeState .FOUND ;
406
473
Message msg = new Message (MessageType .REPORT , weightBestAdjacent );
407
474
System .out .println (id + ":Sending Report to " + inBranch .getReceiver (id ));
475
+ ReportSent .getAndIncrement ();
408
476
new java .util .Timer ().schedule (
409
477
new java .util .TimerTask () {
410
478
@ Override
@@ -448,7 +516,7 @@ public synchronized void receiveReport(Message message, Link link) throws Remote
448
516
public void run () {
449
517
try {
450
518
Thread .sleep (5000 );
451
- nodes [id ].receive (message , link );
519
+ nodes [id ].receiveReport (message , link );
452
520
} catch (RemoteException e ) {
453
521
e .printStackTrace ();
454
522
} catch (InterruptedException e ) {
@@ -464,7 +532,51 @@ public void run() {
464
532
if (message .getWeight () == weightBestAdjacent &&
465
533
weightBestAdjacent == Double .POSITIVE_INFINITY ) {
466
534
System .out .println (id + ":HAAAAAAAAAAAAAAAAAAAAAAAAAALT" );
467
- // TODO: HALT
535
+ Map <String ,Integer > stats = null ;
536
+ Map <String ,Integer > temp ;
537
+ int t ;
538
+ for (IComponent node :nodes ){
539
+ if (node .getID ()==id ){
540
+ temp = getMetrics ();
541
+ }
542
+ else {
543
+ temp = node .getMetrics ();
544
+ for (Double w :node .getMST ().keySet ()){
545
+ if (!mstEdges .containsKey (w ))
546
+ mstEdges .put (w , node .getMST ().get (w ));
547
+ }
548
+ for (Double w :node .getCores ().keySet ()){
549
+ if (!cores .containsKey (w ))
550
+ cores .put (w , node .getCores ().get (w ));
551
+ }
552
+ for (int i :node .getLevels ().keySet ()){
553
+ if (!levels .containsKey (i )){
554
+ levels .put (i , node .getLevels ().get (i ));
555
+ }
556
+ else {
557
+ List <Link > tt ;
558
+ for (Link l :node .getLevels ().get (i )){
559
+ if (!levels .get (i ).stream ().anyMatch (p -> p .getWeight () == l .getWeight ())){
560
+ tt = levels .get (i );
561
+ tt .add (l );
562
+ levels .put (i , tt );
563
+ }
564
+ }
565
+ }
566
+ }
567
+ }
568
+ if (stats ==null )
569
+ stats = new HashMap <String ,Integer >(temp );
570
+ else {
571
+ for (String k : stats .keySet ()){
572
+ t = stats .get (k );
573
+ stats .put (k , t +temp .get (k ));
574
+ }
575
+ }
576
+ }
577
+ t = stats .get ("merges" );
578
+ stats .put ("merges" , t /2 );
579
+ presentStats (stats );
468
580
}
469
581
}
470
582
}
@@ -476,6 +588,7 @@ private void changeRoot() throws RemoteException {
476
588
477
589
if (bestEdge .getState () == LinkState .IN_MST ) {
478
590
Message msg = new Message (MessageType .CHANGE_ROOT );
591
+ ChangeRootSent .getAndIncrement ();
479
592
new java .util .Timer ().schedule (
480
593
new java .util .TimerTask () {
481
594
@ Override
@@ -498,6 +611,7 @@ public void run() {
498
611
} else {
499
612
Message msg = new Message (MessageType .CONNECT , level );
500
613
System .out .println (id + ":Sending connect message " + bestEdge .getReceiver (id ));
614
+ ConnectSent .getAndIncrement ();
501
615
new java .util .Timer ().schedule (
502
616
new java .util .TimerTask () {
503
617
@ Override
@@ -518,6 +632,7 @@ public void run() {
518
632
);
519
633
System .out .println (id + ": changing bestEdge to " + bestEdge .getReceiver (id ) + " to IN_MST" );
520
634
bestEdge .setState (LinkState .IN_MST );
635
+ mstEdges .put (bestEdge .getWeight (), bestEdge );
521
636
522
637
}
523
638
}
@@ -540,7 +655,65 @@ public IComponent[] getEntities() throws RemoteException{
540
655
541
656
@ Override
542
657
public int getID () throws RemoteException {
543
- // TODO Auto-generated method stub
544
658
return id ;
545
659
}
660
+
661
+ @ Override
662
+ public Map <String ,Integer > getMetrics () throws RemoteException {
663
+ // TODO Auto-generated method stub
664
+ Map <String ,Integer > stat = new HashMap <String , Integer >();
665
+ stat .put ("ConnectSent" , ConnectSent .get ());
666
+ stat .put ("InitiateSent" , InitiateSent .get ());
667
+ stat .put ("AcceptSent" , AcceptSent .get ());
668
+ stat .put ("RejectSent" , RejectSent .get ());
669
+ stat .put ("TestSent" , TestSent .get ());
670
+ stat .put ("ReportSent" , ReportSent .get ());
671
+ stat .put ("ChangeRootSent" , ChangeRootSent .get ());
672
+ stat .put ("ConnectReceived" , ConnectReceived .get ());
673
+ stat .put ("InitiateReceived" , InitiateReceived .get ());
674
+ stat .put ("AcceptReceived" , AcceptReceived .get ());
675
+ stat .put ("RejectReceived" , RejectReceived .get ());
676
+ stat .put ("TestReceived" , TestReceived .get ());
677
+ stat .put ("ReportReceived" , ReportReceived .get ());
678
+ stat .put ("ChangeRootReceived" , ChangeRootReceived .get ());
679
+ stat .put ("merges" , merges .get ());
680
+ stat .put ("absorbs" , absorbs .get ());
681
+ return stat ;
682
+ }
683
+
684
+
685
+ private void presentStats (Map <String , Integer > stats ){
686
+ for (String k :stats .keySet ()){
687
+ System .out .println (k +": " +stats .get (k ));
688
+ }
689
+ System .out .println ("---------- MST ----------" );
690
+ for (Double w :mstEdges .keySet ()){
691
+ System .out .println ("(" +mstEdges .get (w ).getFrom ()+ " - " +mstEdges .get (w ).getTo ()+")" );
692
+ }
693
+ System .out .println ("---------- Core-Level Values ----------" );
694
+ for (int l :levels .keySet ()){
695
+ System .out .println ("In level " + l );
696
+ for (Link e : levels .get (l )){
697
+ System .out .println ("(" +e .getFrom ()+ " - " +e .getTo ()+")" );
698
+ }
699
+ }
700
+ }
701
+
702
+ @ Override
703
+ public Map <Double , Link > getCores () throws RemoteException {
704
+ // TODO Auto-generated method stub
705
+ return cores ;
706
+ }
707
+
708
+ @ Override
709
+ public Map <Double , Link > getMST () throws RemoteException {
710
+ // TODO Auto-generated method stub
711
+ return mstEdges ;
712
+ }
713
+
714
+ @ Override
715
+ public Map <Integer , List <Link >> getLevels () throws RemoteException {
716
+ // TODO Auto-generated method stub
717
+ return levels ;
718
+ }
546
719
}
0 commit comments