A computational model of oxytocin modulation of olfactory recognition memory (Linster & Kelsch 2019)

 Download zip file 
Help downloading and running models
Accession:257940
Model of olfactory bulb (OB) and anterior olfactory nucleus (AON) pyramidal cells. Includes olfactory sensory neurons, mitral cells, periglomerular, external tufted and granule interneurons and pyramidal cells. Can be built to include a feedback loop between OB and AON. Output consists of voltage and spikes over time in all neurons. Model can be stimulated with simulated odorants. The code submitted here has served for a number of modeling explorations of olfactory bulb and cortex. The model architecture is defined in "bulb.dat" with synapses defined in "channels.dat". The main function to run the model can be found in "neuron.c". Model architecture is constructed in "set.c" from types defined in "sim.c". A make file to create an executable is located in "neuron.mak".
Reference:
1 . Linster C, Kelsch W (2019) A computational model of oxytocin modulation of olfactory recognition memory. eNeuro [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main interneuron granule TC GABA cell; Olfactory bulb main tufted cell external;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s):
Implementer(s): Linster, Christiane [cl243 at cornell.edu];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main interneuron granule TC GABA cell;
#include "cell.init"
                                                          
/** this file contains personal organization and menue routines **/
/** new routines for menue choices may be included **/


#if 1
void CHANGE_FUNCTIONS ()
{
int t, f1, f2, f3, unit;
enum TYPES type;
  	printf (" change functions of 0. recs 1. inhib 2. excit 3. proj 4. vum .. \n");
loop:
  	scanf ("%d", &t);
  	if (t > 4)
      		{
      		printf (" wrong choice, try again \n");
      		goto loop;
      		}
	if (t == 0) type = receptor;
	if (t == 1) type = inhib;
	if (t == 2) type = excit;
	if (t == 3) type = proj;
	if (t == 4) type = vum;
  	printf (" input : 1. get_mols 2. sum 3. sat 4. mixed\n");
  	printf (" state : 1. lin      2. decay \n");
  	printf (" out   : 1. lin      2. sat 3. sig 4. spike \n"); 
  	printf (" new input .. state .. output .. \n");
  	scanf ("%d %d %d", &f1, &f2, &f3);
  	for (unit = 0; unit < N_UNITS; unit++)
      	if (units[unit].type == type)
      	  	{
      	  	if (f1 == 1) units[unit].input_function = GET_MOLECULES;
      	  	if (f1 == 2) units[unit].input_function = SUM_INPUTS;
      	  	if (f1 == 3) units[unit].input_function = SAT_INPUTS;
      	  	if (f1 == 4) units[unit].input_function = GUST_INPUT;
      	  	if (f2 == 1) units[unit].state_function = LINEAR;
      	  	if (f2 == 2) units[unit].state_function = DECAY;
      	  	if (f3 == 1) units[unit].output_function = LINEAR;
      	  	if (f3 == 2) units[unit].output_function = SAT;
      	  	if (f3 == 3) units[unit].output_function = FALSE_SIG;
      	  	if (f3 == 4) units[unit].output_function = FALSE_SPIKE;
      		}
}


void CHANGE_NEURONS (type1)
enum TYPES 	type1;                
{
FILE 	*read_from;   
char 	reset[10], first[10];
int 	unit, test, loc;  
NEURON	uni;                                    
float	par1, par2, par3, par, par0;
	if (type1 == vum)
		{
		printf (" 1. local 2. global \n");
		scanf ("%d", &loc);
		}
	for (unit = 0; unit < N_UNITS; unit++)
	     if (	((units[unit].type == type1) && (type1 != vum)) || 
			((type1 == vum) && (loc == 1) && (units[unit].type == vum) && (units[unit].couche != 100)) || 
			((type1 == vum) && (loc == 2) && (units[unit].type == vum) && (units[unit].couche == 100)))

		   break;                    
	uni = units[unit];
	printf (" old in-par1 %5.3f inpar2 %5.3f old state-para %5.3f old output-para1 %5.3f old output-para2 %5.3f\n", 
	         uni.inpar1, uni.inpar2, uni.stpar1, uni.outpar1, uni.outpar2);
	printf (" new in-par1 .. in-par2 .. state-par... output-par1... output-par2...\n");
	scanf ("%f %f %f %f %f", &par, &par0, &par1, &par2, &par3);
	for (unit = 0; unit < N_UNITS; unit++)
	     if (	((units[unit].type == type1) && (type1 != vum)) || 
			((type1 == vum) && (loc == 1) && (units[unit].type == vum) && (units[unit].couche != 100)) || 
			((type1 == vum) && (loc == 2) && (units[unit].type == vum) && (units[unit].couche == 100)))

	        {     
		units[unit].inpar1 = par;  
		units[unit].inpar2 = par0;
		units[unit].stpar1 = par1;
		units[unit].outpar1 = par2;
	        units[unit].outpar2 = par3;
		} 


}   


void SET_ALL_HEBBS ()
{
FILE *read_hebbs;
enum BOOLEAN iv, pv, vi, vp;
float riv, rpv, rvi, rvp;
float wiv, wvi, wpv, wvp;
float tiv, tvi, tpv, tvp;
LINK *link;
int unit;
char dumi[50];
	if ((read_hebbs = fopen ("hebb.dat", "r")) == NULL)
		printf (" noo file hebb.dat \n");
	if (fscanf (read_hebbs, "%s %s %d %f %f %f %s %d %f %f %f %s %d %f %f %f %s %d %f %f %f", 
				dumi, dumi, &iv, &riv, &wiv, &tiv, dumi, &pv, &rpv, &wpv, &tpv, dumi, &vi, &rvi, &wvi, &tvi, dumi, &vp, &rvp, &wvp, &tvp) != 21) 
		printf (" error in reading file hebb.dat \n");
	
			
	for (unit = 0; unit < N_UNITS; unit++)
		{
		if (units[unit].type == vum)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == inhib)
					{
					link->hebb = iv;
					link->learning_rate = riv;
					link->max_weight = wiv;
					link->learning_thresh = tiv;
					}
				if ((units[link->from_unit].type == proj) || (units[link->from_unit].type == excit))
					{
					link->hebb = pv;
					link->learning_rate = rpv;
					link->max_weight = wpv;
					link->learning_thresh = tpv;
					}
				link = link->next;
				}
			}
		if (units[unit].type == inhib)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == vum)
					{
					link->hebb = vi; 
					link->learning_rate = rvi; 
					link->max_weight = wvi;
					link->learning_thresh = tvi;
					}
				link = link->next;
				}
			}
		if (units[unit].type == proj)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == vum)
					{
					link->hebb = vp;
					link->learning_rate = rvp;
					link->max_weight = wvp;
					link->learning_thresh = tvp;
					}
				link = link->next;
				}
			}
		}
}

void RESET_HEBBS ()
{
int unit; 
LINK *link;

	for (unit = 0; unit < N_UNITS; unit++)
		{
		link = units[unit].links_to_unit;
		while (link)
			{
			if (link->hebb == VRAI)
				link->hebb = FAUX;
			link = link->next;
			}
		}
}




void CHANGE_CONNECTIONS ()

{
int		unit, test, couche_too, couche_from, delay, helpi;                                          
float		w, random, help, psi, center , pg_help;                 
LINK		*link; 
enum BOOLEAN 	flag, flag1, decay, incr;     
enum TYPES 	from_type, too_type;
enum LINK_TYPES  link_type;    
LATS 		*lats;      
int		 G0, g, gg, ll;
	flag1 = VRAI;
loop:
	printf (" AFFERENT 10. to inhib 11. to excit \n LOCAL 20. inhib-excit 21. excit-inhib 22. inhib-proj 23. excit-proj\n LATERAL 30. inhib-excit 31. inhib-inhib 32. inhib-proj \n VUM 40 i-v 41 e-v 42 p-v 43 v-i 44 p-e 45 v-p\n");
	scanf ("%d", &test); 
	if ((test != 22) && ( test != 10) && (test != 11) && (test != 20) && (test != 21) && (test != 30) && (test != 31) && (test != 23) && (test != 34) && (test != 40) && (test != 41) && (test != 42) && (test != 43))
		{printf (" wrong choice, try again\n"); goto loop;}               
	if (test == 10)
		{link_type = aff; from_type = receptor; too_type = inhib;}
	if (test == 11)
		{link_type = aff; from_type = receptor; too_type = excit;}
	if (test == 20)
		{link_type = local; from_type = inhib; too_type = excit; }
	if (test == 21)
		{link_type = local; from_type = excit; too_type = inhib; }
	if (test == 22)
		{link_type = local; from_type = inhib; too_type = proj;}
	if (test == 23)
		{link_type = local; from_type = excit; too_type = proj;}
	if (test == 31)
		{link_type = lateral; from_type = inhib; too_type = inhib;  flag1 = FAUX;}
	if (test == 30)
		{link_type = lateral; from_type = inhib; too_type = excit; flag1 = FAUX;}
	if (test == 32) 
		{link_type = local; from_type = inhib; too_type = proj;}
	if (test == 40)
		{link_type = local; from_type = inhib; too_type = vum;}
	if (test == 41)
		{link_type = local; from_type = excit; too_type = vum;}
	if (test == 42)
		{link_type = local; from_type = proj; too_type = vum;}
	if (test == 43)
		{link_type = local; from_type = vum; too_type = inhib;}
	if (test == 44) 
		{link->type = local; from_type = vum; too_type = excit;}
	if (test == 45)
		{link_type = local; from_type = vum; too_type = proj;}

	
	if (flag1 == VRAI)
		{
		flag = VRAI;
		for (unit = 0; (unit < N_UNITS) && (flag == VRAI); unit++)
			if (units[unit].type == too_type)
				{
				link = units[unit].links_to_unit;
				while (link)
					{
					if ((units[link->from_unit].type == from_type) && (link->type == link_type))
						{
						w = link->weight;
						delay = link->delay;
						flag = FAUX;
						break;
						}
					link = link->next;
					}
				}
		if (flag == FAUX)
			printf (" old weight %5.3f delay %d \n", w, delay);
		else
			printf (" no weight found \n");	
			
		printf ("new weight... delay .. \n");
		scanf ("%f %d", &w, &delay);random = 10.0;
		for (unit = 0; unit < N_UNITS; unit++)
	    		{
	    		link = units[unit].links_to_unit;
	    		while (link != NULL)
		  		{
		  		if ((units[link->from_unit].type == from_type) && (link->type == link_type))
		      			if ((units[unit].type == too_type) || (too_type == all))
			 			{   
			 			if (random != 0.0)       
			      				help = w/random;
		         			else 	
			      				help = 0.0;
			  			help = RANF () * (2*help) + (w - help);
			  			link->weight = help;
			  			link->delay = delay;
		      	  			free (link->signal);
		      	  			link->signal = (float *) calloc (link->delay, sizeof (float));
			 			}
		   		link = link->next;
	           		} /** while .. **/
	     		} /** for .. **/
		}
    	else 
		{
		flag = VRAI;
		for (unit = 0; (unit < N_UNITS) && (flag == VRAI); unit++)
			if (units[unit].type == too_type)
				{
				link = units[unit].links_to_unit;
				while (link)
					{
					if ((units[link->from_unit].type == from_type ) && (link->type == link_type))
						{
						w = link->weight;
						delay = link->delay;
						flag = FAUX;
						break;
						}
					link = link->next;
					}
				}
		if (flag == FAUX)
			printf (" old weight %5.3f delay %d \n", w, delay);
		else
			printf (" no weight found \n");
		
		printf (" new weight .. delay .. distance .. decay .. incr .. ? (0,1)\n");
		scanf ("%f %d %f %d %d", &center, &delay, &psi, &decay, &incr);random = 10.0;
/** make lateral gaussian weight distribution **/
	  	lats = MAKE_LATS (center, decay, delay, incr, psi, GLOM);
		for (unit = 0; unit < N_UNITS; unit++)
			{
			link = units[unit].links_to_unit;
			while (link != NULL)
				{
				if ((units[link->from_unit].type == from_type) && (link->type == link_type))
					if ((units[unit].type == too_type) || (too_type == all))
						{   
						w = lats[units[link->from_unit].couche].weight[units[unit].couche];
						/*  w = center;*/
						if (random != 0.0)
							help = w/random;
						else 
							help = 0.0;
						help = RANF () * (2*help) + (w - help);
						link->weight = help;
						
      	      	      	      			helpi = lats[units[link->from_unit].couche].delay[units[unit].couche];
						 link->delay = helpi;
      	      	      	      			free (link->signal);
      	      	      	      			link->signal = (float *) calloc (link->delay, sizeof (float));
						}
				link = link->next;
				} /** while .. **/
	              	  } /** for .. **/

  		
		for (unit = 0; unit < GLOM; unit ++)
  			{
    			free (lats[unit].weight);
    			free (lats[unit].delay);
	      		}
		free (lats);
		}

}

void SET_HEBBS ()
{
int t, f, unit;
enum TYPES from_type, too_type;
float nuu, max;
LINK *link;
	printf (" from 1. inhib 2. proj 3. vum too 1. inhib 2. proj 3. vum \n learning rate .. max_weight .. \n");
	scanf ("%d %d %f %f", &f, &t, &nuu, &max);
	if (f == 1) from_type = inhib;
	if (f == 2) from_type = proj;
	if (f == 3) from_type = vum;
	if (t == 1) too_type = inhib;
	if (t == 2) too_type = proj;
	if (t == 3) too_type = vum;
	for (unit = 0; unit < N_UNITS; unit++)
		if (units[unit].type == too_type)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == from_type)
					{
					link->hebb = VRAI;
					link->learning_rate = nuu;
					link->max_weight = max;
					}
				link = link->next;
				}
			}
}

#endif

void DO_CROSS ()
{
int index, index1, index2;
int cor, unit;    
EVENT maus; 

loop:
	printf ("0. p_pot-p_out 1. p_pot-p 2. p_out-p 3. p_pot-inhib \n 4. p-inhib 5. p-p 6. pote-e 7. autopn 8. autin\n");
	scanf ("%d", &cor);
	if (cor == 7)
		CROSS (p_pot, p_pot, N_STEPS, fft_i1, fft_i2);
	if (cor == 8)
		CROSS (i_pot, i_pot, N_STEPS, fft_i1, fft_i2);
	if (cor == 0)
		CROSS (p_pot, p_out, N_STEPS, fft_i1, fft_i2);
	if (cor == 1)
		{
		printf ("proj index .. \n");
		scanf ("%d", &index);
		for (unit = 0; unit < N_UNITS; unit++)
			if ((units[unit].couche == index) && (units[unit].type == excit))
				index = unit;
		   CROSS (units[index].state, p_pot, N_STEPS, fft_i1, fft_i2); 
		}
	if (cor == 2)
		{
		printf ("proj index .. \n");
		scanf ("%d", &index);
		for (unit = 0; unit < N_UNITS; unit++)
			if ((units[unit].couche == index) && (units[unit].type == excit))
				index = unit;
		CROSS (units[index].output, p_pot, N_STEPS, fft_i1, fft_i2); 
		}
	if (cor == 3)
		{
		CROSS (i_pot, p_pot, N_STEPS, fft_i1, fft_i2);
		}
	if (cor == 4)
		{
		printf ("pn index .. \n");
		scanf ("%d", &index);
		for (unit = 0; unit < N_UNITS; unit++)
			if ((units[unit].couche == index) && (units[unit].type == inhib))
				index = unit;
		CROSS (units[index].output, i_pot, N_STEPS, fft_i1, fft_i2); 
		}
	if (cor == 5)
		{
		printf ("excit index .. index .. \n");
		scanf ("%d %d", &index1, &index2);
		for (unit = 0; unit < N_UNITS; unit++)
			{
			if ((units[unit].couche == index1) && (units[unit].type == excit))
				index1 = unit;
			if ((units[unit].couche == index2) && (units[unit].type == excit))
				index2 = unit;
			}

		CROSS (units[index1].output, units[index2].output, N_STEPS, fft_i1, fft_i2); 
		}
	if (cor == 6)
		{
		printf ("proj index1 .. index2 .. \n");
		scanf ("%d %d", &index1, &index2);
		for (unit = 0; unit < N_UNITS; unit++)
			{
			if ((units[unit].couche == index1) && (units[unit].type == excit))
				index1 = unit;
			if ((units[unit].couche == index2) && (units[unit].type == excit))
				index2 = unit;
			}
		CROSS (units[index1].state, units[index2].state, N_STEPS, fft_i1, fft_i2); 
		}
	maus.button = SHOW_CROSS ();
	if (maus.button == MIDDLE)
		goto loop;

}		                       
                 
				
void MENU ()
{
int	      step_number, x_ext, y_ext, x_mul, y_mul, y_mul2, end, delta;  
FILE	      *read_from; 
char 	      dummy[10], to[50];
int 	      h, test, testi, testo, tot, o;  
enum BOOLEAN  flag, glob, cc;                                       
int	      points, count, t1, t2;  
int	      yc, yp, ys, crossx, cor, index, unit, index1, index2;
 float *inter;
int toto;
EVENT maus;
	cc = FAUX;
	N_UNITS = 0; 	   
	GET_RUN_PARAMETERS ("para.dat");
printf ("after para THRESH %f THRESH2 %f \n", THRESH, THRESH2);
        INIT_GRAPHICS ();
	main_window = OPEN_WINDOW (0, 0, WIDTH, HEIGHT, blanc);  
      	maus = GET_EVENT (); 
	count = 0;
/***/first_loop:/***/
	GET_RUN_PARAMETERS ("para.dat");
	printf (" 1. set up new 2. load config 3. exit\n");
	scanf ("%d", &test);   
	if ((test != 1) && (test != 2) && (test != 3) && (test != 4))
		{
		printf (" wrong choice, try again\n");
		goto first_loop;
		}
      	if (test == 3)    
		{
		DESTROY_WINDOW (main_window);
		return;        
		}
	if (test == 2)
		{ 
		READ_CONFIG (); 
		MAKE_REC_SENS ();
	goto last_loop;
		} /** if (test == 2 **/
	if (test == 1)
		{

/***/set_up_loop:/***/   
		GET_RUN_PARAMETERS ("para.dat");
		SET_UP ();	
		SHOW_UNITS ();getchar ();
		getchar ();
		
		goto last_loop;
        	} /** if (test == 1 **/

/***/get_odors_loop:/***/ 
	GET_RUN_PARAMETERS ("para.dat");
	NULL_ODORS ();
	GET_ODORS ();
	/*SCHOCK ();*/

/***/run_loop:/***/  

	printf (" in run loop \n");
	/*	GET_PLASTICITY ("plasticity.dat");*/
	RUN ();
	/*COUNTSPIKES ();*/
	printf (" spikes %d \n", COUNT1);
/***/draw_loop:/***/

	SHOW ();  

/***/last_loop:/***/

	printf ("100. interspike interval 1. draw again 11. draw_map 12. draw_lasts 14. draw weights 15. vp weights 16 pi weights \n20. aldehydes 2. new input 21. same input 22. gust input 23. read input 24. save input 3. change par 31. set hebbs 32. reset hebbs 4. set up new 5.save config 6. save outputs 7. save weights 8. read weights 13. exit\n"); 

	scanf ("%d", &test);
	if ((test != 100) && (test != 20) && (test != 11) && (test != 14) && (test != 15) && (test != 12) && (test != 1) && (test != 21) && (test != 2) && (test != 3) && (test != 4) && (test != 5) && (test != 13) && (test != 22) && (test != 23) && (test != 24) && (test != 14) && (test != 31) && (test != 32) && (test != 15) && (test != 16) && (test != 6) && (test != 7) && (test != 8))
		{
		printf (" wrong choice, try again\n");
		goto last_loop;
		}         



	if (test == 6) 
		{
		SAVE_DATA (); 	

		goto last_loop;
		}
	if (test == 7) 
		{
		SAVE_WEIGHTS (); 
		goto last_loop;
		}
	if (test == 8) 
		{
		READ_WEIGHTS ();
		goto last_loop;
		}
	if (test == 14)
		{
       		CHOOSE_WINDOW (weight_window);
		SHOW_WEIGHTS ();getchar ();
		goto last_loop;
		}
	if (test == 15)
		{
		SHOW_PV (1, 10);
		goto last_loop;
		}
	if (test == 16)
		{
		SHOW_VI (1, 10);
		goto last_loop;
		}
	if (test == 31)
		{
		SET_ALL_HEBBS ();
		goto last_loop;
		}
	if (test == 32)
		{
		RESET_HEBBS ();
		goto last_loop;
		}
	if (test == 13)  
		{                         
		FREE_ALL ();
		goto first_loop;
		}   /** test == 13 **/          

	if (test == 2)                
		goto get_odors_loop;     

	if (test == 20)
		{
		NULL_ODORS ();
		ALDEHYDES ();
		goto run_loop;
		}
	if (test == 22)
		{
		GET_GUST ();
		goto last_loop;
		}
	if (test == 23)
		{
		READ_ODORS ();
		goto run_loop;
		}
	if (test == 24)
		{
		SAVE_ODORS ();
		goto last_loop;
		}
	if (test == 21)
		goto run_loop;           

	if (test == 100)
		{ 
		  printf (" max interval .. \n");
		  scanf ("%d", &points);

		  DRAW_INTER (points);
	       
		  
       		cc = VRAI;
		goto last_loop;
		} /** endif test == 100 **/

	if (test == 3)                         
		{  
		flag = FAUX;
		while (flag == FAUX)
			{          
			loopp:	
			printf (" change 1. receptor 2. inhibs 3. excits 4. projs 5. vum 6. connections 7. functions\n");
			scanf ("%d", &testi);   
			if (testi > 7)
				{
				printf ("wrong choice, try again \n");
				goto loopp;
				}
			if (testi == 2)
				{
				CHANGE_NEURONS (inhib);  
				}
			if (testi == 3)  
				{
				CHANGE_NEURONS (excit);   
				}
			if (testi == 4)
				CHANGE_NEURONS (proj);
			if (testi == 5)
				CHANGE_NEURONS (vum);
			if (testi == 7)
				CHANGE_FUNCTIONS ();
			if (testi == 6) 
				CHANGE_CONNECTIONS ();
			if (testi == 1)
				CHANGE_NEURONS (receptor);	

loopu:
			printf (" 1. change others 2. run\n");
			scanf ("%d", &end);
			if ((end != 1) && (end != 2))
				{
				printf (" wrong choice, try again \n");
				goto loopu;
				}	
			if (end == 2)
				flag = VRAI;
			}	/** while (flag == false **/		
		goto run_loop;
		} /** endif (test == 3 **/

	if (test == 4)
		{
		FREE_ALL ();
		goto set_up_loop; 
		}

	if (test == 5)
		{                     
		SAVE_CONFIG ();  
/*		  SAVE_OUT ();*/
		goto last_loop;
		}   

	if (test == 1)
		{     
		goto draw_loop;
		} 

	if (test == 11)
		{
loopuu:
		printf (" odor .. type .. (0. rec 1. inhib 2. excit 3. proj 4. vum)\n");
		scanf ("%d %d", &o, &t1);
		if (o >= NODS)
			{
			printf (" wrong, try again \n");
			goto loopuu;
			}
		DRAW_ODOR (o, t1+1);  
		goto last_loop;
		}   

	if (test == 12)
		{                 

		DRAW_MEANS ();
		goto last_loop;
		}
   
}

int DISTANCE (o1, o2)
int o1, o2; 
{
int dist, dist1; 
 int d;
	dist = abs (o1-o2); 
	if (dist > (MOL-1)/2)
		{
		  for (d=1; d <= (int) (MOL-1)/2; d++)
		    if (dist == MOL-d)
			dist1 = d; 
	
		}
	else
		dist1 = dist;

	return (dist1); 
} 
		 
				
void SAVE ()
{

FILE 		*saveto, *saveto2, *saveto3;
float *vumm;
int	od, o1, o2, step;
float *value, *dev;
int *nn;
int dist,c; 
char name1[50], name2[50], name3[50];
 float con;
 int unit; 
 LINK *link;
/** SET UP A NETWORK ***/
	N_UNITS = 0; 	   
	GET_RUN_PARAMETERS ("para.dat");
	GET_PLASTICITY ("plasticity.dat");
       	SET_UP ();

/***********************/


vumm = (float *) calloc (MOL, sizeof (float));
value = (float *) calloc (MOL, sizeof (float)); 
dev = (float *) calloc (MOL, sizeof (float));
 nn = (int *) calloc (MOL, sizeof (int));

/** DO A LOOP FOR CONCENTRATION **/
       for (con = 0.25; con < 1.0; con += 0.25)
	   {
	     printf (" at con %f \n", con);
/** PREPARE **/
c=(int)(con*100);
	    sprintf(name1, "vum_theta8e_c%d", c);
	    sprintf(name2, "av_theta8e_c%d", c);
	    sprintf(name3, "weights_theta8e_c%d", c);
	    saveto = fopen (name1, "w");
	    saveto2 = fopen (name2, "w");
	    saveto3 = fopen (name3,"w"); 
	    for (o1 = 0; o1 < MOL; o1++)
		{nn[o1] = 0; value[o1] = dev[o1] = 0.0; }


/** LEARN ONE AND TEST ALL ***/
	for (o1 = 0; o1 < 15; o1++)
	    	{
		  printf (" learn %d \n", o1);
		/*NULL_ALL ();*/
		RESET_VUM (); /** SET ALL WEIGHTS TO VUM TO ZERO **/
		LEARN = VRAI;    /** TURN ON LEARNING **/
		NULL_ODORS (); /** RESET ODORS **/
/** MAKE o1 ACTIVE **/
		for (step = 0; step < N_STEPS; step++)
			molecules[o1].stim[step] = con*1.0;

/** RUN NETWORK AND LEARN VUM WEIGHTS **/ 
		RUN (); 

		for (o2=0;o2<MOL;o2++)
		     vumm[o2] = 0.0;
/** NOW TEST VUM RESPONSE TO ALL ODORS **/
		for (o2 = 0; o2 < MOL; o2++)
			{
 printf (" test %d \n", o2);

			 NULL_ALL ();
			NULL_ODORS (); 
			LEARN = FAUX; 
			for (step = 0; step < N_STEPS; step++)
				molecules[o2].stim[step] = con*1.0; 
			RUN (); 
			vumm[o2] = VUM (); /** AVERAGE VUM POTENTIAL DURING ODOR **/
			dist = DISTANCE (o1, o2); /** DISTANCE BETWEEN TRAIN-TEST **/
				value[dist] += vumm[o2]; 
			dev[dist] += vumm[o2]*vumm[o2];
			nn[dist] += 1;  
				}
/** SAVE RESPONSE **/
		fprintf (saveto3, "o1 %d \n", o1); 
		for (unit = 0; unit < N_UNITS; unit++)
			if ((units[unit].type == vum ) && (units[unit].couche == 100))
				{
				link = units[unit].links_to_unit; 	
				while (link) 
					{
       					fprintf (saveto3, "%f ", link->weight); 
					link = link->next; 
					}
				fprintf (saveto3, "\n"); 
				}
	

		fprintf (saveto, "o1 %d\n", o1);
		for (o2 = 0; o2 < MOL; o2++)
			fprintf (saveto, "%f ", vumm[o2]); 
		fprintf (saveto, "\n"); 
		}
     
		fclose (saveto);
		fclose (saveto3);	
       		for (o1 = 0; o1 <= (int)((MOL-1)/2); o1++)
			{
		if (nn[o1] != 0) value[o1] /= nn[o1];
			if (nn[o1] != 0) dev[o1] /= nn[o1];
			dev[o1] = sqrt (fabs (dev[o1] - value[o1]*value[o1]));
			fprintf (saveto2, "dist %d n %d value %f dev %f \n", o1, nn[o1], value[o1], dev[o1]); 
			}
		printf (" before close \n");
		fclose (saveto2);
		}

}

				
void SAVE4 ()
{

  FILE 		*c11, *c12, *c13, *c21, *c22, *c23, *c31, *c32, *c33;
  float vumm;
int	od, o1, o2, step;
float *value, *dev;
int *nn;
int dist,c1, c2; 
char name1[50], name2[50], name3[50];
 float con1, con2;
 int unit; 
 LINK *link;
/** SET UP A NETWORK ***/
	N_UNITS = 0; 	   
	GET_RUN_PARAMETERS ("para.dat");
	GET_PLASTICITY ("plasticity.dat");
       	SET_UP ();

/***********************/
	c11 = fopen ("c11_theta8e", "w");
	c12 = fopen ("c12_theta8e", "w");
	c13 = fopen ("c13_theta8e", "w");	
	c21 = fopen ("c21_theta8e", "w");	
	/*	c22 = fopen ("c22_theta8e", "w");	
	c23 = fopen ("c23_theta8e", "w");	
	c31 = fopen ("c31_theta8e", "w");
	c32 = fopen ("c32_theta8e", "w");	
	c33 = fopen ("c33_theta8e", "w");
	*/
	for (o1 = 0; o1 < 15; o1++)
	    	{
		  for (con1 = 0.15; con1 < 1.0; con1+=0.6)
		    {
		      printf (" learn %d con1 %f\n", o1, con1);
		      /*NULL_ALL ();*/
		      RESET_VUM (); /** SET ALL WEIGHTS TO VUM TO ZERO **/
		      LEARN = VRAI;    /** TURN ON LEARNING **/
		      NULL_ODORS (); /** RESET ODORS **/
/** MAKE o1 ACTIVE **/
		      for (step = 0; step < N_STEPS; step++)
			molecules[o1].stim[step] = con1*1.0;

/** RUN NETWORK AND LEARN VUM WEIGHTS **/ 
		      RUN (); 

		      
		   
/** NOW TEST VUM RESPONSE TO ALL ODORS **/
		     for (con2 = 0.15; con2 < 1.0; con2+=0.6)
		       {
			 printf ("con1 %f con2 %f \n", con1, con2);
		        NULL_ALL ();
			NULL_ODORS (); 
			LEARN = FAUX; 
			for (step = 0; step < N_STEPS; step++)
				molecules[o1].stim[step] = con2*1.0; 
			RUN (); 
			vumm = VUM (); /** AVERAGE VUM POTENTIAL DURING ODOR **/
			printf ("con1 %f con2 %f \n", con1, con2);
		    	if ((fabs (con1-0.15) < 0.01) && (fabs (con2-0.15)< 0.01))
			  {
			    printf("writing to c11 \n");
			  fprintf (c11, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			  }
		       
			if ((abs (con1-0.15)<0.01) && (abs(con2-0.75) < 0.01)) 
			  {
			    printf ("writing to c12\n");
			  fprintf (c12, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			  }

			if ((abs (con1-0.75) < 0.01) && (abs (con2-0.15)<0.01))
			  {printf ("writing to c13\n");
			  fprintf (c13, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);}
			if ((abs (con1-0.75) < 0.01) && (abs (con2-0.75) < 0.01)) 
			  {printf ("writing to c21\n");
			  fprintf (c21, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);}
			/*	if ((con1 == 0.5) && (con2 == 0.5))
			    fprintf (c22, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			if ((con1 == 0.5) && (con2 == 0.75))
			    fprintf (c23, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			if ((con1 == 0.75) && (con2 == 0.25))
			    fprintf (c31, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			if ((con1 == 0.75) && (con2 == 0.5))
			    fprintf (c32, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);
			if ((con1 == 0.75) && (con2 == 0.75))
			fprintf (c33, "o %d con1 %f con2 %f vum %f \n", o1, con1, con2, vumm);*/
		       }
		    }
		}
	fclose (c11); fclose (c21); fclose (c31);
	fclose (c12); /*fclose (c22); fclose (c32);
			fclose (c13); fclose (c23); fclose (c33);*/
}

				
void SAVE2 ()
{
FILE 		*saveto, *saveto2, *saveto3;
float *vumm;
int	od, o1, o2, step;
float nspikes, devnspikes;
 float help, sync, devsync;
int *nn;
int dist,c; 
char name1[50], name2[50], name3[50];
 float con;
 int unit; 
 LINK *link;
/** SET UP A NETWORK ***/
	N_UNITS = 0; 	   
	GET_RUN_PARAMETERS ("para.dat");
       	SET_UP ();

/***********************/


	saveto = fopen ("spikes_theta6", "w");
	LEARN = FAUX;
/** DO A LOOP FOR CONCENTRATION **/
       for (con = 0.25; con < 1.0; con += 0.25)
	   {
	
     printf (" at con %f \n", con);
/** PREPARE **/
	    nspikes = devnspikes = sync = devsync = 0.0;



	for (o1 = 0; o1 < MOL; o1++)
	    	{
		  printf (" learn %d \n", o1);
		/*NULL_ALL ();*/
		NULL_ODORS (); /** RESET ODORS **/
/** MAKE o1 ACTIVE **/
		for (step = 0; step < N_STEPS; step++)
			molecules[o1].stim[step] = con*1.0;

/** RUN NETWORK AND LEARN VUM WEIGHTS **/ 
		RUN (); 
		help = COUNTSPIKES (); nspikes += help; devnspikes += help*help;

		help = SYNC_COUNT (0, N_STEPS); sync += help; devsync += help*help;

		}
		nspikes /= MOL; sync /= MOL;
		devnspikes /= MOL; devsync /= MOL;
		devnspikes = sqrt (fabs (devnspikes - nspikes*nspikes));
		devsync = sqrt (fabs (devsync - sync*sync));
		    
		fprintf (saveto, "conc %f nspikes %f dev %f sync %f dev %f \n", con, nspikes, devnspikes, sync, devsync);
	}
     
		fclose (saveto);


}

				
void SAVE_DIST ()
{
FILE 		*saveto1, *saveto2, *saveto3;
float *vumm;
int	od, o1, o2, step;
float vum[3], dev[3];
 float sync, devsync;
int *nn;
int dist,c, i, ex; 
char name1[50], name2[50], name3[50];
 float pn1[75], pn2[75], pn3[75];
 float con1, con2, help, normpn1, normpn2;
 int unit, e; 
 LINK *link;
/** SET UP A NETWORK ***/
	N_UNITS = 0; 	   
	GET_RUN_PARAMETERS ("para.dat");
       	GET_PLASTICITY ("plasticity.dat");
	SET_UP ();

/***********************/
	LEARN = FAUX;

	saveto1 = fopen ("dist1c", "w");
	saveto2 = fopen ("dist2c", "w");
	saveto3 = fopen ("dist3c", "w");
#if 0
	con1 = 0.25;

	ex = 0;
	for (o1 = 0; o1 < MOL; o1++)
	  for (o2 = 0; o2 < MOL; o2++)
	    if (abs (o1-o2) == 4)
	      {
		for (i=0; i < 75; i++)
		  {
		    pn1[i] = 0.0;
		    pn2[i] = 0.0;
		  }
		printf ("at c %f o %d %d\n", con1, o1, o2);
		NULL_ODORS ();
		NULL_ALL ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o1].stim[i] = con1;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn1[e] += units[unit].output[step];
		    e++;
		    }
		NULL_ODORS ();
		NULL_ALL ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o2].stim[i] = con1;
		RUN ();
		e = 0;
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn2[e] += units[unit].output[step];
		    e++;
		    }
		help = 0.0;normpn1 = 0.0; normpn2 = 0.0;
		for (e = 0; e < 75; e++)
		  {
		    normpn1 += pn1[e]*pn1[e];
		    normpn2 += pn2[e]*pn2[e];
		  }
		normpn1 = sqrt(normpn1);normpn2 = sqrt(normpn2);
		if ((normpn1 != 0.0) && (normpn2 != 0.0))
		  for (e = 0; e < 75; e++)
		      help += (pn1[e]/normpn1-pn2[e]/normpn2)*(pn1[e]/normpn1-pn2[e]/normpn2);

		
		fprintf (saveto1, "con %f o1 %d o2 %d dist %f \n", con1, o1, o2, sqrt(help));
		
	      }
	fclose (saveto1);
	

con1 = 0.75;
	
	for (o1 = 0; o1 < MOL; o1++)
	  for (o2 = 0; o2 < MOL; o2++)
	    if (abs (o1-o2) == 4)
	      {
for (i=0; i < 75; i++)
	  {
	    pn1[i] = 0.0;
	    pn2[i] = 0.0;
	  }
printf (" at c %f o %d %d\n", con1, o1, o2);
		NULL_ODORS ();
		NULL_ALL ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o1].stim[i] = con1;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn1[e] += units[unit].output[step];
		    e++;
		    }
		NULL_ODORS ();
		NULL_ALL ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o2].stim[i] = con1;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn2[e] += units[unit].output[step];
		    e++;
		    }

		help = 0.0;normpn1 = 0.0; normpn2 = 0.0;
		for (e = 0; e < 75; e++)
		  {
		    normpn1 += pn1[e]*pn1[e];
		    normpn2 += pn2[e]*pn2[e];
		  }
		normpn1 = sqrt(normpn1);normpn2 = sqrt(normpn2);
		if ((normpn1 != 0.0) && (normpn2 != 0.0))
		  for (e = 0; e < 75; e++)
		    help += (pn1[e]/normpn1-pn2[e]/normpn2)*(pn1[e]/normpn1-pn2[e]/normpn2);
		
		fprintf (saveto2, "con %f o1 %d o2 %d dist %f \n", con1, o1, o2, sqrt(help));
	      
	      }
	fclose (saveto2);
	
 #endif
	for (o1 = 0; o1 < MOL; o1++)
	  {
     	for (i=0; i < 75; i++)
	  {
	    pn1[i] = 0.0;
	    pn2[i] = 0.0;
	    pn3[i] = 0.0;
	  }
printf (" at o %d \n", o1);
	    con1 = 0.25; con2 = 0.75;
	    NULL_ODORS ();
		NULL_ALL ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o1].stim[step] = con1;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn1[e] += units[unit].output[step];
		    e++;
		    }
	    
		NULL_ALL ();
		NULL_ODORS ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o1].stim[step] = con1;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn2[e] += units[unit].output[step];
		    e++;
		    }

		help = 0.0;normpn1 = 0.0; normpn2 = 0.0;
		for (e = 0; e < 75; e++)
		  {
		    normpn1 += pn1[e]*pn1[e];
		    normpn2 += pn2[e]*pn2[e];
		  }
		normpn1 = sqrt(normpn1);normpn2 = sqrt(normpn2);
		if ((normpn1 != 0.0) && (normpn2 != 0.0))
		  for (e = 0; e < 75; e++)
		    help += (pn1[e]/normpn1-pn2[e]/normpn2)*(pn1[e]/normpn1-pn2[e]/normpn2);
		
		  fprintf (saveto2, "con %f con2 %f o %d dist %f \n", con1, con1, o1, sqrt(help));
	     
	    
		NULL_ALL ();
		NULL_ODORS ();
		for (step = 0; step < N_STEPS; step++)
		  molecules[o1].stim[step] = con2;
		RUN ();
		for (unit = 0, e=0; unit < N_UNITS; unit++)
		  if (units[unit].type == excit)
		    {
		    for (step = 0; step < N_STEPS; step++)
		      pn3[e] += units[unit].output[step];
		    e++;
		    }

		help = 0.0;normpn1 = 0.0; normpn2 = 0.0;
		for (e = 0; e < 75; e++)
		  {
		    normpn1 += pn1[e]*pn1[e];
		    normpn2 += pn3[e]*pn3[e];
		  }
		normpn1 = sqrt(normpn1);normpn2 = sqrt(normpn2);
		if ((normpn1 != 0.0) && (normpn2 != 0.0))
		  for (e = 0; e < 75; e++)
		    help += (pn1[e]/normpn1-pn3[e]/normpn2)*(pn1[e]/normpn1-pn3[e]/normpn2);
		
		  fprintf (saveto3, "con %f con2 %f o %d dist %f \n", con1, con2, o1, sqrt(help));
		  
	
  }

	fclose (saveto3);
	fclose (saveto2);
}






void main ()
{                
int test, goon;
printf (" here we go\n");  
        alea = 0.22;
	ialea =  alea * 2147483647;  
loppo:
		printf (" 1. play 2. save \n"); scanf ("%d", &test);
	if (test == 1)	
	MENU (); 
 	if (test == 2)
	  {
	    /* SAVE ();*/
	    SAVE_DIST ();
	  }
/*	 
	printf (" 1. ciao 2. hii \n");
	scanf ("%d", &goon);
	if (goon == 2)
		goto loppo;
	printf (" ciao \n"); 

SAVE();*/
} 




Loading data, please wait...