-
Notifications
You must be signed in to change notification settings - Fork 3
/
OzGap.pm
executable file
·127 lines (109 loc) · 3.36 KB
/
OzGap.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/perl -I/home/geoff/bin
#
# Determines how much of a task (and time) is completed
# given a particular competition / task
#
# Geoff Wong 2007
#
package OzGap;
require Gap;
@ISA = ( "Gap" );
use strict;
#require DBD::mysql;
#use POSIX qw(ceil floor);
#use Math::Trig;
#use Data::Dumper;
#use TrackLib qw(:all);
sub points_weight
{
my ($self, $task, $taskt, $formula) = @_;
my $Fversion;
my $quality;
my $distweight;
my $Adistance;
my $Aspeed;
my $Astart;
my $Aarrival;
my $x;
my $dem;
$quality = $taskt->{'quality'};
#print "distweight=$distweight($Ngoal/$Nfly)\n";
$x = $taskt->{'ess'} / $taskt->{'launched'};
$distweight = 1-0.8*sqrt($x);
$Adistance = 1000 * $quality * $distweight;
$Fversion = $formula->{'version'};
if ($Fversion eq '2005')
{
#
$Astart = 0;
$Aspeed = 1000 * $quality * (1-$distweight) * 3/4;
$Aarrival = 1000 * $quality * (1-$distweight) * 1/4;
}
elsif ($Fversion eq '2000')
{
#
$Aspeed = 1000 * $quality * (1-$distweight) * 2/4;
$Astart = 1000 * $quality * (1-$distweight) * 1/4;
$Aarrival = 1000 * $quality * (1-$distweight) * 1/4;
}
elsif (substr($formula->{'version'},0,2) eq 'hg')
{
$Adistance = 1000 * (0.9-1.665*$x+1.713*$x*$x-0.587*$x*$x*$x) * $quality;
$Astart = 1000 * $quality * (1-$distweight) * 1.4/8;
$Aarrival = 1000 * $quality * (1-$distweight) * 1/8;
$Aspeed = 1000 - $Adistance - $Astart - $Aarrival;
}
else
{
# Allocate some to leadout
$Aspeed = $quality * (1-$distweight) * 4.6/8 * 1000;
$Astart = $quality * (1-$distweight) * 1.4/8 * 1000;
$Aarrival = $quality * (1-$distweight) * 2/8 * 1000;
}
print "points_weight (0): ($Fversion) Quality=$quality Adist=$Adistance, Aspeed=$Aspeed, Astart=$Astart, Aarrival=$Aarrival\n";
# need to rescale if depart / arrival are "off"
if (($task->{'arrival'} eq 'off') and ($task->{'departure'} eq 'off'))
{
$dem = $Adistance + $Aspeed;
if ($dem > 0)
{
$Adistance = 1000 * $quality * ($Adistance / $dem);
$Aspeed = 1000 * $quality * ($Aspeed / $dem);
}
$Astart = 0;
$Aarrival = 0;
}
elsif ($task->{'arrival'} eq 'off')
{
if (substr($formula->{'version'},0,2) eq 'hg')
{
$Aarrival = 0;
$Aspeed = 1000 - $Adistance - $Astart - $Aarrival;
}
else
{
$dem = $Adistance + $Aspeed + $Astart;
if ($dem > 0)
{
$Adistance = 1000 * $quality *($Adistance / $dem);
$Aspeed = 1000 * $quality * ($Aspeed / $dem);
$Astart = 1000 * $quality * ($Astart / $dem);
}
$Aarrival = 0;
}
}
elsif ($task->{'departure'} eq 'off')
{
$dem = $Adistance + $Aspeed + $Aarrival;
if ($dem > 0)
{
$Adistance = 1000 * $quality * ($Adistance / $dem);
$Aspeed = 1000 * $quality * ($Aspeed / $dem);
$Aarrival = 1000 * $quality * ($Aarrival / $dem);
}
$Astart = 0;
}
print "points_weight (1): ($Fversion) Quality=$quality Adist=$Adistance, Aspeed=$Aspeed, Astart=$Astart, Aarrival=$Aarrival\n";
return ($Adistance, $Aspeed, $Astart, $Aarrival);
}
1;