import functools as ft
import functransf


class RedeNeural:
    class Neuronio:
        def __init__(self, posicao, funcaoT=0, bias=0) -> None:
            self.funcao = functransf.funcoesTransferencia[funcaoT]
            self.b = bias
            self.posicao = posicao
        
        def computar(self, dados, pesos):
            multiplicar = lambda x, y: x * y
            somar = lambda x, y: x + y

            z = ft.reduce(somar, list(map(multiplicar, dados, pesos))) + self.b
            y = self.funcao(z)

            return y
    
    def __init__(self, pesos, funcT, b) -> None:
        self.pesos = pesos
        self.neuronios = []

        for camada in range(len(pesos)):
            self.neuronios.append([])
            for idNeuronio in range(len(pesos[camada])):
                self.neuronios[camada].append(RedeNeural.Neuronio((camada, idNeuronio), funcT, b))
    
    def main(self, dados):
        for camada in range(len(self.neuronios)):
            dados = [neuronio.computar(dados, conjpesos) for neuronio,  conjpesos in zip(self.neuronios[camada], self.pesos[camada])]
        
        return dados
    
    def getpesos(self) -> list:
        return self.pesos
