16 with pytest.raises(TypeError):
19 with pytest.raises(TypeError):
20 fit.fit(oneParam, 1, [1])
22 with pytest.raises(TypeError):
23 fit.fit(oneParam, [1], 1)
25 with pytest.raises(TypeError):
26 fit.fit(oneParam, [1], [1], 1)
29 with pytest.raises(ValueError):
30 fit.fit(oneParam, [1, 1], [1])
32 with pytest.raises(ValueError):
33 fit.fit(oneParam, [1], [1, 1])
35 with pytest.raises(ValueError):
36 fit.fit(oneParam, [1], [1], [1, 1])
39 fit.fit(oneParam, [1, 2], [2, 4])
40 fit.fit(oneParam, [1, 2], [2, 4], [0.1, 0.2])
44 fit.fit(oneParam, numpy.array([1, 2]), [2, 4])
45 fit.fit(oneParam, [1, 2], numpy.array([2, 4]))
46 fit.fit(oneParam, numpy.array([1, 2]), numpy.array([2, 4]))
47 fit.fit(oneParam, numpy.array([1, 2]), [2, 4], [0.1, 0.2])
48 fit.fit(oneParam, [1, 2], numpy.array([2, 4]), [0.1, 0.2])
49 fit.fit(oneParam, [1, 2], [2, 4], numpy.array([0.1, 0.2]))
50 fit.fit(oneParam, numpy.array([1, 2]), numpy.array([2, 4]), [0.1, 0.2])
51 fit.fit(oneParam, numpy.array([1, 2]), [2, 4], numpy.array([0.1, 0.2]))
52 fit.fit(oneParam, [1, 2], numpy.array([2, 4]), numpy.array([0.1, 0.2]))
55 numpy.array([1, 2]), numpy.array([2, 4]), numpy.array([0.1, 0.2]))
57 fit.fit(twoParam, [1, 2], [2, 4])
61 def test_fit_bounds():
69 raise OutOfRangeException()
72 def twoParam(x, p, c):
74 raise OutOfRangeException()
76 raise OutOfRangeException()
83 with pytest.raises(TypeError):
84 fit.fit(oneParam, [1], [1], lowerBounds = 1)
85 with pytest.raises(TypeError):
86 fit.fit(oneParam, [1], [1], upperBounds = 1)
87 with pytest.raises(TypeError):
88 fit.fit(oneParam, [1], [1], lowerBounds = 1, upperBounds = 1)
90 with pytest.raises(TypeError):
91 fit.fit(oneParam, [1], [1], lowerBounds = [1, 2])
92 with pytest.raises(TypeError):
93 fit.fit(oneParam, [1], [1], upperBounds = [1, 2])
95 with pytest.raises(TypeError):
96 fit.fit(twoParam, [1, 2], [1, 2], lowerBounds = [1])
97 with pytest.raises(TypeError):
98 fit.fit(twoParam, [1, 2], [1, 2], upperBounds = [1])
101 with pytest.raises(OutOfRangeException):
102 fit.fit(oneParam, [1, 2], [-2, -4], lowerBounds =
None)
103 fit.fit(oneParam, [1, 2], [-2, -4], lowerBounds = [0])
106 with pytest.raises(OutOfRangeException):
107 fit.fit(twoParam, [1, 2], [-3, -5], lowerBounds =
None)
108 with pytest.raises(OutOfRangeException):
109 fit.fit(twoParam, [1, 2], [-3, -5], lowerBounds = [
None, 3])
110 with pytest.raises(OutOfRangeException):
111 fit.fit(twoParam, [1, 2], [-3, -5], lowerBounds = [0,
None])
112 fit.fit(twoParam, [1, 2], [-3, -5], lowerBounds = [0, 3])
114 with pytest.raises(OutOfRangeException):
116 twoParam, [1, 2], [30, 50],
117 lowerBounds = [0, 3], upperBounds = [
None, 10])
119 with pytest.raises(OutOfRangeException):
121 twoParam, [1, 2], [30, 50],
122 lowerBounds = [0, 3], upperBounds = [5,
None])
125 twoParam, [1, 2], [30, 50],
126 lowerBounds = [0, 3], upperBounds = [5, 10])
129 def test_getFitParameterCount():
137 def twoParam(x, p, c):
144 with pytest.raises(RuntimeError):
145 fit.getFitParameterCount()
148 fit.fit(oneParam, [1, 2], [2, 4])
149 assert fit.getFitParameterCount() == 1
150 assert fit.getFitParameterCount() == 1
152 fit.fit(oneParam, [1, 2], [2, 4], [1.0, 0.1])
153 assert fit.getFitParameterCount() == 1
154 assert fit.getFitParameterCount() == 1
156 fit.fit(twoParam, [1, 2], [2, 4])
157 assert fit.getFitParameterCount() == 2
158 assert fit.getFitParameterCount() == 2
160 fit.fit(oneParam, [1, 2], [2, 4])
161 assert fit.getFitParameterCount() == 1
162 assert fit.getFitParameterCount() == 1
166 def test_getFitParameter():
174 def twoParam(x, p, c):
181 with pytest.raises(RuntimeError):
182 fit.getFitParameter(0)
185 fit.fit(oneParam, [1, 2], [2, 4])
187 with pytest.raises(TypeError):
188 fit.getFitParameter(0.0)
190 with pytest.raises(ValueError):
191 fit.getFitParameter(-1)
193 with pytest.raises(ValueError):
194 fit.getFitParameter(1)
196 assert fit.getFitParameter(0) == 2
199 fit.fit(twoParam, [1, 2], [2, 4])
200 assert fit.getFitParameter(0) == pytest.approx(2)
201 assert fit.getFitParameter(1) == pytest.approx(0, abs = 3e-12)
203 fit.fit(twoParam, [1, 2], [3, 5])
204 assert fit.getFitParameter(0) == pytest.approx(2)
205 assert fit.getFitParameter(1) == pytest.approx(1)
208 import scipy.optimize
226 for testcase
in testcases:
227 f, x, y, err = testcase
230 scipy.optimize.curve_fit(
231 f, x, y, sigma = err, absolute_sigma =
True)
233 fit.fit(f, x, y, err)
235 for i
in range(0, fit.getFitParameterCount()):
236 assert fit.getFitParameter(i) == pytest.approx(expected[0][i])
240 def test_getFitParameterVariance():
251 def twoParam(x, p, c):
258 with pytest.raises(RuntimeError):
259 fit.getFitParameterVariance(0)
262 fit.fit(oneParam, [1, 2], [2, 4])
264 with pytest.raises(TypeError):
265 fit.getFitParameterVariance(0.0)
267 with pytest.raises(ValueError):
268 fit.getFitParameterVariance(-1)
270 with pytest.raises(ValueError):
271 fit.getFitParameterVariance(1)
274 import scipy.optimize
329 for testcase
in testcases:
330 f, x, y, err = testcase
335 estimateAvailable = paramCount < len(x)
or err
is not None
338 with warnings.catch_warnings():
339 if not estimateAvailable:
340 warnings.simplefilter(
"ignore", scipy.optimize.OptimizeWarning)
343 scipy.optimize.curve_fit(
344 f, x, y, sigma = err,
345 absolute_sigma = err
is not None)
347 fit.fit(f, x, y, err)
349 for i
in range(0, fit.getFitParameterCount()):
350 val = expected[1][i][i]
351 assert fit.getFitParameterVariance(i) == pytest.approx(val)
353 if not estimateAvailable:
354 assert fit.getFitParameterVariance(i) == numpy.inf
357 fit.fit(oneParam, [1, 2, 3], [3, 6, 9])
358 assert fit.getFitParameter(0) == 3
359 assert fit.getFitParameterVariance(0) == 0
361 fit.fit(oneParam, [2, 3], [6, 9])
362 assert fit.getFitParameter(0) == 3
363 assert fit.getFitParameterVariance(0) == 0
365 fit.fit(oneParam, [3], [9])
366 assert fit.getFitParameter(0) == 3
367 assert fit.getFitParameterVariance(0) == numpy.inf
371 def test_getFitParameterStandardDeviation():
379 def twoParam(x, p, c):
386 with pytest.raises(RuntimeError):
387 fit.getFitParameterStandardDeviation(0)
390 fit.fit(oneParam, [1, 2], [2, 4])
392 with pytest.raises(TypeError):
393 fit.getFitParameterStandardDeviation(0.0)
395 with pytest.raises(ValueError):
396 fit.getFitParameterStandardDeviation(-1)
398 with pytest.raises(ValueError):
399 fit.getFitParameterStandardDeviation(1)
432 for testcase
in testcases:
433 f, x, y, err = testcase
435 fit.fit(f, x, y, err)
437 for i
in range(0, fit.getFitParameterCount()):
438 val = numpy.sqrt(fit.getFitParameterVariance(i))
439 assert fit.getFitParameterStandardDeviation(i) == pytest.approx(val)
442 fit.fit(oneParam, [1, 2, 3], [3, 6, 9])
443 assert fit.getFitParameter(0) == 3
444 assert fit.getFitParameterStandardDeviation(0) == 0
446 fit.fit(oneParam, [2, 3], [6, 9])
447 assert fit.getFitParameter(0) == 3
448 assert fit.getFitParameterStandardDeviation(0) == 0
450 fit.fit(oneParam, [3], [9])
451 assert fit.getFitParameter(0) == 3
452 assert fit.getFitParameterStandardDeviation(0) == numpy.inf
456 def test_getFitParameterCovariance():
467 def twoParam(x, p, c):
474 with pytest.raises(RuntimeError):
475 fit.getFitParameterCovariance(0, 0)
478 fit.fit(oneParam, [1, 2], [2, 4])
480 with pytest.raises(TypeError):
481 fit.getFitParameterCovariance(0.0, 0)
483 with pytest.raises(TypeError):
484 fit.getFitParameterCovariance(0, 0.0)
486 with pytest.raises(TypeError):
487 fit.getFitParameterCovariance(0.0, 0.0)
489 with pytest.raises(ValueError):
490 fit.getFitParameterCovariance(-1, 0)
492 with pytest.raises(ValueError):
493 fit.getFitParameterCovariance(0, -1)
495 with pytest.raises(ValueError):
496 fit.getFitParameterCovariance(-1, -1)
498 with pytest.raises(ValueError):
499 fit.getFitParameterCovariance(0, 1)
501 with pytest.raises(ValueError):
502 fit.getFitParameterCovariance(1, 0)
504 with pytest.raises(ValueError):
505 fit.getFitParameterCovariance(1, 1)
508 import scipy.optimize
563 for testcase
in testcases:
564 f, x, y, err = testcase
569 estimateAvailable = paramCount < len(x)
or err
is not None
572 fit.fit(f, x, y, err)
575 with warnings.catch_warnings():
576 if not estimateAvailable:
577 warnings.simplefilter(
"ignore", scipy.optimize.OptimizeWarning)
580 scipy.optimize.curve_fit(
581 f, x, y, sigma = err,
582 absolute_sigma = err
is not None)
584 for i
in range(0, fit.getFitParameterCount()):
585 for j
in range(0, fit.getFitParameterCount()):
586 cov_ij = fit.getFitParameterCovariance(i, j)
587 cov_ji = fit.getFitParameterCovariance(j, i)
589 assert cov_ij == pytest.approx(cov_ji)
590 assert cov_ij == pytest.approx(expected[1][i][j])
592 if not estimateAvailable:
593 assert cov_ij == numpy.inf
594 assert cov_ji == numpy.inf
598 def test_multipleIndependentDataFits():
603 def twoParam(x, p, c):
631 results = Fit.multipleIndependentDataFits(twoParam, testcases)
633 assert isinstance(results, list)
635 for index, result
in enumerate(results):
636 assert isinstance(result, dict)
637 assert result[
'data'] == testcases[index]
642 testcases[index][0], testcases[index][1], testcases[index][2])
643 assert result[
'fit'] == fit
647 def test_getBestOutOfMultipleIndependentDataFits():
652 def twoParam(x, p, c):
682 oldVariance = old[
"fit"].getFitParameterVariance(0)
683 newVariance = new[
"fit"].getFitParameterVariance(0)
684 return newVariance < oldVariance
687 Fit.getBestOutOfMultipleIndependentDataFits(twoParam, [], comp)
is None
689 fits = Fit.multipleIndependentDataFits(twoParam, testcases)
692 for i
in range(1, len(fits)):
693 if comp(best, fits[i]):
697 Fit.getBestOutOfMultipleIndependentDataFits(twoParam, testcases, comp)
698 assert best == result
702 minVariance = min(minVariance, fit[
"fit"].getFitParameterVariance(0))
703 assert minVariance == result[
"fit"].getFitParameterVariance(0)
709 for x
in range(-3, 3 + 1):
711 yData.append(x * x - 1)
717 def discardFrontGenerator(xData, yData, minNumElements):
718 for i
in range(0, len(xData) - minNumElements + 1):
719 yield [xData[i:], yData[i:],
None]
723 oldVariance = old[
"fit"].getFitParameterVariance(0)
724 newVariance = new[
"fit"].getFitParameterVariance(0)
725 return newVariance < oldVariance
729 Fit.getBestOutOfMultipleIndependentDataFits(
731 discardFrontGenerator(xData, yData, 1),
736 result[
"data"] == [xData[len(xData) - 4:], yData[len(yData) - 4:],
None]
737 assert result[
"fit"].getFitParameter(0) == 2.1428571428596355
738 assert result[
"fit"].getFitParameterVariance(0) == 0.2312925188464976
742 Fit.getBestOutOfMultipleIndependentDataFits(
744 discardFrontGenerator(xData, yData, 2),
749 result[
"data"] == [xData[len(xData) - 3:], yData[len(yData) - 3:],
None]
750 assert result[
"fit"].getFitParameter(0) == 4.0000000000000009
751 assert result[
"fit"].getFitParameterVariance(0) == 0.33333333333587728
752 assert result[
"fit"].getFitParameter(1) == -4.3333333333333339
753 assert result[
"fit"].getFitParameterVariance(1) == 1.5555555698350492
764 with pytest.raises(TypeError):
767 assert empty1 == empty1
768 assert empty2 == empty2
770 assert empty1 == empty2
771 assert empty2 == empty1
774 f1.fit(
lambda x, p: p * x, [1], [2])
777 f2.fit(
lambda x, p: p * x, [1], [2])
780 f3.fit(
lambda x, p: p * x, [1], [2], [3])
783 f4.fit(
lambda x, p: p * x, [1], [3])
786 f5.fit(
lambda x, p: p * x, [2], [2])
810 with pytest.raises(TypeError):
813 assert not empty1 != empty1
814 assert not empty2 != empty2
816 assert not empty1 != empty2
817 assert not empty2 != empty1
820 f1.fit(
lambda x, p: p * x, [1], [2])
823 f2.fit(
lambda x, p: p * x, [1], [2])
826 f3.fit(
lambda x, p: p * x, [1], [2], [3])
829 f4.fit(
lambda x, p: p * x, [1], [3])
832 f5.fit(
lambda x, p: p * x, [2], [2])