コード例 #1
0
    def initialize_MFE(self):
        self.trhov = self.post_population.curr_rhov
        vT = 1.0
        value_kick = vT - self.weights
        # get v
        Vedges = util.get_v_edges(self.v_min, self.v_max, self.dv)
        Vbins = 0.5 * (Vedges[0:-1] + Vedges[1:])

        idx_vT = len(Vedges) - 1  # len(Vbins)

        Ind_k1 = np.where(Vedges > value_kick)
        if np.shape(Ind_k1)[1] > 0:
            idx_kick = Ind_k1[0][0]
        else:
            idx_kick = idx_vT

        self.idx_kick = idx_kick
        self.idx_vT = idx_vT
        self.V_sample_post = self.post_population.curr_V_sample
        self.ei_pop_post = self.post_population.ei_pop
コード例 #2
0
 def initialize_edges(self):
     # initialize discreted voltage bins
     self.edges = util.get_v_edges(self.v_min, self.v_max, self.dv)
コード例 #3
0
    def initialize(self, t0=0.0):
        """
        initialize by hand, first put all sub-population and connection-pair
        !!! put them on the same platform!!! simulationBridge
        """
        ''' initialize P_MFE '''
        ''' at first, we only use NHYP as NPATCH '''
        self.iteration_max = self.ntt + 100
        iteration_max = self.iteration_max
        self.tbin_tmp = 0  # initial
        self.tbinsize = 1.0
        dtperbin = int(self.tbinsize / self.dt)
        self.dtperbin = dtperbin
        iteration_bin = int(iteration_max / dtperbin)
        NPATCH = self.Net_settings['nmax']
        NE, NI = self.NE, self.NI
        NPHA = 4
        self.VE, self.VI = np.zeros((NE, NPHA * NPATCH)), np.zeros(
            (NI, NPHA * NPATCH))
        # DTBIN_RECORD_FLAG
        self.tbin_ra = np.zeros((iteration_max, 1))
        self.mE_ra = np.zeros((iteration_max, NPHA * NPATCH))
        self.mI_ra = np.zeros((iteration_max, NPHA * NPATCH))
        self.mEbin_ra = np.zeros((iteration_bin, NPHA * NPATCH))
        self.mIbin_ra = np.zeros_like(self.mEbin_ra)
        self.xEbin_ra = np.zeros_like(self.mEbin_ra)
        self.xIbin_ra = np.zeros_like(self.xEbin_ra)

        self.nEbin_ra = np.zeros_like(self.xEbin_ra)
        self.nIbin_ra = np.zeros_like(self.xEbin_ra)

        self.VEavgbin_ra = np.zeros((iteration_bin, NPHA * NPATCH))
        self.VIavgbin_ra = np.zeros_like(self.VEavgbin_ra)
        self.VEstdbin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VIstdbin_ra = np.zeros_like(self.VEstdbin_ra)

        self.VEavg_ra = np.zeros((iteration_max, NPHA * NPATCH))
        self.VIavg_ra = np.zeros_like(self.VEavg_ra)
        self.VEstd_ra = np.zeros_like(self.VIavg_ra)
        self.VIstd_ra = np.zeros_like(self.VEstd_ra)
        self.rE, self.rI = None, None
        self.NPATCH = NPATCH
        self.NPHA = NPHA

        dv = self.Net_settings['dv']
        self.Vedges = util.get_v_edges(-1.0, 1.0, dv)
        ''' bins = edges - 1'''
        # in internal , rhov length len(self.Vbins), len(Vedges)-1
        self.Vbins = 0.5 * (self.Vedges[0:-1] + self.Vedges[1:])
        Vedges = self.Vedges
        Vbins = self.Vbins

        self.rE = np.zeros((len(self.Vbins), self.NPATCH * self.NPHA))
        self.rI = np.zeros_like(self.rE)

        # An connection_distribution_list (store unique connection(defined by weight,syn,prob))
        self.connection_distribution_collection = ConnectionDistributionCollection(
        )  # this is
        self.t = t0

        # Matrix to record
        numCGPatch = self.Net_settings['nmax'] * 2  # excitatory and inhibitory
        # 2 * numCGPatch = External Population and Recurrent Population
        # set Matrix to record only Internal Population
        self.m_record = np.zeros((NPHA * (numCGPatch + 1), self.ntt + 10))
        self.v_record = np.zeros_like(self.m_record)

        # put all subpopulation and all connections into the same platform
        for subpop in self.population_list:
            subpop.simulation = self  # .simulation = self(self is what we called 'simulation')
        for connpair in self.connection_list:
            connpair.simulation = self

        # initialize population_list, calculate
        for p in self.population_list:
            p.initialize()  # 2

        for c in self.connection_list:
            #print 'initialize population'
            c.initialize()  # 1
コード例 #4
0
    def initialize(self,t0=0.0):
        """
        initialize by hand, first put all sub-population and connection-pair
        """
        ''' initialize P_MFE '''
        ''' at first, we only use NHYP as NPATCH '''
        self.iteration_max = self.ntt+100
        iteration_max = self.iteration_max
        self.tbin_tmp = 0 # initial
        self.tbinsize = 1.0
        dtperbin = int(self.tbinsize/self.dt)
        self.dtperbin = dtperbin
        iteration_bin = int(iteration_max/dtperbin)
        NPATCH = self.Net_settings['nmax']
        NE,NI  = self.NE,self.NI
        self.VE,self.VI = np.zeros((NE,NPATCH)),np.zeros((NI,NPATCH))
        # DTBIN_RECORD_FLAG
        self.tbin_ra = np.zeros((iteration_max,1))

        self.mEbin_ra = np.zeros((iteration_bin,NPATCH))
        self.mIbin_ra = np.zeros_like(self.mEbin_ra)
        self.xEbin_ra = np.zeros_like(self.mEbin_ra)
        self.xIbin_ra = np.zeros_like(self.xEbin_ra)
        
        self.nEbin_ra = np.zeros_like(self.xEbin_ra)
        self.nIbin_ra = np.zeros_like(self.xEbin_ra)
        
        ''' also recording possible MFE as well as effective MFE'''
        # possible MFE-prob and index
        self.P_MFEbin_ra = np.zeros_like(self.xIbin_ra)
        self.P_MFE_ra    = np.zeros((iteration_max,1))
        self.idx_MFE_ra  = np.zeros((iteration_max,1))
        # effective MFE-prob and index
        self.P_MFE_eff   = np.zeros((iteration_max,1))
        self.idx_MFE_eff = np.zeros((iteration_max,1))
        
        self.rEbin_ra = np.zeros((NPATCH,2000,iteration_bin))
        self.rIbin_ra = np.zeros_like(self.rEbin_ra)

        self.VEavgbin_ra = np.zeros_like(self.P_MFEbin_ra)
        self.VIavgbin_ra = np.zeros_like(self.VEavgbin_ra)
        self.VEstdbin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VIstdbin_ra = np.zeros_like(self.VEstdbin_ra)

        self.rE,self.rI  = None,None
        self.NPATCH = NPATCH
        
        self.LE_ra = np.zeros((iteration_max,NPATCH))
        self.LI_ra = np.zeros_like(self.LE_ra)
        
        DEE,DIE,DEI,DII = self.DEE,self.DIE,self.DEI,self.DII

        vT = 1.0
        dv = self.Net_settings['dv']
        self.Vedges = util.get_v_edges(-1.0,1.0,dv)
        ''' bins = edges - 1'''
        # in internal , rhov length len(self.Vbins), len(Vedges)-1
        self.Vbins = 0.5*(self.Vedges[0:-1] + self.Vedges[1:]) 
        Vedges = self.Vedges 
        Vbins  = self.Vbins
        idx_vT = len(Vedges)-1 #len(Vbins)
        idx_kickE,idx_kickI = np.zeros((NPATCH,NPATCH),dtype=int),np.zeros((NPATCH,NPATCH),dtype=int)
        for it in range(self.NPATCH):
            for js in range(self.NPATCH):
                value_kickE = vT - DEE[it,js]
                value_kickI = vT - DIE[it,js]
                Ind_k1  = np.where(Vedges>value_kickE)
                IndI_k1 = np.where(Vedges>value_kickI) 
                if np.shape(Ind_k1)[1]>0:
                    idx_kickE[it,js]  = Ind_k1[0][0]
                else:
                    idx_kickE[it,js]  = idx_vT
                if np.shape(IndI_k1)[1]>0:
                    idx_kickI[it,js]  = IndI_k1[0][0]
                else:
                    idx_kickI[it,js]  = idx_vT
        
        self.idx_kickE,self.idx_kickI = idx_kickE,idx_kickI
        self.idx_vT   = idx_vT
        self.MFE_pevent = np.zeros(self.NPATCH)
        self.p_single = np.zeros(self.NPATCH)
        self.rE = np.zeros((len(self.Vbins),self.NPATCH))
        self.rI = np.zeros_like(self.rE)

        # An connection_distribution_list (store unique connection(defined by weight,syn,prob))
        self.connection_distribution_collection = ConnectionDistributionCollection() # this is 
        self.t = t0

        # Matrix to record 
        numCGPatch = self.Net_settings['nmax'] * 2 # excitatory and inhibitory
        # 2 * numCGPatch = External Population and Recurrent Population
        # set Matrix to record only Internal Population
        self.m_record = np.zeros((numCGPatch+1, self.ntt + 10))
        self.v_record = np.zeros_like(self.m_record)
        
        # put all subpopulation and all connections into the same platform
        for subpop in self.population_list:
            subpop.simulation = self    # .simulation = self(self is what we called 'simulation')
        for connpair in self.connection_list:
            connpair.simulation = self
            
        # initialize population_list, calculate         
        for p in self.population_list:
            p.initialize()      # 2   
        
        for c in self.connection_list:
            c.initialize()      # 1
コード例 #5
0
"""
"""
simulation = Simulation(population_list,
                        connection_list,
                        Net_settings,
                        Cell_type_num,
                        verbose=True)
mEbin_ra, mIbin_ra, xEbin_ra, xIbin_ra, VEavg_ra, VIavg_ra, VEstd_ra, VIstd_ra, rEbin_ra, rIbin_ra, P_MFEbin_ra = simulation.update(
    t0=t0, dt=dt, tf=tf)
'''
if plot_flag == 1 and dtbin_record_flag == 1
means that figures should be plotted and time-bin recording rather than tiny
time interval is used as minimum recording time step
'''
# for figure 2
Vedges = util.get_v_edges(-1, 1.0, dv)
Vbins = 0.5 * (Vedges[:-1] + Vedges[1:])

plt.figure()
for idx_pop in range(NPATCH):
    # POPULATION ipop
    plt.subplot(2, 1, idx_pop + 1)
    rEpop, rIpop = np.squeeze(rEbin_ra[idx_pop, :, :]), np.squeeze(
        rIbin_ra[idx_pop, :, :])
    mEpop, mIpop = np.squeeze(mEbin_ra[:,
                                       idx_pop]), np.squeeze(mIbin_ra[:,
                                                                      idx_pop])
    xEpop, xIpop = np.squeeze(xEbin_ra[:,
                                       idx_pop]), np.squeeze(xIbin_ra[:,
                                                                      idx_pop])
    VEavgpop, VIavgpop = np.squeeze(VEavg_ra[:, idx_pop]), np.squeeze(
コード例 #6
0
    def initialize(self, t0=0.0):
        """
        The Most Important Issue in This File is, Both Populations and Connections Are within One Shared Plantform Called Simulation, Thus all Personal Variables and Settings Could be Effective Connectted and Have Easier Access to
        """
        self.iteration_max = self.ntt + 100
        iteration_max = self.iteration_max
        self.tbin_tmp = 0  # initial
        self.tbinsize = 1.0
        dtperbin = int(self.tbinsize / self.dt)
        self.dtperbin = dtperbin

        # >>>>>>>>>>> Different Time Scale >>>>>>>>>>>>>>
        # Record per dt, Record per dtbin
        iteration_bin = int(iteration_max / dtperbin)
        NPATCH = self.Net_settings['hyp_num']
        NE, NI = self.NE, self.NI
        self.VE, self.VI = np.zeros((NE, NPATCH)), np.zeros((NI, NPATCH))
        # DTBIN_RECORD_FLAG
        self.tbin_ra = np.zeros((iteration_max, 1))
        # each dt !!!
        '''
        # each dt
        self.mE_ra   = np.zeros((iteration_max,NPATCH))
        self.mI_ra   = np.zeros((iteration_max,NPATCH))
        self.NMDAE_ra = np.zeros((iteration_max,NPATCH))
        self.NMDAI_ra = np.zeros((iteration_max,NPATCH))
        '''
        # >>> >>> >>> Remain Each dt >>> >>> >>>
        self.P_MFE_ra = np.zeros((iteration_max, NPATCH))

        # each tbin
        self.mEbin_ra = np.zeros((iteration_bin, NPATCH))
        self.mIbin_ra = np.zeros_like(self.mEbin_ra)
        self.xEbin_ra = np.zeros_like(self.mEbin_ra)
        self.xIbin_ra = np.zeros_like(self.xEbin_ra)
        ''' long-range '''
        self.NMDAEbin_ra = np.zeros_like(self.xEbin_ra)
        self.NMDAIbin_ra = np.zeros_like(self.xIbin_ra)
        self.tau_NMDA = np.zeros((2, 1))
        ''' >>>>>>> Possible MFE and inhence Effective MFE >>>>>>>>'''
        # >>>>>>>>>> Possible MFE(probability value) and Index >>>>>>>>>>>
        self.P_MFEbin_ra = np.zeros_like(self.xIbin_ra)
        # >>>>>>>>>> Possible MFE Time (dt)>>>>>>>>>>>>>>>>>>>>>>>>>>>
        self.idx_MFE_ra = np.zeros((iteration_max, 1))
        # >>>>>>>>>>>>>> Effective/Successful MFE(VALUE), Index and Time >>>>>>>>
        self.P_MFE_eff = np.zeros((iteration_max, 1))
        # >>>>>>>>>>>>>> Index and Time >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        self.idx_MFE_eff = np.zeros((iteration_max, 2))
        #  >>>>>>>>>>>> Normal Voltage Distribution >>>>>>>>>>>>>>>>>>>
        self.rEbin_ra = np.zeros((NPATCH, 2000, iteration_bin))
        self.rIbin_ra = np.zeros_like(self.rEbin_ra)
        # FOR DATA ANALYSIS
        #        self.rEbinp_ra = np.zeros((NPATCH,2000,5000))
        #        self.rIbinp_ra = np.zeros_like(self.rEbinp_ra)
        self.VEbinp_ra = np.zeros((NPATCH, 652, 12000))  # + time + LE/LI
        self.VIbinp_ra = np.zeros_like(self.VEbinp_ra)
        self.rhovc = 0

        self.VEavgbin_ra = np.zeros_like(self.P_MFEbin_ra)
        self.VIavgbin_ra = np.zeros_like(self.VEavgbin_ra)
        self.VEstdbin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VIstdbin_ra = np.zeros_like(self.VEstdbin_ra)

        self.VEmubin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VImubin_ra = np.zeros_like(self.VEstdbin_ra)
        self.VEsigbin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VIsigbin_ra = np.zeros_like(self.VEstdbin_ra)

        # each dt !!!
        '''
        self.VEavg_ra = np.zeros((iteration_max,NPATCH))
        self.VIavg_ra = np.zeros_like(self.VEavg_ra)
        self.VEstd_ra = np.zeros_like(self.VIavg_ra)
        self.VIstd_ra = np.zeros_like(self.VEstd_ra)
        '''
        # >>>>>>>>>>>>>>>> Instant Recording Rhov >>>>>>>>>>>>
        self.rE, self.rI = None, None
        self.NPATCH = NPATCH
        # why _ra for each dt
        self.LE_ra = np.zeros((iteration_max, NPATCH))
        self.LI_ra = np.zeros_like(self.LE_ra)

        # >>>>>>>>>>>>>>>>>>>> Extract Instant Synaptic Connections from self.structure, Prepare for MFE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        DEE, DIE, DEI, DII = self.DEE, self.DIE, self.DEI, self.DII

        vT = 1.0
        dv = self.Net_settings['dv']

        # >>>>>>>>>>>>>>> Vedges --> Node = (max-min)/dv + 1, Vbins --> Bin-central Value >>>>>>>>>
        self.Vedges = util.get_v_edges(-1.0, 1.0, dv)
        self.Vbins = 0.5 * (self.Vedges[0:-1] + self.Vedges[1:])
        Vedges = self.Vedges
        Vbins = self.Vbins
        idx_vT = len(Vedges) - 1  # or len(Vbins)
        idx_kickE, idx_kickI = np.zeros((NPATCH, NPATCH), dtype=int), np.zeros(
            (NPATCH, NPATCH), dtype=int)
        for it in range(self.NPATCH):
            for js in range(self.NPATCH):
                value_kickE = vT - DEE[it, js]
                value_kickI = vT - DIE[it, js]
                Ind_k1 = np.where(Vedges > value_kickE)
                IndI_k1 = np.where(Vedges > value_kickI)
                if np.shape(Ind_k1)[1] > 0:
                    idx_kickE[it, js] = Ind_k1[0][0]
                else:
                    idx_kickE[it, js] = idx_vT
                if np.shape(IndI_k1)[1] > 0:
                    idx_kickI[it, js] = IndI_k1[0][0]
                else:
                    idx_kickI[it, js] = idx_vT

        self.idx_kickE, self.idx_kickI, self.idx_vT = idx_kickE, idx_kickI, idx_vT
        self.MFE_pevent = np.zeros(self.NPATCH)
        self.p_single = np.zeros(self.NPATCH)
        self.rE = np.zeros((len(self.Vbins), self.NPATCH))
        self.rI = np.zeros_like(self.rE)
        print('kick!>>', idx_kickE)
        print('kick!>>', idx_kickI)

        # >>> An connection_distribution_list (store unique connection(defined by weight,syn,prob)) >>>
        self.connection_distribution_collection = ConnectionDistributionCollection(
        )  # this is
        self.t = t0  # zero

        # >>>>> Number of Internal Populations, Excitatory and Inhibitory Populations Included >>>>
        numCGPatch = self.Net_settings['nmax'] * 2
        '''
        # >>>>>>>>>>>>>>>>> The Most Improtant Issue, Populations as well as Connections Should be 
        '''
        for subpop in self.population_list:
            subpop.simulation = self  # .simulation = self(self is what we called 'simulation')
        for connpair in self.connection_list:
            connpair.simulation = self
        ''' simulation is a platform, both populations and connections could have access to it '''

        # >>>>>>>>>>>>> Preparation Finished, Initialize Populations and Connections >>>>>>
        for p in self.population_list:
            p.initialize()  # 2

        for c in self.connection_list:
            c.initialize()  # 1
コード例 #7
0
    def initialize(self, t0=0.0):
        """
        initialize by hand, first put all sub-population and connection-pair
        !!! put them on the same platform!!! simulationBridge
        """
        ''' initialize P_MFE '''
        ''' at first, we only use NHYP as NPATCH '''

        self.iteration_max = self.ntt + 100
        iteration_max = self.iteration_max

        self.tbin_tmp = 0  # initial
        self.tbinsize = 1.0
        dtperbin = int(self.tbinsize / self.dt)
        self.dtperbin = dtperbin
        # iteration_max for number of dt per tfinal
        # dtperbin for number of dt per tbinsize
        # iteration_bin for number of tbin per tfinal
        iteration_bin = int(iteration_max / dtperbin)
        NPATCH = self.Net_settings['hyp_num']
        NE, NI = self.NE, self.NI
        self.VE, self.VI = np.zeros((NE, NPATCH)), np.zeros((NI, NPATCH))
        # DTBIN_RECORD_FLAG
        self.tbin_ra = np.zeros((iteration_max, 1))
        # each dt !!!
        '''
        # each dt
        self.mE_ra   = np.zeros((iteration_max,NPATCH))
        self.mI_ra   = np.zeros((iteration_max,NPATCH))
        self.NMDAE_ra = np.zeros((iteration_max,NPATCH))
        self.NMDAI_ra = np.zeros((iteration_max,NPATCH))
        '''
        # each tbin
        self.mEbin_ra = np.zeros((iteration_bin, NPATCH))
        self.mIbin_ra = np.zeros_like(self.mEbin_ra)
        self.xEbin_ra = np.zeros_like(self.mEbin_ra)
        self.xIbin_ra = np.zeros_like(self.xEbin_ra)
        ''' long-range '''
        self.HNMDAEbin_ra = np.zeros_like(self.xEbin_ra)
        self.HNMDAIbin_ra = np.zeros_like(self.xEbin_ra)
        self.NMDAEbin_ra = np.zeros_like(self.xEbin_ra)
        self.NMDAIbin_ra = np.zeros_like(self.xEbin_ra)
        self.tau_NMDA = np.zeros((2, 1))
        ''' also recording possible MFE as well as effective MFE'''
        # possible MFE-prob and index
        self.P_MFEbin_ra = np.zeros_like(self.xIbin_ra)
        # each dt !!!
        '''
        self.P_MFE_ra    = np.zeros((iteration_max,1))
        '''
        self.idx_MFE_ra = np.zeros((iteration_max, 1))
        # effective MFE-prob and index
        self.P_MFE_eff = np.zeros((iteration_max, 1))
        self.idx_MFE_eff = np.zeros((iteration_max, 1))

        # voltage distribution
        self.rEbin_ra = np.zeros((NPATCH, 2000, iteration_bin))
        self.rIbin_ra = np.zeros_like(self.rEbin_ra)

        self.VEavgbin_ra = np.zeros_like(self.P_MFEbin_ra)
        self.VIavgbin_ra = np.zeros_like(self.VEavgbin_ra)
        self.VEstdbin_ra = np.zeros_like(self.VIavgbin_ra)
        self.VIstdbin_ra = np.zeros_like(self.VEstdbin_ra)

        # each dt !!!
        '''
        self.VEavg_ra = np.zeros((iteration_max,NPATCH))
        self.VIavg_ra = np.zeros_like(self.VEavg_ra)
        self.VEstd_ra = np.zeros_like(self.VIavg_ra)
        self.VIstd_ra = np.zeros_like(self.VEstd_ra)
        '''
        self.rE, self.rI = None, None
        self.NPATCH = NPATCH

        # why _ra for each dt
        self.LE_ra = np.zeros((iteration_max, NPATCH))
        self.LI_ra = np.zeros_like(self.LE_ra)
        ''' IDX '''
        # get v
        ''' COMMON PARAMETERS '''
        DEE, DIE, DEI, DII = self.DEE, self.DIE, self.DEI, self.DII

        vT = 1.0
        dv = self.Net_settings['dv']
        self.Vedges = util.get_v_edges(-1.0, 1.0, dv)
        ''' bins = edges - 1'''
        # in internal , rhov length len(self.Vbins), len(Vedges)-1
        self.Vbins = 0.5 * (self.Vedges[0:-1] + self.Vedges[1:])
        ''' notice that Number of BINS is less than Number of EDGES '''
        Vedges = self.Vedges
        Vbins = self.Vbins
        idx_vT = len(Vedges) - 1  # is equal to len(Vbins)
        idx_kickE, idx_kickI = np.zeros((NPATCH, NPATCH), dtype=int), np.zeros(
            (NPATCH, NPATCH), dtype=int)
        for it in range(self.NPATCH):
            for js in range(self.NPATCH):
                value_kickE = vT - DEE[it, js]
                value_kickI = vT - DIE[it, js]
                Ind_k1 = np.where(Vedges > value_kickE)
                IndI_k1 = np.where(Vedges > value_kickI)
                if np.shape(Ind_k1)[1] > 0:
                    idx_kickE[it, js] = Ind_k1[0][0]
                else:
                    idx_kickE[it, js] = idx_vT
                if np.shape(IndI_k1)[1] > 0:
                    idx_kickI[it, js] = IndI_k1[0][0]
                else:
                    idx_kickI[it, js] = idx_vT

        self.idx_kickE, self.idx_kickI = idx_kickE, idx_kickI
        self.idx_vT = idx_vT
        self.MFE_pevent = np.zeros(self.NPATCH)
        self.p_single = np.zeros(self.NPATCH)
        self.rE = np.zeros((len(self.Vbins), self.NPATCH))
        self.rI = np.zeros_like(self.rE)

        # An connection_distribution_list (store unique connection(defined by weight,syn,prob))
        self.connection_distribution_collection = ConnectionDistributionCollection(
        )  # this is
        self.t = t0  # zero

        # Matrix to record
        numCGPatch = self.Net_settings[
            'nmax'] * 2  # both excitatory and inhibitory
        # 2 * numCGPatch = External Population and Recurrent Population
        # set Matrix to record only Internal Population

        # put all subpopulation and all connections into the same platform
        for subpop in self.population_list:
            subpop.simulation = self  # .simulation = self(self is what we called 'simulation')
        for connpair in self.connection_list:
            connpair.simulation = self
        ''' simulation is a platform, both populations and connections could have access to it '''

        # initialize population_list, calculate
        for p in self.population_list:
            p.initialize()  # 2

        for c in self.connection_list:
            #print 'initialize population'
            c.initialize()  # 1