def test_merge_three(self): g1, g2, g3 = Mock(), Mock(), Mock() g1.axes, g2.axes, g3.axes = ["g1"], ["g2"], ["g3"] g1.size, g2.size, g3.size = 3, 4, 5 g1.positions = {"g1":np.array([0, 1, 2])} g2.positions = {"g2":np.array([-1, 0, 1, 2])} g3.positions = {"g3":np.array([-2, 0, 2, 4, 6])} d1, d2, d3 = Dimension(g1), Dimension(g2), Dimension(g3) d1_m, d2_m, d3_m = Mock(), Mock(), Mock() d1._masks = [{"repeat":1, "tile":1, "mask":d1_m}] d2._masks = [{"repeat":2, "tile":3, "mask":d2_m}] d3._masks = [{"repeat":5, "tile":7, "mask":d3_m}] combined = Dimension.merge_dimensions([d1, d2, d3]) self.assertEqual(60, combined._max_length) self.assertEqual(g1.alternate or g2.alternate or g3.alternate, combined.alternate) self.assertEqual(["g1", "g2", "g3"], combined.axes) self.assertEqual([0, -1, -2], combined.lower) self.assertEqual([2, 2, 6], combined.upper) expected_masks = [ {"repeat":20, "tile":1, "mask":d1_m}, {"repeat":10, "tile":9, "mask":d2_m}, {"repeat":5, "tile":84, "mask":d3_m}] self.assertEqual(expected_masks, combined._masks)
def test_prepare(self): d = Dimension( Mock(axes=["x", "y"], positions={ "x": np.array([0]), "y": np.array([0]) }, size=30)) m1 = np.array([0, 1, 0, 1, 1, 0], dtype=np.int8) m2 = np.array([1, 1, 0, 0, 1], dtype=np.int8) d._masks = [{ "repeat": 2, "tile": 2.5, "mask": m1 }, { "repeat": 2, "tile": 3, "mask": m2 }] e1 = np.array([0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0], dtype=np.int8) e1 = np.append(np.tile(e1, 2), e1[:len(e1) // 2]) e2 = np.array([1, 1, 1, 1, 0, 0, 0, 0, 1, 1], dtype=np.int8) e2 = np.tile(e2, 3) expected = e1 & e2 d.prepare() self.assertEqual(expected.tolist(), d.mask.tolist())
def test_merge_dimensions(self): g, h = Mock(), Mock() g.axes, h.axes = ["gx", "gy"], ["hx", "hy"] g.size, h.size = 16, 64 g.positions = {"gx":np.array([0, 1, 2]), "gy":np.array([10, 11, 12])} h.positions = {"hx":np.array([0, -1, -2]), "hy":np.array([-10, -11, -12])} outer, inner = Dimension(g), Dimension(h) om1, om2 = Mock(), Mock() im1, im2 = Mock(), Mock() outer._masks = [{"repeat":2, "tile":3, "mask":om1}, {"repeat":5, "tile":7, "mask":om2}] inner._masks = [{"repeat":11, "tile":13, "mask":im1}, {"repeat":17, "tile":19, "mask":im2}] combined = Dimension.merge_dimensions([outer, inner]) self.assertEqual(g.size * h.size, combined._max_length) self.assertEqual(outer.alternate or inner.alternate, combined.alternate) self.assertEqual(["gx", "gy", "hx", "hy"], combined.axes) self.assertEqual([2, 12, 0, -10], combined.upper) self.assertEqual([0, 10, -2, -12], combined.lower) expected_masks = [ {"repeat":128, "tile":3, "mask":om1}, {"repeat":320, "tile":7, "mask":om2}, {"repeat":11, "tile":13*16, "mask":im1}, {"repeat":17, "tile":19*16, "mask":im2}] self.assertEqual(expected_masks, combined._masks)
def test_successive_merges(self): g1, g2, h1, h2 = Mock(), Mock(), Mock(), Mock() g1.axes, g2.axes = ["g1x"], ["g2x", "g2y"] g1.positions = {"g1x": np.array([0, 1, 2, 3, 4])} g2.positions = { "g2x": np.array([10, 11, 12, 13, 14, 15, 16]), "g2y": np.array([-10, -11, -12, -13, -14, -15, -16]) } h1.axes, h2.axes = ["h1x", "h1y"], ["h2x"] h1.positions = { "h1x": np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), "h1y": np.array([1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]) } h2.positions = { "h2x": np.array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 9]) } g1.size, g2.size = 5, 7 h1.size, h2.size = 11, 13 g2mask = Mock() h1mask = Mock() dg1, dg2 = Dimension(g1), Dimension(g2) dh1, dh2 = Dimension(h1), Dimension(h2) dg2._masks = [{"repeat": 1, "tile": 1, "mask": g2mask}] dh1._masks = [{"repeat": 1, "tile": 1, "mask": h1mask}] outer = Dimension.merge_dimensions([dg1, dg2]) inner = Dimension.merge_dimensions([dh1, dh2]) self.assertEqual(5 * 7, outer._max_length) self.assertEqual(11 * 13, inner._max_length) self.assertEqual([{ "repeat": 1, "tile": 5, "mask": g2mask }], outer._masks) self.assertEqual([{ "repeat": 13, "tile": 1, "mask": h1mask }], inner._masks) self.assertEqual([4, 16, -10], outer.upper) self.assertEqual([0, 10, -16], outer.lower) self.assertEqual([11, 21, 9], inner.upper) self.assertEqual([1, 1, 0], inner.lower) combined = Dimension.merge_dimensions([outer, inner]) expected_masks = [{ "repeat": 11 * 13, "tile": 5, "mask": g2mask }, { "repeat": 13, "tile": 5 * 7, "mask": h1mask }] self.assertEqual(expected_masks, combined._masks) self.assertEqual(5 * 7 * 11 * 13, combined._max_length) self.assertEqual(["g1x", "g2x", "g2y", "h1x", "h1y", "h2x"], combined.axes) self.assertEqual([4, 16, -10, 11, 21, 9], combined.upper) self.assertEqual([0, 10, -16, 1, 1, 0], combined.lower)