-
Notifications
You must be signed in to change notification settings - Fork 0
/
ModelingProject.ml
145 lines (111 loc) · 4.99 KB
/
ModelingProject.ml
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
(*
Christian Cameron Modeling Project.
Modeling Pro and Average Athletes
____________________
Modeling 7 types of professional athletes
Each type has basic generic traits that makes them
preform better.
*)
type name = string;
type liftMax = int;
(*A type holding the accuracy percentage of an athlete
accuracy must be between 0-1*)
type accuracy = real;
type verticalJump = real;
(*Time of releasing a certain object. Used for quarterbacks*)
type releaseTime = real;
(*Speed of the athlete, read as MPH- swimmers are given a multiplier*)
type speed = real;
type weight = real;
type failPercentage = real;
(*
Modeling the type of athlete. If a sport has multiple positions it
will be split up.
-Wide receivers and running backs have the same traits
*)
datatype athlete =
WideReceiver of name * liftMax * verticalJump * speed
| Quarterback of name * accuracy * releaseTime * failPercentage
| OffensiveCenter of name * liftMax * weight
| BasketballPlayer of name * accuracy * verticalJump * speed
| Swimmer of name * verticalJump * speed
| Runner of name * speed
| Powerlifter of name * liftMax;
(*Modeling Data*)
(*Pro Athletes*)
val leonardFournette = WideReceiver("Leonard Fournette", 1665, 33.0, 17.54);
val randyMoss = WideReceiver("Randy Moss", 1000, 51.0, 18.82);
val aaronRodgers = Quarterback("Aaron Rodgers", 0.663, 2.2, 0.015);
val tomBrady = Quarterback("Tom Brady", 0.638, 2.5, 0.017);
val dermonttiDawson = OffensiveCenter("Dermontti Dawson", 1750, 320.0);
val mikeWebster = OffensiveCenter("Mike Webster", 2120, 312.0);
val jimOtto = OffensiveCenter("Jim Otto", 1970, 256.0);
val lebronJames = BasketballPlayer("LeBron James", 0.784, 40.0, 20.0);
val kobeBryant = BasketballPlayer("Kobe Bryant", 0.826, 38.0, 15.5);
val michaelJordan = BasketballPlayer("Michael Jordan", 0.821, 48.0, 19.13);
val caelebDressel = Swimmer("Caeleb Dressel", 41.0, 5.681);
val michaelPhelps = Swimmer("Michael Phelps", 37.0, 5.605);
val usainBolt = Runner("Usain Bolt", 23.35);
val justinGatlin = Runner("Justin Gatlin", 22.71);
val eddieHall = Powerlifter("Eddie Hall", 2653);
val brianShaw = Powerlifter("Brian Shaw", 2685);
(*Non-pro Athletes*)
(*Current freshman swimmers*)
val jamesConrady = Swimmer("James Conrady", 20.0, 3.987);
val christianCameron = Swimmer("Christian Cameron", 31.0, 4.341);
(*Wheaton college record holding runners.*)
val kermitEllison = Runner("Kermit Ellison", 19.13);
val richardHollatz = Runner("Richard Hollatz", 19.79);
val allAthletes = [aaronRodgers, tomBrady, lebronJames, kobeBryant, michaelJordan, leonardFournette, caelebDressel, michaelPhelps, usainBolt,
eddieHall, brianShaw, randyMoss, justinGatlin, dermonttiDawson, mikeWebster, jimOtto, jamesConrady,christianCameron,kermitEllison,
richardHollatz];
val allFBAthletes = [aaronRodgers, tomBrady, leonardFournette, randyMoss, dermonttiDawson, mikeWebster, jimOtto];
val allAverageAthletes = [jamesConrady, christianCameron, kermitEllison, richardHollatz];
(*
Functions applying the data
n = name
a = accuracy
m = liftmax
vj = jump
s = speed
r = reactionspeed
rt = releasetime
fp = failpercentage
w = weight
*)
(*Calculate the power index of the athlete. Returns a int.*)
fun calculatePowerIndex(WideReceiver(n,m,vj,s)) = Real.fromInt(m div 50)+(vj*5.6)+(s*9.0)
| calculatePowerIndex(Quarterback(n,a,rt,fp)) = a*870.0 - rt*50.0 - fp*1000.0
| calculatePowerIndex(OffensiveCenter(n,m,w)) = (Real.fromInt(m)*0.5*w*0.05)/36.0
| calculatePowerIndex(BasketballPlayer(n,a,vj,s)) = (vj*3.0 + s)*(a*3.9)
| calculatePowerIndex(Swimmer(n,vj,s)) = ((s*60.0) + (vj*3.0))
| calculatePowerIndex(Runner(n,s)) = s*20.7
| calculatePowerIndex(Powerlifter(n,m)) = Real.fromInt(m)/5.9;
(*
Sort athletes by power index.
-Takes a list of Athletes
-Returns a list of Athletes formated by (string concatenated with power index)
Sorting method used is insertion sort.
*)
fun sort(athletes) =
let fun names([]) = []
| names(WideReceiver(n,m,vj,s)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(WideReceiver(n,m,vj,s)))))::names(rest)
| names(Quarterback(n,a,rt,fp)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(Quarterback(n,a,rt,fp)))))::names(rest)
| names(OffensiveCenter(n,m,w)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(OffensiveCenter(n,m,w)))))::names(rest)
| names(BasketballPlayer(n,a,vj,s)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(BasketballPlayer(n,a,vj,s)))))::names(rest)
| names(Swimmer(n,vj,s)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(Swimmer(n,vj,s)))))::names(rest)
| names(Runner(n,s)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(Runner(n,s)))))::names(rest)
| names(Powerlifter(n,m)::rest) = (n^": "^Int.toString(round(calculatePowerIndex(Powerlifter(n,m)))))::names(rest)
fun insertionSort([]) = []
| insertionSort(x::rest) =
let fun insert(x, []) = [x]
| insert(x, y::rest) =
if (calculatePowerIndex(x) > calculatePowerIndex(y))
then x::y::rest
else y::insert(x,rest)
in
insert(x,insertionSort(rest))
end
in
names(insertionSort(athletes))
end;