from uctc.framework import basis import numpy as np import math binary_arguments = [ (1.0, 2.0), (2.0, 1.0), (-1.0, 1.0), (2.0, -2.0), (1.0, 3.0), (3.0, -1.0), (3.0, 3.0), (-4.0, -5.0), (5.0, 4.0), (4.0, 4.0), (5.0, 5.0) ] singular_arguments = [ 1.0, -3.2, 4.3, 5.5, -6.7, 4.8, 3.33, 2.22, 1.11 ] def is_close(x, y): return abs(x - y) < 1e-5 def sigmoid(x): if x >= 0: return 1 / (1 + math.exp(-x)) else: return math.exp(x) / (1 + math.exp(x)) def iterate_binary_arguments(func, std_func): for argument in binary_arguments: if not is_close(func(*argument), std_func(*argument)): print(f"\033[1;31mError: {func.__name__}({argument}) = {func(*argument)} != {std_func.__name__}({argument}) = {std_func(*argument)}\033[0m") exit(0) print(f"\033[1;34mPassed: {func.__name__} passed all tests\033[0m") return True def iterate_singular_arguments(func, std_func): for argument in singular_arguments: if not is_close(func(argument), std_func(argument)): print(f"\033[1;31mError: {func.__name__}({argument}) = {func(argument)} != {std_func.__name__}({argument}) = {std_func(argument)}\033[0m") exit(0) print(f"\033[1;34mPassed: {func.__name__} passed all tests\033[0m") return True # Test task 1 iterate_binary_arguments(basis.is_close, lambda x, y: 1.0*int(is_close(x, y))) iterate_singular_arguments(basis.sigmoid, lambda x: sigmoid(x)) iterate_singular_arguments(basis.relu, lambda x: x if x > 0.0 else 0.0) iterate_singular_arguments(basis.inv, lambda x: 1.0/x) iterate_binary_arguments(basis.inv_back, lambda x, d: -d/(x*x)) iterate_binary_arguments(basis.relu_back, lambda x, d: d * 1.0 if x > 0.0 else 0.0) print(f"\033[1;32m[PASSED] Task 2 finished!\033[0m")