manual_teachbooks/book/examples/example_gumbel.py
2024-05-27 09:50:01 +02:00

61 lines
No EOL
1.9 KiB
Python

from grading import check
from math import isclose
tolerance = 0.001
# Using rel_tol is more reliable in the face of aliasing, but to fit the instructions give we use abs_total
check_float = lambda a, b: isclose(a, b, rel_tol=0, abs_tol=tolerance)
# We have to pass in the globals object since we need to have access to changes as well
@check
def check_example(glob):
mu, beta = glob["mu"], glob["beta"]
if (check_float(mu, -1.7461520011511888) and check_float(beta, 2.553428469837263)):
print(f"Part 1: you got the parameters right, well done! (checked with tolerance {tolerance})")
else:
print(f"Part 1: your parameters are incorrect. (checked with tolerance {tolerance})")
print(f" Other parts won't be graded until these are fixed. ")
return
function = glob["find_x_with_probability_p"]
test_inputs = [(1 - 0.001, 15.891029744351862), (1 - 0.2, 2.0838374640878863), (1 - 0.9, -3.875794191615308)]
failed = []
for x, out in test_inputs:
result = function(x)
if not check_float(result, out):
failed.append((x, out, result))
if len(failed) == 0:
print(f"Part 2: Well done, your inverse function is correct! (checked with tolerance {tolerance})")
else:
print(f"Part 2: Your function failed some tests. Keep in mind the tolerance is {tolerance}")
print(" --> Failed inputs:")
for case in failed:
print(f"{case[0]} gave {case[2]}, expected {case[1]}")
print(f" Other parts won't be graded until these are fixed.")
x = glob["x"]
if check_float(x, 15.891029744351862):
print(f"Part 3: you got the value of x right, well done! (checked with tolerance {tolerance})")
else:
print(f"Part 3: your value of x is incorrect. (checked with tolerance {tolerance})")
return
"""
Task 0:
x_1 = 4
p_1 = 1 - .1
x_2 = 10
p_2 = 1 - .01
Task 1:
beta = -(x_2 - x_1) / log(log(p_2) / log(p_1))
mu = x_1 + beta * log(-log(p_1))
Task 2:
x = mu - beta * log(-log(p))
Task 3:
x = find_x_with_probability_p(1 - 0.001)
"""