Хромосомы для лаб4
This commit is contained in:
51
lab4/gp/ops.py
Normal file
51
lab4/gp/ops.py
Normal file
@@ -0,0 +1,51 @@
|
||||
import math
|
||||
|
||||
from .operation import Operation
|
||||
|
||||
# Унарные операции
|
||||
NEG = Operation("-", 1, lambda x: -x[0])
|
||||
SIN = Operation("sin", 1, lambda x: math.sin(x[0]))
|
||||
COS = Operation("cos", 1, lambda x: math.cos(x[0]))
|
||||
|
||||
|
||||
def _safe_exp(a: float) -> float:
|
||||
if a < 700.0:
|
||||
if a > -700.0:
|
||||
return math.exp(a)
|
||||
return 0.0
|
||||
else:
|
||||
return float("inf")
|
||||
|
||||
|
||||
EXP = Operation("exp", 1, lambda x: _safe_exp(x[0]))
|
||||
|
||||
|
||||
# Бинарные операции
|
||||
ADD = Operation("+", 2, lambda x: x[0] + x[1])
|
||||
SUB = Operation("-", 2, lambda x: x[0] - x[1])
|
||||
MUL = Operation("*", 2, lambda x: x[0] * x[1])
|
||||
DIV = Operation("/", 2, lambda x: x[0] / x[1] if x[1] != 0 else float("inf"))
|
||||
|
||||
|
||||
def safe_pow(a, b):
|
||||
# 0 в отрицательной степени
|
||||
if abs(a) <= 1e-12 and b < 0:
|
||||
return float("inf")
|
||||
# отрицательное основание при нецелой степени
|
||||
if a < 0 and abs(b - round(b)) > 1e-12:
|
||||
return float("inf")
|
||||
# грубое насыщение (настрой пороги под задачу)
|
||||
if abs(a) > 1 and b > 20:
|
||||
return float("inf")
|
||||
if abs(a) < 1 and b < -20:
|
||||
return float("inf")
|
||||
try:
|
||||
return a**b
|
||||
except OverflowError, ValueError:
|
||||
return float("inf")
|
||||
|
||||
|
||||
POW = Operation("^", 2, lambda x: safe_pow(x[0], x[1]))
|
||||
|
||||
# Все операции в либе
|
||||
ALL = (NEG, SIN, COS, EXP, ADD, SUB, MUL, DIV, POW)
|
||||
Reference in New Issue
Block a user