Skip to content

Commit f7dd8ee

Browse files
committed
Progress on updates to lap race, tests not passing.
1 parent 27e00d8 commit f7dd8ee

File tree

16 files changed

+309
-69
lines changed

16 files changed

+309
-69
lines changed

src/main/java/common/RawResult.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
public class RawResult {
88

99
// Leg number is optional, depending on whether it was recorded on paper sheet.
10-
final int bib_number, leg_number;
10+
Integer bib_number, leg_number;
1111
Duration recorded_finish_time; // Relative to start of leg 1.
1212
boolean interpolated_time = false;
13+
String comment = "";
1314

1415
public RawResult(final String file_line) {
1516

@@ -18,15 +19,19 @@ public RawResult(final String file_line) {
1819
final String bib_number_as_string = elements[0];
1920
final String time_as_string = elements[1];
2021

21-
bib_number = Integer.parseInt(bib_number_as_string);
22+
bib_number = bib_number_as_string.equals("?") ? null : Integer.parseInt(bib_number_as_string);
2223
recorded_finish_time = time_as_string.equals("?") ? null : Race.parseTime(time_as_string);
23-
leg_number = elements.length > 2 ? Integer.parseInt(elements[2]) : 0;
24+
leg_number = elements.length <= 2 ? 0 : Integer.parseInt(elements[2]);
2425
}
2526

26-
public int getBibNumber() {
27+
public Integer getBibNumber() {
2728
return bib_number;
2829
}
2930

31+
public void setBibNumber(Integer bib_number) {
32+
this.bib_number = bib_number;
33+
}
34+
3035
public Duration getRecordedFinishTime() {
3136
return recorded_finish_time;
3237
}
@@ -43,7 +48,15 @@ public void setInterpolatedTime(boolean interpolated_time) {
4348
this.interpolated_time = interpolated_time;
4449
}
4550

46-
public int getLegNumber() {
51+
public String getComment() {
52+
return comment;
53+
}
54+
55+
public void appendComment(String comment) {
56+
this.comment = this.comment + comment;
57+
}
58+
59+
public Integer getLegNumber() {
4760
return leg_number;
4861
}
4962
}

src/main/java/lap_race/LapRace.java

+136-31
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,24 @@ public static void main(String[] args) throws IOException {
7070

7171
//////////////////////////////////////////////////////////////////////////////////////////////////
7272

73+
@Override
74+
protected void configure() throws IOException {
75+
76+
readProperties();
77+
78+
configureHelpers();
79+
configureInputData();
80+
configureMassStarts();
81+
configurePairedLegs();
82+
configureIndividualLegStarts();
83+
}
84+
7385
public void processResults() throws IOException {
7486

7587
initialiseResults();
7688

89+
interpolateMissingTimes();
90+
guessMissingBibNumbers();
7791
fillLegFinishTimes();
7892
fillDNFs();
7993
fillLegStartTimes();
@@ -88,19 +102,6 @@ public void processResults() throws IOException {
88102
printCollatedTimes();
89103
}
90104

91-
@Override
92-
protected void configure() throws IOException {
93-
94-
readProperties();
95-
96-
configureHelpers();
97-
configureInputData();
98-
configureInterpolatedTimes();
99-
configureMassStarts();
100-
configurePairedLegs();
101-
configureIndividualLegStarts();
102-
}
103-
104105
protected void readProperties() {
105106

106107
super.readProperties();
@@ -126,17 +127,27 @@ private void configureInputData() throws IOException {
126127

127128
entries = input.loadEntries();
128129
raw_results = input.loadRawResults();
130+
131+
input.loadTimeAnnotations(raw_results);
129132
}
130133

131-
private void configureInterpolatedTimes() {
134+
private void interpolateMissingTimes() {
132135

133136
int raw_result_index = 0;
134137
int previous_non_null_time_index;
135138

136139
while (raw_result_index < raw_results.length && raw_results[raw_result_index].getRecordedFinishTime() == null) raw_result_index++;
137140

138-
for (int i = 0; i < raw_result_index - 1; i++)
141+
for (int i = 0; i < raw_result_index; i++) {
139142
raw_results[i].setRecordedFinishTime(raw_results[raw_result_index].getRecordedFinishTime());
143+
raw_results[i].setInterpolatedTime(true);
144+
145+
final String existing_comment = raw_results[i].getComment();
146+
String comment = "";
147+
if (!existing_comment.isEmpty()) comment = " ";
148+
comment += "Time not recorded. No basis for interpolation so set to first recorded time.";
149+
raw_results[i].appendComment(comment);
150+
}
140151

141152
while (raw_result_index < raw_results.length) {
142153

@@ -148,29 +159,121 @@ private void configureInterpolatedTimes() {
148159
if (raw_result_index < raw_results.length) {
149160
final int number_of_consecutive_null_times = raw_result_index - previous_non_null_time_index - 1;
150161

151-
System.out.println("number_of_consecutive_null_times: " + number_of_consecutive_null_times);
152162
Duration time_step = raw_results[raw_result_index].getRecordedFinishTime().
153163
minus(raw_results[previous_non_null_time_index].getRecordedFinishTime()).
154164
dividedBy(number_of_consecutive_null_times + 1);
155165

156-
System.out.println("time before: " + raw_results[previous_non_null_time_index].getRecordedFinishTime());
157-
System.out.println("time after: " + raw_results[raw_result_index].getRecordedFinishTime());
158-
System.out.println("step: " + time_step);
159-
160-
161166
for (int i = previous_non_null_time_index + 1; i < raw_result_index; i++) {
162167
raw_results[i].setRecordedFinishTime(raw_results[i - 1].getRecordedFinishTime().plus(time_step));
163168
raw_results[i].setInterpolatedTime(true);
169+
170+
171+
final String existing_comment = raw_results[i].getComment();
172+
String comment = "";
173+
if (!existing_comment.isEmpty()) comment = " ";
174+
comment += "Time not recorded. Time interpolated.";
175+
raw_results[i].appendComment(comment);
164176
}
165177
}
166178
else {
167179
for (int i = previous_non_null_time_index + 1; i < raw_result_index; i++) {
168-
raw_results[i].setRecordedFinishTime(Race.DUMMY_DURATION);
180+
raw_results[i].setRecordedFinishTime(raw_results[previous_non_null_time_index].getRecordedFinishTime());
181+
raw_results[i].setInterpolatedTime(true);
182+
183+
184+
final String existing_comment = raw_results[i].getComment();
185+
String comment = "";
186+
if (!existing_comment.isEmpty()) comment = " ";
187+
comment += "Time not recorded. No basis for interpolation so set to last recorded time.";
188+
raw_results[i].appendComment(comment);
169189
}
170190
}
171191
}
172192
}
173193

194+
private void guessMissingBibNumbers() {
195+
196+
record TeamSummaryAtPosition(int team_number, int finishes_before, int finishes_after, Duration previous_finish, Duration next_finish) { }
197+
198+
int position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
199+
while (position_of_first_missing_bib_number > 0) {
200+
201+
TeamSummaryAtPosition[] summaries = new TeamSummaryAtPosition[entries.length];
202+
for (int i = 0; i < summaries.length; i++) {
203+
204+
int bib_number = entries[i].bib_number;
205+
int finishes_before = getNumberOfTeamFinishesBefore(position_of_first_missing_bib_number, bib_number);
206+
int finishes_after = getNumberOfTeamFinishesAfter(position_of_first_missing_bib_number, bib_number);
207+
Duration previous_finish_time = getPreviousTeamFinishTime(position_of_first_missing_bib_number, bib_number);
208+
Duration next_finish_time = getNextTeamFinishTime(position_of_first_missing_bib_number, bib_number);
209+
summaries[i] = new TeamSummaryAtPosition(bib_number, finishes_before, finishes_after, previous_finish_time, next_finish_time);
210+
}
211+
212+
Arrays.sort(summaries, Comparator.comparing(o -> o.previous_finish));
213+
Arrays.sort(summaries, Comparator.comparing(o -> o.next_finish));
214+
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_after));
215+
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_before));
216+
217+
raw_results[position_of_first_missing_bib_number - 1].setBibNumber(summaries[0].team_number);
218+
raw_results[position_of_first_missing_bib_number - 1].appendComment("Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.");
219+
220+
position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
221+
}
222+
223+
}
224+
225+
private int getNumberOfTeamFinishesBefore(int position, int bib_number) {
226+
227+
int count = 0;
228+
for (int i = position - 1; i > 0; i--) {
229+
Integer bibNumber = raw_results[i - 1].getBibNumber();
230+
if (bibNumber != null && bibNumber == bib_number) count++;
231+
}
232+
233+
return count;
234+
}
235+
236+
private int getNumberOfTeamFinishesAfter(int position, int bib_number) {
237+
238+
int count = 0;
239+
for (int i = position + 1; i <= raw_results.length; i++) {
240+
Integer bibNumber = raw_results[i - 1].getBibNumber();
241+
if (bibNumber != null && bibNumber == bib_number) count++;
242+
}
243+
244+
return count;
245+
}
246+
247+
private Duration getPreviousTeamFinishTime(int position, int bib_number) {
248+
249+
for (int i = position - 1; i > 0; i--) {
250+
Integer bibNumber = raw_results[i - 1].getBibNumber();
251+
if (bibNumber != null && raw_results[i - 1].getBibNumber() == bib_number) return raw_results[i - 1].getRecordedFinishTime();
252+
}
253+
254+
return ZERO_TIME;
255+
}
256+
257+
private Duration getNextTeamFinishTime(int position, int bib_number) {
258+
259+
for (int i = position + 1; i <= raw_results.length; i++) {
260+
Integer bibNumber = raw_results[i - 1].getBibNumber();
261+
if (bibNumber != null && raw_results[i - 1].getBibNumber() == bib_number) return raw_results[i - 1].getRecordedFinishTime();
262+
}
263+
264+
return ZERO_TIME;
265+
}
266+
267+
268+
private int getPositionOfFirstMissingBibNumber() {
269+
270+
for (int i = 0; i < raw_results.length; i++) {
271+
if (raw_results[i].getBibNumber() == null) return i + 1;
272+
}
273+
274+
return 0;
275+
}
276+
174277
private void configureMassStarts() {
175278

176279
start_times_for_mass_starts = new Duration[number_of_legs];
@@ -289,17 +392,19 @@ private void fillLegFinishTimes() {
289392

290393
for (final RawResult raw_result : raw_results) {
291394

292-
final int team_index = findIndexOfTeamWithBibNumber(raw_result.getBibNumber());
293-
final TeamResult result = overall_results[team_index];
294-
final LegResult[] leg_results = result.leg_results;
395+
if (raw_result.getBibNumber() != null) {
396+
final int team_index = findIndexOfTeamWithBibNumber(raw_result.getBibNumber());
397+
final TeamResult result = overall_results[team_index];
398+
final LegResult[] leg_results = result.leg_results;
295399

296-
final int leg_index = findIndexOfNextUnfilledLegResult(leg_results);
400+
final int leg_index = findIndexOfNextUnfilledLegResult(leg_results);
297401

298-
leg_results[leg_index].finish_time = raw_result.getRecordedFinishTime().plus(start_offset);
402+
leg_results[leg_index].finish_time = raw_result.getRecordedFinishTime().plus(start_offset);
299403

300-
// Provisionally this leg is not DNF since a finish time was recorded.
301-
// However, it might still be set to DNF in fillDNFs() if the runner missed a checkpoint.
302-
leg_results[leg_index].DNF = false;
404+
// Provisionally this leg is not DNF since a finish time was recorded.
405+
// However, it might still be set to DNF in fillDNFs() if the runner missed a checkpoint.
406+
leg_results[leg_index].DNF = false;
407+
}
303408
}
304409

305410
// if (leg_times_swap_string != null) swapLegTimes();
@@ -448,7 +553,7 @@ int getRecordedLegPosition(final int bib_number, final int leg_number) {
448553
int legs_completed = 0;
449554

450555
for (int i = 0; i < raw_results.length; i++) {
451-
if (raw_results[i].getBibNumber() == bib_number) {
556+
if (raw_results[i].getBibNumber() != null && raw_results[i].getBibNumber() == bib_number) {
452557
legs_completed++;
453558
if (legs_completed == leg_number) return i + 1;
454559
}

src/main/java/lap_race/LapRaceInput.java

+35-5
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public class LapRaceInput {
1313

1414
final LapRace race;
1515

16-
Path input_directory_path, entries_path, raw_results_path, paper_results_path;
17-
String entries_filename, raw_results_filename, paper_results_filename;
16+
Path input_directory_path, entries_path, raw_results_path, paper_results_path, annotations_path;
17+
String entries_filename, raw_results_filename, paper_results_filename, annotations_filename;
1818

1919
int number_of_raw_results;
2020

@@ -35,14 +35,16 @@ private void readProperties() {
3535
entries_filename = race.getProperties().getProperty("ENTRIES_FILENAME");
3636
raw_results_filename = race.getProperties().getProperty("RAW_RESULTS_FILENAME");
3737
paper_results_filename = race.getProperties().getProperty("PAPER_RESULTS_FILENAME");
38+
annotations_filename = race.getProperties().getProperty("ANNOTATIONS_FILENAME");
3839
}
3940

4041
private void constructFilePaths() {
4142

4243
input_directory_path = race.getWorkingDirectoryPath().resolve("input");
4344
entries_path = input_directory_path.resolve(entries_filename);
4445
raw_results_path = input_directory_path.resolve(raw_results_filename);
45-
paper_results_path = input_directory_path.resolve(paper_results_filename);
46+
paper_results_path = paper_results_filename == null ? null : input_directory_path.resolve(paper_results_filename);
47+
annotations_path = annotations_filename == null ? null : input_directory_path.resolve(annotations_filename);
4648
}
4749

4850
Team[] loadEntries() throws IOException {
@@ -98,8 +100,9 @@ RawResult[] loadRawResults() throws IOException {
98100

99101
number_of_raw_results = raw_results.size();
100102

101-
for (String line : Files.readAllLines(paper_results_path))
102-
loadRawResult(raw_results, line);
103+
if (paper_results_path != null)
104+
for (String line : Files.readAllLines(paper_results_path))
105+
loadRawResult(raw_results, line);
103106

104107
return raw_results.toArray(new RawResult[0]);
105108
}
@@ -123,6 +126,9 @@ private static void loadRawResult(final List<RawResult> raw_results, String line
123126
return;
124127
}
125128

129+
if (result.getBibNumber() == null && result.getRecordedFinishTime() != null)
130+
result.appendComment("Time but not bib number recorded electronically.");
131+
126132
final RawResult previous_result = !raw_results.isEmpty() ? raw_results.get(raw_results.size() - 1) : null;
127133

128134
if (result.getRecordedFinishTime() != null && previous_result != null && previous_result.getRecordedFinishTime() != null && previous_result.getRecordedFinishTime().compareTo(result.getRecordedFinishTime()) > 0)
@@ -131,4 +137,28 @@ private static void loadRawResult(final List<RawResult> raw_results, String line
131137
raw_results.add(result);
132138
}
133139
}
140+
141+
public void loadTimeAnnotations(RawResult[] raw_results) throws IOException {
142+
143+
if (annotations_path != null) {
144+
145+
List<String> lines = Files.readAllLines(annotations_path);
146+
147+
int index1 = lines.indexOf("Missing bib numbers:") + 2;
148+
if (index1 > 1) {
149+
while (index1 < lines.size() && !lines.get(index1).isEmpty()) {
150+
String[] elements = lines.get(index1).split("\t");
151+
int position = Integer.parseInt(elements[0]);
152+
int bib_number = Integer.parseInt(elements[1]);
153+
String comment = elements[2];
154+
155+
RawResult raw_result = raw_results[position - 1];
156+
raw_result.setBibNumber(bib_number);
157+
raw_result.appendComment(comment);
158+
159+
index1++;
160+
}
161+
}
162+
}
163+
}
134164
}

0 commit comments

Comments
 (0)