161 lines
5.9 KiB
Python
161 lines
5.9 KiB
Python
import numpy as np
|
|
import skimage.graph.mcp as mcp
|
|
|
|
from skimage._shared.testing import (assert_array_equal, assert_almost_equal,
|
|
parametrize)
|
|
from skimage._shared._warnings import expected_warnings
|
|
|
|
|
|
np.random.seed(0)
|
|
a = np.ones((8, 8), dtype=np.float32)
|
|
a[1:-1, 1] = 0
|
|
a[1, 1:-1] = 0
|
|
|
|
warning_optional = r'|\A\Z'
|
|
|
|
|
|
def test_basic():
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(a, fully_connected=True)
|
|
costs, traceback = m.find_costs([(1, 6)])
|
|
return_path = m.traceback((7, 2))
|
|
assert_array_equal(costs,
|
|
[[1., 1., 1., 1., 1., 1., 1., 1.],
|
|
[1., 0., 0., 0., 0., 0., 0., 1.],
|
|
[1., 0., 1., 1., 1., 1., 1., 1.],
|
|
[1., 0., 1., 2., 2., 2., 2., 2.],
|
|
[1., 0., 1., 2., 3., 3., 3., 3.],
|
|
[1., 0., 1., 2., 3., 4., 4., 4.],
|
|
[1., 0., 1., 2., 3., 4., 5., 5.],
|
|
[1., 1., 1., 2., 3., 4., 5., 6.]])
|
|
|
|
assert_array_equal(return_path,
|
|
[(1, 6),
|
|
(1, 5),
|
|
(1, 4),
|
|
(1, 3),
|
|
(1, 2),
|
|
(2, 1),
|
|
(3, 1),
|
|
(4, 1),
|
|
(5, 1),
|
|
(6, 1),
|
|
(7, 2)])
|
|
|
|
|
|
def test_neg_inf():
|
|
expected_costs = np.where(a == 1, np.inf, 0)
|
|
expected_path = [(1, 6),
|
|
(1, 5),
|
|
(1, 4),
|
|
(1, 3),
|
|
(1, 2),
|
|
(2, 1),
|
|
(3, 1),
|
|
(4, 1),
|
|
(5, 1),
|
|
(6, 1)]
|
|
test_neg = np.where(a == 1, -1, 0)
|
|
test_inf = np.where(a == 1, np.inf, 0)
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(test_neg, fully_connected=True)
|
|
costs, traceback = m.find_costs([(1, 6)])
|
|
return_path = m.traceback((6, 1))
|
|
assert_array_equal(costs, expected_costs)
|
|
assert_array_equal(return_path, expected_path)
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(test_inf, fully_connected=True)
|
|
costs, traceback = m.find_costs([(1, 6)])
|
|
return_path = m.traceback((6, 1))
|
|
assert_array_equal(costs, expected_costs)
|
|
assert_array_equal(return_path, expected_path)
|
|
|
|
|
|
def test_route():
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
return_path, cost = mcp.route_through_array(a, (1, 6), (7, 2),
|
|
geometric=True)
|
|
assert_almost_equal(cost, np.sqrt(2) / 2)
|
|
assert_array_equal(return_path,
|
|
[(1, 6),
|
|
(1, 5),
|
|
(1, 4),
|
|
(1, 3),
|
|
(1, 2),
|
|
(2, 1),
|
|
(3, 1),
|
|
(4, 1),
|
|
(5, 1),
|
|
(6, 1),
|
|
(7, 2)])
|
|
|
|
|
|
def test_no_diagonal():
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(a, fully_connected=False)
|
|
costs, traceback = m.find_costs([(1, 6)])
|
|
return_path = m.traceback((7, 2))
|
|
assert_array_equal(costs,
|
|
[[2., 1., 1., 1., 1., 1., 1., 2.],
|
|
[1., 0., 0., 0., 0., 0., 0., 1.],
|
|
[1., 0., 1., 1., 1., 1., 1., 2.],
|
|
[1., 0., 1., 2., 2., 2., 2., 3.],
|
|
[1., 0., 1., 2., 3., 3., 3., 4.],
|
|
[1., 0., 1., 2., 3., 4., 4., 5.],
|
|
[1., 0., 1., 2., 3., 4., 5., 6.],
|
|
[2., 1., 2., 3., 4., 5., 6., 7.]])
|
|
assert_array_equal(return_path,
|
|
[(1, 6),
|
|
(1, 5),
|
|
(1, 4),
|
|
(1, 3),
|
|
(1, 2),
|
|
(1, 1),
|
|
(2, 1),
|
|
(3, 1),
|
|
(4, 1),
|
|
(5, 1),
|
|
(6, 1),
|
|
(7, 1),
|
|
(7, 2)])
|
|
|
|
|
|
def test_offsets():
|
|
offsets = [(1, i) for i in range(10)] + [(1, -i) for i in range(1, 10)]
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(a, offsets=offsets)
|
|
costs, traceback = m.find_costs([(1, 6)])
|
|
assert_array_equal(traceback,
|
|
[[-2, -2, -2, -2, -2, -2, -2, -2],
|
|
[-2, -2, -2, -2, -2, -2, -1, -2],
|
|
[15, 14, 13, 12, 11, 10, 0, 1],
|
|
[10, 0, 1, 2, 3, 4, 5, 6],
|
|
[10, 0, 1, 2, 3, 4, 5, 6],
|
|
[10, 0, 1, 2, 3, 4, 5, 6],
|
|
[10, 0, 1, 2, 3, 4, 5, 6],
|
|
[10, 0, 1, 2, 3, 4, 5, 6]])
|
|
|
|
|
|
@parametrize("shape", [(100, 100), (5, 8, 13, 17)] * 5)
|
|
def test_crashing(shape):
|
|
_test_random(shape)
|
|
|
|
|
|
def _test_random(shape):
|
|
# Just tests for crashing -- not for correctness.
|
|
a = np.random.rand(*shape).astype(np.float32)
|
|
starts = [[0] * len(shape), [-1] * len(shape),
|
|
(np.random.rand(len(shape)) * shape).astype(int)]
|
|
ends = [(np.random.rand(len(shape)) * shape).astype(int)
|
|
for i in range(4)]
|
|
with expected_warnings(['Upgrading NumPy' + warning_optional]):
|
|
m = mcp.MCP(a, fully_connected=True)
|
|
costs, offsets = m.find_costs(starts)
|
|
for point in [(np.random.rand(len(shape)) * shape).astype(int)
|
|
for i in range(4)]:
|
|
m.traceback(point)
|
|
m._reset()
|
|
m.find_costs(starts, ends)
|
|
for end in ends:
|
|
m.traceback(end)
|
|
return a, costs, offsets
|