170 Eigen::Matrix<double, 6, 6, Eigen::RowMajor>(initial_covariance_data);
196 Eigen::Matrix<double, 2, 2, Eigen::RowMajor>(
233 tracks.GetMarkersForTrackInClip(marker->
clip, marker->
track, &markers);
235 if (markers.empty()) {
236 LG <<
"No markers to predict from for " << *marker;
242 for (
int i = 0;
i < markers.size(); ++
i) {
243 boxed_markers[
i] = &markers[
i];
245 std::sort(boxed_markers.begin(), boxed_markers.end(), OrderByFrameLessThan);
249 int insert_before = -1;
250 for (
int i = 0;
i < boxed_markers.size(); ++
i) {
251 if (boxed_markers[
i]->frame == marker->
frame) {
255 if (boxed_markers[
i]->frame > marker->
frame) {
262 int forward_scan_begin, forward_scan_end;
265 int backward_scan_begin, backward_scan_end;
268 if (insert_at == -1 && insert_before == -1) {
270 forward_scan_begin = forward_scan_end = 0;
271 backward_scan_begin = markers.size() - 1;
272 backward_scan_end = 0;
273 }
else if (insert_at != -1) {
275 forward_scan_begin = insert_at + 1;
276 forward_scan_end = markers.size() - 1;
277 backward_scan_begin = insert_at - 1;
278 backward_scan_end = 0;
281 forward_scan_begin = insert_before;
282 forward_scan_end = markers.size() - 1;
283 backward_scan_begin = insert_before - 1;
284 backward_scan_end = 0;
287 const int num_consecutive_needed = 2;
289 if (forward_scan_begin <= forward_scan_end &&
290 forward_scan_end - forward_scan_begin > num_consecutive_needed) {
294 bool predict_forward =
false;
297 if (backward_scan_end <= backward_scan_begin) {
299 predict_forward =
true;
308 const int max_frames_to_predict_from = 20;
309 if (predict_forward) {
310 if (backward_scan_begin - backward_scan_end < num_consecutive_needed) {
312 LG <<
"Predicting forward impossible, not enough information";
315 LG <<
"Predicting forward";
317 std::max(backward_scan_begin - max_frames_to_predict_from, 0);
318 int predict_end = backward_scan_begin;
320 for (
int i = predict_begin;
i <= predict_end; ++
i) {
321 previous_markers.push_back(boxed_markers[
i]);
323 RunPrediction(previous_markers, marker);
326 if (forward_scan_end - forward_scan_begin < num_consecutive_needed) {
328 LG <<
"Predicting backward impossible, not enough information";
331 LG <<
"Predicting backward";
332 int predict_begin = std::min(
333 forward_scan_begin + max_frames_to_predict_from, forward_scan_end);
334 int predict_end = forward_scan_begin;
336 for (
int i = predict_begin;
i >= predict_end; --
i) {
337 previous_markers.push_back(boxed_markers[
i]);
339 RunPrediction(previous_markers, marker);