Коммит 55c1efa1 создал по автору Ilya Portnov's avatar Ilya Portnov
Просмотр файлов

Test cases for calc_mask.

владелец a5e7a872
......@@ -367,6 +367,42 @@ def describe_data_shape(data):
nesting, result = helper(data)
return "Level {}: {}".format(nesting, result)
def calc_mask(subset_data, set_data, level=0, negate=False, ignore_order=True):
"""
Calculate mask: for each item in set_data, return True if it is present in subset_data.
The function can work at any specified level.
subset_data: subset, for example [1]
set_data: set, for example [1, 2, 3]
level: 0 to check immediate members of set and subset; 1 to work with lists of lists and so on.
negate: if True, then result will be negated (True if item of set is not present in subset).
ignore_order: when comparing lists, ignore items order.
Raises an exception if nesting level of input sets is less than specified level parameter.
calc_mask([1], [1,2,3]) == [True, False, False])
calc_mask([1], [1,2,3], negate=True) == [False, True, True]
"""
if level == 0:
if not isinstance(subset_data, (tuple, list)):
raise Exception("Specified level is too high for given Subset")
if not isinstance(set_data, (tuple, list)):
raise Exception("Specified level is too high for given Set")
if ignore_order and get_data_nesting_level(subset_data) > 1:
if negate:
return [set(item) not in map(set, subset_data) for item in set_data]
else:
return [set(item) in map(set, subset_data) for item in set_data]
else:
if negate:
return [item not in subset_data for item in set_data]
else:
return [item in subset_data for item in set_data]
else:
sub_objects = match_long_repeat([subset_data, set_data])
return [calc_mask(subset_item, set_item, level - 1, negate, ignore_order) for subset_item, set_item in zip(*sub_objects)]
#####################################################
################### matrix magic ####################
#####################################################
......
......@@ -19,7 +19,7 @@
import bpy
from bpy.props import BoolProperty, EnumProperty, IntProperty
from sverchok.node_tree import SverchCustomTreeNode, StringsSocket, VerticesSocket
from sverchok.data_structure import updateNode, match_long_repeat, fullList
from sverchok.data_structure import updateNode, match_long_repeat, fullList, calc_mask
class SvCalcMaskNode(bpy.types.Node, SverchCustomTreeNode):
"""
......@@ -51,27 +51,6 @@ class SvCalcMaskNode(bpy.types.Node, SverchCustomTreeNode):
self.inputs.new('StringsSocket', "Set")
self.outputs.new('StringsSocket', 'Mask')
def calc(self, subset_data, set_data, level):
if level == 0:
if not isinstance(subset_data, (tuple, list)):
raise Exception("Specified level is too high for given Subset")
if not isinstance(set_data, (tuple, list)):
raise Exception("Specified level is too high for given Set")
if self.ignore_order:
if self.negate:
return [set(item) not in map(set, subset_data) for item in set_data]
else:
return [set(item) in map(set, subset_data) for item in set_data]
else:
if self.negate:
return [item not in subset_data for item in set_data]
else:
return [item in subset_data for item in set_data]
else:
sub_objects = match_long_repeat([subset_data, set_data])
return [self.calc(subset_item, set_item, level - 1) for subset_item, set_item in zip(*sub_objects)]
def process(self):
if not any(output.is_linked for output in self.outputs):
......@@ -83,7 +62,7 @@ class SvCalcMaskNode(bpy.types.Node, SverchCustomTreeNode):
objects = match_long_repeat([subset_s, set_s])
for subset, set in zip(*objects):
mask = self.calc(subset, set, self.level)
mask = calc_mask(subset, set, level=self.level, negate=self.negate, ignore_order=self.ignore_order)
out_masks.append(mask)
self.outputs['Mask'].sv_set(out_masks)
......
......@@ -68,3 +68,46 @@ class DataStructureTests(SverchokTestCase):
self.subtest_assert_equals(describe_data_shape([1]), 'Level 1: list [1] of int')
self.subtest_assert_equals(describe_data_shape([[(1,2,3)]]), 'Level 3: list [1] of list [1] of tuple [3] of int')
class CalcMaskTests(SverchokTestCase):
def test_calc_mask_1(self):
subset = [1]
set = [1, 2, 3]
mask = calc_mask(subset, set, level=0)
expected = [True, False, False]
self.assertEquals(mask, expected)
def test_calc_mask_2(self):
subset = [1]
set = [1, 2, 3]
mask = calc_mask(subset, set, negate=True)
expected = [False, True, True]
self.assertEquals(mask, expected)
def test_calc_mask_3(self):
subset = [[1, 2], [3, 4]]
set = [[1, 2], [3, 4], [5, 6]]
mask = calc_mask(subset, set, level=0)
expected = [True, True, False]
self.assertEquals(mask, expected)
def test_calc_mask_4(self):
subset = [[1, 2], [3, 4]]
set = [[1, 2], [3, 4], [5, 6]]
mask = calc_mask(subset, set, level=1)
expected = [[True, True], [True, True], [False, False]]
self.assertEquals(mask, expected)
def test_calc_mask_5(self):
subset = [[1], [5,6]]
set = [[1, 2, 3], [7, 8, 9]]
mask = calc_mask(subset, set, level=0)
expected = [False, False]
self.assertEquals(mask, expected)
def test_calc_mask_6(self):
subset = [[1], [5,6]]
set = [[1, 2, 3], [7, 8, 9]]
mask = calc_mask(subset, set, level=1)
expected = [[True, False, False], [False, False, False]]
self.assertEquals(mask, expected)
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать