# Path: guacamol/score_modifier.py
# class ScoreModifier:
# class ChainedModifier(ScoreModifier):
# class LinearModifier(ScoreModifier):
# class SquaredModifier(ScoreModifier):
# class AbsoluteScoreModifier(ScoreModifier):
# class GaussianModifier(ScoreModifier):
# class MinMaxGaussianModifier(ScoreModifier):
# class ClippedScoreModifier(ScoreModifier):
# class SmoothClippedScoreModifier(ScoreModifier):
# class ThresholdedLinearModifier(ScoreModifier):
#     def __call__(self, x):
#     def __init__(self, modifiers: List[ScoreModifier]) -> None:
#     def __call__(self, x):
#     def __init__(self, slope=1.0):
#     def __call__(self, x):
#     def __init__(self, target_value: float, coefficient=1.0) -> None:
#     def __call__(self, x):
#     def __init__(self, target_value: float) -> None:
#     def __call__(self, x):
#     def __init__(self, mu: float, sigma: float) -> None:
#     def __call__(self, x):
#     def __init__(self, mu: float, sigma: float, minimize=False) -> None:
#     def __call__(self, x):
#     def __init__(self, upper_x: float, lower_x=0.0, high_score=1.0, low_score=0.0) -> None:
#     def __call__(self, x):
#     def __init__(self, upper_x: float, lower_x=0.0, high_score=1.0, low_score=0.0) -> None:
#     def __call__(self, x):
#     def __init__(self, threshold: float) -> None:
#     def __call__(self, x):


from functools import partial
from guacamol.score_modifier import LinearModifier, SquaredModifier, AbsoluteScoreModifier, GaussianModifier, \
    MinGaussianModifier, MaxGaussianModifier, ThresholdedLinearModifier, ClippedScoreModifier, \
    SmoothClippedScoreModifier, ChainedModifier
import numpy as np
import pytest



scalar_value = 8.343
value_array = np.array([[-3.3, 0, 5.5],
                        [0.011, 2.0, -33]])


def test_linear_function_default():
    f = LinearModifier()

    assert f(scalar_value) == scalar_value
    assert np.array_equal(f(value_array), value_array)


def test_linear_function_with_slope():
    slope = 3.3

# Path: guacamol/score_modifier.py
# class ScoreModifier:
# class ChainedModifier(ScoreModifier):
# class LinearModifier(ScoreModifier):
# class SquaredModifier(ScoreModifier):
# class AbsoluteScoreModifier(ScoreModifier):
# class GaussianModifier(ScoreModifier):
# class MinMaxGaussianModifier(ScoreModifier):
# class ClippedScoreModifier(ScoreModifier):
# class SmoothClippedScoreModifier(ScoreModifier):
# class ThresholdedLinearModifier(ScoreModifier):
#     def __call__(self, x):
#     def __init__(self, modifiers: List[ScoreModifier]) -> None:
#     def __call__(self, x):
#     def __init__(self, slope=1.0):
#     def __call__(self, x):
#     def __init__(self, target_value: float, coefficient=1.0) -> None:
#     def __call__(self, x):
#     def __init__(self, target_value: float) -> None:
#     def __call__(self, x):
#     def __init__(self, mu: float, sigma: float) -> None:
#     def __call__(self, x):
#     def __init__(self, mu: float, sigma: float, minimize=False) -> None:
#     def __call__(self, x):
#     def __init__(self, upper_x: float, lower_x=0.0, high_score=1.0, low_score=0.0) -> None:
#     def __call__(self, x):
#     def __init__(self, upper_x: float, lower_x=0.0, high_score=1.0, low_score=0.0) -> None:
#     def __call__(self, x):
#     def __init__(self, threshold: float) -> None:
#     def __call__(self, x):


# Path: tests/test_score_modifier.py
from functools import partial
from guacamol.score_modifier import LinearModifier, SquaredModifier, AbsoluteScoreModifier, GaussianModifier, \
    MinGaussianModifier, MaxGaussianModifier, ThresholdedLinearModifier, ClippedScoreModifier, \
    SmoothClippedScoreModifier, ChainedModifier
import numpy as np
import pytest




scalar_value = 8.343
value_array = np.array([[-3.3, 0, 5.5],
                        [0.011, 2.0, -33]])


def test_linear_function_default():
    f = LinearModifier()

    assert f(scalar_value) == scalar_value
    assert np.array_equal(f(value_array), value_array)


def test_linear_function_with_slope():
    slope = 3.3

    f = LinearModifier(slope=slope)