Coverage for tests/test_makeRadialMapping.py: 13%

69 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2024-06-13 02:50 -0700

1 

2import unittest 

3 

4import numpy as np 

5import numpy.testing as npt 

6 

7import astshim as ast 

8from astshim.test import MappingTestCase, makeForwardPolyMap 

9 

10 

11class TestMakeRadialMapping(MappingTestCase): 

12 def setUp(self): 

13 self.in_data_full = np.array([ 

14 [0.0, 0.1, 1.1, 50.1], 

15 [1.45, -47.3, 0.546, 37.3], 

16 [0.34, 54.3, 16.2, -55.5], 

17 ], dtype=float) 

18 

19 def test_MakeRadialMappingForward(self): 

20 """Test a radial_map mapping that only has a forward transform 

21 """ 

22 coeff_f = np.array([ 

23 [5.0, 1, 1], 

24 [-0.12, 1, 2], 

25 ]) 

26 mapping1d = ast.PolyMap(coeff_f, 1) 

27 self.assertTrue(mapping1d.hasForward) 

28 self.assertFalse(mapping1d.hasInverse) 

29 

30 # If center = [0.0] then the radial_map mapping is identical to 

31 # mapping1d. 

32 radial_map = ast.makeRadialMapping([0], mapping1d) 

33 self.assertTrue(radial_map.hasForward) 

34 self.assertFalse(radial_map.hasInverse) 

35 in_data1 = self.in_data_full[0] 

36 npt.assert_allclose(radial_map.applyForward(in_data1), mapping1d.applyForward(in_data1)) 

37 

38 for center in ( 

39 [0.0], 

40 [1.1], 

41 [0.0, 0.0], 

42 [-5.5, 4.7], 

43 [0.0, 0.0, 0.0], 

44 [1.1, 2.2, -3.3], 

45 ): 

46 naxes = len(center) 

47 center_reshaped = np.expand_dims(center, 1) 

48 in_data = self.in_data_full[0:naxes] 

49 

50 radial_map = ast.makeRadialMapping(center, mapping1d) 

51 self.assertTrue(radial_map.hasForward) 

52 self.assertFalse(radial_map.hasInverse) 

53 

54 # compute desired output 

55 in_from_center = in_data - center_reshaped 

56 in_norm = np.linalg.norm(in_from_center, axis=0) 

57 with np.errstate(invalid='ignore'): 

58 unit_vector = np.where(in_norm != 0, in_from_center / in_norm, in_from_center) 

59 out_norm = mapping1d.applyForward(in_norm) 

60 out_from_center = unit_vector * out_norm 

61 desired_out_data = out_from_center + center_reshaped 

62 

63 out_data = radial_map.applyForward(in_data) 

64 npt.assert_allclose(out_data, desired_out_data) 

65 

66 def test_MakeRadialMappingInvertible(self): 

67 """Test makeRadialMapping on a mapping that has an accurate inverse""" 

68 zoom = 5.5 

69 mapping1d = ast.ZoomMap(1, zoom) 

70 self.assertTrue(mapping1d.hasForward) 

71 self.assertTrue(mapping1d.hasInverse) 

72 

73 for center in ( 

74 [0.0], 

75 [1.1], 

76 [0.0, 0.0], 

77 [-5.5, 4.7], 

78 [0.0, 0.0, 0.0], 

79 [1.1, 2.2, -3.3], 

80 ): 

81 naxes = len(center) 

82 center_reshaped = np.expand_dims(center, 1) 

83 in_data = self.in_data_full[0:naxes] 

84 

85 radial_map = ast.makeRadialMapping(center, mapping1d) 

86 self.assertTrue(radial_map.hasForward) 

87 self.assertTrue(radial_map.hasInverse) 

88 self.checkRoundTrip(radial_map, in_data) 

89 

90 # compute desired output 

91 in_from_center = in_data - center_reshaped 

92 in_norm = np.linalg.norm(in_from_center, axis=0) 

93 with np.errstate(invalid='ignore'): 

94 unit_vector = np.where(in_norm != 0, in_from_center / in_norm, in_from_center) 

95 out_norm = in_norm * zoom 

96 out_from_center = unit_vector * out_norm 

97 desired_out_data = out_from_center + center_reshaped 

98 

99 out_data = radial_map.applyForward(in_data) 

100 npt.assert_allclose(out_data, desired_out_data) 

101 

102 def test_MakeRadialMappingErrorHandling(self): 

103 """Test error handling in makeRadialMapping""" 

104 for bad_nin in (1, 2, 3): 

105 for bad_nout in (1, 2, 3): 

106 if bad_nin == bad_nout == 1: 

107 continue # the only valid case 

108 bad_mapping1d = makeForwardPolyMap(bad_nin, bad_nout) 

109 with self.assertRaises(ValueError): 

110 ast.makeRadialMapping([0.0], bad_mapping1d) 

111 

112 mapping1d = ast.ZoomMap(1, 5.5) 

113 with self.assertRaises(RuntimeError): 

114 ast.makeRadialMapping([], mapping1d) 

115 

116 

117if __name__ == "__main__": 117 ↛ 118line 117 didn't jump to line 118, because the condition on line 117 was never true

118 unittest.main()