// speed rules // TODO the larger the speed difference // the higher the current rank // general importance: up (7/8), down (4/8), stop (2/8) // decay: quick (#1.curr.speed > #1.prev.speed) -> SPEED; UP; <#1>; 2.2; 1; ((#1.curr.speed < #1.prev.speed) && (#1.curr.pos < 2000)) -> SPEED; DOWN; <#1>; 1.4; 1; (((#1.curr.speed <= 0) && (#1.prev.speed > 0)) && (#1.curr.pos < 2000)) -> SPEED; STOP; <#1>; 5; 1; (#2.curr.speed > #2.prev.speed) -> SPEED; UP; <#2>; 2.0; 1; ((#2.curr.speed < #2.prev.speed) && (#2.curr.pos < 2000)) -> SPEED; DOWN; <#2>; 1.2; 1; (((#2.curr.speed <= 0) && (#2.prev.speed > 0)) && (#2.curr.pos < 2000)) -> SPEED; STOP; <#2>; 5; 1; (#3.curr.speed > #3.prev.speed) -> SPEED; UP; <#3>; 1.8; 1; ((#3.curr.speed < #3.prev.speed) && (#3.curr.pos < 2000)) -> SPEED; DOWN; <#3>; 1.0; 1; (((#3.curr.speed <= 0) && (#3.prev.speed > 0)) && (#3.curr.pos < 2000)) -> SPEED; STOP; <#3>; 5; 1; (#4.curr.speed > #4.prev.speed) -> SPEED; UP; <#4>; 1.6; 1; ((#4.curr.speed < #4.prev.speed) && (#4.curr.pos < 2000)) -> SPEED; DOWN; <#4>; 0.8; 1; (((#4.curr.speed <= 0) && (#4.prev.speed > 0)) && (#4.curr.pos < 2000)) -> SPEED; STOP; <#4>; 5; 1; // gap // the higher the ranking, TODO the smaller/larger the gap // decay: quick slower than speed events // added: position check, otherwise a horse nearing the finish line can cause a small gap event with an already finished horse for example ((((#1.curr.pos - #2.curr.pos) < 25) && ((#1.curr.pos - #2.curr.pos) > 5)) && ((#1.curr.speed < #2.curr.speed) && (#1.curr.pos < 2000))) -> GAP; SMALL; <#1,#2>; 2.4; 2; ((((#1.curr.pos - #2.curr.pos) > 200) && (#1.curr.speed > #2.curr.speed)) && (#1.curr.pos < 2000)) -> GAP; LARGE; <#1,#2>; 2.4; 1; ((((#2.curr.pos - #3.curr.pos) < 25) && ((#2.curr.pos - #3.curr.pos) > 5)) && ((#2.curr.speed < #3.curr.speed) && (#2.curr.pos < 2000))) -> GAP; SMALL; <#2,#3>; 2.0; 2; ((((#2.curr.pos - #3.curr.pos) > 200) && (#2.curr.speed > #3.curr.speed)) && (#2.curr.pos < 2000)) -> GAP; LARGE; <#2,#3>; 2.0; 1; ((((#3.curr.pos - #4.curr.pos) < 25) && ((#3.curr.pos - #4.curr.pos) > 5)) && ((#3.curr.speed < #4.curr.speed) && (#3.curr.pos < 2000))) -> GAP; SMALL; <#3,#4>; 1.8; 2; ((((#3.curr.pos - #4.curr.pos) > 200) && (#3.curr.speed > #4.curr.speed)) && (#3.curr.pos < 2000)) -> GAP; LARGE; <#3,#4>; 1.8; 1; // overtake // the higher the ranking, general: 6/8 // decay: quick, but slower than gap events (#1.curr.rank == #2.prev.rank) -> OVERTAKE; 1; <#1,#2>; 5; 4; (#2.curr.rank == #3.prev.rank) -> OVERTAKE; 2; <#2,#3>; 5; 4; (#3.curr.rank == #4.prev.rank) -> OVERTAKE; 3; <#3,#4>; 5; 4; // rank // importance: high. start 6/8, during backstretch 8/8, beginning final stretch 6/8, during final stretch 6/8 // TODO add some more ranking points based on the race transcripts // decay: quick // start 6/8 ((#1.prev.pos < 10) && (#1.curr.pos >= 10)) -> RANK; 1; <#1>; 3.5; 0.3; ((#1.prev.pos < 10) && (#1.curr.pos >= 10)) -> RANK; 2; <#2>; 3.3; 0.3; ((#1.prev.pos < 10) && (#1.curr.pos >= 10)) -> RANK; 3; <#3>; 3.1; 0.3; ((#1.prev.pos < 10) && (#1.curr.pos >= 10)) -> RANK; 4; <#4>; 2.9; 0.3; // into the homestretch ((#1.prev.pos < 400) && (#1.curr.pos >= 400)) -> RANK; 1; <#1>; 3; 0.3; ((#1.prev.pos < 400) && (#1.curr.pos >= 400)) -> RANK; 2; <#2>; 2.8; 0.3; ((#1.prev.pos < 400) && (#1.curr.pos >= 400)) -> RANK; 3; <#3>; 2.6; 0.3; ((#1.prev.pos < 400) && (#1.curr.pos >= 400)) -> RANK; 4; <#4>; 2.4; 0.3; // during backstretch 8/8 ((#1.prev.pos < 1200) && (#1.curr.pos >= 1200)) -> RANK; 1; <#1>; 4; 0.3; ((#1.prev.pos < 1200) && (#1.curr.pos >= 1200)) -> RANK; 2; <#2>; 3.8; 0.3; ((#1.prev.pos < 1200) && (#1.curr.pos >= 1200)) -> RANK; 3; <#3>; 3.6; 0.3; ((#1.prev.pos < 1200) && (#1.curr.pos >= 1200)) -> RANK; 4; <#4>; 3.4; 0.3; // beginning final stretch 6/8 ((#1.prev.pos < 1600) && (#1.curr.pos >= 1600)) -> RANK; 1; <#1>; 3.5; 0.3; ((#1.prev.pos < 1600) && (#1.curr.pos >= 1600)) -> RANK; 2; <#2>; 3.3; 0.3; ((#1.prev.pos < 1600) && (#1.curr.pos >= 1600)) -> RANK; 3; <#3>; 3.1; 0.3; ((#1.prev.pos < 1600) && (#1.curr.pos >= 1600)) -> RANK; 4; <#4>; 2.9; 0.3; // during final stretch 6/8 ((#1.prev.pos < 1800) && (#1.curr.pos >= 1800)) -> RANK; 1; <#1>; 3.5; 0.3; ((#1.prev.pos < 1800) && (#1.curr.pos >= 1800)) -> RANK; 2; <#2>; 3.3; 0.3; ((#1.prev.pos < 1800) && (#1.curr.pos >= 1800)) -> RANK; 3; <#3>; 3.1; 0.3; ((#1.prev.pos < 1800) && (#1.curr.pos >= 1800)) -> RANK; 4; <#4>; 2.9; 0.3; // position // importance high // decay quick ((#1.prev.pos < 200) && (#1.curr.pos >= 200)) -> POSITION; FIRST TURN; <#1>; 2.5; 1; <200, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 200-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 400) && (#1.curr.pos >= 400)) -> POSITION; HOMESTRETCH; <#1>; 2.0; 1; <400, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 400-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 600) && (#1.curr.pos >= 600)) -> POSITION; TOP HOMESTRETCH; <#1>; 2.5; 1; <600, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 600-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 800) && (#1.curr.pos >= 800)) -> POSITION; CLUBHOUSE TURN; <#1>; 2.5; 1; <800, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 800-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1000) && (#1.curr.pos >= 1000)) -> POSITION; FIRST HALF; <#1>; 2.5; 1; <1000, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1000-#1.prev.pos )) + #1.prev.time)> //((#1.prev.pos < 1000) && (#1.curr.pos >= 1000)) -> POSITION; BACKSTRETCH; <#1>; 2.5; 1; <1000, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1000-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1200) && (#1.curr.pos >= 1200)) -> POSITION; TOP BACKSTRETCH; <#1>; 2.0; 1; <1200, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1200-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1400) && (#1.curr.pos >= 1400)) -> POSITION; FAR TURN; <#1>; 2.5; 1; <1400, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1400-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1500) && (#1.curr.pos >= 1500)) -> POSITION; QUARTER POLE; <#1>; 2.0; 1; <1500, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1500-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1600) && (#1.curr.pos >= 1600)) -> POSITION; FINAL STRETCH; <#1>; 2.5; 1; <1600, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1600-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1750) && (#1.curr.pos >= 1750)) -> POSITION; EIGHTH POLE; <#1>; 2.0; 1; <1750, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1750-#1.prev.pos )) + #1.prev.time)> ((#1.prev.pos < 1800) && (#1.curr.pos >= 1800)) -> POSITION; TOP FINAL STRETCH; <#1>; 2.5; 1; <1800, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1800-#1.prev.pos )) + #1.prev.time)> // 1900 niet voorgedefinieerd in design oid, maar anders is er zo'n gap? ((#1.prev.pos < 1875) && (#1.curr.pos >= 1875)) -> POSITION; FINAL 100; <#1>; 3.0; 1; <1900, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1900-#1.prev.pos )) + #1.prev.time)> // time interpolatie werkt niet goed bij 2000, want de paarden stoppen precies op 2000 // de berekening zou dan dus gebruik moeten maken van de known speed -> 3e parameter ((#1.prev.pos < 2000) && (#1.curr.pos >= 2000)) -> POSITION; FINISHLINE; <#1>; 3.5; 1; <2000, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 2000-#1.prev.pos )) + #1.prev.time), (((2000 - #1.prev.pos) / #1.prev.speed) + #1.prev.time)> // prestart -- is generated in ram // importance high // decay quick // start -- is generated in ram // importance high // decay quick // ((#1.prev.pos <= 0) && (#1.curr.pos > 0)) -> START; ; <#1>; 5; 2; // finish // importance high, 8/8 // decay none ((#1.prev.pos < 2000) && (#1.curr.pos >= 2000)) -> FINISH; 1; <#1>; 5; 0; <(((2000 - #1.prev.pos) / #1.prev.speed) + #1.prev.time)> ((#2.prev.pos < 2000) && (#2.curr.pos >= 2000)) -> FINISH; 2; <#2>; 5; 0; <(((2000 - #2.prev.pos) / #2.prev.speed) + #2.prev.time)> ((#3.prev.pos < 2000) && (#3.curr.pos >= 2000)) -> FINISH; 3; <#3>; 5; 0; <(((2000 - #3.prev.pos) / #3.prev.speed) + #3.prev.time)> ((#4.prev.pos < 2000) && (#4.curr.pos >= 2000)) -> FINISH; 4; <#4>; 5; 0; <(((2000 - #4.prev.pos) / #4.prev.speed) + #4.prev.time)> // finish & fallen (((((#1.curr.pos < 2000) && (#1.curr.speed <= 0)) && (#2.curr.pos >= 2000)) && (#3.curr.pos >= 2000)) && (#4.curr.pos >= 2000)) -> POSTFINISHALT; 1; <#1,#2,#3,#4>; 5; 0; (((((#2.curr.pos < 2000) && (#2.curr.speed <= 0)) && (#1.curr.pos >= 2000)) && (#3.curr.pos >= 2000)) && (#4.curr.pos >= 2000)) -> POSTFINISHALT; 1; <#1,#2,#3,#4>; 5; 0; (((((#3.curr.pos < 2000) && (#3.curr.speed <= 0)) && (#2.curr.pos >= 2000)) && (#1.curr.pos >= 2000)) && (#4.curr.pos >= 2000)) -> POSTFINISHALT; 1; <#1,#2,#3,#4>; 5; 0; (((((#4.curr.pos < 2000) && (#4.curr.speed <= 0)) && (#2.curr.pos >= 2000)) && (#3.curr.pos >= 2000)) && (#1.curr.pos >= 2000)) -> POSTFINISHALT; 1; <#1,#2,#3,#4>; 5; 0; // POSTfinish // importance low // decay none (((#1.curr.pos >= 2000) && (#2.curr.pos >= 2000)) && ((#3.curr.pos >= 2000) && (#4.curr.pos >= 2000))) -> POSTFINISH; 1; <#1,#2,#3,#4>; 2; 0; // terminology - speed check toegevoegd, anders heb je -altijd- een blanket finish *g* //((((((#1.curr.pos >= 2000) && ((#1.curr.pos - #2.curr.pos) <= 10)) && ((#1.curr.pos - #3.curr.pos) <= 10)) && (#1.prev.speed != 0)) && (#2.prev.speed > 0)) && (#3.prev.speed > 0)) -> TERMINOLOGY; BLANKET FINISH; <#1,#2,#3>; 5; 0; // time // importance lower than ranking, high enough to be reported // no decay ((#1.prev.pos < 500) && (#1.curr.pos >= 500)) -> TIME; QUARTER; <#1>; 2; 0; <500, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 500-#1.prev.pos )) + #1.prev.time), (((500 - #1.prev.pos) / #1.prev.speed) + #1.prev.time)> ((#1.prev.pos < 1000) && (#1.curr.pos >= 1000)) -> TIME; HALF; <#1>; 2; 0; <1000, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 1000-#1.prev.pos )) + #1.prev.time), (((1000 - #1.prev.pos) / #1.prev.speed) + #1.prev.time)> ((#1.prev.pos < 2000) && (#1.curr.pos >= 2000)) -> TIME; FINISHPOLE; <#1>; 2; 0; <2000, ((((#1.curr.time-#1.prev.time)/(#1.curr.pos-#1.prev.pos) )*( 2000-#1.prev.pos )) + #1.prev.time), (((2000 - #1.prev.pos) / #1.prev.speed) + #1.prev.time)> // (#1.curr.pos > 0) -> BACKGROUND; ; <#1>; 0.03; 0.01;