SolverResult OLCTriangle::Solve(bool exhaustive) { if (trace_master.size() < 3) { ClearTrace(); is_complete = false; return SolverResult::FAILED; } if (!running) { // branch and bound is currently in finished state, update trace UpdateTrace(exhaustive); } if (!is_complete || running) { if (n_points < 3) { ResetBranchAndBound(); return SolverResult::FAILED; } if (is_closed) SolveTriangle(exhaustive); if (!SaveSolution()) return SolverResult::FAILED; return SolverResult::VALID; } else { return SolverResult::FAILED; } }
/** * @brief Adds a new GPS fix to analysis * * @param gps New GPS fix to use in analysis */ void CContestMgr::Add(const CPointGPSSmart &gps) { static unsigned step = 0; const unsigned STEPS_NUM = 4; // OLC-Plus _trace.Push(gps); if(step % STEPS_NUM == 0) { // Solve FAI-OLC std::auto_ptr<CPointGPS> prevFront(_traceLoop.Front() ? new CPointGPS(_traceLoop.Front()->GPS()) : 0); std::auto_ptr<CPointGPS> prevBack(_traceLoop.Back() ? new CPointGPS(_traceLoop.Back()->GPS()) : 0); if(BiggestLoopFind(_trace, _traceLoop)) SolveTriangle(_traceLoop, prevFront.get(), prevBack.get()); } _trace.Compress(); if(step % STEPS_NUM == 1) { // Solve OLC-Classic and FAI 3TPs SolvePoints(_trace, false, false); } SolveOLCPlus(); if(step % STEPS_NUM == 2) { // Solve OLC-Classic and FAI 3TPs for predicted path SolvePoints(_trace, false, true); } // OLC-League _traceSprint.Push(gps); _traceSprint.Compress(); if(step % STEPS_NUM == 3) // Solve OLC-Sprint SolvePoints(_traceSprint, true, false); step++; }