Speed up your algorithms (python)
Run Forrest! Run !
Solution
Here is a possible solution. You can note that we have queried the indexes of the properties "isAlong" and "hasAlong" only once at the initialisation to avoid to recompute static information. In a more usual way using classes, you could create a map with all the "static" indexes.
#!/usr/bin/env python
import rospy
from ontologenius import OntologyManipulatorIndex
_onto = None
isAlong_index = 0
hasAlong_index = 0
def displayRoute(route):
print('Route:')
route_id = _onto.conversion.individualsIndexes2Ids(route)
for point in route_id:
print('- ' + point)
def findRoutes(path_from, path_to, selector):
global _onto
routes = []
routes.insert(0, [path_from])
found = False
if path_from == path_to:
found = True
while not found:
tmp_routes = []
for route in routes:
size = len(route) - 1
intersections = _onto.individuals.getFrom(isAlong_index, route[size])
for intersection in intersections:
paths = _onto.individuals.getOn(intersection, isAlong_index, selector)
# erase paths already present in the current route
paths = [path for path in paths if not path in route]
for path in paths:
tmp = list(route)
tmp.insert(len(tmp), intersection)
tmp.insert(len(tmp), path)
tmp_routes.insert(len(tmp_routes), tmp)
if path == path_to:
found = True
routes = list(tmp_routes)
return routes
def find(place_from, place_to, selector):
global _onto
res_route = []
min_size = 100
paths_from = _onto.individuals.getOn(place_from, isAlong_index, selector)
paths_to = _onto.individuals.getFrom(hasAlong_index, place_to, selector)
for path_from in paths_from:
for path_to in paths_to:
routes = findRoutes(path_from, path_to, selector)
for route in routes:
if route[len(route) - 1] == path_to:
if len(route) < min_size:
min_size = len(route)
res_route = route
return res_route
def main():
global _onto
rospy.init_node('find_our_way')
_onto = OntologyManipulatorIndex()
_onto.close()
isAlong_index = _onto.conversion.objectPropertiesId2Index('isAlong')
hasAlong_index = _onto.conversion.objectPropertiesId2Index('hasAlong')
route = find(_onto.conversion.individualsId2Index('pub'),
_onto.conversion.individualsId2Index('house'),
_onto.conversion.classesId2Index('>path'))
displayRoute(route)
route = find(_onto.conversion.individualsId2Index('house'),
_onto.conversion.individualsId2Index('car'),
_onto.conversion.classesId2Index('path'))
displayRoute(route)
route = find(_onto.conversion.individualsId2Index('car'),
_onto.conversion.individualsId2Index('house'),
_onto.conversion.classesId2Index('road'))
displayRoute(route)
if __name__ == '__main__':
main():
#!/usr/bin/env python
import rclpy
from ontopy import OntologyManipulatorIndex, Ontoros
_onto = None
isAlong_index = 0
hasAlong_index = 0
def displayRoute(route):
Ontoros().get_logger().info('Route:')
route_id = _onto.conversion.individualsIndexes2Ids(route)
for point in route_id:
Ontoros().get_logger().info('- ' + point)
def findRoutes(path_from, path_to, selector):
global _onto
routes = []
routes.insert(0, [path_from])
found = False
if path_from == path_to:
found = True
while not found:
tmp_routes = []
for route in routes:
size = len(route) - 1
intersections = _onto.individuals.getFrom(isAlong_index, route[size])
for intersection in intersections:
paths = _onto.individuals.getOn(intersection, isAlong_index, selector)
# erase paths already present in the current route
paths = [path for path in paths if not path in route]
for path in paths:
tmp = list(route)
tmp.insert(len(tmp), intersection)
tmp.insert(len(tmp), path)
tmp_routes.insert(len(tmp_routes), tmp)
if path == path_to:
found = True
routes = list(tmp_routes)
return routes
def find(place_from, place_to, selector):
global _onto
res_route = []
min_size = 100
paths_from = _onto.individuals.getOn(place_from, isAlong_index, selector)
paths_to = _onto.individuals.getFrom(hasAlong_index, place_to, selector)
for path_from in paths_from:
for path_to in paths_to:
routes = findRoutes(path_from, path_to, selector)
for route in routes:
if route[len(route) - 1] == path_to:
if len(route) < min_size:
min_size = len(route)
res_route = route
return res_route
def main():
global _onto
rclpy.init()
_onto = OntologyManipulatorIndex()
_onto.close()
isAlong_index = _onto.conversion.objectPropertiesId2Index('isAlong')
hasAlong_index = _onto.conversion.objectPropertiesId2Index('hasAlong')
route = find(_onto.conversion.individualsId2Index('pub'),
_onto.conversion.individualsId2Index('house'),
_onto.conversion.classesId2Index('>path'))
displayRoute(route)
route = find(_onto.conversion.individualsId2Index('house'),
_onto.conversion.individualsId2Index('car'),
_onto.conversion.classesId2Index('path'))
displayRoute(route)
route = find(_onto.conversion.individualsId2Index('car'),
_onto.conversion.individualsId2Index('house'),
_onto.conversion.classesId2Index('road'))
displayRoute(route)
if __name__ == '__main__':
main():