From 1687154c62f4e29c49a65e8abc78a5d55a023ae9 Mon Sep 17 00:00:00 2001 From: Berack96 Date: Thu, 13 Mar 2025 12:40:33 +0100 Subject: [PATCH] Add new images and update README with examples and additional information --- README.md | 55 +- image/README/1741860064265.png | Bin 0 -> 11473 bytes image/README/1741862185715.png | Bin 0 -> 13771 bytes image/README/1741862486547.png | Bin 0 -> 13407 bytes image/README/1741862746304.png | Bin 0 -> 902 bytes image/README/1741863043733.png | Bin 0 -> 1147 bytes src/main/resources/example1.jsimg | 146 +++++ src/main/resources/example3.jsimg | 1000 +++++++++++++++++++++++++++++ 8 files changed, 1196 insertions(+), 5 deletions(-) create mode 100644 image/README/1741860064265.png create mode 100644 image/README/1741862185715.png create mode 100644 image/README/1741862486547.png create mode 100644 image/README/1741862746304.png create mode 100644 image/README/1741863043733.png create mode 100644 src/main/resources/example1.jsimg create mode 100644 src/main/resources/example3.jsimg diff --git a/README.md b/README.md index 7316daa..074cc13 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,13 @@ Il simulatore è iniziato con il lavoro trovato sul libro di testo [Discrete-Eve Il risultato è la creazione in una libreria per la simulazione di eventi discreti nella quale si può scegliera la topologia e la quantità di nodi nella rete da simulare. +Questa libreria è stata confrontata con il tool [JMT](https://jmt.sourceforge.net/Download.html) e le reti usate per fare il confronto si possono trovare sotto [le risorse del main](https://github.com/Berack96/upo-valpre/tree/main/src/main/resources). + > [!IMPORTANT] > Il JAR risultante che si trova nelle [Releases](https://github.com/Berack96/upo-valpre/releases).\ > La versione di Java usata è la 23 (precisamente la [23.0.1](https://www.oracle.com/java/technologies/javase/jdk23-archive-downloads.html)). +--- ### Comandi Jar Il JAR viene invocato tramite il classico comando java: `java -jar upo-valpre.jar` al quale si aggiungono vari argomenti successivi in base a cosa si vuole fare: @@ -21,10 +24,12 @@ Usato per avviare una simulazione della rete. Nel caso la rete non abbia eventua Esistono vari tipi di argomenti per scegliere come fare la simulazione: * `-runs ` per fare la simulazione N volte * `-seed ` per dare un seed iniziale scelto + * `-i ` per scegliere gli indici di terminazione delle run di simulazione quando l'intervallo di confidenza associato è raggiunto. Viene ignorato il comando -p se questa opzione è attiva. Il formato da usare è\ + **\[nodo:statistica=confidenza:errore%\];\[..\]** * `-csv ` per salvare i risultati delle run in un file csv * `-p` per fare le simulazioni in parallelo (ovvero su più thread) * `-end ` per scegliere quando la simulazione finisce nel caso non ci siano dei source limitati nella creazione di arrivi. La tipologia di fine simulazione la si può trovare dentro `EndCriteria` (ovvero MaxArrivals, MaxDepartures, MaxTime) e la formattazione da usare per passare il parametro è la seguente:\ - **\[Tipo1:param1,..,paramN\];\[..\];\[TipoN:param1,..,paramN\]** + **\[tipo:param1,..,paramN\];\[..\]** * `java -jar upo-valpre.jar plot -csv `\ Mostra (con un ambiente grafico) una finestra nella quale si può scegliere quale nodo vedere e ogni statistica associata ad esso. Di seguito un'immagine di esempio:\ ![1738603552417](image/README/1738603552417.png) @@ -33,21 +38,61 @@ Esistono dei file prefatti per vedere eventuali simulazioni che, nel caso vengan * `example1.net`, `example2.net` e `example3.net` per `simulation -net` * `example1.csv`, `example2.csv` e `example3.csv` per `plot -csv` +--- ### Classi Interne -Esistono molteplici classi interne che vengono usate per supportare la simulazione e/o mostrare i risultati. In generale le classi dentro il percorso [net.berack.upo.valpre](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre) sono usate per l'utilizzo del jar e quindi non sono essenziali per la simulazione. +Esistono molteplici classi interne che vengono usate per supportare la simulazione e/o mostrare i risultati. In generale le classi dentro il percorso [net.berack.upo.valpre](src/main/java/net/berack/upo/valpre) sono usate per l'utilizzo del jar e quindi non sono essenziali per la simulazione. I percorsi che invece sono direttamente responsabili per la simulazione sono: -- [net.berack.upo.valpre.rand](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/rand) All'interno del quale si possono trovare: +- [net.berack.upo.valpre.rand](src/main/java/net/berack/upo/valpre/rand) All'interno del quale si possono trovare: - **Rng** che viene usato per il calcolo di numeri pseudo-casuali tramite un seed iniziale e la generazione di molteplici stream di generazione di numeri casuali - **Distribution** interfaccia usata per la generazione di un numero casuale di una distribuzione. In questo file esistono molteplici classi interne che implementano l'interfaccia; per esempio: Exponential, Normal, Uniform -- [net.berack.upo.valpre.sim](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim) Package che contiene tutte le parti utili alla simulazione; per esempio la creazione della rete o la simulazione si più thread: +- [net.berack.upo.valpre.sim](src/main/java/net/berack/upo/valpre/sim) Package che contiene tutte le parti utili alla simulazione; per esempio la creazione della rete o la simulazione si più thread: - **Net** che viene usato per rappresentare una rete da simulare. - **ServerNode** che viene usato per rappresentare un singolo nodo della rete. - **Event** che viene usato per rappresentare un evento della simulazione. - **EndCriteria** interfaccia che viene implementata dalle classi interne usata per controllare se e quando la simulazione debba finire. - **Simulation** e **SimulationMultiple** che vengono usate per far partire la simulazione; la versione multiple serve ad organizzare molteplici simulazioni su più thread o su un singolo core. -- [net.berack.upo.valpre.sim.stats](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim/stats) Package che contiene tutte le classi utili per la raccolta e l'analisi statistica dei vari valori generati dalla simulazione: +- [net.berack.upo.valpre.sim.stats](src/main/java/net/berack/upo/valpre/sim/stats) Package che contiene tutte le classi utili per la raccolta e l'analisi statistica dei vari valori generati dalla simulazione: - **Result** il risultato di una run e la sua classe interna **Result.Summary** che contiene molteplici risultati di run già analizzati. - **NodeStats** contiene indici statistici di un nodo e la sua classe interna **NodeStats.Summary** che contiene molteplici indici statistici già analizzati. - **ConsoleTable** utile per mostrare i risultati in console sottoforma di tabella - **CsvResult** utile per la lettura/scrittura dei risultati in formato csv + +--- +### Esempi + +Nel jar sono presenti già 3 reti per fare degli esperimenti e/o testare se il tool funziona correttamente. Per tutti e tre gli esempi i comandi usati sono i seguenti, dove viene sostituito un numero al posto dell'asterisco: +- `java -jar .\upo-valpre.jar simulation -net example*.net -runs 100` per fare una simulazione di 100 run e vedere i risultati aggregati. +- `java -jar .\upo-valpre.jar plot -csv example*.csv` per mostrare un'aggregazione con più dettagli di una simulazione di 1000 run. + +##### Primo esempio +![1741862746304](image/README/1741862746304.png)\ +Il primo è `example1`; è una rete composta da una fonte di clienti (Source) che arrivano con tasso esponenziale (λ=0.222 e quindi media 4.5) e un centro di servizio (Queue) con tasso di servizio distribuito come una normale (μ=3.2, σ=0.6).\ +Se si effettua una simulazione con il comando precedente si vedranno i risultati sulla console in questo modo: +![1741860064265](image/README/1741860064265.png) + +Il tool JMT con la stessa rete produce i seguenti risultati che sono molto simili a quelli prodotti dalla libreria:\ +Queue Response Time = 7.3022 con un range [7.1456, 7.4589]\ +Queue Throughput = 0.2226 con un range [0.2182, 0.2271]\ +Queue Utilization = 0.7111 con un range [0.6959, 0.7262] + +##### Secondo esempio +![1741863043733](image/README/1741863043733.png)\ +Il secondo è `example2`; è una rete composta da una fonte di clienti (Source) che arrivano con tasso esponenziale (λ=0.222 e quindi media 4.5), un centro di servizio (Queue) con tasso di servizio distribuito come una normale (μ=3.2, σ=0.6) e un altro centro di servizio (Queue Wait) con tasso di servizio distribuito come una normale (μ=3.2, σ=0.6) e con un tempo di indisponibilità che viene attivato con probabilità 20% e distribuito con una normale (μ=4.2, σ=0.6)\ +Se si effettua una simulazione con il comando precedente si vedranno i risultati sulla console in questo modo: +![1741862185715](image/README/1741862185715.png) + +##### Terzo esempio +![1741863043733](image/README/1741863043733.png)\ +Il terzo è `example3`; è uguale al secondo esempio ma nel quale cambiano i nomi dei nodi e le loro distribuzioni: è una rete composta da una fonte di clienti (Source) che arrivano con tasso esponenziale (λ=1.5 e quindi media 0.666), un centro di servizio (Service1) con tasso di servizio distribuito come una esponenziale (λ=2.0 e quindi media 0.5) e un altro centro di servizio (Service2) con tasso di servizio distribuito come una esponenziale (λ=3.5 e quindi media 0.2857) e con un tempo di indisponibilità che viene attivato con probabilità 10% e distribuito con una eseponenziale (λ=10.0 e quindi media 0.1)\ +Se si effettua una simulazione con il comando precedente si vedranno i risultati sulla console in questo modo: +![1741862486547](image/README/1741862486547.png) +Il tool JMT con la stessa rete produce i seguenti risultati che sono molto simili a quelli prodotti dalla libreria:\ +Service1 Response Time ~ 1.9866\ +Busy2 Response Time ~ 0.2825\ +Queue2 Response Time ~ 0.2279\ +Service1 Utilization ~ 0.7488\ +Calibration Number of Customers ~ 0.0150\ +Busy2 Number of Customers ~ 0.4279\ +Throughput ~ 1.5000 + diff --git a/image/README/1741860064265.png b/image/README/1741860064265.png new file mode 100644 index 0000000000000000000000000000000000000000..7d14ca39f10cb0cadda1fd3144a8a7f9a3a0f0ba GIT binary patch literal 11473 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%0D!*SeHJ9fc*mr27HJ zqzncbIlzb#5)pxrFk^16M<1);&C%08=)6JUUX@{M9Qnq5Hg$XeckFtFcBq!#*6;sI0O= zR4xpH&N0#IT2d*#jxvp@s970J`~p8=w&=;}y9h64iET&Lu;ut)2Dw$nvqSbCNRJt! zWl_WSzF56l&;{_A0UJ7jYXZrewmv43rHcX3E#${7eAp?+exD1m3Q|C=Zx&3M@EIb& zK0a3ud;D}tG#z8ESW7zx8_)Lx=URMtZi$gJCjn-uD|0}&RW3f#IxL{~L8=a!4E`tmBAeE=|aw}d1dVc<7Cj`Vk2L|*Xj z=N%i9yE1?%dwm~oDj($`c*Wgt9MyI8*R}H^w4;_cDR(=N3~#?qph7->=p1MohBO9aY)(W%@gLV)NP&&3 zCI(?mi@&XkML3=Ay6T}BcIjSl!K)O}!$Q&bl)$|iA@&ym^JoV^Cve>1bHH&2ssVDH zoGL0Jk4piUWclgG`tgoswSDN}Qh@G(lDywCe}7B4t?uS?QukPYuNNI>(TKM?Bd=14 zt?vhf^GrnjqqzMWCUaLg)!!a~&rdd9tl=B?CzwFwbGp=llR0gg`H8(wzX95d&N`sl zJyKXp1WvsIwdZ<#3}TlZ&=Op6-RbWOXsjMaF@h%QE;Z5n7o^{ghL*p+FRPL*5xmOQ z$y@50=P-BZPM4EC#7zT^-(ZG5fkW3;!Gc+sO|^+Gw&!Xbp7Yq&X0yY;B8s%*UarRpA+02 ZpJo=`tMxxS4ZOyuf79qj@%2BR{2z0QnV|px literal 0 HcmV?d00001 diff --git a/image/README/1741862185715.png b/image/README/1741862185715.png new file mode 100644 index 0000000000000000000000000000000000000000..0af9ed2372e713d181ceff438bb14ce1cba0c9dc GIT binary patch literal 13771 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
CE}RB+7{X)m8ep z?w4A(u=DAI;|I1}{@Xy#a))Vr#gv`){$geOFC3()#is1s>1jXsPuW&JE2LAiboG#P z!@GZO+jUo3>IqrX)8KP(ZfDxOidD4(j^c6)mP%MsV|*TUt=xK?8};o@IV6*4u|(6GneEfjF*eFrt|&O*rrQ~ zEwj79E~T8=HCQX_Z!5FXu8no9wIU_lyv8>D%B7TCAXw}<ARKOF`t= z3~8^V_o@AA<9c@cywzHENJKeKg6l!fjvHx2=$LY9)zlwcn_LN-(Rmw?P zKcyqo&N@AY8s}meq^KBFzCmMyhYwMUB}Gy3gwzxXa*RcTJO3ZA+hRj?^gyRcwCNO^ z>zb}A)2wgYOzzp#92WD-dtlOy8N{2RK0ejVx2>$dhorarXYPI%s+LkZ@Zs5ZSo6_1 zNj}RspqJ>ADsFkUt)w@2+r2JPpz_P3DLqG?C5NK(BkE689_cUj;`vl9Ho3oKkD5l0 zQxo&5nXM>~7ZD1zC_dtlm|>&EL+#x_mV1F-4g;$gC^K~MAmw>^84 zKY-gn0@ZVhe(*OQetFK;fL>Q$O~vByTIHiz_s7GoX5X__^V~Ij@#3A1TG~Y9an_Ds zM1kFNH^rDZKCyVFQ2Cu3Pa*{zwmZSbs~z|dy6UgOJ|)=&vV9*{VGCKu=od6N-t%{8 zpsZ*VS5cUEzHp!gX zrp!EvV(MMq@f;8Tkz()gY4OSh4HNkVc2}X<^~IBt*?)%zY{w0mxULe~GZsJUgg#jb zeHX18y|xUTRBQX{l+CA}+s@skpQ-DWMiBz51GbLd{|7u!XJ`=x8pS!PuHxfarRFJE z&CVlt(?=7r-@j<;zdF|SuUYz8Zx2s-IF_mzIzE|Ig#tG<;mAQ2>%fvLPQYohBoYn1rud#p6qy{>OySLXsp^u=*_&1|vvXC`vWeSJdf@l< zHUyi7TFdN3%MHh;9s(wfJ?5^wVKV=GY& zK6-_T)sWPFspaGQ`OmRHcEaZBnDDS2f%$eu8Odad5_UQjk&ae#@O0r@lxE+1N{#w{ zML%SYhVyyExRdo(9?DAv4QEJOCABPHpu4@`1Py@2%lff*Tb}t|b~c%_-RS5Xhv`$R zC&Zux8_+%GWS^RmEGYjL=Oj87tvHVs>B<~qDxw^VJ*Xn)gfr=^$vt7&jYyt7>2Jm9 z*fty2RT>wYzM>M5R?Tbh7%T^mu|VmLhP5m5CAORvx8Lj3l0es)PY@sYdx$;q5c@XS z>|Y@J&Mz(F$}D<{vyq)&Z1Y7`D|e{~@ibFhV1&kc;~w#R`bQIuFyT*cR9kkGoMWX% zH6zmFN_+=}VCes?C-CYo5@DxuZ};SX^4U^}^O6Lhww(3dYaAsf|1HgyE_KHoglwJa zJc%rnk}?zd+p|kj#H{@+=9l&V&gT13X9!Y%2ONJTUz(^z^usSv3o2=QU({mT()=LJ z?;o=1)j7212gs++zfJpJ;ufY^g`fv87BC`=NtI2B*T&zN{jxDOsR5^`fYMof7RJLr+N0&xbWq#%A112cc>}65(7^ZueceXl@0W~` zQabK+%4ecdn2=5!|1O;aatOO8BMW08F`Nu1I{}9-zJflRm*lX_bH*cnS0Yr-k@Q;| z;`jZUx5AHCzBoZ_z{9e#r(1|7Dw1+K4arpLKqC93>Z92~e41^ONYt!+I-ap=Xk$1^ zWGyFu_WbV?f4r1JHH z-K0d4J*H0XW4cr?K{wAr}93-3C@Xe-XhBw{dJqG!>}^*sCt?hO)% z*Q8Wy^;*qo7P$T(6S5@<_yS(GPr4jcL{`=6Fu*W!j8p?sQt$iSB6lF0D2mmg30B)h zNQXEl1BY^o-O|)EZ}lrZE-IDXn!E_F)iTnE;Wu;bIVVb+aYRNrL`&7y@GC!QL&*mM zpbtlt%h5^k)yEaEZ#vx4)F(X5K;8sUg{@EokALh(KX&>05pCJs5*gv~$?L^|+vm>B zJ>BU5{6BNx8R4p(vAw`3(8vnr^C^QUhir6%P-->c7u_7dFyram-m?}rmFn8?HpM0vA%Jc>oB@+-Q)3yleBt;T`y=Kuzzxq_WgB&|3F(PNn{1`%>sNvTn`*L(9qDZckkZ+|NpnNv;c*dE?pWI7bhblGh@aKTU*=W;$j{i zo~>KA_Vn~*XJ@ZnyB4UX<5u@kASF~1*AN9$JwrXy)Em=8fois;MtG)qdTKFn06DA- zQjDw&j6jwb5KBYZAm3^*GK0mLfNVoXCI$f@9RMK9w;tyZ{CYj7GDR z0Vp+roq+|Y(!j{rfN=rDRFI9V3m_&<0kT1W31}`8SY?o<1&{^RWoTdkk_~sy6}@DY z0CY6tRZkbkkO=pyGai;TEAY6rN;$47-uM6XJB5x9p}nrwFaHMfcJ6#^A+q}8;*j^7 zOIdpk|2(SV)h=ND^khIyk?n<JDoK~aSGx& zCnhQDvHM=Ljg2qR>VLT9|I4tA=AA~@YInHY`IqE8&8JW^^}mUW*5&eNXNo!|h6)vC z?fpI3qt9;E*YlOH7+WTW1{FS@et6y&%a5!;vsC@6GM2u{zPt6l>OGU@mn$y63csgO zw}kCpXwp7+nd=iL9i6=WaOpdN=iQUOe=O}1@h^9HeMjkBsOawJDW|yZJ$*k-^lxnH znpJDrCw|`+pPg9G-*9qvLbTX=)2^@XD`xCH-t}>x_nle$SFyicWdCOW3jNEm+kT|% zTj8I6aq9HL{ttfdb&lC*{3Ww6qn2UEp|C&vtjo^*jXAypltdXkUHx3vIVCg!0J`2< A*8l(j literal 0 HcmV?d00001 diff --git a/image/README/1741863043733.png b/image/README/1741863043733.png new file mode 100644 index 0000000000000000000000000000000000000000..886191bd721fe9e821c2b17fecaca4dfc9fb2314 GIT binary patch literal 1147 zcmeAS@N?(olHy`uVBq!ia0y~yV5|eO)j61fr2VJMu0V>hILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFK)zXkPl)S*0|y!!8usqp`~Uy{mX;Qv@Y1DA(-v0p6u-GwQJV`)pXqIJ_@9SN`m}?ff`W(!=wHCg@Cf01s;*b3=DjSK$uZf z!>a)(C{f}XQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXPSCrnkZ1sw$upEG*3@01`Z&H zl|hP;m4Ok+@&aOMC>!Wo1`S4Lus9QtZOF*PAONJJfHEalY;rw=1cKIp?9@j*#iq7l5{{Mdy%jERzgGZE5NzC2&DE5bMWL7L% zee*ACihcTPjt%deQx+w^=Gej4@2@BnI`RFRbLKx88o9RYQ$L~4C_i&fZ}V+G3&t7h zi@u$0I`AjNI>5c9w|REeqQ$qH3zf3&>(smz?0Pw~Z9(q|6TZ9|4J^?HJ}z%(x9ab? zXL+>xYX57VGaFboyIk4ldA0xaoEK-$Nt_W1{Jkv1eqB+~zr1wbw$2r`_Dlc0NINVA zl28k=*JJAYn>?lCmigRYg}j9|KM!gMZhaq8FE}~wZ{Ku#HK6+Ezm{w7OSjTo@u|9F z-u{Ih9`m%nZQS?g{D-Gsr-%B6gr_>|eZBwEQlP72#WBPEfBZkBeigrBrZ{E#tUs^h z*_`+VzgjGt^WgNW_b;se+_JiAf5v&g6nl7B;miA1%~$Q0`lY}3mHczXD*}Q2&5i7Z z-&4PayTty^uQ0jG*~_$TL0dI#D|KaJ^`NyTtYhRW7dLC$Dm5k3O#$sR~?x|aq@5^z0(Ysmu ze_75@Ui1y<p zzq$`nS@-={-v78X-M&I}Yrfal`=3C!g zzkV09Z+yRR^GSC5``54VJ8?bWh< + + + + +
+ + Class1 + + + + + 0.2222222222222222 + + + + +
+
+
+ + Class1 + + +
+ + +
+ + + + 0.0 + + + 0.0 + + + 0.0 + +
+ + -1 + + + Class1 + + drop + + + + + Class1 + + +
+
+ + 1 + + + Class1 + + 1 + + + + Class1 + + + + + 3.2 + + + 0.6000000000000001 + + + + + + Class1 + + 1 + + + + + Queue - Server Type 1 + + + + + 1 + + + + + + true + + + + + ALIS (Assign Longest Idle Server) + +
+
+ + Class1 + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/example3.jsimg b/src/main/resources/example3.jsimg new file mode 100644 index 0000000..6ceb93e --- /dev/null +++ b/src/main/resources/example3.jsimg @@ -0,0 +1,1000 @@ + + + + + + + + 0.0 + 0.0 + + + 0.0 + + + 0.0 + +
+ + -1 + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+ + 1 + + + Class1 + + 1 + + Class2 + + 1 + + + + Class1 + + + + + 2.0 + + + + Class2 + + + + + 1.0 + + + + + + Class1 + + 1 + + Class2 + + 1 + + + + + Service1 - Server Type 1 + + + + + 1 + + + + + + true + + + true + + + + + ALIS (Assign Longest Idle Server) + +
+
+ + Class1 + + Class2 + + +
+
+ +
+ + -1 + + + Class1 + + -1 + + Class2 + + -1 + + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+
+ + +
+ + -1 + + + Class1 + + -1 + + Class2 + + -1 + + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+
+ + +
+ + -1 + + + Class1 + + -1 + + Class2 + + -1 + + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+
+ + +
+ + -1 + + + Class1 + + -1 + + Class2 + + -1 + + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+
+ + +
+ + + + + + Queue2 + + + Class1 + + 1 + + Class2 + + 0 + + + + + + IdleServer2 + + + Class1 + + 0 + + Class2 + + 1 + + + + + + + + + + + + Queue2 + + + Class1 + + 0 + + Class2 + + 0 + + + + + + IdleServer2 + + + Class1 + + 0 + + Class2 + + 0 + + + + + + +
+
+ + + Mode1 + + + + + 1 + + + + + + + + 0 + + + + + 1.0 + + +
+
+ + + + + + Busy2 + + + Class1 + + 1 + + Class2 + + 0 + + + + + + +
+
+ +
+ + + + + + Busy2 + + + Class1 + + 1 + + Class2 + + 0 + + + + + + + + + + + + Busy2 + + + Class1 + + 0 + + Class2 + + 0 + + + + + + +
+
+ + + Mode1 + + + + + 1 + + + + + + + + 3.5 + + + + + + + -1 + + + + + 1.0 + + +
+
+ + + + + + CheckCalibration + + + Class1 + + 0 + + Class2 + + 1 + + + + + + Sink 2 + + + Class1 + + 1 + + Class2 + + 0 + + + + + + +
+
+ +
+ + + + + + CheckCalibration + + + Class1 + + 0 + + Class2 + + 1 + + + + + + + + + + + + CheckCalibration + + + Class1 + + 0 + + Class2 + + 0 + + + + + + +
+
+ + + Mode1 + + + + + 1 + + + + + + + + 0 + + + + + 0.1 + + +
+
+ + + + + + Calibration + + + Class1 + + 0 + + Class2 + + 1 + + + + + + +
+
+ +
+ + +
+ + + + + + CheckCalibration + + + Class1 + + 0 + + Class2 + + 1 + + + + + + + + + + + + CheckCalibration + + + Class1 + + 0 + + Class2 + + 0 + + + + + + +
+
+ + + Mode1 + + + + + 1 + + + + + + + + 0 + + + + + 0.9 + + +
+
+ + + + + + IdleServer2 + + + Class1 + + 0 + + Class2 + + 1 + + + + + + +
+
+ +
+ + -1 + + + Class1 + + -1 + + Class2 + + -1 + + + + Class1 + + drop + + Class2 + + drop + + + + + Class1 + + Class2 + + +
+
+
+ + +
+ + Class1 + + + + + 1.5 + + + + Class2 + + null + + +
+
+
+ + Class1 + + Class2 + + +
+ + +
+ + + + + + Calibration + + + Class1 + + 0 + + Class2 + + 1 + + + + + + + + + + + + Calibration + + + Class1 + + 0 + + Class2 + + 0 + + + + + + +
+
+ + + Mode1 + + + + + 1 + + + + + + + + 10.0 + + + + + + + -1 + + + + + 1.0 + + +
+
+ + + + + + IdleServer2 + + + Class1 + + 0 + + Class2 + + 1 + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +