def init():
    # ================= GLOBALIZE VARIABLES ====================== #
    global te, ti, wee, wei, wie, tempx, tempy
    global savedWEE, savedWEI, savedWIE, savedTE, savedTI
    global score, scoreFig, stringPattern, MASK

    # ===== FOR ALL THE EXCITATORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== #
    for i in range(0, NN_E):
        te[i] = aux01.randd() * TE_MAX

    # ===== FOR ALL THE INHIBITORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== #
    for i in range(0, NN_I):
        ti[i] = aux01.randd() * TI_MAX

    # ===== FOR ALL E ---> I PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB 1.0 ===== #
    for i in range(0, NN_I):
        sum = 0
        # ======== SUMMING THE WEIGHTS ======== #
        for j in range(0, NN_E):
            wie[i][j] = aux01.randd()
            sum = sum + wie[i][j]

        # ===== PERFORMING NORMALIZATION ====== #
        for j in range(0, NN_E):
            if (sum <> 0):
                wie[i][j] = wie[i][j] / sum

    # ===== FOR ALL E ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEE ===== #
    for i in range(0, NN_E):
        sum = 0
        # ======== SUMMING THE WEIGHTS ======== #
        for j in range(0, NN_E):
            if ((i <> j) and (aux01.randd() <= pEE)):  # >>NO SELF-CONN
                wee[i][j] = aux01.randd()
                sum = sum + wee[i][j]
            else:
                wee[i][j] = -99.0  # NOT CONNECTED

        # ===== PERFORMING NORMALIZATION ====== #
        for j in range(0, NN_E):
            if ((sum <> 0.0) and (wee[i][j] >= 0.0)):
                wee[i][j] = wee[i][j] / sum

    # ===== FOR ALL I ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEI ===== #
    for i in range(0, NN_E):
        sum = 0
        # ======== SUMMING THE WEIGHTS ======== #
        for j in range(0, NN_I):
            if (aux01.randd() <= pEI):
                wei[i][j] = aux01.randd()
                sum = sum + wei[i][j]
            else:
                wei[i][j] = -99.0  # NOT CONNECTED

        # ===== PERFORMING NORMALIZATION ====== #
        for j in range(0, NN_I):
            if ((sum <> 0) and (wei[i][j] >= 0)):
                wei[i][j] = wei[i][j] / sum

    # ========== INITIALIZING THE STATE OF EXCITATORY NEURONS TO ZERO ========== #
    for i in range(0, NN_E):
        x[0][i] = 0
        tempx[0][i] = 0

    # ========== INITIALIZING THE STATE OF INHIBITORY NEURONS TO ZERO ========== #
    for i in range(0, NN_I):
        y[0][i] = 0
        tempy[0][i] = 0

    # ========== INITIALIZING THE STATE OF SAVING VARIABLES OF THE WEIGHTS ========== #
    savedWEE = np.zeros(shape=(3, NN_E, NN_E))
    savedWEI = np.zeros(shape=(3, NN_E, NN_I))
    savedWIE = np.zeros(shape=(3, NN_I, NN_E))

    # ========== INITIALIZING THE STATE OF SAVING VARIABLES OF THE THRESHOLDS ======= #
    savedTE = np.zeros(shape=(3, NN_E))
    savedTI = np.zeros(shape=(3, NN_I))

    # ========== INITIALIZING THE VARIABLES USED IN EVOLUTIONARY STEPS =========== #
    stringPattern = np.zeros(N)
    score = np.zeros(3)
    MASK = np.random.binomial(1, 0.5, N)
    scoreFig = []
def step(t):
    # ============ GLOBALIZING VARIABLES ============== #
    global wee, wei, wie, te, ti, x, y

    # ================ DISPLAY STEPS COUNTING EVERY 100 STEPS ================== #
    if (t % 100 == 0):
        print "Running step " + str(t) + " / " + str(STEPS)

    # =============== INDEX OF ACTIVITY STATES FOR THE LAST AND CURRENT STEP ============== #
    t0 = (t - 1) % 2
    t1 = t % 2

    # ================================================================================== #
    # ============ UPDATING ACTIVITIES OF EXCITATORY NEURONS USING EQ 3.4 ============== #
    # ================================================================================== #
    for i in range(0, NN_E):
        sum1 = 0.0
        sum2 = 0.0

        # =============== CALCULATING ALL THE E-E CONNECTIONS TO THAT NEURON ============= #
        for j in range(0, NN_E):
            if (wee[i][j] >= 0.0):
                sum1 += wee[i][j] * x[t0][j]

        # =============== CALCULATING ALL THE I-E CONNECTIONS TO THAT NEURON ============= #
        for j in range(0, NN_I):
            if (wei[i][j] >= 0.0):
                sum2 += wei[i][j] * y[t0][j]

        # =============== CALCULATING RESULTANT SUMMATION ================ #
        sum = sum1 - sum2 + math.sqrt(sig2) * aux01.gasdev()

        # =============== CACULATING SUMMATION BY THE INPUT NEURONS ============ #
        if (i < NUM_I):
            sum = sum + inp[i]

        # =============== OBTAIN ACTIVITY BY COMPARING SUMMATION WITH ITS THRESHOLD ============ #
        if (sum > te[i]):
            x[t1][i] = 1
        else:
            x[t1][i] = 0

    # ================================================================================== #
    # ============= UPDATING ACTIVITIES OF INHIBITORY NEURONS USING EQ 3.5 ============= #
    # ================================================================================== #
    for i in range(0, NN_I):  # INHIBITORY UPDATE (EQ.2)
        sum1 = 0

        # ============== CALCULATING ALL THE E-I CONNECTIONS TO THAT NEURON ================ #
        for j in range(0, NN_E):
            sum1 += wie[i][j] * x[t0][j]

        sum1 += math.sqrt(sig2) * aux01.gasdev()

        # =============== OBTAIN ACTIVITY BY COMPARING SUMMATION WITH ITS THRESHOLD ============ #
        if (sum1 > ti[i]):
            y[t1][i] = 1
        else:
            y[t1][i] = 0

    if fix == 0:
        for i in range(0, NN_E):
            sum = 0
            # ================================================================================== #
            # ==================== UPDATING E-E WEIGHTS BY STDP (EQ 3.7) ======================= #
            # ================================================================================== #
            for j in range(0, NN_E):
                if ((wee[i][j] > 0.0) and (i <> j)):
                    tt = etaSTDP * (float(x[t1][i]) * float(x[t0][j]) -
                                    float(x[t0][i]) * float(x[t1][j]))
                    if (wee[i][j] + tt <= 0):
                        wee[i][j] = -99
                    else:
                        wee[i][j] = wee[i][j] + tt
                        sum = sum + wee[i][j]

            # ================================================================================== #
            # ========================== WEIGHT NORMALISATION (EQ 3.1) ========================= #
            # ================================================================================== #
            for j in range(0, NN_E):
                if ((sum <> 0) and (wee[i][j] > 0.0)):
                    wee[i][j] = wee[i][j] / sum

            sum = 0
            # ================================================================================== #
            # ================== UPDATING I-E WEIGHTS BY iSTDP (EQ 3.9) ======================== #
            # ================================================================================== #
            for j in range(0, NN_I):
                if (wei[i][j] > 0):
                    tt = -1.0 * etaINHIB * y[t0][j] * (1 - float(x[t1][i])) * (
                        1.0 + 1.0 / float(muIP))
                    if (wei[i][j] + tt <= 0):
                        wei[i][j] = -99
                    else:
                        wei[i][j] = wei[i][j] + tt
                        sum = sum + wei[i][j]

            # ================================================================================== #
            # ========================= WEIGHT NORMALISATION (EQ 3.2) ========================== #
            # ================================================================================== #
            for j in range(0, NN_I):
                if ((sum <> 0) and (wei[i][j] > 0)):
                    wei[i][j] = wei[i][j] / sum

            # ================================================================================== #
            # ================== UPDATING THRESHOLD BY IP (EQ 3.10) ============================ #
            # ================================================================================== #
            te[i] += etaIP * (float(x[t0][i]) - muIP)

            if (te[i] < 0):
                te[i] = 0

        # ================================================================================== #
        # =========== ADD NEW E-E CONNECTION WITH paddEE(STRUCTURAL PLASTICITY) ============ #
        # ================================================================================== #
        if (aux01.randd() < paddEE):
            ind = 0
            sum = 0

            while (ind == 0):
                # ============== RANDOM TWO EXCITATORY NEURONS WHICH IS NOT YET CONNECTED =========== #
                r1 = aux01.randl(NN_E)
                r2 = aux01.randl(NN_E)

                if ((wee[r1][r2] == -99) and (r1 <> r2)):
                    # ============= ADD NEW CONNECTION WITH WEIGHT: 0.001 =============== #
                    wee[r1][r2] = 0.001
                    ind = 1

                    # ================================================================================== #
                    # ========================= WEIGHT NORMALISATION (EQ 3.1) ========================== #
                    # ================================================================================== #
                    for j in range(0, NN_E):  # (RE) NORMALISATION
                        if (wee[r1][j] > 0):
                            sum = sum + wee[r1][j]
                    for j in range(0, NN_E):
                        if ((sum <> 0) and (wee[r1][j] >= 0)):
                            wee[r1][j] = wee[r1][j] / sum
def step(t):
	# ============ GLOBALIZING VARIABLES ============== #
	global wee, wei, wie, te, ti, x, y

	# ================ DISPLAY STEPS COUNTING EVERY 100 STEPS ================== #
	if (t % 100 == 0):
		print "Running step " + str(t) + " / " + str(STEPS) 

	# =============== INDEX OF ACTIVITY STATES FOR THE LAST AND CURRENT STEP ============== #
	t0 = (t-1) % 2 
	t1 = t % 2 
	
	# ================================================================================== #
	# ============ UPDATING ACTIVITIES OF EXCITATORY NEURONS USING EQ 3.4 ============== #
	# ================================================================================== #
	for i in range(0, NN_E):	
		sum1 = 0.0
		sum2 = 0.0
		
		# =============== CALCULATING ALL THE E-E CONNECTIONS TO THAT NEURON ============= #
		for j in range(0, NN_E):
			if (wee[i][j] >= 0.0):
				sum1 += wee[i][j] * x[t0][j]
		
		# =============== CALCULATING ALL THE I-E CONNECTIONS TO THAT NEURON ============= #
		for j in range(0, NN_I):
			if (wei[i][j] >= 0.0):
				sum2 += wei[i][j] * y[t0][j]
		
		# =============== CALCULATING RESULTANT SUMMATION ================ #
		sum = sum1 - sum2 + math.sqrt(sig2) * aux01.gasdev()
		
		# =============== CACULATING SUMMATION BY THE INPUT NEURONS ============ #
		if (i < NUM_I):
			sum = sum + inp[i]
		
		# =============== OBTAIN ACTIVITY BY COMPARING SUMMATION WITH ITS THRESHOLD ============ #
		if (sum > te[i]):
			x[t1][i] = 1
		else:
			x[t1][i] = 0

	# ================================================================================== #
	# ============= UPDATING ACTIVITIES OF INHIBITORY NEURONS USING EQ 3.5 ============= #
	# ================================================================================== #
	for i in range(0, NN_I):	
		sum1 = 0 
		
		# ============== CALCULATING ALL THE E-I CONNECTIONS TO THAT NEURON ================ #
		for j in range(0, NN_E):
			sum1 += wie[i][j] * x[t0][j]
			
		sum1 += math.sqrt(sig2) * aux01.gasdev()
		
		# =============== OBTAIN ACTIVITY BY COMPARING SUMMATION WITH ITS THRESHOLD ============ #
		if (sum1 > ti[i]):
			y[t1][i] = 1 
		else:
			y[t1][i] = 0 
	
	if fix == 0:
		for i in range(0, NN_E):	
			sum = 0 	
			# ================================================================================== #
			# ==================== UPDATING E-E WEIGHTS BY STDP (EQ 3.7) ======================= #
			# ================================================================================== #
			for j in range(0, NN_E):
				if ((wee[i][j] > 0.0) and (i <> j)):
					tt = etaSTDP * (float(x[t1][i]) * float(x[t0][j]) - float(x[t0][i]) * float(x[t1][j])) 
					if (wee[i][j] + tt <= 0):
						wee[i][j] = -99 
					else:
						wee[i][j] = wee[i][j] + tt 
						sum = sum + wee[i][j] 
						
			# ================================================================================== #
			# ========================== WEIGHT NORMALISATION (EQ 3.1) ========================= #
			# ================================================================================== #
			for j in range(0, NN_E):
				if ((sum <> 0) and (wee[i][j] > 0.0)):
					wee[i][j] = wee[i][j] / sum 
			
			sum = 0 
			# ================================================================================== #
			# ================== UPDATING I-E WEIGHTS BY iSTDP (EQ 3.9) ======================== #
			# ================================================================================== #
			for j in range(0, NN_I):
				if (wei[i][j] > 0):
					tt = -1.0 * etaINHIB * y[t0][j] * (1-float(x[t1][i])) * (1.0+1.0/float(muIP)) 
					if (wei[i][j] + tt <= 0):
						wei[i][j] = -99 
					else:
						wei[i][j] = wei[i][j] + tt 
						sum = sum + wei[i][j] 
						
			# ================================================================================== #
			# ========================= WEIGHT NORMALISATION (EQ 3.2) ========================== #
			# ================================================================================== #
			for j in range(0, NN_I):
				if ((sum <> 0) and (wei[i][j] > 0)):
					wei[i][j] = wei[i][j] / sum 
					
			# ================================================================================== #
			# ================== UPDATING THRESHOLD BY IP (EQ 3.10) ============================ #
			# ================================================================================== #
			te[i] += etaIP * (float(x[t0][i]) - muIP) 
			
			if (te[i] < 0):
				te[i] = 0 
		
		# ================================================================================== #
		# =========== ADD NEW E-E CONNECTION WITH paddEE(STRUCTURAL PLASTICITY) ============ #
		# ================================================================================== #
		if (aux01.randd() < paddEE):
			ind = 0 
			sum = 0 
			
			while (ind == 0):
				# ============== RANDOM TWO EXCITATORY NEURONS WHICH IS NOT YET CONNECTED =========== #
				r1 = aux01.randl(NN_E) 
				r2 = aux01.randl(NN_E) 
			
				if ((wee[r1][r2] == -99) and (r1 <> r2)):
				
					# ============= ADD NEW CONNECTION WITH WEIGHT: 0.001 =============== #
					wee[r1][r2] = 0.001 
					ind = 1 

					# ================================================================================== #
					# ========================= WEIGHT NORMALISATION (EQ 3.1) ========================== #
					# ================================================================================== #
					for j in range(0, NN_E):	
						if (wee[r1][j] > 0):
							sum = sum + wee[r1][j] 
							
					for j in range(0, NN_E):
						if ((sum <> 0) and (wee[r1][j] >= 0)):
							wee[r1][j] = wee[r1][j] / sum 	
Exemple #4
0
def init():
	# ================= GLOBALIZE VARIABLES ====================== #
	global te, ti, wee, wei, wie, x, y
	
	# ===== FOR ALL THE EXCITATORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== # 
	for i in range(0, NN_E):
		te[i] = aux01.randd() * TE_MAX 

	# ===== FOR ALL THE INHIBITORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== #
	for i in range(0, NN_I):
		ti[i] = aux01.randd() * TI_MAX 

	# ===== FOR ALL E ---> I PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB 1.0 ===== #
	for i in range(0, NN_I):
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_E):
			wie[i][j] = aux01.randd() 
			sum = sum + wie[i][j] 
			
		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_E):
			if (sum <> 0):
				wie[i][j] = wie[i][j] / sum 

	# ===== FOR ALL E ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEE ===== #
	for i in range(0, NN_E):	
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_E): 
			if ((i <> j) and (aux01.randd() <= pEE)):	# >>NO SELF-CONN
				wee[i][j] = aux01.randd() 
				sum = sum + wee[i][j] 
			else:
				wee[i][j] = -99.0 	# NOT CONNECTED

		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_E):
			if ((sum <> 0.0) and (wee[i][j] >= 0.0)):
				wee[i][j] = wee[i][j] / sum 
	
	# ===== FOR ALL I ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEI ===== #
	for i in range(0, NN_E):	
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_I):
			if (aux01.randd() <= pEI):
				wei[i][j] = aux01.randd() 
				sum = sum + wei[i][j] 
			else:
				wei[i][j] = -99.0 	# NOT CONNECTED
		
		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_I):
			if ((sum <> 0) and (wei[i][j] >= 0)):
				wei[i][j] = wei[i][j] / sum 

	# ========== INITIALIZING THE STATE OF EXCITATORY NEURONS TO ZERO ========== #
	for i in range(0, NN_E):
		x[0][i] = 0 
	
	# ========== INITIALIZING THE STATE OF INHIBITORY NEURONS TO ZERO ========== #
	for i in range(0, NN_I):
		y[0][i] = 0 
def init():
	# ================= GLOBALIZE VARIABLES ====================== #
	global te, ti, wee, wei, wie, tempx, tempy
	global savedWEE, savedWEI, savedWIE, savedTE, savedTI
	global score, scoreFig, stringPattern, MASK
	
	# ===== FOR ALL THE EXCITATORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== # 
	for i in range(0, NN_E):
		te[i] = aux01.randd() * TE_MAX 

	# ===== FOR ALL THE INHIBITORY NEURONS, RANDOMLY ASSIGNED THRESHOLD FOR THEM ==== #
	for i in range(0, NN_I):
		ti[i] = aux01.randd() * TI_MAX 

	# ===== FOR ALL E ---> I PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB 1.0 ===== #
	for i in range(0, NN_I):	
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_E):
			wie[i][j] = aux01.randd() 
			sum = sum + wie[i][j]
		
		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_E):
			if (sum <> 0):
				wie[i][j] = wie[i][j] / sum 

	# ===== FOR ALL E ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEE ===== #
	for i in range(0, NN_E):	
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_E): 
			if ((i <> j) and (aux01.randd() <= pEE)):	# >>NO SELF-CONN
				wee[i][j] = aux01.randd() 
				sum = sum + wee[i][j] 
			else:
				wee[i][j] = -99.0 	# NOT CONNECTED

		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_E):
			if ((sum <> 0.0) and (wee[i][j] >= 0.0)):
				wee[i][j] = wee[i][j] / sum 
				
	# ===== FOR ALL I ---> E PAIRS, RANDOMLY ASSIGNED WEIGHT BETWEEN THEM WITH PROB pEI ===== #
	for i in range(0, NN_E):	
		sum = 0 
		# ======== SUMMING THE WEIGHTS ======== #
		for j in range(0, NN_I):
			if (aux01.randd() <= pEI):
				wei[i][j] = aux01.randd() 
				sum = sum + wei[i][j] 
			else:
				wei[i][j] = -99.0 	# NOT CONNECTED
		
		# ===== PERFORMING NORMALIZATION ====== #
		for j in range(0, NN_I):
			if ((sum <> 0) and (wei[i][j] >= 0)):
				wei[i][j] = wei[i][j] / sum 

	# ========== INITIALIZING THE STATE OF EXCITATORY NEURONS TO ZERO ========== #
	for i in range(0, NN_E):
		x[0][i] = 0
		tempx[0][i] = 0
	
	# ========== INITIALIZING THE STATE OF INHIBITORY NEURONS TO ZERO ========== #
	for i in range(0, NN_I):
		y[0][i] = 0
		tempy[0][i] = 0
		
	# ========== INITIALIZING THE STATE OF SAVING VARIABLES OF THE WEIGHTS ========== #
	savedWEE = np.zeros(shape=(3, NN_E, NN_E))		
	savedWEI = np.zeros(shape=(3, NN_E, NN_I))		
	savedWIE = np.zeros(shape=(3, NN_I, NN_E))		
	
	# ========== INITIALIZING THE STATE OF SAVING VARIABLES OF THE THRESHOLDS ======= #
	savedTE = np.zeros(shape=(3, NN_E))				
	savedTI = np.zeros(shape=(3, NN_I))		
	
	# ========== INITIALIZING THE VARIABLES USED IN EVOLUTIONARY STEPS =========== #
	stringPattern = np.zeros(N)						
	score = np.zeros(3)								
	MASK = np.random.binomial(1,0.5,N)	
	scoreFig = []