Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorygorshenin <mipt.vi002@gmail.com>2016-12-09 19:37:39 +0300
committerGitHub <noreply@github.com>2016-12-09 19:37:39 +0300
commitce695967fdc760c2eac042a5b84afcdcd6557deb (patch)
tree11d2086b2136c31d9ed386ae455e06ee0ac48963 /traffic
parent2eef321bb242e07b73dc9b52a7c8c8e1249a0722 (diff)
parentc2918c055d2fbb9a8c3b0d2c347d9962a02ff781 (diff)
Merge pull request #4942 from mpimenov/traffic-python-bindingspy-modules-0.1
[traffic] Added python bindings for traffic serialization.
Diffstat (limited to 'traffic')
-rw-r--r--traffic/pytraffic/CMakeLists.txt15
-rw-r--r--traffic/pytraffic/bindings.cpp145
-rw-r--r--traffic/pytraffic/example.py28
-rw-r--r--traffic/traffic_info.cpp5
4 files changed, 174 insertions, 19 deletions
diff --git a/traffic/pytraffic/CMakeLists.txt b/traffic/pytraffic/CMakeLists.txt
index b8ec31abf4..987eadf89c 100644
--- a/traffic/pytraffic/CMakeLists.txt
+++ b/traffic/pytraffic/CMakeLists.txt
@@ -43,12 +43,23 @@ endif()
omim_link_libraries(
${PROJECT_NAME}
- ${PYTHON_LIBRARIES}
- ${Boost_LIBRARIES}
+ editor
+ routing
+ indexer
traffic
platform
geometry
+ coding
base
+ stats_client
+ jansson
+ oauthcpp
+ protobuf
+ pugixml
+ opening_hours
+ ${PYTHON_LIBRARIES}
+ ${Boost_LIBRARIES}
+ ${LIBZ}
)
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
diff --git a/traffic/pytraffic/bindings.cpp b/traffic/pytraffic/bindings.cpp
index 7d31ee2e27..aacf206f95 100644
--- a/traffic/pytraffic/bindings.cpp
+++ b/traffic/pytraffic/bindings.cpp
@@ -1,35 +1,147 @@
#include "traffic/traffic_info.hpp"
#include "traffic/speed_groups.hpp"
+#include "indexer/classificator_loader.hpp"
+
+#include "platform/platform.hpp"
+
+#include "base/assert.hpp"
+#include "base/logging.hpp"
+#include "base/math.hpp"
+
+#include "std/cstdint.hpp"
+#include "std/map.hpp"
+#include "std/sstream.hpp"
+#include "std/string.hpp"
+#include "std/vector.hpp"
+
+#include "pyhelpers/vector_list_conversion.hpp"
#include "pyhelpers/vector_uint8.hpp"
#include <boost/python.hpp>
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
namespace
{
using namespace boost::python;
-vector<uint8_t> Serialize(traffic::TrafficInfo::Coloring const & coloring)
+struct SegmentSpeeds
+{
+ SegmentSpeeds() = default;
+ SegmentSpeeds(double weightedSpeed, double weightedRefSpeed, double weight)
+ : m_weightedSpeed(weightedSpeed), m_weightedRefSpeed(weightedRefSpeed), m_weight(weight)
+ {
+ }
+
+ double m_weightedSpeed = 0;
+ double m_weightedRefSpeed = 0;
+ double m_weight = 0;
+};
+
+using SegmentMapping = map<traffic::TrafficInfo::RoadSegmentId, SegmentSpeeds>;
+
+string SegmentSpeedsRepr(SegmentSpeeds const & v)
{
- vector<uint8_t> data;
- traffic::TrafficInfo::SerializeTrafficData(coloring, data);
- return data;
+ ostringstream ss;
+ ss << "SegmentSpeeds("
+ << " weighted_speed=" << v.m_weightedSpeed << " weighted_ref_speed=" << v.m_weightedRefSpeed
+ << " weight=" << v.m_weight << " )";
+ return ss.str();
}
-traffic::TrafficInfo::Coloring Deserialize(vector<uint8_t> const & data)
+traffic::TrafficInfo::Coloring TransformToSpeedGroups(SegmentMapping const & segmentMapping)
{
- traffic::TrafficInfo::Coloring coloring;
- traffic::TrafficInfo::DeserializeTrafficData(data, coloring);
- return coloring;
+ double const kEps = 1e-9;
+ traffic::TrafficInfo::Coloring result;
+ for (auto const & kv : segmentMapping)
+ {
+ double const ws = kv.second.m_weightedSpeed;
+ double const wrs = kv.second.m_weightedRefSpeed;
+ double const w = kv.second.m_weight;
+ if (my::AlmostEqualAbs(w, 0.0, kEps))
+ {
+ LOG(LWARNING, ("A traffic segment has zero weight."));
+ continue;
+ }
+ double const u = ws / w;
+ double const v = wrs / w;
+ bool const uz = my::AlmostEqualAbs(u, 0.0, kEps);
+ bool const vz = my::AlmostEqualAbs(v, 0.0, kEps);
+ if (uz && vz)
+ {
+ result[kv.first] = traffic::SpeedGroup::TempBlock;
+ }
+ else if (vz)
+ {
+ LOG(LWARNING, ("A traffic segment has zero reference speed."));
+ continue;
+ }
+ else
+ {
+ double p = 100.0 * u / v;
+ p = my::clamp(p, 0.0, 100.0);
+ result[kv.first] = traffic::GetSpeedGroupByPercentage(p);
+ }
+ }
+ return result;
}
string RoadSegmentIdRepr(traffic::TrafficInfo::RoadSegmentId const & v)
{
- stringstream ss;
+ ostringstream ss;
ss << "RoadSegmentId(" << v.m_fid << ", " << v.m_idx << ", " << int(v.m_dir) << ")";
return ss.str();
}
+
+boost::python::list GenerateTrafficKeys(string const & mwmPath)
+{
+ vector<traffic::TrafficInfo::RoadSegmentId> result;
+ traffic::TrafficInfo::ExtractTrafficKeys(mwmPath, result);
+ return std_vector_to_python_list(result);
+}
+
+vector<uint8_t> GenerateTrafficValues(boost::python::list const & keys,
+ boost::python::dict const & segmentMappingDict)
+{
+ vector<traffic::TrafficInfo::RoadSegmentId> keysVec =
+ python_list_to_std_vector<traffic::TrafficInfo::RoadSegmentId>(keys);
+ SegmentMapping segmentMapping;
+
+ boost::python::list mappingKeys = segmentMappingDict.keys();
+ for (size_t i = 0; i < len(mappingKeys); ++i)
+ {
+ object curArg = segmentMappingDict[mappingKeys[i]];
+ if (curArg)
+ segmentMapping[extract<traffic::TrafficInfo::RoadSegmentId>(mappingKeys[i])] =
+ extract<SegmentSpeeds>(segmentMappingDict[mappingKeys[i]]);
+ }
+
+ traffic::TrafficInfo::Coloring const knownColors = TransformToSpeedGroups(segmentMapping);
+ traffic::TrafficInfo::Coloring coloring;
+ traffic::TrafficInfo::CombineColorings(keysVec, knownColors, coloring);
+
+ vector<traffic::SpeedGroup> values(coloring.size());
+
+ size_t i = 0;
+ for (auto const & kv : coloring)
+ {
+ ASSERT_EQUAL(kv.first, keysVec[i], ());
+ values[i] = kv.second;
+ ++i;
+ }
+ ASSERT_EQUAL(i, values.size(), ());
+
+ vector<uint8_t> buf;
+ traffic::TrafficInfo::SerializeTrafficValues(values, buf);
+ return buf;
+}
+
+void LoadClassificator(string const & classifPath)
+{
+ GetPlatform().SetResourceDir(classifPath);
+ classificator::Load();
+}
} // namespace
BOOST_PYTHON_MODULE(pytraffic)
@@ -40,10 +152,16 @@ BOOST_PYTHON_MODULE(pytraffic)
to_python_converter<vector<uint8_t>, vector_uint8t_to_str>();
vector_uint8t_from_python_str();
+ class_<SegmentSpeeds>("SegmentSpeeds", init<double, double, double>())
+ .def("__repr__", &SegmentSpeedsRepr);
+
class_<traffic::TrafficInfo::RoadSegmentId>("RoadSegmentId", init<uint32_t, uint16_t, uint8_t>())
.def("__repr__", &RoadSegmentIdRepr)
;
+ class_<std::vector<traffic::TrafficInfo::RoadSegmentId>>("RoadSegmentIdVec")
+ .def(vector_indexing_suite<std::vector<traffic::TrafficInfo::RoadSegmentId>>());
+
enum_<traffic::SpeedGroup>("SpeedGroup")
.value("G0", traffic::SpeedGroup::G0)
.value("G1", traffic::SpeedGroup::G1)
@@ -55,10 +173,7 @@ BOOST_PYTHON_MODULE(pytraffic)
.value("Unknown", traffic::SpeedGroup::Unknown)
;
- class_<traffic::TrafficInfo::Coloring>("Coloring")
- .def(map_indexing_suite<traffic::TrafficInfo::Coloring>())
- ;
-
- def("dumps", Serialize);
- def("loads", Deserialize);
+ def("load_classificator", LoadClassificator);
+ def("generate_traffic_keys", GenerateTrafficKeys);
+ def("generate_traffic_values", GenerateTrafficValues);
}
diff --git a/traffic/pytraffic/example.py b/traffic/pytraffic/example.py
new file mode 100644
index 0000000000..79c2e8ff73
--- /dev/null
+++ b/traffic/pytraffic/example.py
@@ -0,0 +1,28 @@
+from pytraffic import RoadSegmentId, SegmentSpeeds, load_classificator, generate_traffic_keys, generate_traffic_values
+import argparse
+
+parser = argparse.ArgumentParser(description='Example usage of pytraffic.')
+parser.add_argument("--path_to_classificator", dest="path_to_classificator", help="Path to the directory that contains classificator.txt.")
+parser.add_argument("--path_to_mwm", dest="path_to_mwm", help="Path to the target mwm file.")
+
+options = parser.parse_args()
+if not options.path_to_classificator or not options.path_to_mwm:
+ parser.print_help()
+ exit()
+
+load_classificator(options.path_to_classificator)
+
+keys = [
+ RoadSegmentId(0, 0, 0),
+ RoadSegmentId(1, 0, 0),
+ RoadSegmentId(1, 0, 1),
+]
+
+keys_from_mwm = generate_traffic_keys(options.path_to_mwm)
+
+mapping = {
+ RoadSegmentId(0, 0, 0):SegmentSpeeds(1.0, 2.0, 3.0),
+ RoadSegmentId(1, 0, 1):SegmentSpeeds(4.0, 5.0, 6.0),
+}
+
+buf = generate_traffic_values(keys, mapping)
diff --git a/traffic/traffic_info.cpp b/traffic/traffic_info.cpp
index 199992ec83..3d24d68ef8 100644
--- a/traffic/traffic_info.cpp
+++ b/traffic/traffic_info.cpp
@@ -200,8 +200,9 @@ void TrafficInfo::ExtractTrafficKeys(string const & mwmPath, vector<RoadSegmentI
}
// static
-void CombineColorings(vector<TrafficInfo::RoadSegmentId> const & keys,
- TrafficInfo::Coloring const & knownColors, TrafficInfo::Coloring & result)
+void TrafficInfo::CombineColorings(vector<TrafficInfo::RoadSegmentId> const & keys,
+ TrafficInfo::Coloring const & knownColors,
+ TrafficInfo::Coloring & result)
{
result.clear();
size_t numKnown = 0;