/* True skill (R2) in Picat. This is a port of the R2 model TrueSkillSimple.cs (via the WebPPL model true_skill_simple.wppl) With the datafiles from R2 - true_skill_simple_r2_players.csv - true_skill_simple_r2_games.csv Output from the R2 model (skills): ``` [0] Mean: 107.265 skills[0] [0] Variance: 72.9736 [1] Mean: 100.541 skills[1] [1] Variance: 86.9287 [2] Mean: 95.7907 skills[2] [2] Variance: 84.9168 ``` This is a port of my Gamble model gamble_true_skill_simple.rkt. This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import ppl_distributions,ppl_utils. main => go. /* var : skills(1) Probabilities (truncated): 138.686139436927988: 0.00072833211944647 (1 / 1373) 136.757251361663805: 0.00072833211944647 (1 / 1373) 134.013434306172314: 0.00072833211944647 (1 / 1373) 132.285538348591729: 0.00072833211944647 (1 / 1373) ......... 78.330023251134151: 0.00072833211944647 (1 / 1373) 77.813016341809544: 0.00072833211944647 (1 / 1373) 76.566771465466573: 0.00072833211944647 (1 / 1373) 75.690773344358348: 0.00072833211944647 (1 / 1373) mean = 105.889 var : skills(2) Probabilities (truncated): 131.861086373999512: 0.00072833211944647 (1 / 1373) 125.810415902656374: 0.00072833211944647 (1 / 1373) 125.682242386650842: 0.00072833211944647 (1 / 1373) 125.178968678568623: 0.00072833211944647 (1 / 1373) ......... 75.973924186634576: 0.00072833211944647 (1 / 1373) 74.950523654757546: 0.00072833211944647 (1 / 1373) 73.147176472007203: 0.00072833211944647 (1 / 1373) 71.380761935993803: 0.00072833211944647 (1 / 1373) mean = 100.031 var : skills(3) Probabilities (truncated): 126.581905164488447: 0.00072833211944647 (1 / 1373) 123.92761107341876: 0.00072833211944647 (1 / 1373) 121.052452615963603: 0.00072833211944647 (1 / 1373) 120.92548531654927: 0.00072833211944647 (1 / 1373) ......... 67.084769087573619: 0.00072833211944647 (1 / 1373) 66.634845302911799: 0.00072833211944647 (1 / 1373) 64.74638887494325: 0.00072833211944647 (1 / 1373) 61.673338758581863: 0.00072833211944647 (1 / 1373) mean = 94.2245 var : performance(1,1) Probabilities (truncated): 162.039255948868259: 0.00072833211944647 (1 / 1373) 157.309234515905075: 0.00072833211944647 (1 / 1373) 156.583991227424747: 0.00072833211944647 (1 / 1373) 156.268379240276346: 0.00072833211944647 (1 / 1373) ......... 72.408076623962515: 0.00072833211944647 (1 / 1373) 71.996520937841481: 0.00072833211944647 (1 / 1373) 71.706065300321754: 0.00072833211944647 (1 / 1373) 71.091948335819197: 0.00072833211944647 (1 / 1373) mean = 112.854 var : performance(1,2) Probabilities (truncated): 143.187670581721875: 0.00072833211944647 (1 / 1373) 140.324944717946579: 0.00072833211944647 (1 / 1373) 136.38214608332072: 0.00072833211944647 (1 / 1373) 134.969675128992151: 0.00072833211944647 (1 / 1373) ......... 48.272482947567767: 0.00072833211944647 (1 / 1373) 46.805747685678256: 0.00072833211944647 (1 / 1373) 45.419846968809438: 0.00072833211944647 (1 / 1373) 45.241518084482166: 0.00072833211944647 (1 / 1373) mean = 92.3863 var : performance(2,1) Probabilities (truncated): 153.854361597780922: 0.00072833211944647 (1 / 1373) 151.438797973070649: 0.00072833211944647 (1 / 1373) 150.609051373411376: 0.00072833211944647 (1 / 1373) 148.349611765145767: 0.00072833211944647 (1 / 1373) ......... 68.353575316656546: 0.00072833211944647 (1 / 1373) 67.814881837291892: 0.00072833211944647 (1 / 1373) 66.794056500731827: 0.00072833211944647 (1 / 1373) 52.709799375863568: 0.00072833211944647 (1 / 1373) mean = 106.741 var : performance(2,2) Probabilities (truncated): 138.540559501767916: 0.00072833211944647 (1 / 1373) 135.21284998948812: 0.00072833211944647 (1 / 1373) 132.065703232713958: 0.00072833211944647 (1 / 1373) 131.660580527630458: 0.00072833211944647 (1 / 1373) ......... 43.998947964774288: 0.00072833211944647 (1 / 1373) 41.483487675358397: 0.00072833211944647 (1 / 1373) 35.978536763046634: 0.00072833211944647 (1 / 1373) 14.720861479960277: 0.00072833211944647 (1 / 1373) mean = 87.0699 var : performance(3,1) Probabilities (truncated): 166.132104855562602: 0.00072833211944647 (1 / 1373) 160.942598080274593: 0.00072833211944647 (1 / 1373) 159.914506112392331: 0.00072833211944647 (1 / 1373) 151.368479582586417: 0.00072833211944647 (1 / 1373) ......... 71.720259159422113: 0.00072833211944647 (1 / 1373) 70.759354033259712: 0.00072833211944647 (1 / 1373) 70.39748583845406: 0.00072833211944647 (1 / 1373) 66.16352978102671: 0.00072833211944647 (1 / 1373) mean = 110.915 var : performance(3,2) Probabilities (truncated): 126.732228396474369: 0.00072833211944647 (1 / 1373) 126.360441234179973: 0.00072833211944647 (1 / 1373) 125.598501848325768: 0.00072833211944647 (1 / 1373) 125.151327558334145: 0.00072833211944647 (1 / 1373) ......... 50.359352171811395: 0.00072833211944647 (1 / 1373) 48.189165212324589: 0.00072833211944647 (1 / 1373) 44.644197613792983: 0.00072833211944647 (1 / 1373) 39.006327746160402: 0.00072833211944647 (1 / 1373) mean = 87.9911 */ go ?=> reset_store(), time2(run_model(10_000,$model,[show_probs_rat_trunc,mean])), fail, nl. go => true. model() => % From the Gamble model (0 based) % Players = 0..2, % Games: % p1 p2 result (1:won 0:tie, -1:lost) % Games = [ [0,1,1], % player 0 won over player 1 % [1,2,1], % player 1 won over player 2 % [0,2,1]],% player 0 won over player 2 % 1 based Players = 1..3, Games = [ [1,2,1], % player 1 won over player 2 [2,3,1], % player 2 won over player 3 [1,3,1]],% player 1 won over player 3 NumPlayers = Players.len, NumGames = Games.len, % Each player has some fixed skill Skills = normal_dist_n(100,10,NumPlayers), % Performances per game % The performance per game is - however - depending on the skill % but might vary. Performance = [ [normal_dist(Skills[G[P]],15) : P in 1..2] : G in Games], foreach(G in 1..NumGames) if Games[G,3] == 1 then observe(Performance[G,1] > Performance[G,2]) elseif Games[G,3] == -1 then observe(Performance[G,1] < Performance[G,2]) else observe(abs(Performance[G,1]-Performance[G,2])<= 0.1) end end, if observed_ok then add("skills(1)",Skills[1]), add("skills(2)",Skills[2]), add("skills(3)",Skills[3]), % Peformance for each game add("performance(1,1)",Performance[1,1]), add("performance(1,2)",Performance[1,2]), add("performance(2,1)",Performance[2,1]), add("performance(2,2)",Performance[2,2]), add("performance(3,1)",Performance[3,1]), add("performance(3,2)",Performance[3,2]) end.