Skip to content

Commit 3de6686

Browse files
committed
fixes Walter's bug (strange precision error with np.float32_t)
1 parent 8d81faa commit 3de6686

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

CMap2D.pyx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,7 @@ cdef cpath_from_dijkstra_field(np.float32_t[:,::1] costmap, np.int64_t[::1] firs
18471847
path = []
18481848
jump_log = []
18491849
path.append([first[0], first[1]])
1850+
cdef int n
18501851
cdef np.int64_t n_offsets = len(offsets)
18511852
cdef np.int64_t maxi = costmap.shape[0]
18521853
cdef np.int64_t maxj = costmap.shape[1]
@@ -1860,7 +1861,7 @@ cdef cpath_from_dijkstra_field(np.float32_t[:,::1] costmap, np.int64_t[::1] firs
18601861
cdef np.float32_t olen
18611862
cdef np.float32_t[::1] offset_edge_costs = np.zeros((n_offsets,), dtype=np.float32)
18621863
cdef np.float32_t offset_edge_cost
1863-
cdef np.float32_t best_offset_edge_cost
1864+
cdef int best_offset_edge_cost_id
18641865
cdef np.int64_t n_best_edges
18651866
cdef np.int64_t[::1] tied_firstplace_candidates = np.zeros((n_offsets,), dtype=np.int64)
18661867
cdef np.int64_t stochastic_candidate_pick
@@ -1869,7 +1870,7 @@ cdef cpath_from_dijkstra_field(np.float32_t[:,::1] costmap, np.int64_t[::1] firs
18691870
while True:
18701871
current_cost = costmap[current_idxi, current_idxj]
18711872
# lookup all edge costs and find lowest cost which is also < 0
1872-
best_offset_edge_cost = 0
1873+
best_offset_edge_cost_id = 0
18731874
for n in range(n_offsets):
18741875
oi = offsets[n, 0]
18751876
oj = offsets[n, 1]
@@ -1904,18 +1905,21 @@ cdef cpath_from_dijkstra_field(np.float32_t[:,::1] costmap, np.int64_t[::1] firs
19041905
# in 8/16 connectedness some offsets are 'longer' and will be preferred unless normalized
19051906
olen = csqrt(oi*oi + oj*oj)
19061907
offset_edge_cost = offset_edge_cost / olen
1908+
# fix nan values
1909+
if np.isnan(offset_edge_cost):
1910+
offset_edge_cost = np.inf
19071911
# store for later
19081912
offset_edge_costs[n] = offset_edge_cost
1909-
if offset_edge_cost < best_offset_edge_cost:
1910-
best_offset_edge_cost = offset_edge_cost
1913+
if offset_edge_cost < offset_edge_costs[best_offset_edge_cost_id]:
1914+
best_offset_edge_cost_id = n
19111915
# find how many choice are tied for best cost, if several, sample stochastically
19121916
n_best_edges = 0
1913-
if best_offset_edge_cost >= 0:
1917+
if offset_edge_costs[best_offset_edge_cost_id] >= 0:
19141918
# local minima reached, terminate
19151919
jump_log.append(n_best_edges)
19161920
break
19171921
for n in range(n_offsets):
1918-
if offset_edge_costs[n] == best_offset_edge_cost:
1922+
if offset_edge_costs[n] == offset_edge_costs[best_offset_edge_cost_id]:
19191923
tied_firstplace_candidates[n_best_edges] = n
19201924
n_best_edges += 1
19211925
if n_best_edges > 1:
@@ -1925,8 +1929,9 @@ cdef cpath_from_dijkstra_field(np.float32_t[:,::1] costmap, np.int64_t[::1] firs
19251929
elif n_best_edges == 1:
19261930
selected_offset_id = tied_firstplace_candidates[0]
19271931
else:
1928-
print(best_offset_edge_cost)
1929-
print(offset_edge_costs)
1932+
print(best_offset_edge_cost_id)
1933+
for n in range(n_offsets):
1934+
print(offset_edge_costs[n])
19301935
print("Warning: this code should be unreachable")
19311936
break
19321937
jump_log.append(n_best_edges)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
long_description=long_description,
1313
long_description_content_type='text/markdown',
1414
url="https://github.com/danieldugas/pymap2d",
15-
version='0.1.1',
15+
version='0.1.4',
1616
py_modules=['map2d', 'pose2d', 'circular_index', 'map2d_ros_tools'],
1717
ext_modules=cythonize("CMap2D.pyx", annotate=True),
1818
include_dirs=[numpy.get_include()],

0 commit comments

Comments
 (0)