From 0cd5b707146e69e0fb85015ac33d8ce284df8057 Mon Sep 17 00:00:00 2001 From: vng Date: Wed, 18 Jun 2014 16:38:01 +0300 Subject: [PATCH] Use one house search algorithm with 3 steps: odd/even and consequentially. --- search/house_detector.cpp | 63 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/search/house_detector.cpp b/search/house_detector.cpp index 6932e99c41..4ac6443e96 100644 --- a/search/house_detector.cpp +++ b/search/house_detector.cpp @@ -961,7 +961,7 @@ struct ScoredHouse class ResultAccumulator { ParsedNumber m_number; - bool m_isOdd, m_sign; + bool m_isOdd, m_sign, m_useOdd; ScoredHouse m_results[4]; @@ -977,14 +977,25 @@ public: } string const & GetFullNumber() const { return m_number.GetNumber(); } + bool UseOdd() const { return m_useOdd; } bool SetStreet(MergedStreet const & st) { Reset(); + + m_useOdd = true; m_isOdd = m_number.IsOdd(); return st.GetHousePivot(m_isOdd, m_sign) != 0; } + void SetSide(bool sign) + { + Reset(); + + m_useOdd = false; + m_sign = sign; + } + void Reset() { for (size_t i = 0; i < ARRAY_SIZE(m_results); ++i) @@ -995,7 +1006,9 @@ public: bool IsOurSide(HouseProjection const & p) const { - return ((m_isOdd == p.IsOdd()) && (m_sign == p.m_projectionSign)); + if (m_sign != p.m_projectionSign) + return false; + return (!m_useOdd || m_isOdd == p.IsOdd()); } void ProcessCandidate(HouseProjection const & p) @@ -1198,6 +1211,7 @@ void ProccessHouses(vector const & st, ResultAccumulato size_t numberOfStreetHouses = count; vector used(count, false); string const & houseNumber = acc.GetFullNumber(); + int const step = acc.UseOdd() ? 2 : 1; for (size_t i = 0; i < count; ++i) { @@ -1213,7 +1227,7 @@ void ProccessHouses(vector const & st, ResultAccumulato return; queue houseNumbersToCheck; - AddToQueue(houseChains[0].houses[0]->m_house->GetIntNumber(), 2, houseNumbersToCheck); + AddToQueue(houseChains[0].houses[0]->m_house->GetIntNumber(), step, houseNumbersToCheck); while (numberOfStreetHouses > 0) { if (!houseNumbersToCheck.empty()) @@ -1263,7 +1277,7 @@ void ProccessHouses(vector const & st, ResultAccumulato } } if (shouldAddHouseToQueue) - AddToQueue(candidateHouseNumber, 2, houseNumbersToCheck); + AddToQueue(candidateHouseNumber, step, houseNumbersToCheck); } else { @@ -1274,7 +1288,7 @@ void ProccessHouses(vector const & st, ResultAccumulato houseChains.push_back(HouseChain(st[i])); --numberOfStreetHouses; used[i] = true; - AddToQueue(st[i]->m_house->GetIntNumber(), 2, houseNumbersToCheck); + AddToQueue(st[i]->m_house->GetIntNumber(), step, houseNumbersToCheck); break; } } @@ -1382,37 +1396,26 @@ void HouseDetector::GetHouseForName(string const & houseNumber, vector acc(3, ResultAccumulator(houseNumber)); + int offsets[] = { 25, 50, 100, 200, 500 }; + for (size_t i = 0; i < count; ++i) { LOG(LDEBUG, (m_streets[i].GetDbgName())); - for (size_t j = 0; j < acc.size(); ++j) - acc[j].SetStreet(m_streets[i]); + acc[0].SetStreet(m_streets[i]); + acc[1].SetSide(true); + acc[2].SetSide(false); - double arrOffsets[] = { 25, 50, 100, 200, 500 }; - - size_t resultIndex = 0; - - for (size_t j = 0; j < ARRAY_SIZE(arrOffsets) && arrOffsets[j] <= m_houseOffsetM; ++j) - { - GetLSHouse(m_streets[i], arrOffsets[j], acc[resultIndex]); //0.880194 - if (acc[resultIndex].HasBestMatch()) - break; - } - - resultIndex = 1; - - GetClosestHouse(m_streets[i], acc[resultIndex]); //0.880716 - - resultIndex = 2; - - for (size_t j = 0; j < ARRAY_SIZE(arrOffsets) && arrOffsets[j] <= m_houseOffsetM; ++j) - { - GetBestHouseWithNumber(m_streets[i], arrOffsets[j], acc[resultIndex]); //0.88668 - if (acc[resultIndex].HasBestMatch()) - break; - } + // 0.88668 + for (size_t j = 0; j < ARRAY_SIZE(offsets) && offsets[j] <= m_houseOffsetM; ++j) + for (size_t k = 0; k < acc.size(); ++k) + { + GetBestHouseWithNumber(m_streets[i], offsets[j], acc[k]); + if (acc[k].HasBestMatch()) + goto end; + } +end: ProduceVoting(acc, res, m_streets[i]); for (size_t j = 0; j < acc.size(); ++j)