Coverage for colour/models/rgb/transfer_functions/tests/test_panalog.py: 100%

65 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-11-15 19:01 +1300

1""" 

2Define the unit tests for the 

3:mod:`colour.models.rgb.transfer_functions.panalog` module. 

4""" 

5 

6import numpy as np 

7 

8from colour.constants import TOLERANCE_ABSOLUTE_TESTS 

9from colour.models.rgb.transfer_functions import ( 

10 log_decoding_Panalog, 

11 log_encoding_Panalog, 

12) 

13from colour.utilities import domain_range_scale, ignore_numpy_errors 

14 

15__author__ = "Colour Developers" 

16__copyright__ = "Copyright 2013 Colour Developers" 

17__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause" 

18__maintainer__ = "Colour Developers" 

19__email__ = "colour-developers@colour-science.org" 

20__status__ = "Production" 

21 

22__all__ = [ 

23 "TestLogEncoding_Panalog", 

24 "TestLogDecoding_Panalog", 

25] 

26 

27 

28class TestLogEncoding_Panalog: 

29 """ 

30 Define :func:`colour.models.rgb.transfer_functions.panalog.\ 

31log_encoding_Panalog` definition unit tests methods. 

32 """ 

33 

34 def test_log_encoding_Panalog(self) -> None: 

35 """ 

36 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

37log_encoding_Panalog` definition. 

38 """ 

39 

40 np.testing.assert_allclose( 

41 log_encoding_Panalog(0.0), 

42 0.062561094819159, 

43 atol=TOLERANCE_ABSOLUTE_TESTS, 

44 ) 

45 

46 np.testing.assert_allclose( 

47 log_encoding_Panalog(0.18), 

48 0.374576791382298, 

49 atol=TOLERANCE_ABSOLUTE_TESTS, 

50 ) 

51 

52 np.testing.assert_allclose( 

53 log_encoding_Panalog(1.0), 

54 0.665689149560117, 

55 atol=TOLERANCE_ABSOLUTE_TESTS, 

56 ) 

57 

58 def test_n_dimensional_log_encoding_Panalog(self) -> None: 

59 """ 

60 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

61log_encoding_Panalog` definition n-dimensional arrays support. 

62 """ 

63 

64 x = 0.18 

65 y = log_encoding_Panalog(x) 

66 

67 x = np.tile(x, 6) 

68 y = np.tile(y, 6) 

69 np.testing.assert_allclose( 

70 log_encoding_Panalog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS 

71 ) 

72 

73 x = np.reshape(x, (2, 3)) 

74 y = np.reshape(y, (2, 3)) 

75 np.testing.assert_allclose( 

76 log_encoding_Panalog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS 

77 ) 

78 

79 x = np.reshape(x, (2, 3, 1)) 

80 y = np.reshape(y, (2, 3, 1)) 

81 np.testing.assert_allclose( 

82 log_encoding_Panalog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS 

83 ) 

84 

85 def test_domain_range_scale_log_encoding_Panalog(self) -> None: 

86 """ 

87 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

88log_encoding_Panalog` definition domain and range scale support. 

89 """ 

90 

91 x = 0.18 

92 y = log_encoding_Panalog(x) 

93 

94 d_r = (("reference", 1), ("1", 1), ("100", 100)) 

95 for scale, factor in d_r: 

96 with domain_range_scale(scale): 

97 np.testing.assert_allclose( 

98 log_encoding_Panalog(x * factor), 

99 y * factor, 

100 atol=TOLERANCE_ABSOLUTE_TESTS, 

101 ) 

102 

103 @ignore_numpy_errors 

104 def test_nan_log_encoding_Panalog(self) -> None: 

105 """ 

106 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

107log_encoding_Panalog` definition nan support. 

108 """ 

109 

110 log_encoding_Panalog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan])) 

111 

112 

113class TestLogDecoding_Panalog: 

114 """ 

115 Define :func:`colour.models.rgb.transfer_functions.panalog.\ 

116log_decoding_Panalog` definition unit tests methods. 

117 """ 

118 

119 def test_log_decoding_Panalog(self) -> None: 

120 """ 

121 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

122log_decoding_Panalog` definition. 

123 """ 

124 

125 np.testing.assert_allclose( 

126 log_decoding_Panalog(0.062561094819159), 

127 0.0, 

128 atol=TOLERANCE_ABSOLUTE_TESTS, 

129 ) 

130 

131 np.testing.assert_allclose( 

132 log_decoding_Panalog(0.374576791382298), 

133 0.18, 

134 atol=TOLERANCE_ABSOLUTE_TESTS, 

135 ) 

136 

137 np.testing.assert_allclose( 

138 log_decoding_Panalog(0.665689149560117), 

139 1.0, 

140 atol=TOLERANCE_ABSOLUTE_TESTS, 

141 ) 

142 

143 def test_n_dimensional_log_decoding_Panalog(self) -> None: 

144 """ 

145 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

146log_decoding_Panalog` definition n-dimensional arrays support. 

147 """ 

148 

149 y = 0.374576791382298 

150 x = log_decoding_Panalog(y) 

151 

152 y = np.tile(y, 6) 

153 x = np.tile(x, 6) 

154 np.testing.assert_allclose( 

155 log_decoding_Panalog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS 

156 ) 

157 

158 y = np.reshape(y, (2, 3)) 

159 x = np.reshape(x, (2, 3)) 

160 np.testing.assert_allclose( 

161 log_decoding_Panalog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS 

162 ) 

163 

164 y = np.reshape(y, (2, 3, 1)) 

165 x = np.reshape(x, (2, 3, 1)) 

166 np.testing.assert_allclose( 

167 log_decoding_Panalog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS 

168 ) 

169 

170 def test_domain_range_scale_log_decoding_Panalog(self) -> None: 

171 """ 

172 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

173log_decoding_Panalog` definition domain and range scale support. 

174 """ 

175 

176 y = 0.374576791382298 

177 x = log_decoding_Panalog(y) 

178 

179 d_r = (("reference", 1), ("1", 1), ("100", 100)) 

180 for scale, factor in d_r: 

181 with domain_range_scale(scale): 

182 np.testing.assert_allclose( 

183 log_decoding_Panalog(y * factor), 

184 x * factor, 

185 atol=TOLERANCE_ABSOLUTE_TESTS, 

186 ) 

187 

188 @ignore_numpy_errors 

189 def test_nan_log_decoding_Panalog(self) -> None: 

190 """ 

191 Test :func:`colour.models.rgb.transfer_functions.panalog.\ 

192log_decoding_Panalog` definition nan support. 

193 """ 

194 

195 log_decoding_Panalog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))