23 changed files with 952 additions and 0 deletions
-
52prism/tests/pomdps/3x3grid.prism
-
3prism/tests/pomdps/3x3grid.prism.props
-
61prism/tests/pomdps/3x3grid_bounded.prism
-
1prism/tests/pomdps/3x3grid_bounded.prism.args
-
3prism/tests/pomdps/3x3grid_bounded.prism.props
-
92prism/tests/pomdps/crypt3.prism
-
10prism/tests/pomdps/crypt3.prism.props
-
115prism/tests/pomdps/maze.prism
-
3prism/tests/pomdps/maze.prism.props
-
135prism/tests/pomdps/maze2.prism
-
3prism/tests/pomdps/maze2.prism.props
-
93prism/tests/pomdps/network2.prism
-
1prism/tests/pomdps/network2.prism.args
-
7prism/tests/pomdps/network2.prism.props
-
93prism/tests/pomdps/network2_noidle.prism
-
1prism/tests/pomdps/network2_noidle.prism.args
-
7prism/tests/pomdps/network2_noidle.prism.props
-
124prism/tests/pomdps/network2_priorities.prism
-
1prism/tests/pomdps/network2_priorities.prism.args
-
11prism/tests/pomdps/network2_priorities.prism.props
-
124prism/tests/pomdps/network2_priorities_noidle.prism
-
1prism/tests/pomdps/network2_priorities_noidle.prism.args
-
11prism/tests/pomdps/network2_priorities_noidle.prism.props
@ -0,0 +1,52 @@ |
|||
// 3x3 grid |
|||
// based on Littman, Cassandra and Kaelbling |
|||
// Learning policies for partially observable environments: Scaling up |
|||
// Technical Report CS, Brown University |
|||
|
|||
pomdp |
|||
|
|||
// only the target is observable which is in the south east corner |
|||
observables |
|||
o |
|||
endobservables |
|||
|
|||
module grid |
|||
|
|||
x : [0..2]; // x coordinate |
|||
y : [0..2]; // y coordinate |
|||
o : [0..2]; // observables |
|||
// 0 - initial observation |
|||
// 1 - in the grid (not target) |
|||
// 2 - observe target |
|||
|
|||
// initially randomly placed within the grid (not at the target) |
|||
[] o=0 -> 1/8 : (o'=1) & (x'=0) & (y'=0) |
|||
+ 1/8 : (o'=1) & (x'=0) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=0) & (y'=2) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=0) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=2) |
|||
// + 1/8 : (o'=1) & (x'=2) & (y'=0) the target |
|||
+ 1/8 : (o'=1) & (x'=2) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=2) & (y'=2); |
|||
|
|||
// move around the grid |
|||
[east] o=1 & !(x=1 & y=0) -> (x'=min(x+1,2)); // not reached target |
|||
[east] o=1 & x=1 & y=0 -> (x'=min(x+1,2)) & (o'=2); |
|||
[west] o=1 -> (x'=max(x-1,0)); // not reached target |
|||
[north] o=1 -> (x'=min(y+1,2)); // reached target |
|||
[south] o=1 & !(x=2 & y=1) -> (y'=max(y-1,0)); // not reached target |
|||
[south] o=1 & x=2 & y=1 -> (y'=max(y-1,0)) & (o'=2); // reached target |
|||
|
|||
// reached target |
|||
[done] o=2 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// reward structure for number of steps to reach the target |
|||
rewards |
|||
[east] true : 1; |
|||
[west] true : 1; |
|||
[north] true : 1; |
|||
[south] true : 1; |
|||
endrewards |
|||
@ -0,0 +1,3 @@ |
|||
// minimum steps to reach goal |
|||
// RESULT: [2.8496094277343733,2.8750000000000004] (grid resolution 16) |
|||
Rmin=?[F o=2 ] |
|||
@ -0,0 +1,61 @@ |
|||
// 3x3 grid (for step bounded properties) |
|||
// based on Littman, Cassandra and Kaelbling |
|||
// Learning policies for partially observable environments: Scaling up |
|||
// Technical Report CS, Brown University |
|||
|
|||
pomdp |
|||
|
|||
const int K; // step bound in property |
|||
|
|||
// only the target is observable which is in the south east corner |
|||
// (and the step bound) |
|||
observables |
|||
o, k |
|||
endobservables |
|||
|
|||
module grid |
|||
|
|||
x : [0..2]; // x coordinate |
|||
y : [0..2]; // y coordinate |
|||
o : [0..2]; // observables |
|||
// 0 - initial observation |
|||
// 1 - in the grid (not target) |
|||
// 2 - observe target |
|||
|
|||
// initially randomly placed within the grid (not at the target) |
|||
[] o=0 -> 1/8 : (o'=1) & (x'=0) & (y'=0) |
|||
+ 1/8 : (o'=1) & (x'=0) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=0) & (y'=2) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=0) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=1) & (y'=2) |
|||
// + 1/8 : (o'=1) & (x'=2) & (y'=0) the target |
|||
+ 1/8 : (o'=1) & (x'=2) & (y'=1) |
|||
+ 1/8 : (o'=1) & (x'=2) & (y'=2); |
|||
|
|||
// move around the grid |
|||
[east] o=1 & !(x=1 & y=0) -> (x'=min(x+1,2)); // not reached target |
|||
[east] o=1 & x=1 & y=0 -> (x'=min(x+1,2)) & (o'=2); // reached target |
|||
[west] o=1 -> (x'=max(x-1,0)); // not reached target |
|||
[north] o=1 -> (x'=min(y+1,2)); // reached target |
|||
[south] o=1 & !(x=2 & y=1) -> (y'=max(y-1,0)); // not reached target |
|||
[south] o=1 & x=2 & y=1 -> (y'=max(y-1,0)) & (o'=2); // reached target |
|||
|
|||
// reached target |
|||
[done] o=2 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// module for the step bound |
|||
module bound |
|||
|
|||
k : [0..K]; |
|||
|
|||
[east] k<K -> (k'=k+1); |
|||
[west] k<K -> (k'=k+1); |
|||
[north] k<K -> (k'=k+1); |
|||
[south] k<K -> (k'=k+1); |
|||
|
|||
[] k=K -> true; |
|||
|
|||
endmodule |
|||
@ -0,0 +1 @@ |
|||
-const K=2 |
|||
@ -0,0 +1,3 @@ |
|||
// max probability reach goal (use with step bound property) |
|||
// RESULT (K=2): [0.37500000000000006,0.375000078125] (grid resolution 8) |
|||
Pmax=?[F o=2 ] |
|||
@ -0,0 +1,92 @@ |
|||
// dining cryptographers |
|||
// gxn 27/01/16 |
|||
|
|||
// pomdp model |
|||
pomdp |
|||
|
|||
// observable variables (for crypt3) |
|||
// the announcements of all cryptographers |
|||
// only its own coin and the coin of its left neighbour |
|||
// if it guesses correctly (this is the target so needs to be observable) |
|||
// also local states of modules this only indicates: |
|||
// - if a cryptographer has announced |
|||
// - if the master has made its choice |
|||
observables |
|||
coin1, coin3, m, s1, s2, s3, guess, correct, agree1, agree2, agree3 |
|||
endobservables |
|||
|
|||
// constants used in renaming |
|||
const int p1=1; |
|||
const int p2=2; |
|||
const int p3=3; |
|||
|
|||
module master |
|||
|
|||
m : [0..1]; // local state (has chosen who pays) |
|||
pay : [1..3]; // who actually pays |
|||
|
|||
// randomly choose who pays |
|||
[] m=0 -> 1/2 : (m'=1) & (pay'=1) + 1/2 : (m'=1) & (pay'=2); |
|||
|
|||
// test cases |
|||
//[] m=0 -> (m'=1); // master pays |
|||
//[] m=0 -> (m'=1) & (pay'=1); // crypt 1 pays |
|||
//[] m=0 -> (m'=1) & (pay'=2); // crypt 2 pays |
|||
//[] m=0 -> (m'=1) & (pay'=3); // crypt 3 pays |
|||
|
|||
endmodule |
|||
|
|||
module crypt1 |
|||
|
|||
coin1 : [0..2]; // value of coin |
|||
s1 : [0..1]; // local state (has announced yet) |
|||
agree1 : [0..1]; // agree or not |
|||
|
|||
// flip coin and share values |
|||
[flip] m=1 & coin1=0 -> 0.5 : (coin1'=1) + 0.5 : (coin1'=2); |
|||
|
|||
// make choice (once relevant coins have been flipped) |
|||
// does not pay |
|||
[a1] s1=0 & coin1>0 & coin2>0 & coin1=coin2 & (pay!=p1) -> (s1'=1) & (agree1'=1); |
|||
[d1] s1=0 & coin1>0 & coin2>0 & !(coin1=coin2) & (pay!=p1) -> (s1'=1); |
|||
// pays |
|||
[d1] s1=0 & coin1>0 & coin2>0 & coin1=coin2 & (pay=p1) -> (s1'=1); |
|||
[a1] s1=0 & coin1>0 & coin2>0 & !(coin1=coin2) & (pay=p1) -> (s1'=1) & (agree1'=1); |
|||
|
|||
// when everyone has announced |
|||
[done] s1=1 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// construct further cryptographers through renaming |
|||
module crypt2 =crypt1[coin1=coin2, s1=s2, p1=p2, agree1=agree2, coin2=coin3, a1=a2, d1=d2 ] endmodule |
|||
|
|||
// the cryptographer that guesses who pays |
|||
module crypt3 |
|||
|
|||
coin3 : [0..2]; |
|||
s3 : [0..1]; |
|||
agree3 : [0..1]; |
|||
guess : [0..3]; |
|||
correct : [0..1]; |
|||
|
|||
// flip coin |
|||
[flip] m=1 & coin3=0 -> 0.5 : (coin3'=1) + 0.5 : (coin3'=2); |
|||
|
|||
// make choice (once relevant coins have been flipped) |
|||
// assume does not pay |
|||
[a3] s3=0 & coin3>0 & coin1>0 & coin3=coin1 -> (s3'=1) & (agree3'=1); |
|||
[d3] s3=0 & coin3>0 & coin1>0 & !(coin3=coin1) -> (s3'=1); |
|||
// pays |
|||
[d3] s3=0 & coin3>0 & coin1>0 & coin3=coin1 & (pay=p3) -> (s3'=1); |
|||
[a3] s3=0 & coin3>0 & coin1>0 & !(coin3=coin1) & (pay=p3) -> (s3'=1) & (agree3'=1); |
|||
|
|||
// after everyone has announced guess who payed |
|||
[done] s3=1 & guess=0 -> (guess'=1); |
|||
[done] s3=1 & guess=0 -> (guess'=2); |
|||
|
|||
// check whether guessed correctly |
|||
[check] s3=1 & guess>0 & guess=pay -> (correct'=1); |
|||
[check] s3=1 & guess>0 & !(guess=pay) -> true; |
|||
|
|||
endmodule |
|||
@ -0,0 +1,10 @@ |
|||
// minimum probability guess correctly which cryptographer paid |
|||
// RESULT: 0.5 |
|||
Pmin=? [ F correct=1 ] |
|||
|
|||
// maximum probability guess correctly which cryptographer paid |
|||
// RESULT: 0.5 |
|||
Pmax=? [ F correct=1 ] |
|||
|
|||
|
|||
|
|||
@ -0,0 +1,115 @@ |
|||
// maze example (POMDP) |
|||
// Littman, Cassandra and Kaelbling |
|||
// Learning policies for partially observable environments: Scaling up |
|||
// Technical Report CS, Brown University |
|||
// gxn 29/01/16 |
|||
|
|||
// state space (value of variable "s") |
|||
|
|||
// 0 1 2 3 4 |
|||
// 5 6 7 |
|||
// 8 10 9 |
|||
|
|||
// 10 is the target |
|||
|
|||
pomdp |
|||
|
|||
// can observe the walls and target |
|||
observables |
|||
o |
|||
endobservables |
|||
// o=0 - observation in initial state |
|||
// o=1 - west and north walls (s0) |
|||
// o=2 - north and south ways (s1 and s3) |
|||
// o=3 - north wall (s2) |
|||
// o=4 - east and north way (s4) |
|||
// o=5 - east and west walls (s5, s6 and s7) |
|||
// o=6 - east, west and south walls (s8 and s9) |
|||
// o=7 - the target (s10) |
|||
|
|||
module maze |
|||
|
|||
s : [-1..10]; |
|||
o : [0..7]; |
|||
|
|||
// initialisation |
|||
[] s=-1 -> 0.1 : (s'=0) & (o'=1) |
|||
+ 0.1 : (s'=1) & (o'=2) |
|||
+ 0.1 : (s'=2) & (o'=3) |
|||
+ 0.1 : (s'=3) & (o'=2) |
|||
+ 0.1 : (s'=4) & (o'=4) |
|||
+ 0.1 : (s'=5) & (o'=5) |
|||
+ 0.1 : (s'=6) & (o'=5) |
|||
+ 0.1 : (s'=7) & (o'=5) |
|||
+ 0.1 : (s'=8) & (o'=6) |
|||
+ 0.1 : (s'=9) & (o'=6); |
|||
|
|||
// moving around the maze |
|||
|
|||
[east] s=0 -> (s'=1) & (o'=2); |
|||
[west] s=0 -> (s'=0); |
|||
[north] s=0 -> (s'=0); |
|||
[south] s=0 -> (s'=5) & (o'=5); |
|||
|
|||
[east] s=1 -> (s'=2) & (o'=3); |
|||
[west] s=1 -> (s'=0) & (o'=1); |
|||
[north] s=1 -> (s'=1); |
|||
[south] s=1 -> (s'=1); |
|||
|
|||
[east] s=2 -> (s'=3) & (o'=2); |
|||
[west] s=2 -> (s'=1) & (o'=2); |
|||
[north] s=2 -> (s'=2); |
|||
[south] s=2 -> (s'=6) & (o'=5); |
|||
|
|||
[east] s=3 -> (s'=4) & (o'=4); |
|||
[west] s=3 -> (s'=2) & (o'=2); |
|||
[north] s=3 -> (s'=3); |
|||
[south] s=3 -> (s'=3); |
|||
|
|||
[east] s=4 -> (s'=4); |
|||
[west] s=4 -> (s'=3) & (o'=2); |
|||
[north] s=4 -> (s'=4); |
|||
[south] s=4 -> (s'=7) & (o'=5); |
|||
|
|||
[east] s=5 -> (s'=5); |
|||
[west] s=5 -> (s'=5); |
|||
[north] s=5 -> (s'=0) & (o'=1); |
|||
[south] s=5 -> (s'=8) & (o'=6); |
|||
|
|||
[east] s=6 -> (s'=6); |
|||
[west] s=6 -> (s'=6); |
|||
[north] s=6 -> (s'=2) & (o'=3); |
|||
[south] s=6 -> (s'=10) & (o'=7); |
|||
|
|||
[east] s=7 -> (s'=7); |
|||
[west] s=7 -> (s'=7); |
|||
[north] s=7 -> (s'=4) & (o'=4); |
|||
[south] s=7 -> (s'=9) & (o'=6); |
|||
|
|||
[east] s=8 -> (s'=8); |
|||
[west] s=8 -> (s'=8); |
|||
[north] s=8 -> (s'=5) & (o'=5); |
|||
[south] s=8 -> (s'=8); |
|||
|
|||
[east] s=9 -> (s'=9); |
|||
[west] s=9 -> (s'=9); |
|||
[north] s=9 -> (s'=7) & (o'=5); |
|||
[south] s=9 -> (s'=9); |
|||
|
|||
// loop when we reach the target |
|||
[done] s=10 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// reward structure (number of steps to reach the target) |
|||
rewards |
|||
|
|||
[east] true : 1; |
|||
[west] true : 1; |
|||
[north] true : 1; |
|||
[south] true : 1; |
|||
|
|||
endrewards |
|||
|
|||
// target observation |
|||
label "target" = o=7; |
|||
@ -0,0 +1,3 @@ |
|||
// Minimum expected number of steps to reach the target |
|||
// RESULT: 4.3 |
|||
Rmin=? [ F "target" ] |
|||
@ -0,0 +1,135 @@ |
|||
// maze example (POMDP) |
|||
// slightly extends that presented in |
|||
// Littman, Cassandra and Kaelbling |
|||
// Learning policies for partially observable environments: Scaling up |
|||
// Technical Report CS, Brown University |
|||
// gxn 29/01/16 |
|||
|
|||
// state space (value of variable "s") |
|||
|
|||
// 0 1 2 3 4 |
|||
// 5 6 7 |
|||
// 8 9 10 |
|||
// 11 13 12 |
|||
|
|||
// 13 is the target |
|||
|
|||
pomdp |
|||
|
|||
// can observe the walls and target |
|||
observables |
|||
o |
|||
endobservables |
|||
// o=0 - observation in initial state |
|||
// o=1 - west and north walls (s0) |
|||
// o=2 - north and south ways (s1 and s3) |
|||
// o=3 - north wall (s2) |
|||
// o=4 - east and north way (s4) |
|||
// o=5 - east and west walls (s5, s6, s7, s8, s9 and s10) |
|||
// o=6 - east, west and south walls (s11 and s12) |
|||
// o=7 - the target (s13) |
|||
|
|||
module maze |
|||
|
|||
s : [-1..13]; |
|||
o : [0..7]; |
|||
|
|||
// initialisation |
|||
[] s=-1 -> 1/13 : (s'=0) & (o'=1) |
|||
+ 1/13 : (s'=1) & (o'=2) |
|||
+ 1/13 : (s'=2) & (o'=3) |
|||
+ 1/13 : (s'=3) & (o'=2) |
|||
+ 1/13 : (s'=4) & (o'=4) |
|||
+ 1/13 : (s'=5) & (o'=5) |
|||
+ 1/13 : (s'=6) & (o'=5) |
|||
+ 1/13 : (s'=7) & (o'=5) |
|||
+ 1/13 : (s'=8) & (o'=5) |
|||
+ 1/13 : (s'=9) & (o'=5) |
|||
+ 1/13 : (s'=10) & (o'=5) |
|||
+ 1/13 : (s'=11) & (o'=6) |
|||
+ 1/13 : (s'=12) & (o'=6); |
|||
|
|||
// moving around the maze |
|||
|
|||
[east] s=0 -> (s'=1) & (o'=2); |
|||
[west] s=0 -> (s'=0); |
|||
[north] s=0 -> (s'=0); |
|||
[south] s=0 -> (s'=5) & (o'=5); |
|||
|
|||
[east] s=1 -> (s'=2) & (o'=3); |
|||
[west] s=1 -> (s'=0) & (o'=1); |
|||
[north] s=1 -> (s'=1); |
|||
[south] s=1 -> (s'=1); |
|||
|
|||
[east] s=2 -> (s'=3) & (o'=2); |
|||
[west] s=2 -> (s'=1) & (o'=2); |
|||
[north] s=2 -> (s'=2); |
|||
[south] s=2 -> (s'=6) & (o'=5); |
|||
|
|||
[east] s=3 -> (s'=4) & (o'=4); |
|||
[west] s=3 -> (s'=2) & (o'=2); |
|||
[north] s=3 -> (s'=3); |
|||
[south] s=3 -> (s'=3); |
|||
|
|||
[east] s=4 -> (s'=4); |
|||
[west] s=4 -> (s'=3) & (o'=2); |
|||
[north] s=4 -> (s'=4); |
|||
[south] s=4 -> (s'=7) & (o'=5); |
|||
|
|||
[east] s=5 -> (s'=5); |
|||
[west] s=5 -> (s'=5); |
|||
[north] s=5 -> (s'=0) & (o'=1); |
|||
[south] s=5 -> (s'=8); |
|||
|
|||
[east] s=6 -> (s'=6); |
|||
[west] s=6 -> (s'=6); |
|||
[north] s=6 -> (s'=2) & (o'=3); |
|||
[south] s=6 -> (s'=9); |
|||
|
|||
[east] s=7 -> (s'=7); |
|||
[west] s=7 -> (s'=7); |
|||
[north] s=7 -> (s'=4) & (o'=4); |
|||
[south] s=7 -> (s'=10); |
|||
|
|||
[east] s=8 -> (s'=8); |
|||
[west] s=8 -> (s'=8); |
|||
[north] s=8 -> (s'=5); |
|||
[south] s=8 -> (s'=11) & (o'=6); |
|||
|
|||
[east] s=9 -> (s'=9); |
|||
[west] s=9 -> (s'=9); |
|||
[north] s=9 -> (s'=6); |
|||
[south] s=9 -> (s'=13) & (o'=7); |
|||
|
|||
[east] s=10 -> (s'=9); |
|||
[west] s=10 -> (s'=9); |
|||
[north] s=10 -> (s'=7); |
|||
[south] s=10 -> (s'=12) & (o'=6); |
|||
|
|||
[east] s=11 -> (s'=11); |
|||
[west] s=11 -> (s'=11); |
|||
[north] s=11 -> (s'=8) & (o'=5); |
|||
[south] s=11 -> (s'=11); |
|||
|
|||
[east] s=12 -> (s'=12); |
|||
[west] s=12 -> (s'=12); |
|||
[north] s=12 -> (s'=10) & (o'=5); |
|||
[south] s=12 -> (s'=12); |
|||
|
|||
// loop when we reach the target |
|||
[done] s=13 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// reward structure (number of steps to reach the target) |
|||
rewards |
|||
|
|||
[east] true : 1; |
|||
[west] true : 1; |
|||
[north] true : 1; |
|||
[south] true : 1; |
|||
|
|||
endrewards |
|||
|
|||
// target observation |
|||
label "target" = o=7; |
|||
@ -0,0 +1,3 @@ |
|||
// Minimum expected number of steps to reach the target |
|||
// RESULT: [5.199999938461538,5.230769230769232] (grid resolution 20) |
|||
Rmin=? [ F "target" ] |
|||
@ -0,0 +1,93 @@ |
|||
// network unitization example with partially observable channels based on: |
|||
// L. Yang, S. Murugesan and J. Zhang |
|||
// Real-Kime Scheduling over Markovian Channels: When Partial Observability Meets Hard Deadlines |
|||
// IEEE Global Kelecommunications Conference (GLOBECOM'11), pages 1-5, 2011 |
|||
|
|||
pomdp |
|||
|
|||
observables |
|||
sched, k, t, packet1, packet2 //, chan1, chan2 |
|||
endobservables |
|||
|
|||
// timing constants |
|||
const int K; // total number of time periods |
|||
const int T; // number of slots per time period |
|||
|
|||
// probabilities that channels change states |
|||
// channel of user 1 |
|||
const double p1 = 0.8; // prob remain on |
|||
const double r1 = 0.2; // prob move from off to on |
|||
// channel of user 2 |
|||
const double p2 = 0.6; // prob remain on |
|||
const double r2 = 0.4; // prob move from off to on |
|||
|
|||
// scheduler |
|||
module scheduler |
|||
|
|||
k : [0..K-1]; // current time period |
|||
t : [0..T-1]; // correct slot |
|||
sched : [0..1]; // local state |
|||
|
|||
// next slot/time period |
|||
[slot] sched=0 & t<T-1 -> (sched'=1) & (t'=t+1); |
|||
[slot] sched=0 & t=T-1 & k<K-1 -> (sched'=1) & (t'=0) & (k'=k+1); |
|||
|
|||
// make scheduling choice |
|||
[idle] sched=1 -> (sched'=0); |
|||
[send1] sched=1 -> (sched'=0); |
|||
[send2] sched=1 -> (sched'=0); |
|||
|
|||
// loop when finished |
|||
[] sched=0 & t=T-1 & k=K-1 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// packets for first channel |
|||
module packet1 |
|||
|
|||
packet1 : [0..1]; // packet to send in current period |
|||
|
|||
// next slot |
|||
[slot] t=0 -> (packet1'=1); // new period so new packet |
|||
[slot] t>0 -> true; |
|||
// sending |
|||
[send1] packet1=1 & chan1=1 -> (packet1'=0); // channel up |
|||
[send1] packet1=1 & chan1=0 -> true; // channel down |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels' packets through renaming |
|||
module packet2=packet1[packet1=packet2,send1=send2,chan1=chan2] endmodule |
|||
|
|||
// first channel status |
|||
module channel1 |
|||
|
|||
chan1 : [0..1]; // status of channel (off/on) |
|||
|
|||
// initialise |
|||
[slot] t=0 & k=0 -> 0.5 : (chan1'=0) + 0.5 : (chan1'=1); |
|||
// next slot |
|||
[slot] chan1=0 & !(t=0 & k=0) -> 1 - r1 : (chan1'=0) + r1 : (chan1'=1); |
|||
[slot] chan1=1 & !(t=0 & k=0) -> 1 - p1 : (chan1'=0) + p1 : (chan1'=1); |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels through renaming |
|||
module channel2=channel1[chan1=chan2,p1=p2,r1=r2] endmodule |
|||
|
|||
// reward structure for number of dropped packets |
|||
// (need to be careful as we update k and t at the start of the time slot) |
|||
rewards "dropped_packets" |
|||
[slot] t=0 & k>0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[idle] t=T-1 & k=K-1 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=1 : ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=1 : ((packet1=0)?0:1); |
|||
endrewards |
|||
|
|||
// reward structure for number of sent packets |
|||
rewards "packets_sent" |
|||
[send1] chan1=1 : 1; |
|||
[send2] chan2=1 : 1; |
|||
endrewards |
|||
@ -0,0 +1 @@ |
|||
-const K=2,T=3 |
|||
@ -0,0 +1,7 @@ |
|||
// minimum number of dropped packets |
|||
// RESULT (K=2,T=3): [1.6572208448483332,1.6578400000000002] (grid resolution 50) |
|||
R{"dropped_packets"}min=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum number of packets sent (dual property) |
|||
// RESULT (K=2,T=3): [2.3421600000000002,2.342779155151662] (grid resolution 50) |
|||
R{"packets_sent"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
@ -0,0 +1,93 @@ |
|||
// network unitization example with partially observable channels based on: |
|||
// L. Yang, S. Murugesan and J. Zhang |
|||
// Real-Kime Scheduling over Markovian Channels: When Partial Observability Meets Hard Deadlines |
|||
// IEEE Global Kelecommunications Conference (GLOBECOM'11), pages 1-5, 2011 |
|||
|
|||
pomdp |
|||
|
|||
observables |
|||
sched, k, t, packet1, packet2 //, chan1, chan2 |
|||
endobservables |
|||
|
|||
// timing constants |
|||
const int K; // total number of time periods |
|||
const int T; // number of slots per time period |
|||
|
|||
// probabilities that channels change states |
|||
// channel of user 1 |
|||
const double p1 = 0.8; // prob remain on |
|||
const double r1 = 0.2; // prob move from off to on |
|||
// channel of user 2 |
|||
const double p2 = 0.6; // prob remain on |
|||
const double r2 = 0.4; // prob move from off to on |
|||
|
|||
// scheduler |
|||
module scheduler |
|||
|
|||
k : [0..K-1]; // current time period |
|||
t : [0..T-1]; // correct slot |
|||
sched : [0..1]; // local state |
|||
|
|||
// next slot/time period |
|||
[slot] sched=0 & t<T-1 -> (sched'=1) & (t'=t+1); |
|||
[slot] sched=0 & t=T-1 & k<K-1 -> (sched'=1) & (t'=0) & (k'=k+1); |
|||
|
|||
// make scheduling choice |
|||
[idle] sched=1 & packet1=0 & packet2=0 -> (sched'=0); |
|||
[send1] sched=1 -> (sched'=0); |
|||
[send2] sched=1 -> (sched'=0); |
|||
|
|||
// loop when finished |
|||
[] sched=0 & t=T-1 & k=K-1 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// packets for first channel |
|||
module packet1 |
|||
|
|||
packet1 : [0..1]; // packet to send in current period |
|||
|
|||
// next slot |
|||
[slot] t=0 -> (packet1'=1); // new period so new packet |
|||
[slot] t>0 -> true; |
|||
// sending |
|||
[send1] packet1=1 & chan1=1 -> (packet1'=0); // channel up |
|||
[send1] packet1=1 & chan1=0 -> true; // channel down |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels' packets through renaming |
|||
module packet2=packet1[packet1=packet2,send1=send2,chan1=chan2] endmodule |
|||
|
|||
// first channel status |
|||
module channel1 |
|||
|
|||
chan1 : [0..1]; // status of channel (off/on) |
|||
|
|||
// initialise |
|||
[slot] t=0 & k=0 -> 0.5 : (chan1'=0) + 0.5 : (chan1'=1); |
|||
// next slot |
|||
[slot] chan1=0 & !(t=0 & k=0) -> 1 - r1 : (chan1'=0) + r1 : (chan1'=1); |
|||
[slot] chan1=1 & !(t=0 & k=0) -> 1 - p1 : (chan1'=0) + p1 : (chan1'=1); |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels through renaming |
|||
module channel2=channel1[chan1=chan2,p1=p2,r1=r2] endmodule |
|||
|
|||
// reward structure for number of dropped packets |
|||
// (need to be careful as we update k and t at the start of the time slot) |
|||
rewards "dropped_packets" |
|||
[slot] t=0 & k>0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[idle] t=T-1 & k=K-1 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=1 : ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=1 : ((packet1=0)?0:1); |
|||
endrewards |
|||
|
|||
// reward structure for number of sent packets |
|||
rewards "packets_sent" |
|||
[send1] chan1=1 : 1; |
|||
[send2] chan2=1 : 1; |
|||
endrewards |
|||
@ -0,0 +1 @@ |
|||
-const K=2,T=3 |
|||
@ -0,0 +1,7 @@ |
|||
// minimum number of dropped packets |
|||
// RESULT (K=2,T=3): [1.6572208448483332,1.6578400000000002] (grid resolution 50) |
|||
R{"dropped_packets"}min=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum number of packets sent (dual property) |
|||
// RESULT (K=2,T=3): [2.3421600000000002,2.342779155151662] (grid resolution 50) |
|||
R{"packets_sent"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
@ -0,0 +1,124 @@ |
|||
// network unitization example with partially observable channels based on: |
|||
// L. Yang, S. Murugesan and J. Zhang |
|||
// Real-Kime Scheduling over Markovian Channels: When Partial Observability Meets Hard Deadlines |
|||
// IEEE Global Kelecommunications Conference (GLOBECOM'11), pages 1-5, 2011 |
|||
|
|||
pomdp |
|||
|
|||
observables |
|||
sched, k, t, packet1, packet2, priority1, priority2 //, chan1, chan2, |
|||
endobservables |
|||
|
|||
// timing constants |
|||
const int K; // total number of time periods |
|||
const int T; // number of slots per time period |
|||
|
|||
// probabilities that channels change states |
|||
// channel of user 1 |
|||
const double p1 = 0.8; // prob remain on |
|||
const double r1 = 0.2; // prob move from off to on |
|||
// channel of user 2 |
|||
const double p2 = 0.6; // prob remain on |
|||
const double r2 = 0.4; // prob move from off to on |
|||
|
|||
// scheduler |
|||
module scheduler |
|||
|
|||
k : [0..K-1]; // current time period |
|||
t : [0..T-1]; // correct slot |
|||
sched : [0..1]; // local state |
|||
|
|||
// next slot/time period |
|||
[slot] sched=0 & t<T-1 -> (sched'=1) & (t'=t+1); |
|||
[slot] sched=0 & t=T-1 & k<K-1 -> (sched'=1) & (t'=0) & (k'=k+1); |
|||
|
|||
// make scheduling choice |
|||
[idle] sched=1 -> (sched'=0); |
|||
[send1] sched=1 -> (sched'=0); |
|||
[send2] sched=1 -> (sched'=0); |
|||
|
|||
// loop when finished |
|||
[] sched=0 & t=T-1 & k=K-1 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// packets for first channel |
|||
module packet1 |
|||
|
|||
packet1 : [0..1]; // packet to send in current period |
|||
|
|||
// next slot |
|||
[slot] t=0 -> (packet1'=1); // new period so new packet |
|||
[slot] t>0 -> true; |
|||
// sending |
|||
[send1] packet1=1 & chan1=1 -> (packet1'=0); // channel up |
|||
[send1] packet1=1 & chan1=0 -> true; // channel down |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels' packets through renaming |
|||
module packet2=packet1[packet1=packet2,send1=send2,chan1=chan2] endmodule |
|||
|
|||
// priority of packets for first channel |
|||
module priority1 |
|||
|
|||
priority1 : [0..3]; |
|||
|
|||
// new period so new packet and randomly assign priority |
|||
[slot] t=0 -> 0.1 : (priority1'=1) + 0.3 : (priority1'=2) + 0.6 : (priority1'=3); |
|||
// priority already assigned for this period |
|||
[slot] t>0 -> true; |
|||
|
|||
// reset priority when packet has been sent |
|||
[send1] chan1=0 -> true; |
|||
[send1] chan1=1 -> (priority1'=0); |
|||
|
|||
endmodule |
|||
|
|||
// construct further priorities through renaming |
|||
module priority2 = priority1[priority1=priority2,chan1=chan2,send1=send2] endmodule |
|||
|
|||
// first channel status |
|||
module channel1 |
|||
|
|||
chan1 : [0..1]; // status of channel (off/on) |
|||
|
|||
// initialise |
|||
[slot] t=0 & k=0 -> 0.5 : (chan1'=0) + 0.5 : (chan1'=1); |
|||
// next slot |
|||
[slot] chan1=0 & !(t=0 & k=0) -> 1 - r1 : (chan1'=0) + r1 : (chan1'=1); |
|||
[slot] chan1=1 & !(t=0 & k=0) -> 1 - p1 : (chan1'=0) + p1 : (chan1'=1); |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels through renaming |
|||
module channel2=channel1[chan1=chan2,p1=p2,r1=r2] endmodule |
|||
|
|||
// reward structure for number of dropped packets |
|||
// (need to be careful as we update k and t at the start of the time slot) |
|||
rewards "dropped_packets" |
|||
[slot] t=0 & k>0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[idle] t=T-1 & k=K-1 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=1 : ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=1 : ((packet1=0)?0:1); |
|||
endrewards |
|||
|
|||
// reward structure for number of sent packets |
|||
rewards "packets_sent" |
|||
[send1] chan1=1 : 1; |
|||
[send2] chan2=1 : 1; |
|||
endrewards |
|||
|
|||
const double beta=1; // discount factor |
|||
|
|||
// (discounted) reward structure based on priorities |
|||
rewards "priority" |
|||
[send1] chan1=1 & priority1=1 : 1 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=1 : 1 * pow(beta,t + k*T); |
|||
[send1] chan1=1 & priority1=2 : 10 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=2 : 10 * pow(beta,t + k*T); |
|||
[send1] chan1=1 & priority1=3 : 20 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=3 : 20 * pow(beta,t + k*T); |
|||
endrewards |
|||
@ -0,0 +1 @@ |
|||
-const K=2,T=3 |
|||
@ -0,0 +1,11 @@ |
|||
// minimum number of dropped packets |
|||
// RESULT (K=2,T=3): [1.6560279993301588,1.6578400000000002] (grid resolution 20) |
|||
R{"dropped_packets"}min=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum number of packets sent (dual property) |
|||
// RESULT (K=2,T=3): [2.3421600000000002,2.3439720006698384] (grid resolution 20) |
|||
R{"packets_sent"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum reward (based on priorities) |
|||
// RESULT (K=2,T=3): [36.321503131200004,36.33018249727175] (grid resolution 20) |
|||
R{"priority"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
@ -0,0 +1,124 @@ |
|||
// network unitization example with partially observable channels based on: |
|||
// L. Yang, S. Murugesan and J. Zhang |
|||
// Real-Kime Scheduling over Markovian Channels: When Partial Observability Meets Hard Deadlines |
|||
// IEEE Global Kelecommunications Conference (GLOBECOM'11), pages 1-5, 2011 |
|||
|
|||
pomdp |
|||
|
|||
observables |
|||
sched, k, t, packet1, packet2, priority1, priority2 //, chan1, chan2, |
|||
endobservables |
|||
|
|||
// timing constants |
|||
const int K; // total number of time periods |
|||
const int T; // number of slots per time period |
|||
|
|||
// probabilities that channels change states |
|||
// channel of user 1 |
|||
const double p1 = 0.8; // prob remain on |
|||
const double r1 = 0.2; // prob move from off to on |
|||
// channel of user 2 |
|||
const double p2 = 0.6; // prob remain on |
|||
const double r2 = 0.4; // prob move from off to on |
|||
|
|||
// scheduler |
|||
module scheduler |
|||
|
|||
k : [0..K-1]; // current time period |
|||
t : [0..T-1]; // correct slot |
|||
sched : [0..1]; // local state |
|||
|
|||
// next slot/time period |
|||
[slot] sched=0 & t<T-1 -> (sched'=1) & (t'=t+1); |
|||
[slot] sched=0 & t=T-1 & k<K-1 -> (sched'=1) & (t'=0) & (k'=k+1); |
|||
|
|||
// make scheduling choice |
|||
[idle] sched=1 & packet1=0 & packet2=0 -> (sched'=0); |
|||
[send1] sched=1 -> (sched'=0); |
|||
[send2] sched=1 -> (sched'=0); |
|||
|
|||
// loop when finished |
|||
[] sched=0 & t=T-1 & k=K-1 -> true; |
|||
|
|||
endmodule |
|||
|
|||
// packets for first channel |
|||
module packet1 |
|||
|
|||
packet1 : [0..1]; // packet to send in current period |
|||
|
|||
// next slot |
|||
[slot] t=0 -> (packet1'=1); // new period so new packet |
|||
[slot] t>0 -> true; |
|||
// sending |
|||
[send1] packet1=1 & chan1=1 -> (packet1'=0); // channel up |
|||
[send1] packet1=1 & chan1=0 -> true; // channel down |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels' packets through renaming |
|||
module packet2=packet1[packet1=packet2,chan1=chan2] endmodule |
|||
|
|||
// priority of packets for first channel |
|||
module priority1 |
|||
|
|||
priority1 : [0..3]; |
|||
|
|||
// new period so new packet and randomly assign priority |
|||
[slot] t=0 -> 0.1 : (priority1'=1) + 0.3 : (priority1'=2) + 0.6 : (priority1'=3); |
|||
// priority already assigned for this period |
|||
[slot] t>0 -> true; |
|||
|
|||
// reset priority when packet has been sent |
|||
[send1] chan1=0 -> true; |
|||
[send1] chan1=1 -> (priority1'=0); |
|||
|
|||
endmodule |
|||
|
|||
// construct further priorities through renaming |
|||
module priority2 = priority1[priority1=priority2,chan1=chan2,send1=send2] endmodule |
|||
|
|||
// first channel status |
|||
module channel1 |
|||
|
|||
chan1 : [0..1]; // status of channel (off/on) |
|||
|
|||
// initialise |
|||
[slot] t=0 & k=0 -> 0.5 : (chan1'=0) + 0.5 : (chan1'=1); |
|||
// next slot |
|||
[slot] chan1=0 & !(t=0 & k=0) -> 1 - r1 : (chan1'=0) + r1 : (chan1'=1); |
|||
[slot] chan1=1 & !(t=0 & k=0) -> 1 - p1 : (chan1'=0) + p1 : (chan1'=1); |
|||
|
|||
endmodule |
|||
|
|||
// construct further channels through renaming |
|||
module channel2=channel1[chan1=chan2,send1=send2,p1=p2,r1=r2] endmodule |
|||
|
|||
// reward structure for number of dropped packets |
|||
// (need to be careful as we update k and t at the start of the time slot) |
|||
rewards "dropped_packets" |
|||
[slot] t=0 & k>0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[idle] t=T-1 & k=K-1 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=0 : ((packet1=0)?0:1) + ((packet2=0)?0:1); |
|||
[send1] t=T-1 & k=K-1 & chan1=1 : ((packet2=0)?0:1); |
|||
[send2] t=T-1 & k=K-1 & chan2=1 : ((packet1=0)?0:1); |
|||
endrewards |
|||
|
|||
// reward structure for number of sent packets |
|||
rewards "packets_sent" |
|||
[send1] chan1=1 : 1; |
|||
[send2] chan2=1 : 1; |
|||
endrewards |
|||
|
|||
const double beta=1; // discount factor |
|||
|
|||
// (discounted) reward structure based on priorities |
|||
rewards "priority" |
|||
[send1] chan1=1 & priority1=1 : 1 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=1 : 1 * pow(beta,t + k*T); |
|||
[send1] chan1=1 & priority1=2 : 10 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=2 : 10 * pow(beta,t + k*T); |
|||
[send1] chan1=1 & priority1=3 : 20 * pow(beta,t + k*T); |
|||
[send2] chan2=1 & priority2=3 : 20 * pow(beta,t + k*T); |
|||
endrewards |
|||
@ -0,0 +1 @@ |
|||
-const K=2,T=3 |
|||
@ -0,0 +1,11 @@ |
|||
// minimum number of dropped packets |
|||
// RESULT (K=2,T=3): [1.578,1.578000000041999] (grid resolution 20) |
|||
R{"dropped_packets"}min=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum number of packets sent (dual property) |
|||
// RESULT (K=2,T=3): [2.66096,2.6646735594157978] (grid resolution 20) |
|||
R{"packets_sent"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
|
|||
// maximum reward (based on priorities) |
|||
// RESULT (K=2,T=3): [35.557181022719995,35.58142127696651] (grid resolution 20) |
|||
R{"priority"}max=?[F sched=0 & t=T-1 & k=K-1 ] |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue