from pypcsimplus import *
import pypcsimplus as pcsim
from numpy import *

class PoissInput(pcsim.Model):
    
    def defaultParameters(self):
        p = self.params
        
        # input parameters                
        p.inputRate = 15.0
        p.nInputNeurons = 190
        p.nExcNeurons = 150
        p.Trefract = 5e-4
        p.input_type = 'inputNeurons'
        
    
    def setupRecordings(self):
        p = self.params
        r = Recordings(self.net)
        if p.input_type != 'inputNeurons':
            r.spikes = self.elements.input_nrn_popul.record(SpikeTimeRecorder())
        else:
            r.spikes = self.elements.inputs        
        return r
    
    
    def generate(self):        
        m = self.elements
        dm = self.depModels
        p = self.params
        ep = self.expParams
            
        if p.input_type == 'inputNeurons':
            m.input_nrn_popul = SimObjectPopulation(self.net, SpikingInputNeuron(), p.nInputNeurons)
         
            m.inputs = sort(random.uniform(0, ep.Tsim - int(p.inputRate * ep.Tsim) * p.Trefract, m.input_nrn_popul.size() * int(p.inputRate * ep.Tsim)).reshape(m.input_nrn_popul.size(), 
                          int(p.inputRate * ep.Tsim)), 1) + outer(ones(m.input_nrn_popul.size()), cumsum(ones(int(p.inputRate * ep.Tsim))*p.Trefract))
        
            for i in range(m.input_nrn_popul.size()):
                if m.input_nrn_popul.object(i):
                    m.input_nrn_popul.object(i).setSpikes(m.inputs[i])
        else:
            m.input_nrn_popul = SimObjectPopulation( self.net, LinearPoissonNeuron(1, 1, 5e-4, 0, p.inputRate), p.nInputNeurons )
    
        exc_nrn_ids = []
        inh_nrn_ids = []    
        for i in range(0,p.nExcNeurons):
            exc_nrn_ids.append(m.input_nrn_popul[i])
        
        m.exc_nrn_popul = SimObjectPopulation(self.net, exc_nrn_ids)
        
        for i in range(p.nExcNeurons,m.input_nrn_popul.size()):
            inh_nrn_ids.append(m.input_nrn_popul[i])
        
        m.inh_nrn_popul = SimObjectPopulation(self.net, inh_nrn_ids)
                
        return m
    
    
    def scriptList(self):
        return ["PoissInputModel.py"]
    
    
    def getOutput(self, p):
        return self.elements
