from typing import List, Optional, Tuple
import numpy as np
from axelrod.action import Action
from axelrod.evolvable_player import (
    EvolvablePlayer,
    InsufficientParametersError,
    crossover_lists,
)
from axelrod.load_data_ import load_weights
from axelrod.lllllIlllIIlIIlIIll import Player
lIllIllIIIIIIlIIIll, lIIIllII = Action.C, Action.D
IIllIIIIIIIlIIll = load_weights()
lIllIlIl = np.vectorize(lambda x: max(x, 0))
def IllIlIlIIIIlllI(lIlIllIllIlIl, lIIllIIIllIlIIIlII):
    lIIIIlIlIIIllIIIl = lIlIllIllIlIl * lIIllIIIllIlIIIlII + 2 * lIIllIIIllIlIIIlII
    return lIIIIlIlIIIllIIIl
def IIlIlIllIlIII(lllllIlllIIlIIlIIll: Player, lIIlIlIIIlllIlIl: Player) -> np.ndarray:
    if len(lIIlIlIIIlllIlIl.history) == 0:
        IIIIIllIlI = 0
        IIIlllIIllIIlIIlII = 0
        llIIIlIl = 0
        IIlIllIIlIllllI = 0
        IllIIllIlIIlllIIllI = 0
        lllIlIlIlllIlIlIIIll = 0
        IIIlIIIIllIlI = 0
        IIllIIllIlIII = 0
        IIllIIIllIlIIl = 0
        llIlIIllIIIII = 0
        IIIlIlIlllIIIll = 0
        llIIlIIlllIlI = 0
    elif len(lIIlIlIIIlllIlIl.history) == 1:
        IIIIIllIlI = 1 if lIIlIlIIIlllIlIl.history[0] == lIllIllIIIIIIlIIIll else 0
        IIIlllIIllIIlIIlII = 1 if lIIlIlIIIlllIlIl.history[0] == lIIIllII else 0
        llIIIlIl = 0
        IIlIllIIlIllllI = 0
        IllIIllIlIIlllIIllI = 1 if lllllIlllIIlIIlIIll.history[-1] == lIllIllIIIIIIlIIIll else 0
        lllIlIlIlllIlIlIIIll = 1 if lllllIlllIIlIIlIIll.history[-1] == lIIIllII else 0
        IIIlIIIIllIlI = 0
        IIllIIllIlIII = 0
        IIllIIIllIlIIl = 1 if lIIlIlIIIlllIlIl.history[-1] == lIllIllIIIIIIlIIIll else 0
        llIlIIllIIIII = 1 if lIIlIlIIIlllIlIl.history[-1] == lIIIllII else 0
        IIIlIlIlllIIIll = 0
        llIIlIIlllIlI = 0
    else:
        IIIIIllIlI = 1 if lIIlIlIIIlllIlIl.history[0] == lIllIllIIIIIIlIIIll else 0
        IIIlllIIllIIlIIlII = 1 if lIIlIlIIIlllIlIl.history[0] == lIIIllII else 0
        llIIIlIl = 1 if lIIlIlIIIlllIlIl.history[1] == lIllIllIIIIIIlIIIll else 0
        IIlIllIIlIllllI = 1 if lIIlIlIIIlllIlIl.history[1] == lIIIllII else 0
        IllIIllIlIIlllIIllI = 1 if lllllIlllIIlIIlIIll.history[-1] == lIllIllIIIIIIlIIIll else 0
        lllIlIlIlllIlIlIIIll = 1 if lllllIlllIIlIIlIIll.history[-1] == lIIIllII else 0
        IIIlIIIIllIlI = 1 if lllllIlllIIlIIlIIll.history[-2] == lIllIllIIIIIIlIIIll else 0
        IIllIIllIlIII = 1 if lllllIlllIIlIIlIIll.history[-2] == lIIIllII else 0
        IIllIIIllIlIIl = 1 if lIIlIlIIIlllIlIl.history[-1] == lIllIllIIIIIIlIIIll else 0
        llIlIIllIIIII = 1 if lIIlIlIIIlllIlIl.history[-1] == lIIIllII else 0
        IIIlIlIlllIIIll = 1 if lIIlIlIIIlllIlIl.history[-2] == lIllIllIIIIIIlIIIll else 0
        llIIlIIlllIlI = 1 if lIIlIlIIIlllIlIl.history[-2] == lIIIllII else 0
    IIllllIlI = lIIlIlIIIlllIlIl.cooperations
    IIllIllIllIlllIl = lIIlIlIIIlllIlIl.defections
    lIllIIIIIlIllI = lllllIlllIIlIIlIIll.cooperations
    IlIIIIlIlII = lllllIlllIIlIIlIIll.defections
    return np.array(
        (
            IIIIIllIlI,
            IIIlllIIllIIlIIlII,
            llIIIlIl,
            IIlIllIIlIllllI,
            IllIIllIlIIlllIIllI,
            lllIlIlIlllIlIlIIIll,
            IIIlIIIIllIlI,
            IIllIIllIlIII,
            IIllIIIllIlIIl,
            llIlIIllIIIII,
            IIIlIlIlllIIIll,
            llIIlIIlllIlI,
            IIllllIlI,
            IIllIllIllIlllIl,
            lIllIIIIIlIllI,
            IlIIIIlIlII,
            len(lllllIlllIIlIIlIIll.history),
        )
    )
def lIllIlIllllIIIllIl(
    lIIlIllIlIIlIII: List[float],
    IlIllIIIIlIlllll: List[float],
    IlllIlIl: List[float],
    lllIIIlIlIllIl: np.ndarray,
) -> float:
    llllllllIl = lIIlIllIlIIlIII + np.dot(IlIllIIIIlIlllll, lllIIIlIlIllIl)
    llllllllIl = lIllIlIl(llllllllIl)
    IlIIlIlllIIl = np.dot(llllllllIl, IlllIlIl)
    return IlIIlIlllIIl
def IllIlIII(
    IIlIllIIIlIlIlllll: List[float], lIlIllIllIlIl: int, lIIllIIIllIlIIIlII: int
) -> Tuple[List[List[float]], List[float], List[float]]:
    lIllllllll = lIIllIIIllIlIIIlII * 2 + lIlIllIllIlIl * lIIllIIIllIlIIIlII
    if lIllllllll != len(IIlIllIIIlIlIlllll):
        raise ValueError("NN weights array has an incorrect size.")
    lIIIlIIIlIlIl = lIlIllIllIlIl * lIIllIIIllIlIIIlII
    lllllIllllIIllII = lIIllIIIllIlIIIlII
    IIIlllIIlIIlIIIIl = []
    for IIIIIlIII in range(0, lIIIlIIIlIlIl, lIlIllIllIlIl):
        IIIlllIIlIIlIIIIl.append(IIlIllIIIlIlIlllll[IIIIIlIII : IIIIIlIII + lIlIllIllIlIl])
    IllIlIlIllIII = lIIIlIIIlIlIl
    lIIIIIlI = lIIIlIIIlIlIl + lllllIllllIIllII
    lIIIllll = IIlIllIIIlIlIlllll[IllIlIlIllIII:lIIIIIlI]
    lIIlIllIlIIlIII = IIlIllIIIlIlIlllll[lIIIIIlI:]
    return IIIlllIIlIIlIIIIl, lIIIllll, lIIlIllIlIIlIII
class lIIlIlII(Player):
    llIIllIlIlllIl = "strategy"
    lIIIlIIIIIIllIIIIIIl = {
        "memory_depth": float("inf"),
        "stochastic": False,
        "inspects_source": False,
        "manipulates_source": False,
        "manipulates_state": False,
        "long_run_time": False,
    }
    def __init__(
        lIIllIlllIIllIIIIII,
        lIlIllIllIlIl: int,
        lIIllIIIllIlIIIlII: int,
        IIlIllIIIlIlIlllll: Optional[List[float]] = None,
    ) -> None:
        Player.__init__(lIIllIlllIIllIIIIII)
        lIIllIlllIIllIIIIII.lIlIllIllIlIl = lIlIllIllIlIl
        lIIllIlllIIllIIIIII.lIIllIIIllIlIIIlII = lIIllIIIllIlIIIlII
        lIIllIlllIIllIIIIII.lIIlIIIllIIllllIIl(IIlIllIIIlIlIlllll, lIlIllIllIlIl, lIIllIIIllIlIIIlII)
    def lIIlIIIllIIllllIIl(lIIllIlllIIllIIIIII, IIlIllIIIlIlIlllll, lIlIllIllIlIl, lIIllIIIllIlIIIlII):
        lIIllIlllIIllIIIIII.IIlIllIIIlIlIlllll = list(IIlIllIIIlIlIlllll)
        (llIIllllIlIlIIIlllI, IlIlIIlIllllIlIl, lIIlIllIlIIlIII) = IllIlIII(IIlIllIIIlIlIlllll, lIlIllIllIlIl, lIIllIIIllIlIIIlII)
        lIIllIlllIIllIIIIII.IIlllIIIlllIlIlllIl = np.array(llIIllllIlIlIIIlllI)
        lIIllIlllIIllIIIIII.llIlIlIIlllIIllIlII = np.array(IlIlIIlIllllIlIl)
        lIIllIlllIIllIIIIII.IIlIIIll = np.array(lIIlIllIlIIlIII)
    def IlllIllII(lIIllIlllIIllIIIIII, lIIlIlIIIlllIlIl: Player) -> Action:
        IIlIIIlIIIIl = IIlIlIllIlIII(lIIllIlllIIllIIIIII, lIIlIlIIIlllIlIl)
        IlllIlIl = lIllIlIllllIIIllIl(
            lIIllIlllIIllIIIIII.IIlIIIll,
            lIIllIlllIIllIIIIII.IIlllIIIlllIlIlllIl,
            lIIllIlllIIllIIIIII.llIlIlIIlllIIllIlII,
            IIlIIIlIIIIl,
        )
        if IlllIlIl > 0:
            return lIllIllIIIIIIlIIIll
        else:
            return lIIIllII
class llIIIlIlIlIIlIIlIl(lIIlIlII):
    llIIllIlIlllIl = "strategy"
    def __init__(lIIllIlllIIllIIIIII) -> None:
        lIlIllIllIlIl, lIIllIIIllIlIIIlII, IIlIllIIIlIlIlllll = IIllIIIIIIIlIIll["Evolved ANN 5"]
        super().__init__(
            lIlIllIllIlIl=lIlIllIllIlIl, lIIllIIIllIlIIIlII=lIIllIIIllIlIIIlII, IIlIllIIIlIlIlllll=IIlIllIIIlIlIlllll
        )