dehnert
11 years ago
9 changed files with 893 additions and 0 deletions
-
60test/functional/parser/prism/coin2.nm
-
69test/functional/parser/prism/crowds5_5.pm
-
130test/functional/parser/prism/csma2_2.nm
-
24test/functional/parser/prism/die.pm
-
170test/functional/parser/prism/firewire.nm
-
96test/functional/parser/prism/leader3.nm
-
85test/functional/parser/prism/leader3_5.pm
-
40test/functional/parser/prism/two_dice.nm
-
219test/functional/parser/prism/wlan0_collide.nm
@ -0,0 +1,60 @@ |
|||
// COIN FLIPPING PROTOCOL FOR POLYNOMIAL RANDOMIZED CONSENSUS [AH90] |
|||
// gxn/dxp 20/11/00 |
|||
|
|||
mdp |
|||
|
|||
// constants |
|||
const int N=2; |
|||
const int K; |
|||
const int range = 2*(K+1)*N; |
|||
const int counter_init = (K+1)*N; |
|||
const int left = N; |
|||
const int right = 2*(K+1)*N - N; |
|||
|
|||
// shared coin |
|||
global counter : [0..range] init counter_init; |
|||
|
|||
module process1 |
|||
|
|||
// program counter |
|||
pc1 : [0..3]; |
|||
// 0 - flip |
|||
// 1 - write |
|||
// 2 - check |
|||
// 3 - finished |
|||
|
|||
// local coin |
|||
coin1 : [0..1]; |
|||
|
|||
// flip coin |
|||
[] (pc1=0) -> 0.5 : (coin1'=0) & (pc1'=1) + 0.5 : (coin1'=1) & (pc1'=1); |
|||
// write tails -1 (reset coin to add regularity) |
|||
[] (pc1=1) & (coin1=0) & (counter>0) -> 1 : (counter'=counter-1) & (pc1'=2) & (coin1'=0); |
|||
// write heads +1 (reset coin to add regularity) |
|||
[] (pc1=1) & (coin1=1) & (counter<range) -> 1 : (counter'=counter+1) & (pc1'=2) & (coin1'=0); |
|||
// check |
|||
// decide tails |
|||
[] (pc1=2) & (counter<=left) -> 1 : (pc1'=3) & (coin1'=0); |
|||
// decide heads |
|||
[] (pc1=2) & (counter>=right) -> 1 : (pc1'=3) & (coin1'=1); |
|||
// flip again |
|||
[] (pc1=2) & (counter>left) & (counter<right) -> 1 : (pc1'=0); |
|||
// loop (all loop together when done) |
|||
[done] (pc1=3) -> 1 : (pc1'=3); |
|||
|
|||
endmodule |
|||
|
|||
// construct remaining processes through renaming |
|||
module process2 = process1[pc1=pc2,coin1=coin2] endmodule |
|||
|
|||
// labels |
|||
label "finished" = pc1=3 & pc2=3 ; |
|||
label "all_coins_equal_0" = coin1=0 & coin2=0 ; |
|||
label "all_coins_equal_1" = coin1=1 & coin2=1 ; |
|||
label "agree" = coin1=coin2 ; |
|||
|
|||
// rewards |
|||
rewards "steps" |
|||
true : 1; |
|||
endrewards |
|||
|
@ -0,0 +1,69 @@ |
|||
dtmc |
|||
|
|||
// probability of forwarding |
|||
const double PF = 0.8; |
|||
const double notPF = .2; // must be 1-PF |
|||
// probability that a crowd member is bad |
|||
const double badC = .167; |
|||
// probability that a crowd member is good |
|||
const double goodC = 0.833; |
|||
// Total number of protocol runs to analyze |
|||
const int TotalRuns = 5; |
|||
// size of the crowd |
|||
const int CrowdSize = 5; |
|||
|
|||
module crowds |
|||
// protocol phase |
|||
phase: [0..4] init 0; |
|||
|
|||
// crowd member good (or bad) |
|||
good: bool init false; |
|||
|
|||
// number of protocol runs |
|||
runCount: [0..TotalRuns] init 0; |
|||
|
|||
// observe_i is the number of times the attacker observed crowd member i |
|||
observe0: [0..TotalRuns] init 0; |
|||
|
|||
observe1: [0..TotalRuns] init 0; |
|||
|
|||
observe2: [0..TotalRuns] init 0; |
|||
|
|||
observe3: [0..TotalRuns] init 0; |
|||
|
|||
observe4: [0..TotalRuns] init 0; |
|||
|
|||
// the last seen crowd member |
|||
lastSeen: [0..CrowdSize - 1] init 0; |
|||
|
|||
// get the protocol started |
|||
[] phase=0 & runCount<TotalRuns -> 1: (phase'=1) & (runCount'=runCount+1) & (lastSeen'=0); |
|||
|
|||
// decide whether crowd member is good or bad according to given probabilities |
|||
[] phase=1 -> goodC : (phase'=2) & (good'=true) + badC : (phase'=2) & (good'=false); |
|||
|
|||
// if the current member is a good member, update the last seen index (chosen uniformly) |
|||
[] phase=2 & good -> 1/5 : (lastSeen'=0) & (phase'=3) + 1/5 : (lastSeen'=1) & (phase'=3) + 1/5 : (lastSeen'=2) & (phase'=3) + 1/5 : (lastSeen'=3) & (phase'=3) + 1/5 : (lastSeen'=4) & (phase'=3); |
|||
|
|||
// if the current member is a bad member, record the most recently seen index |
|||
[] phase=2 & !good & lastSeen=0 & observe0 < TotalRuns -> 1: (observe0'=observe0+1) & (phase'=4); |
|||
[] phase=2 & !good & lastSeen=1 & observe1 < TotalRuns -> 1: (observe1'=observe1+1) & (phase'=4); |
|||
[] phase=2 & !good & lastSeen=2 & observe2 < TotalRuns -> 1: (observe2'=observe2+1) & (phase'=4); |
|||
[] phase=2 & !good & lastSeen=3 & observe3 < TotalRuns -> 1: (observe3'=observe3+1) & (phase'=4); |
|||
[] phase=2 & !good & lastSeen=4 & observe4 < TotalRuns -> 1: (observe4'=observe4+1) & (phase'=4); |
|||
|
|||
// good crowd members forward with probability PF and deliver otherwise |
|||
[] phase=3 -> PF : (phase'=1) + notPF : (phase'=4); |
|||
|
|||
// deliver the message and start over |
|||
[] phase=4 -> 1: (phase'=0); |
|||
|
|||
endmodule |
|||
|
|||
label "observe0Greater1" = observe0>1; |
|||
label "observe1Greater1" = observe1>1; |
|||
label "observe2Greater1" = observe2>1; |
|||
label "observe3Greater1" = observe3>1; |
|||
label "observe4Greater1" = observe4>1; |
|||
label "observeIGreater1" = observe1>1|observe2>1|observe3>1|observe4>1; |
|||
label "observeOnlyTrueSender" = observe0>1&observe1<=1 & observe2<=1 & observe3<=1 & observe4<=1; |
@ -0,0 +1,130 @@ |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// CSMA/CD protocol - probabilistic version of kronos model (3 stations) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// gxn/dxp 04/12/01 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mdp |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// note made changes since cannot have strict inequalities |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// in digital clocks approach and suppose a station only sends one message |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// simplified parameters scaled |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int sigma=1; // time for messages to propagate along the bus |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int lambda=30; // time to send a message |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// actual parameters |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int N = 2; // number of processes |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int K = 2; // exponential backoff limit |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int slot = 2*sigma; // length of slot |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// const int M = floor(pow(2, K))-1 ; // max number of slots to wait |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int M = 3 ; // max number of slots to wait |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//const int lambda=782; |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//const int sigma=26; |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// formula min_backoff_after_success = min(s1=4?cd1:K+1,s2=4?cd2:K+1); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// formula min_collisions = min(cd1,cd2); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// formula max_collisions = max(cd1,cd2); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//---------------------------------------------------------------------------------------------------------------------------- |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// the bus |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
module bus |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
b : [0..2]; |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// b=0 - idle |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// b=1 - active |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// b=2 - collision |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// clocks of bus |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y1 : [0..sigma+1]; // time since first send (used find time until channel sensed busy) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y2 : [0..sigma+1]; // time since second send (used to find time until collision detected) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// a sender sends (ok - no other message being sent) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[send1] (b=0) -> (b'=1); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[send2] (b=0) -> (b'=1); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Tree:
d1b797a126
refactoring
${ noResults }
35 lines
194 B
|