001    package cnslab.cnsnetwork;
002
003    import java.io.*;
004    import java.util.*;
005
006    import jpvm.*;
007    import org.slf4j.Logger;
008    import org.slf4j.LoggerFactory;
009
010    import cnslab.cnsmath.*;
011    import edu.jhu.mb.ernst.model.ModelFactory;
012    import edu.jhu.mb.ernst.model.Synapse;
013    import edu.jhu.mb.ernst.model.MutableSynapse;
014
015    /***********************************************************************
016    * Organize layers of neurons. 
017    * 
018    * @version
019    *   $Date: 2012-08-04 13:43:22 -0500 (Sat, 04 Aug 2012) $
020    *   $Rev: 104 $
021    *   $Author: croft $
022    * @author
023    *   Yi Dong
024    * @author
025    *   David Wallace Croft
026    ***********************************************************************/
027    public final class  LayerStructure
028    ////////////////////////////////////////////////////////////////////////
029    ////////////////////////////////////////////////////////////////////////
030    {
031      
032    private static final Class<LayerStructure>
033      CLASS = LayerStructure.class;
034
035    private static final Logger
036      LOGGER = LoggerFactory.getLogger ( CLASS );
037    
038    //
039  
040    public static final int
041      LINEMAP = 0,
042      ABMAP   = 1;
043
044    public static int
045      sectionsInAxisX, // previously named A
046      sectionsInAxisY; // previously named B
047    
048    //
049
050    public Map<String, Integer>  prefixSuffixToLayerIndexMap;
051    
052    /** for slow cellmap */
053    public Map<String, Integer>  indexmap;
054    
055    /** Remove maps after setup core!!! */
056    @Deprecated
057    public String [ ]  celltype;
058
059    @Deprecated
060    public Map<String, TreeSet<Synapse>> [ ]  branchmaps;
061
062    /** Scaffold is used to help to build up the network structure,
063    which should be private */
064    public Map<Integer, Map<String, SizeID>>  scaffold;
065
066    public Map<Integer, Axon>  axons;
067    
068    public List<Layer> layerList;
069    
070    public int
071      edgeLengthX,
072      edgeLengthY;
073    
074    public int
075      numberOfNeurons;
076    
077    /** end index in neuron for each node; .length=number parallel nodes */
078    public int [ ]
079      nodeEndIndices;
080    
081    private int
082      nodeCount; // formerly named nodeNumber
083
084    /** holds reference to neuron array after sent to network */
085    public Neuron [ ]
086      neurons;
087
088    public int
089      base,
090      neuron_end,
091      back_idum2,
092      back_iy;      
093    
094    public int [ ]
095      back_iv = new int [ 32 ];
096    
097    public int
098      backseed;
099    
100    public Seed
101      idum;
102
103    public int
104      numSYN;
105    
106    // private final instance variables
107    
108    private final ModelFactory  modelFactory;
109
110    ////////////////////////////////////////////////////////////////////////
111    // constructor methods
112    ////////////////////////////////////////////////////////////////////////
113
114    public  LayerStructure (
115      final ModelFactory  modelFactory,
116      final int           nodeCount,
117      final int           edgeLengthX,
118      final int           edgeLengthY )
119    ////////////////////////////////////////////////////////////////////////
120    {
121      this.modelFactory = modelFactory;
122      
123      numSYN = 0;
124      
125      base = 0;
126      
127      // cellmap=new TreeMap<String, Integer>();
128      
129      prefixSuffixToLayerIndexMap = new TreeMap<String, Integer> ( );        
130      
131      indexmap = new TreeMap<String, Integer> ( );
132      
133      layerList = new LinkedList<Layer> ( );    
134
135      this.edgeLengthX = edgeLengthX;
136      
137      this.edgeLengthY = edgeLengthY;
138
139      this.nodeCount = nodeCount;
140
141      //numberOfNeurons=nodeIndices[nodeIndices.length-1] + 1;
142      //nodeEndIndices=nodeIndices;
143    }
144
145    ////////////////////////////////////////////////////////////////////////
146    ////////////////////////////////////////////////////////////////////////
147
148    /***********************************************************************
149    * set up the base neuron index for NetHost hostId
150    ***********************************************************************/
151    public void  neuronIndex ( final int  hostId )
152    ////////////////////////////////////////////////////////////////////////
153    {
154      neuron_end = nodeEndIndices [ hostId ];
155      
156      base = 0;
157      
158      if ( hostId != 0 )
159      {
160        base = nodeEndIndices [ hostId - 1 ] + 1;
161      }
162    }
163
164    /***********************************************************************
165    * Add one layer of neurons into the structure.
166    * 
167    * @param pre
168    * @param suf
169    * @param mult
170    * @param type
171    ***********************************************************************/
172    public void  addLayer (
173      final String  pre,
174      final String  suf,
175      final int     mult,
176      final String  type )
177    ////////////////////////////////////////////////////////////////////////
178    {
179      final int  xMul = mult;
180      
181      final int  yMul = mult;
182      
183      if ( mult == 0 )
184      {
185        throw new RuntimeException ( "No zero multiplier is allowed" );
186      }
187      
188      if( xMul < 0 )
189      {
190        if ( edgeLengthX % xMul != 0 )
191        {
192          throw new RuntimeException (
193            xMul + "is not a multiplier of x-edge length" + edgeLengthX );
194        }
195      }
196      
197      if ( yMul < 0 )
198      {
199        if ( edgeLengthY % yMul != 0 )
200        {
201          throw new RuntimeException (
202            yMul + "is not a multiplier of y-edge length" + edgeLengthY );
203        }
204      }
205
206      final Layer  tmp_layer = new Layer ( pre, suf, mult, type );
207      
208      layerList.add ( tmp_layer );
209      
210      prefixSuffixToLayerIndexMap.put (
211        pre + "," + suf,
212        Integer.valueOf ( layerList.size ( ) - 1 ) );
213    }
214
215    public void  addLayer (
216      final String  pre,
217      final String  suf,
218      final int     xmult,
219      final int     ymult,
220      final String  type )
221    ////////////////////////////////////////////////////////////////////////
222    {
223      final int  xMul = xmult;
224      
225      final int  yMul = ymult;
226      
227      if ( xmult == 0 )
228      {
229        throw new RuntimeException ( "No zero multiplier is allowed" );
230      }
231      
232      if ( xMul < 0 )
233      {
234        if ( edgeLengthX % xMul != 0 )
235        {
236          throw new RuntimeException (
237            xMul + "is not a multiplier of x-edge length" + edgeLengthX );
238        }
239      }
240      
241      if( yMul < 0 )
242      {
243        if ( edgeLengthY % yMul !=0 )
244        {
245          throw new RuntimeException (
246            yMul + "is not a multiplier of y-edge length" + edgeLengthY );
247        }
248      }
249
250      final Layer  tmp_layer = new Layer ( pre, suf, xmult, ymult, type );
251      
252      layerList.add ( tmp_layer );
253      
254      prefixSuffixToLayerIndexMap.put (
255        pre + "," + suf,
256        Integer.valueOf ( layerList.size ( ) - 1 ) );
257    }
258
259    /***********************************************************************
260    * Map the cells in linear fashion.
261    ***********************************************************************/
262    public void  mapcells ( )
263    ////////////////////////////////////////////////////////////////////////
264    {
265      int
266        xstep,
267        ystep,
268        xresosize,
269        yresosize;
270      
271      numberOfNeurons = totalNumNeurons ( );
272      
273      nodeEndIndices = new int [ nodeCount ];
274
275      // celltype = new String [ numberOfNeurons ];
276
277      int  n_neuron = 0;
278      
279      // String  str;
280      
281      final int  layerListSize = layerList.size ( );
282
283      for ( int  layerIndex = 0; layerIndex < layerListSize; layerIndex++ )
284      {
285        final Layer  layer = layerList.get ( layerIndex );
286        
287        final int  layerMultiplierX = layer.getMultiplierX ( );
288        
289        if ( layerMultiplierX > 0 )
290        {
291          xstep = 1;
292          
293          xresosize = layerMultiplierX * edgeLengthX;
294        }
295        else
296        {
297          xstep = -layerMultiplierX;
298          
299          xresosize = edgeLengthX;
300        }
301        
302        final int  layerMultiplierY = layer.getMultiplierY ( );
303        
304        if ( layerMultiplierY > 0 )
305        {
306          ystep = 1;
307          
308          yresosize = layerMultiplierY * edgeLengthY;
309        }
310        else
311        {
312          ystep = -layerMultiplierY;
313          
314          yresosize = edgeLengthY;
315        }
316        
317        for ( int  x = 0; x < xresosize; x += xstep )
318        {
319          for ( int  y = 0; y < yresosize; y += ystep )
320          {
321            // str=(layer_structure.get(iter2)).getPrefix()+"," + iter
322            // + "," + iter1 + ","+(layer_structure.get(iter2)).getSuffix();
323            
324            //          celltype[n_neuron]= new String(str);
325            //          cellmap.put(str,n_neuron);
326            
327            n_neuron++;
328          }
329        }
330      }
331      
332      if ( n_neuron != numberOfNeurons )
333      {
334        throw new  RuntimeException (
335          "number doesn't match" + n_neuron + " - " + numberOfNeurons );
336      }
337      
338      for ( int  i = 0; i < nodeCount; i++ )
339      {
340        nodeEndIndices [ i ] = numberOfNeurons / nodeCount * ( i + 1 );
341        
342        if ( i == nodeCount - 1 )
343        {
344          nodeEndIndices [ i ] = numberOfNeurons - 1;
345        }
346      }
347      
348      //    branchmaps=new TreeMap[numberOfNeurons];
349      //    for(int a=0;a<numberOfNeurons;a++)
350      //      branchmaps[a]=new TreeMap<String, TreeSet<Synapse>>();
351    }
352
353    @Deprecated
354    public void  qmapcells()
355    ////////////////////////////////////////////////////////////////////////
356    {
357      boolean sqCheck=false;
358      
359      int sect;
360      
361      for(sect=0;sect<10;sect++)
362      {
363        if(nodeCount == sect*sect)
364        {
365          sqCheck=true;
366          
367          break;
368        }
369      }
370      
371      if(!sqCheck)
372      {
373        throw new RuntimeException (
374          "Now only sqaure nodeNubmers are supported" );
375      }
376
377      nodeEndIndices = new int[nodeCount];
378
379      int iter,iter1,iter2,n_neuron;
380      
381      int xstep,ystep,xresosize,yresosize;
382      
383      int xOri,yOri;
384      
385      int hostId=0;
386      
387      numberOfNeurons = totalNumNeurons() ;
388
389      //    celltype=new String[numberOfNeurons];
390
391      n_neuron=0;
392      
393      String str;
394
395      for(int secX=0;secX<sect;secX++) // x axis section 
396      {
397        for(int secY=0;secY<sect;secY++) //y axis section
398        {
399          // go through all layers
400          
401          for(iter2=0;iter2<layerList.size();iter2++)
402          {
403            if((layerList.get(iter2)).getMultiplierX()>0)
404            {
405              xstep=1;
406              
407              if(secX!=0)
408              {
409                xOri=(layerList.get(iter2)).getMultiplierX()
410                  *edgeLengthX/sect*(secX);
411              }
412              else
413              {
414                xOri=0;
415              }
416              
417              if(secX!=sect-1)
418              {
419                xresosize=(layerList.get(iter2)).getMultiplierX()
420                  *edgeLengthX/sect*(secX+1);
421              }
422              else
423              {
424                xresosize=(layerList.get(iter2)).getMultiplierX()
425                  *edgeLengthX;
426              }
427            }
428            else
429            {
430              xstep=-((layerList.get(iter2)).getMultiplierX());
431              if(secX!=0)
432              {
433                xOri=edgeLengthX/sect*(secX);
434                xOri=xOri + xOri % xstep;
435              }
436              else
437              {
438                xOri=0;
439              }
440              
441              if(secX!=sect-1)
442              {
443                xresosize=edgeLengthX/sect*(secX+1);
444              }
445              else
446              {
447                xresosize=edgeLengthX;
448              }
449            }
450            
451            if((layerList.get(iter2)).getMultiplierY()>0)
452            {
453              ystep=1;
454              
455              if(secY!=0)
456              {
457                yOri=(layerList.get(iter2)).getMultiplierY()
458                  *edgeLengthY/sect*(secY);
459              }
460              else
461              {
462                yOri=0;
463              }
464              
465              if(secY!=sect-1)
466              {
467                yresosize=(layerList.get(iter2)).getMultiplierY()
468                  *edgeLengthY/sect*(secY+1);
469              }
470              else
471              {
472                yresosize=(layerList.get(iter2)).getMultiplierY()
473                  *edgeLengthY;
474              }
475            }
476            else
477            {
478              ystep=-((layerList.get(iter2)).getMultiplierY());
479              if(secY!=0)
480              {
481                yOri=edgeLengthY/sect*(secY);
482                yOri=yOri + yOri % ystep;
483              }
484              else
485              {
486                yOri=0;
487              }
488              if(secY!=sect-1)
489              {
490                yresosize=edgeLengthY/sect*(secY+1);
491              }
492              else
493              {
494                yresosize=edgeLengthY;
495              }
496            }
497            for(iter=xOri;iter<xresosize;iter+=xstep)
498            {
499              for(iter1=yOri;iter1<yresosize;iter1+=ystep)
500              {
501                // System.out.println( "x"+iter+" y"+iter1+" layer"+iter2
502                //   +" host"+(secX*sect+secY));
503                
504                str=(layerList.get(iter2)).getPrefix() + ","+iter
505                  + "," + iter1 +","
506                  + (layerList.get(iter2)).getSuffix();
507                
508                //              celltype[n_neuron]= new String(str);
509                
510                //              cellmap.put(str,n_neuron);
511                
512                n_neuron++;
513              }
514            }
515          } // END: for layer iteration
516          
517          nodeEndIndices[hostId]=n_neuron-1;
518          
519          hostId++;
520        }
521      }
522      
523      if(n_neuron!=numberOfNeurons)
524      {
525        throw new  RuntimeException(
526          "number doesn't match"+n_neuron+" - "+numberOfNeurons);
527      }
528
529      //    branchmaps=new TreeMap[numberOfNeurons];
530      //    for(int a=0;a<numberOfNeurons;a++)
531      //      branchmaps[a]=new TreeMap<String, TreeSet<Synapse>>();
532    }
533
534    /***********************************************************************
535    * Used in main Host, which is fast and used only to get numbers.
536    * neurons are not really initialized to save memory
537    * 
538    * @param a sections in x axis
539    * @param b sections in y axis
540    ***********************************************************************/
541    public void  abmapcells_Main (
542      final int  a,
543      final int  b )
544    ////////////////////////////////////////////////////////////////////////
545    {
546      if ( a * b != nodeCount )
547      {
548        throw new RuntimeException (
549          "a times b should equal to " + nodeCount );
550      }
551      
552      sectionsInAxisX = a;
553      
554      sectionsInAxisY = b;
555
556      nodeEndIndices = new int [ nodeCount ];
557
558      int  iter, iter1, n_neuron;
559      
560      int  xstep, ystep, xresosize, yresosize;
561      
562      int  xOri, yOri;
563      
564      int  hostId = 0;
565      
566      numberOfNeurons = totalNumNeurons ( );
567
568      // celltype=new String[numberOfNeurons];
569
570      n_neuron = 0;
571      
572      String str;
573
574      //    System.out.println(a+" "+b);
575
576      for ( int  secX = 0; secX < a; secX++ ) // x axis section 
577      {
578        for ( int  secY = 0; secY < b; secY++ ) // y axis section
579        {
580          // go through all layers
581          
582          final int  layerListSize = layerList.size ( );
583          
584          for (
585            int  layerIndex = 0; layerIndex < layerListSize; layerIndex++ )
586          {
587            final Layer  layer = layerList.get ( layerIndex );
588            
589            final int  layerMultiplierX = layer.getMultiplierX ( );
590            
591            if ( layerMultiplierX > 0 )
592            {
593              xstep = 1;
594              
595              if ( secX != 0 )
596              {
597                xOri= ( int ) ( ( double ) layerMultiplierX
598                  * ( double ) edgeLengthX / ( double ) a
599                  * ( double ) ( secX ) );
600              }
601              else
602              {
603                xOri = 0;
604              }
605              
606              if ( secX != a - 1 )
607              {
608                xresosize= ( int ) ( ( double ) layerMultiplierX
609                  * ( double ) edgeLengthX / ( double ) a
610                  * ( double ) ( secX + 1 ) );
611              }
612              else
613              {
614                xresosize = layerMultiplierX * edgeLengthX;
615              }
616            }
617            else
618            {
619              xstep = -layerMultiplierX;
620              
621              if ( secX != 0 )
622              {
623                xOri = ( int ) ( ( double ) edgeLengthX
624                  / ( double ) a * ( double ) ( secX ) );
625                
626                xOri = xOri + xstep - xOri % xstep;
627              }
628              else
629              {
630                xOri = 0;
631              }
632              
633              if ( secX != a - 1 )
634              {
635                xresosize = ( int ) ( ( double ) edgeLengthX
636                  / ( double ) a * ( double ) ( secX + 1 ) );
637                
638                xresosize = xresosize + xstep -  xresosize % xstep;
639                
640                if ( xresosize > edgeLengthX )
641                {
642                  xresosize = edgeLengthX;
643                }
644              }
645              else
646              {
647                xresosize = edgeLengthX;
648              }
649            }
650            
651            final int  layerMultiplierY = layer.getMultiplierY ( );
652            
653            if ( layerMultiplierY > 0 )
654            {
655              ystep = 1;
656              
657              if ( secY != 0 )
658              {
659                yOri = ( int ) ( ( double ) layerMultiplierY
660                  * ( double ) edgeLengthY / ( double ) b
661                  * ( double ) ( secY ) );
662              }
663              else
664              {
665                yOri = 0;
666              }
667              
668              if ( secY != b - 1 )
669              {
670                yresosize = ( int ) ( ( double ) layerMultiplierY
671                  * ( double ) edgeLengthY / ( double ) b
672                  * ( double ) ( secY + 1 ) );
673              }
674              else
675              {
676                yresosize = layerMultiplierY * edgeLengthY;
677              }
678            }
679            else
680            {
681              ystep = -layer.getMultiplierY ( );
682              
683              if ( secY != 0 )
684              {
685                yOri = ( int ) ( ( double ) edgeLengthY
686                  / ( double ) b * ( double ) ( secY ) );
687                
688                yOri = yOri + ystep - yOri % ystep;
689              }
690              else
691              {
692                yOri = 0;
693              }
694              
695              if ( secY != b - 1 )
696              {
697                yresosize = ( int ) ( ( double ) edgeLengthY / ( double ) b
698                  * ( double ) ( secY + 1 ) );
699                
700                yresosize = yresosize + ystep -  yresosize % ystep;
701                
702                if ( yresosize > edgeLengthY )
703                {
704                  yresosize = edgeLengthY;
705                }
706              }
707              else
708              {
709                yresosize = edgeLengthY;
710              }
711            }
712
713            indexmap.put (
714              secX + "," + secY + "," + layerIndex,
715              n_neuron);
716            
717            for ( iter = xOri; iter < xresosize; iter += xstep )
718            {
719              for ( iter1 = yOri; iter1 < yresosize; iter1 += ystep )
720              {
721                // System.out.println("x"+iter+" y"+iter1+" layer"+iter2
722                // +" host"+(secX*b+secY));
723                
724                str = layer.getPrefix ( ) + ","+ iter + "," + iter1 + ","
725                  + layer.getSuffix ( );
726                
727                // celltype[n_neuron]= new String(str);
728                
729                // cellmap.put(str,n_neuron);
730                
731                n_neuron++;
732              }
733            }
734          } // END: for layer iteration
735          
736          nodeEndIndices [ hostId ] = n_neuron - 1;
737          
738          hostId++;
739        } // END: for y axis
740      } // END: for x axis
741      
742      if ( n_neuron != numberOfNeurons )
743      {
744        throw new RuntimeException (
745          "number doesn't match" + n_neuron + " - " + numberOfNeurons );
746      }
747
748      // branchmaps=new TreeMap[numberOfNeurons];
749      // for(int i=0;i<numberOfNeurons;i++)
750      //   branchmaps[i]=new TreeMap<String, TreeSet<Synapse>>();
751      
752      LOGGER.trace ( "Total Neuron:" + numberOfNeurons );
753    }
754
755    /***********************************************************************
756    * Calculates the neuron index from the layer x,y coordinates.
757    ***********************************************************************/ 
758    @Deprecated
759    public int  cellmap_slow (
760      final String  pre,
761      final String  suf,
762      final int     x,
763      final int     y )
764    ////////////////////////////////////////////////////////////////////////
765    {
766      int
767        stepX     = 0,
768        stepY     = 0,
769        xresosize = 0,
770        yresosize = 0;
771      
772      int
773        xOri = 0,
774        yOri = 0;
775      
776      boolean
777        foundX = false,
778        foundY = false;
779
780      int  layerIndex;
781
782      try
783      {
784        layerIndex = prefixSuffixToLayerIndexMap.get ( pre + "," + suf );
785      }
786      catch ( final Exception  e )
787      {
788        //TODO: Add Exception handler here
789        
790        throw new RuntimeException ( "pre" + pre + " suf" + suf );
791      }
792      
793      final Layer  layer = layerList.get ( layerIndex );
794      
795      final int
796        layerMultiplierX = layer.getMultiplierX ( ),
797        layerMultiplierY = layer.getMultiplierY ( );      
798      
799      final double
800        neuronsPerSectionX
801          = ( layerMultiplierX * edgeLengthX ) / ( double ) sectionsInAxisX,
802        neuronsPerSectionY
803          = ( layerMultiplierY * edgeLengthY ) / ( double ) sectionsInAxisY;  
804      
805      int  secX;
806      
807      for ( secX = 0; secX < sectionsInAxisX; secX++ ) 
808      {
809        if ( layerMultiplierX > 0 )
810        {
811          stepX = 1;
812          
813          if ( secX != 0 )
814          {
815            // TODO:  maybe multiply first and then divide
816            
817            xOri = ( int ) ( neuronsPerSectionX * secX );
818          }
819          else
820          {
821            xOri = 0;
822          }
823          
824          if ( secX != sectionsInAxisX - 1 )
825          {
826            xresosize = ( int ) ( neuronsPerSectionX * ( secX + 1 ) );
827          }
828          else
829          {
830            xresosize = layerMultiplierX * edgeLengthX;
831          }
832        }
833        else
834        {
835          stepX = -layerMultiplierX;
836          
837          if ( secX != 0 )
838          {
839            xOri = ( int ) ( ( double ) edgeLengthX
840              / ( double ) sectionsInAxisX * ( double ) ( secX ) );
841            
842            xOri = xOri + stepX - xOri % stepX;
843          }
844          else
845          {
846            xOri = 0;
847          }
848          
849          if ( secX != sectionsInAxisX - 1 )
850          {
851            xresosize = ( int ) ( ( double ) edgeLengthX
852              / ( double ) sectionsInAxisX * ( double ) ( secX + 1 ) );
853            
854            xresosize = xresosize + stepX - xresosize % stepX;
855            
856            if ( xresosize > edgeLengthX )
857            {
858              xresosize=edgeLengthX;
859            }
860          }
861          else
862          {
863            xresosize = edgeLengthX;
864          }
865        }
866        
867        if ( x >= xOri
868          && x < xresosize )
869        {
870          foundX = true;
871          
872          break;
873        }
874      }
875      
876      int  secY;
877
878      for ( secY = 0; secY < sectionsInAxisY; secY++ )
879      {
880        if ( layerMultiplierY > 0 )
881        {
882          stepY = 1;
883          
884          if ( secY != 0 )
885          {
886            yOri = ( int ) ( neuronsPerSectionY * secY );
887          }
888          else
889          {
890            yOri = 0;
891          }
892          
893          if ( secY != sectionsInAxisY - 1 )
894          {
895            yresosize = ( int ) ( neuronsPerSectionY * ( secY + 1 ) );
896          }
897          else
898          {
899            yresosize = layerMultiplierY * edgeLengthY;
900          }
901        }
902        else
903        {
904          stepY = -layerMultiplierY;
905          
906          if ( secY != 0 )
907          {
908            yOri = ( int ) ( ( double ) edgeLengthY
909              / ( double ) sectionsInAxisY * ( double ) ( secY ) );
910            
911            yOri = yOri + stepY - yOri % stepY;
912          }
913          else
914          {
915            yOri = 0;
916          }
917          
918          if ( secY != sectionsInAxisY - 1 )
919          {
920            yresosize = ( int ) ( ( double ) edgeLengthY
921              / ( double ) sectionsInAxisY * ( double ) ( secY + 1 ) );
922            
923            yresosize = yresosize + stepY - yresosize % stepY;
924            
925            if ( yresosize > edgeLengthY )
926            {
927              yresosize = edgeLengthY;
928            }
929          }
930          else
931          {
932            yresosize = edgeLengthY;
933          }
934        }
935        
936        if( y >= yOri
937          && y < yresosize )
938        {
939          foundY = true;
940          
941          break;
942        }
943      } // END: for y axis sections
944      
945      if ( foundX
946        && foundY )
947      {
948        int
949          n_neuron = indexmap.get ( secX + "," + secY + "," + layerIndex );
950
951//      int xall = 0;
952        
953        int yall = 0;
954        
955        //      for(iter=xOri;iter<xresosize;iter+=xstep) xall++;
956        
957        for ( int  indexY = yOri; indexY < yresosize; indexY += stepY )
958        {
959          yall++;
960        }
961        
962        n_neuron = n_neuron + yall * ( x - xOri ) / stepX;
963        
964        n_neuron = n_neuron + ( y - yOri ) / stepY;
965        
966        if ( ( x - xOri ) % stepX != 0
967          || ( y - yOri ) % stepY != 0 )
968        {
969          return -1;
970        }
971        
972        return n_neuron;
973        /*
974        for(iter=xOri;iter<xresosize;iter+=xstep)
975        {
976          for(iter1=yOri;iter1<yresosize;iter1+=ystep)
977          {
978            if(x==iter && y==iter1)return n_neuron;
979            n_neuron++;
980          }
981        }
982        */
983      }
984      else
985      {
986        throw new RuntimeException (
987          "neuron was not found in cellmap_slow"
988          + " pre:" + pre + "suf:" + suf + "x:" + x + "y:" + y );
989      }
990      //  throw new RuntimeException("neuron was not found in cellmap_slow");
991    }
992
993    @Deprecated
994    public boolean celllayer_test(int index,String pre, String suf) // a sections in x axis , b sections in y axis;
995    ////////////////////////////////////////////////////////////////////////
996    {
997      int iter,iter1,iter2,n_neuron;
998      int xstep=0,ystep=0,xresosize=0,yresosize=0;
999      int xOri=0,yOri=0;
1000      int hostId=0;
1001      int secX,secY;
1002      boolean xfound=false,yfound=false;
1003
1004      n_neuron=0;
1005      String str;
1006
1007      //iter2=layermap.get(pre+","+suf);
1008
1009      //Iterator<Integer> iter = indexmap.entrySet(
1010      //    indexmap.put(secX+","+secY+","+iter2,n_neuron);
1011      int bsecX=-1,bsecY=-1,bindex=-1;
1012      boolean exit=false;
1013
1014
1015      for(secX=0;secX<sectionsInAxisX;secX++)
1016      {
1017        for(secY=0;secY<sectionsInAxisX;secY++) // x axis section 
1018        {
1019          for(iter2 = 0 ; iter2< prefixSuffixToLayerIndexMap.size(); iter2++)
1020          {
1021            if(index>=indexmap.get(secX+","+secY+","+iter2))
1022            {
1023              bsecX=secX;
1024              bsecY=secY;
1025              bindex=iter2;
1026            }
1027            if(index<indexmap.get(secX+","+secY+","+iter2))
1028            {  
1029              exit=true;
1030              break;
1031            }
1032          }
1033          if(exit)break;
1034        }
1035        if(exit)break;
1036      }
1037
1038      iter2=bindex;
1039      return (layerList.get(iter2).getPrefix().equals(pre) && layerList.get(iter2).getSuffix().equals(suf));
1040    }
1041
1042    @Deprecated
1043    public int [] celllayer_cordinate(int index,String pre, String suf)
1044    ////////////////////////////////////////////////////////////////////////
1045    {
1046      int iter,iter1,iter2,n_neuron;
1047      int xstep=0,ystep=0,xresosize=0,yresosize=0;
1048      int xOri=0,yOri=0;
1049      int hostId=0;
1050      int secX,secY;
1051      boolean xfound=false,yfound=false;
1052
1053      n_neuron=0;
1054      String str;
1055
1056      //iter2=layermap.get(pre+","+suf);
1057
1058      //Iterator<Integer> iter = indexmap.entrySet(
1059      //    indexmap.put(secX+","+secY+","+iter2,n_neuron);
1060      int bsecX=-1,bsecY=-1,bindex=-1;
1061      boolean exit=false;
1062
1063      //    iter2 = layermap.get(pre+","+suf);
1064
1065
1066      for(secX=0;secX<sectionsInAxisX;secX++)
1067      {
1068        for(secY=0;secY<sectionsInAxisX;secY++) // x axis section 
1069        {
1070          for(iter2 = 0 ; iter2< prefixSuffixToLayerIndexMap.size(); iter2++)
1071          {
1072            if(index>=indexmap.get(secX+","+secY+","+iter2))
1073            {
1074              bsecX=secX;
1075              bsecY=secY;
1076              bindex=iter2;
1077            }
1078            if(index<indexmap.get(secX+","+secY+","+iter2))
1079            {  
1080              exit=true;
1081              break;
1082            }
1083          }
1084          if(exit)break;
1085        }
1086        if(exit)break;
1087      }
1088
1089      iter2=bindex;
1090
1091
1092      for(secX=0;secX<sectionsInAxisX;secX++) // x axis section 
1093      {
1094        if((layerList.get(iter2)).getMultiplierX()>0)
1095        {
1096          xstep=1;
1097          if(secX!=0)
1098          {
1099            xOri=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
1100          }
1101          else
1102          {
1103            xOri=0;
1104          }
1105          if(secX!=sectionsInAxisX-1)
1106          {
1107            xresosize=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
1108          }
1109          else
1110          {
1111            xresosize=(layerList.get(iter2)).getMultiplierX()*edgeLengthX;
1112          }
1113        }
1114        else
1115        {
1116          xstep=-((layerList.get(iter2)).getMultiplierX());
1117          if(secX!=0)
1118          {
1119            xOri=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
1120            xOri=xOri + xstep - xOri %xstep;
1121
1122          }
1123          else
1124          {
1125            xOri=0;
1126          }
1127          if(secX!=sectionsInAxisX-1)
1128          {
1129            xresosize=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
1130            xresosize=xresosize + xstep -  xresosize % xstep;
1131            if(xresosize>edgeLengthX)xresosize=edgeLengthX;
1132          }
1133          else
1134          {
1135            xresosize=edgeLengthX;
1136          }
1137        }
1138      }
1139
1140
1141      for(secY=0;secY<sectionsInAxisY;secY++) //y axis section
1142      {
1143        if((layerList.get(iter2)).getMultiplierY()>0)
1144        {
1145          ystep=1;
1146          if(secY!=0)
1147          {
1148            yOri=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
1149          }
1150          else
1151          {
1152            yOri=0;
1153          }
1154          if(secY!=sectionsInAxisY-1)
1155          {
1156            yresosize=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
1157          }
1158          else
1159          {
1160            yresosize=(layerList.get(iter2)).getMultiplierY()*edgeLengthY;
1161          }
1162        }
1163        else
1164        {
1165          ystep=-((layerList.get(iter2)).getMultiplierY());
1166          if(secY!=0)
1167          {
1168            yOri=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
1169            yOri=yOri + ystep - yOri % ystep;
1170          }
1171          else
1172          {
1173            yOri=0;
1174          }
1175          if(secY!=sectionsInAxisY-1)
1176          {
1177            yresosize=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
1178            yresosize=yresosize + ystep -  yresosize % ystep;
1179            if(yresosize>edgeLengthY)yresosize=edgeLengthY;
1180          }
1181          else
1182          {
1183            yresosize=edgeLengthY;
1184          }
1185        }
1186      } // END: for y axis sections
1187
1188      secX=bsecX;
1189      secY=bsecY;
1190      //    iter2=bindex;
1191
1192
1193      //    try {
1194      n_neuron = indexmap.get(secX+","+secY+","+iter2);
1195      //    }
1196      //    catch(Exception ex) {
1197      //      throw new RuntimeException("secX"+secX+" secY"+secY+", iter2"+iter2+" indexmap"+indexmap.size()+" layermap:"+layermap.size()+" pre:"+pre+" suf:"+suf);
1198      //    }
1199      int yall = 0;
1200      //      for(iter=xOri;iter<xresosize;iter+=xstep) xall++;
1201      for(iter1=yOri;iter1<yresosize;iter1+=ystep) yall++;
1202
1203
1204      int x = (index - n_neuron)/yall*xstep + xOri;
1205      int y = ((index - n_neuron)%(yall))*ystep + yOri;
1206      int [] out = new int [] {x,y};
1207      return out;
1208    }
1209
1210    /***********************************************************************
1211    *  Give the nethost id, map the cells in a times b,  slow method.
1212    * 
1213    * @param  a parts in X dimension
1214    * @param  b parts in X dimension
1215    * @param  host_id
1216    ***********************************************************************/
1217    @Deprecated
1218    public String celltype_slow(int index) // a sections in x axis , b sections in y axis;
1219    ////////////////////////////////////////////////////////////////////////
1220    {
1221      int iter,iter1,iter2,n_neuron;
1222      int xstep=0,ystep=0,xresosize=0,yresosize=0;
1223      int xOri=0,yOri=0;
1224      int hostId=0;
1225      int secX,secY;
1226      boolean xfound=false,yfound=false;
1227
1228      n_neuron=0;
1229      String str;
1230
1231      //iter2=layermap.get(pre+","+suf);
1232
1233      //Iterator<Integer> iter = indexmap.entrySet(
1234      //    indexmap.put(secX+","+secY+","+iter2,n_neuron);
1235      int bsecX=-1,bsecY=-1,bindex=-1;
1236      boolean exit=false;
1237
1238
1239      for(secX=0;secX<sectionsInAxisX;secX++)
1240      {
1241        for(secY=0;secY<sectionsInAxisX;secY++) // x axis section 
1242        {
1243          for(iter2 = 0 ; iter2< prefixSuffixToLayerIndexMap.size(); iter2++)
1244          {
1245            if(index>=indexmap.get(secX+","+secY+","+iter2))
1246            {
1247              bsecX=secX;
1248              bsecY=secY;
1249              bindex=iter2;
1250            }
1251            if(index<indexmap.get(secX+","+secY+","+iter2))
1252            {  
1253              exit=true;
1254              break;
1255            }
1256          }
1257          if(exit)break;
1258        }
1259        if(exit)break;
1260      }
1261
1262      iter2=bindex;
1263
1264      for(secX=0;secX<sectionsInAxisX;secX++) // x axis section 
1265      {
1266        if((layerList.get(iter2)).getMultiplierX()>0)
1267        {
1268          xstep=1;
1269          if(secX!=0)
1270          {
1271            xOri=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
1272          }
1273          else
1274          {
1275            xOri=0;
1276          }
1277          if(secX!=sectionsInAxisX-1)
1278          {
1279            xresosize=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
1280          }
1281          else
1282          {
1283            xresosize=(layerList.get(iter2)).getMultiplierX()*edgeLengthX;
1284          }
1285        }
1286        else
1287        {
1288          xstep=-((layerList.get(iter2)).getMultiplierX());
1289          if(secX!=0)
1290          {
1291            xOri=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
1292            xOri=xOri + xstep - xOri %xstep;
1293
1294          }
1295          else
1296          {
1297            xOri=0;
1298          }
1299          if(secX!=sectionsInAxisX-1)
1300          {
1301            xresosize=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
1302            xresosize=xresosize + xstep -  xresosize % xstep;
1303            if(xresosize>edgeLengthX)xresosize=edgeLengthX;
1304          }
1305          else
1306          {
1307            xresosize=edgeLengthX;
1308          }
1309        }
1310      }
1311
1312
1313      for(secY=0;secY<sectionsInAxisY;secY++) //y axis section
1314      {
1315        if((layerList.get(iter2)).getMultiplierY()>0)
1316        {
1317          ystep=1;
1318          if(secY!=0)
1319          {
1320            yOri=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
1321          }
1322          else
1323          {
1324            yOri=0;
1325          }
1326          if(secY!=sectionsInAxisY-1)
1327          {
1328            yresosize=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
1329          }
1330          else
1331          {
1332            yresosize=(layerList.get(iter2)).getMultiplierY()*edgeLengthY;
1333          }
1334        }
1335        else
1336        {
1337          ystep=-((layerList.get(iter2)).getMultiplierY());
1338          if(secY!=0)
1339          {
1340            yOri=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
1341            yOri=yOri + ystep - yOri % ystep;
1342          }
1343          else
1344          {
1345            yOri=0;
1346          }
1347          if(secY!=sectionsInAxisY-1)
1348          {
1349            yresosize=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
1350            yresosize=yresosize + ystep -  yresosize % ystep;
1351            if(yresosize>edgeLengthY)yresosize=edgeLengthY;
1352          }
1353          else
1354          {
1355            yresosize=edgeLengthY;
1356          }
1357        }
1358      } // END: for y axis sections
1359
1360      secX=bsecX;
1361      secY=bsecY;
1362      iter2=bindex;
1363
1364
1365      n_neuron = indexmap.get(secX+","+secY+","+iter2);
1366      int yall = 0;
1367      //      for(iter=xOri;iter<xresosize;iter+=xstep) xall++;
1368      for(iter1=yOri;iter1<yresosize;iter1+=ystep) yall++;
1369
1370
1371      int x = (index - n_neuron)/yall*xstep + xOri;
1372      int y = ((index - n_neuron)%(yall))*ystep + yOri;
1373
1374      return layerList.get(iter2).getPrefix()+","+x+","+y+","+layerList.get(iter2).getSuffix();
1375    }
1376
1377    /***********************************************************************
1378    *  Give the nethost id, map the cells in a times b,  fast method.
1379    * 
1380    * @param  a parts in X dimension
1381    * @param  b parts in X dimension
1382    * @param  host_id
1383    ***********************************************************************/
1384    public void  abmapcells (
1385      final int  a,
1386      final int  b,
1387      final int  host_id ) // a sections in x axis , b sections in y axis;
1388    ////////////////////////////////////////////////////////////////////////
1389    {
1390      if ( a * b != nodeCount )
1391      {
1392        throw new  RuntimeException (
1393          "a times b should equal to " + nodeCount );
1394      }
1395      
1396      sectionsInAxisX = a;
1397      
1398      sectionsInAxisY = b;
1399
1400      nodeEndIndices = new int[nodeCount];
1401
1402      int iter,iter1,iter2,n_neuron;
1403      int xstep,ystep,xresosize,yresosize;
1404      int xOri,yOri;
1405      int hostId=0;
1406      numberOfNeurons = totalNumNeurons() ;
1407
1408      //    celltype=new String[numberOfNeurons];
1409
1410      int hostCell=0;
1411      n_neuron=0;
1412      String str;
1413      int cc=0;
1414
1415      //    System.out.println(a+" "+b);
1416
1417      for(int secX=0;secX<a;secX++) // x axis section 
1418      {
1419        for(int secY=0;secY<b;secY++) //y axis section
1420        {
1421
1422          for(iter2=0;iter2<layerList.size();iter2++) // go through all layers
1423          {
1424            if((layerList.get(iter2)).getMultiplierX()>0)
1425            {
1426              xstep=1;
1427              if(secX!=0)
1428              {
1429                xOri=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)a*(double)(secX));
1430              }
1431              else
1432              {
1433                xOri=0;
1434              }
1435              if(secX!=a-1)
1436              {
1437                xresosize=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)a*(double)(secX+1));
1438              }
1439              else
1440              {
1441                xresosize=(layerList.get(iter2)).getMultiplierX()*edgeLengthX;
1442              }
1443            }
1444            else
1445            {
1446              xstep=-((layerList.get(iter2)).getMultiplierX());
1447              if(secX!=0)
1448              {
1449                xOri=(int)((double)edgeLengthX/(double)a*(double)(secX));
1450                xOri=xOri + xstep - xOri %xstep;
1451
1452              }
1453              else
1454              {
1455                xOri=0;
1456              }
1457              if(secX!=a-1)
1458              {
1459                xresosize=(int)((double)edgeLengthX/(double)a*(double)(secX+1));
1460                xresosize=xresosize + xstep -  xresosize % xstep;
1461                if(xresosize>edgeLengthX)xresosize=edgeLengthX;
1462              }
1463              else
1464              {
1465                xresosize=edgeLengthX;
1466              }
1467            }
1468            if((layerList.get(iter2)).getMultiplierY()>0)
1469            {
1470              ystep=1;
1471              if(secY!=0)
1472              {
1473                yOri=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)b*(double)(secY));
1474              }
1475              else
1476              {
1477                yOri=0;
1478              }
1479              if(secY!=b-1)
1480              {
1481                yresosize=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)b*(double)(secY+1));
1482              }
1483              else
1484              {
1485                yresosize=(layerList.get(iter2)).getMultiplierY()*edgeLengthY;
1486              }
1487            }
1488            else
1489            {
1490              ystep=-((layerList.get(iter2)).getMultiplierY());
1491              if(secY!=0)
1492              {
1493                yOri=(int)((double)edgeLengthY/(double)b*(double)(secY));
1494                yOri=yOri + ystep - yOri % ystep;
1495              }
1496              else
1497              {
1498                yOri=0;
1499              }
1500              if(secY!=b-1)
1501              {
1502                yresosize=(int)((double)edgeLengthY/(double)b*(double)(secY+1));
1503                yresosize=yresosize + ystep -  yresosize % ystep;
1504                if(yresosize>edgeLengthY)yresosize=edgeLengthY;
1505              }
1506              else
1507              {
1508                yresosize=edgeLengthY;
1509              }
1510            }
1511
1512            indexmap.put(secX+","+secY+","+iter2,n_neuron);
1513
1514            for(iter=xOri;iter<xresosize;iter+=xstep)
1515            {
1516              for(iter1=yOri;iter1<yresosize;iter1+=ystep)
1517              {
1518                //              System.out.println("x"+iter+" y"+iter1+" layer"+iter2+" host"+(secX*b+secY));
1519
1520                if(hostId == host_id)
1521                {
1522                  hostCell++;
1523                }
1524                //          celltype[n_neuron]= new String(str);
1525                //                cellmap.put(str,n_neuron);
1526                n_neuron++;
1527              }
1528            }
1529          } // END: for layer iteration
1530          nodeEndIndices[hostId]=n_neuron-1;
1531          hostId++;
1532        } // END: for y axis
1533      } // END: for x axis
1534
1535      hostId=0;
1536      celltype = new String[hostCell];
1537      for(int secX=0;secX<a;secX++) // x axis section 
1538      {
1539        for(int secY=0;secY<b;secY++) //y axis section
1540        {
1541
1542          for(iter2=0;iter2<layerList.size();iter2++) // go through all layers
1543          {
1544            if((layerList.get(iter2)).getMultiplierX()>0)
1545            {
1546              xstep=1;
1547              if(secX!=0)
1548              {
1549                xOri=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)a*(double)(secX));
1550              }
1551              else
1552              {
1553                xOri=0;
1554              }
1555              if(secX!=a-1)
1556              {
1557                xresosize=(int)((double)(layerList.get(iter2)).getMultiplierX()*(double)edgeLengthX/(double)a*(double)(secX+1));
1558              }
1559              else
1560              {
1561                xresosize=(layerList.get(iter2)).getMultiplierX()*edgeLengthX;
1562              }
1563            }
1564            else
1565            {
1566              xstep=-((layerList.get(iter2)).getMultiplierX());
1567              if(secX!=0)
1568              {
1569                xOri=(int)((double)edgeLengthX/(double)a*(double)(secX));
1570                xOri=xOri + xstep - xOri %xstep;
1571
1572              }
1573              else
1574              {
1575                xOri=0;
1576              }
1577              if(secX!=a-1)
1578              {
1579                xresosize=(int)((double)edgeLengthX/(double)a*(double)(secX+1));
1580                xresosize=xresosize + xstep -  xresosize % xstep;
1581                if(xresosize>edgeLengthX)xresosize=edgeLengthX;
1582              }
1583              else
1584              {
1585                xresosize=edgeLengthX;
1586              }
1587            }
1588            if((layerList.get(iter2)).getMultiplierY()>0)
1589            {
1590              ystep=1;
1591              if(secY!=0)
1592              {
1593                yOri=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)b*(double)(secY));
1594              }
1595              else
1596              {
1597                yOri=0;
1598              }
1599              if(secY!=b-1)
1600              {
1601                yresosize=(int)((double)(layerList.get(iter2)).getMultiplierY()*(double)edgeLengthY/(double)b*(double)(secY+1));
1602              }
1603              else
1604              {
1605                yresosize=(layerList.get(iter2)).getMultiplierY()*edgeLengthY;
1606              }
1607            }
1608            else
1609            {
1610              ystep=-((layerList.get(iter2)).getMultiplierY());
1611              if(secY!=0)
1612              {
1613                yOri=(int)((double)edgeLengthY/(double)b*(double)(secY));
1614                yOri=yOri + ystep - yOri % ystep;
1615              }
1616              else
1617              {
1618                yOri=0;
1619              }
1620              if(secY!=b-1)
1621              {
1622                yresosize=(int)((double)edgeLengthY/(double)b*(double)(secY+1));
1623                yresosize=yresosize + ystep -  yresosize % ystep;
1624                if(yresosize>edgeLengthY)yresosize=edgeLengthY;
1625              }
1626              else
1627              {
1628                yresosize=edgeLengthY;
1629              }
1630            }
1631            for(iter=xOri;iter<xresosize;iter+=xstep)
1632            {
1633              for(iter1=yOri;iter1<yresosize;iter1+=ystep)
1634              {
1635                if(hostId == host_id)
1636                {
1637
1638                  str = (layerList.get(iter2)).getPrefix() +","+ iter + "," + iter1 +","+ (layerList.get(iter2)).getSuffix();
1639                  celltype[cc] = new String(str);
1640                  cc++;
1641                  hostCell++;
1642                }
1643              }
1644            }
1645          } // END: for layer iteration
1646          hostId++;
1647        } // END: for y axis
1648      }
1649      if(n_neuron!=numberOfNeurons) throw new  RuntimeException("number doesn't match"+n_neuron+" - "+numberOfNeurons);
1650      //    branchmaps=new TreeMap[numberOfNeurons];
1651      //    for(int i=0;i<numberOfNeurons;i++)
1652      //      branchmaps[i]=new TreeMap<String, TreeSet<Synapse>>();
1653      scaffold = new HashMap<Integer, Map<String, SizeID> >();
1654      /*
1655    for(int i=0;i<numberOfNeurons;i++) 
1656    {
1657      scaffold[i]=new TreeMap<String, SizeID>(); 
1658    }
1659       */
1660      //  axons = new Axon[numberOfNeurons];
1661    }
1662
1663    /***********************************************************************
1664    * Compute the total number of neurons
1665    *  
1666    * @return number of neurons
1667    ***********************************************************************/
1668    public int  totalNumNeurons ( )
1669    ////////////////////////////////////////////////////////////////////////
1670    {
1671      int  num = 0;
1672      
1673      int xMul, yMul;
1674      
1675      for ( final Layer  layer : layerList )
1676      {
1677        xMul = layer.getMultiplierX ( );
1678        
1679        yMul = layer.getMultiplierY ( );
1680
1681        if ( xMul < 0 )
1682        {
1683          if ( edgeLengthX % xMul != 0 )
1684          {
1685            throw new RuntimeException (
1686              xMul + "is not a multiplier of x-edge length" + edgeLengthX );
1687          }
1688        }
1689        
1690        if ( yMul < 0 )
1691        {
1692          if ( edgeLengthY % yMul !=0 )
1693          {
1694            throw new RuntimeException (
1695              yMul + "is not a multiplier of y-edge length" + edgeLengthY );
1696          }
1697        }
1698
1699        num += ( xMul > 0 ? edgeLengthX * xMul : edgeLengthX / -xMul )
1700             * ( yMul > 0 ? edgeLengthY * yMul : edgeLengthY / -yMul );
1701      }
1702      
1703      return num;
1704    }
1705
1706    /***********************************************************************
1707    * Find out the number of neurons of a layer, given the layer name
1708    * 
1709    * @param prefix string
1710    * @param suffix string
1711    * @return number of neurons
1712    ***********************************************************************/
1713    public int  layerNumNeurons (
1714      final String  prefix,
1715      final String  suffix )
1716    ////////////////////////////////////////////////////////////////////////
1717    {
1718      final int
1719        index = prefixSuffixToLayerIndexMap.get ( prefix + "," + suffix );
1720      
1721      // while(!( layer_structure.get(iter)).getPrefix().equals(prefix)
1722      //    || !( layer_structure.get(iter)).getSuffix().equals(suffix))
1723      // {
1724      //   iter++;
1725      // }
1726      
1727      final Layer  layer = layerList.get ( index );
1728      
1729      final int
1730        xMultiplier = layer.getMultiplierX ( ),
1731        yMultiplier = layer.getMultiplierY ( );
1732      
1733      int
1734        xstep,
1735        ystep,
1736        xresosize,
1737        yresosize;
1738      
1739      if ( xMultiplier > 0
1740        && yMultiplier > 0 )
1741      {
1742        xstep = 1;
1743        
1744        ystep = 1;
1745        
1746        xresosize = xMultiplier * edgeLengthX;
1747        
1748        yresosize = yMultiplier * edgeLengthY;
1749      }
1750      else if ( xMultiplier > 0
1751             && yMultiplier < 0 )
1752      {
1753        xstep = 1;
1754        
1755        ystep = -yMultiplier;
1756        
1757        xresosize = xMultiplier * edgeLengthX;
1758        
1759        yresosize = edgeLengthY;
1760      }
1761      else if ( xMultiplier < 0
1762             && yMultiplier > 0 )
1763      {
1764        xstep = -xMultiplier;
1765        
1766        ystep = 1;
1767        
1768        xresosize = edgeLengthX;
1769        
1770        yresosize = yMultiplier * edgeLengthY;
1771      }
1772      else
1773      {
1774        xstep = -xMultiplier;
1775        
1776        ystep = -yMultiplier;
1777        
1778        xresosize = edgeLengthX;
1779        
1780        yresosize = edgeLengthY;
1781      }
1782      
1783      return xresosize * yresosize / ( xstep * ystep );
1784    }
1785
1786    public int  getXmultiplier (
1787      final String  prefix,
1788      final String  suffix )
1789    ////////////////////////////////////////////////////////////////////////
1790    {
1791      final String  key = prefix + "," + suffix;
1792      
1793      if ( prefixSuffixToLayerIndexMap.containsKey ( key ) )
1794      {
1795        final int  iter = prefixSuffixToLayerIndexMap.get ( key );
1796        
1797        final Layer  layer = layerList.get ( iter ); 
1798        
1799        return layer.getMultiplierX ( );
1800      }
1801      
1802      return 0;
1803    }
1804
1805    public int  getYmultiplier (
1806      final String  prefix,
1807      final String  suffix )
1808    ////////////////////////////////////////////////////////////////////////
1809    {
1810      final String  key = prefix + "," + suffix;
1811      
1812      if ( prefixSuffixToLayerIndexMap.containsKey ( key ) )
1813      {
1814        final int  iter = prefixSuffixToLayerIndexMap.get ( key );
1815        
1816        final Layer  layer = layerList.get ( iter );
1817        
1818        return layer.getMultiplierY ( );
1819      }
1820      
1821      return 0;
1822    }
1823
1824    /***********************************************************************
1825    * Find out the number of layers starting with prefix string
1826    * 
1827    * @param prefix string
1828    * @return number of layers.
1829    ***********************************************************************/
1830    public int  getLayersize ( final String  prefix )
1831    ////////////////////////////////////////////////////////////////////////
1832    {
1833      int  sum = 0;
1834      
1835      for ( final Layer  layer : layerList )
1836      {
1837        if ( layer.getPrefix ( ).equals ( prefix ) )
1838        {
1839          sum++;
1840        }
1841      }
1842      
1843      return sum;
1844    }
1845
1846    public Layer  getLayer (
1847      final String  prefix,
1848      final String  suffix )
1849    ////////////////////////////////////////////////////////////////////////
1850    {
1851      final String  key = prefix + "," + suffix;
1852      
1853      if ( prefixSuffixToLayerIndexMap.containsKey ( key ) )
1854      {
1855        final int  index = prefixSuffixToLayerIndexMap.get ( key );
1856        
1857        return layerList.get ( index );
1858      }
1859      
1860      return null;
1861    }
1862
1863    /***********************************************************************
1864    * Returns the suffix of the Nth layer with given prefix. 
1865    ***********************************************************************/
1866    public String  getLayerSuffix (
1867      final String  prefix,
1868      final int     index )
1869    ////////////////////////////////////////////////////////////////////////
1870    {
1871      int  matchingPrefixIndex = 0;
1872      
1873      for ( final Layer  layer : layerList )
1874      {
1875        final String  layerPrefix = layer.getPrefix ( );
1876        
1877        if ( layerPrefix.equals ( prefix ) )
1878        {
1879          if ( matchingPrefixIndex == index )
1880          {
1881            return layer.getSuffix ( );
1882          }
1883          
1884          matchingPrefixIndex++;
1885        }
1886      }
1887      
1888      System.err.println ( "no layer matched" );
1889      
1890      return "no layer matched";
1891    }
1892
1893    @Deprecated
1894    public void  connect (
1895      String f_pre,
1896      String f_suf,
1897      String t_pre,
1898      String t_suf,
1899      boolean convergent,
1900      double stre,
1901      byte type,
1902      double delay,
1903      int idum)
1904    ////////////////////////////////////////////////////////////////////////
1905    {
1906      //ONLY MAKE ONCE, THEN COPY AND PASTE AND ADD FILE RETRIEVE FUNCTION.
1907      /*
1908    FileReader fr=null;
1909    try{
1910      fr=new FileReader(filename);
1911    }
1912    catch(FileNotFoundException e)
1913    {
1914      System.err.println("Couldn't get File: " + filename);
1915      System.exit(0);
1916    }
1917    BufferedReader br=new BufferedReader(fr);
1918    String currentLine=br.readline();
1919       */
1920    }
1921
1922    /***********************************************************************
1923    * Build up the Scaffold for later building up network structure.
1924    * 
1925    * L connection
1926    * 
1927    * This method is called from class SimulatorParser
1928    * method parseScaffoldWithPeriodic(int,Element).
1929    ***********************************************************************/
1930    public void  popScaffold (
1931      final String          fromLayerPrefix,
1932      final String          fromLayerSuffix,
1933      final String          toLayerPrefix,
1934      final String          toLayerSuffix,
1935      final boolean         convergent,
1936      final double          strength,
1937      final int             type,
1938      final double          delay,
1939      final double [ ] [ ]  trans,
1940      final int             hostId,
1941      final boolean         periodic )
1942    ////////////////////////////////////////////////////////////////////////
1943    {
1944      // double  maxOutput = -1.0;
1945      
1946      final int
1947        fromLayerMultiplierX
1948          = getXmultiplier ( fromLayerPrefix, fromLayerSuffix ),
1949        fromLayerMultiplierY
1950          = getYmultiplier ( fromLayerPrefix, fromLayerSuffix ),
1951        toLayerMultiplierX
1952          = getXmultiplier ( toLayerPrefix,   toLayerSuffix ),
1953        toLayerMultiplierY
1954          = getYmultiplier ( toLayerPrefix,   toLayerSuffix );
1955      
1956      int
1957        fromLayerStepX, // previously named f_xstep
1958        fromLayerStepY,
1959        fromLayerMultipliedEdgeLengthX, // previously named f_xresosize
1960        fromLayerMultipliedEdgeLengthY;
1961      
1962      int
1963        toLayerStepX, // previously named t_xstep
1964        toLayerStepY,
1965        toLayerMultipliedEdgeLengthX, // previously named t_xresosize
1966        toLayerMultipliedEdgeLengthY;
1967      
1968      int
1969        denomX = 0,
1970        numX   = 0;
1971      
1972      int
1973        denomY = 0,
1974        numY   = 0;
1975      
1976      int
1977        xmagratio = 0,
1978        ymagratio = 0;
1979      
1980      int
1981        xborder,
1982        yborder;
1983      
1984      int
1985        newx = 0,
1986        newy = 0;
1987      
1988      //    double[] curr=new double[2];
1989      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
1990      //    String fromNeur,toNeur;
1991      
1992      int [ ]
1993        xy = new int [ 2 ];
1994
1995      final int
1996        secX = hostId / sectionsInAxisY,
1997        secY = hostId % sectionsInAxisY;
1998
1999      int
2000        fromLayerStepX2, // previously named xstep_ff
2001        fromLayerStepY2,
2002        fromLayerSectionEndX, // previously named xresosize_ff
2003        fromLayerSectionEndY;
2004      
2005      int
2006        toLayerStepX2, // previously named xstep_tt
2007        toLayerStepY2,
2008        toLayerSectionEndX, // previously named xresosize_tt
2009        toLayerSectionEndY;
2010      
2011      int
2012        fromLayerSectionOriginX, // previously named xOri_ff
2013        fromLayerSectionOriginY;
2014      
2015      int
2016        toLayerSectionOriginX, // previously named xOri_tt
2017        toLayerSectionOriginY;
2018
2019      if ( fromLayerMultiplierX > 0 )
2020      {
2021        fromLayerStepX2 = 1;
2022        
2023        final double  fromLayerNeuronsPerSectionX
2024          = fromLayerMultiplierX * edgeLengthX / ( double ) sectionsInAxisX;
2025        
2026        if ( secX != 0 )
2027        {
2028          fromLayerSectionOriginX
2029            = ( int ) ( fromLayerNeuronsPerSectionX * secX );
2030        }
2031        else
2032        {
2033          fromLayerSectionOriginX = 0;
2034        }
2035        
2036        if ( secX != sectionsInAxisX - 1 )
2037        {
2038          fromLayerSectionEndX
2039            = ( int ) ( fromLayerNeuronsPerSectionX * ( secX + 1 ) );
2040        }
2041        else
2042        {
2043          fromLayerSectionEndX = fromLayerMultiplierX * edgeLengthX;
2044        }
2045      }
2046      else // fromLayerMultiplierX <= 0
2047      {
2048        fromLayerStepX2 = -fromLayerMultiplierX;
2049        
2050        if ( secX != 0 )
2051        {
2052          fromLayerSectionOriginX = ( int ) ( ( double ) edgeLengthX
2053            / ( double ) sectionsInAxisX
2054            * ( double ) ( secX ) );
2055          
2056          //  if(xstep_ff==0)System.out.println("pre:"+f_pre+" suf:"+f_suf);
2057          //          try{
2058          
2059          fromLayerSectionOriginX = fromLayerSectionOriginX
2060            + fromLayerStepX2 - fromLayerSectionOriginX % fromLayerStepX2;
2061          
2062          //          }
2063          //          catch(Exception ex)
2064          //          {
2065          //            throw new RuntimeException("pre:"+f_pre+" suf:"+f_suf);
2066          //          }
2067        }
2068        else
2069        {
2070          fromLayerSectionOriginX = 0;
2071        }
2072        
2073        if ( secX != sectionsInAxisX - 1 )
2074        {
2075          fromLayerSectionEndX = ( int ) ( ( double ) edgeLengthX
2076            / ( double ) sectionsInAxisX
2077            * ( double ) ( secX + 1 ) );
2078          
2079          fromLayerSectionEndX = fromLayerSectionEndX
2080            + fromLayerStepX2 -  fromLayerSectionEndX % fromLayerStepX2;
2081          
2082          if ( fromLayerSectionEndX > edgeLengthX )
2083          {
2084            fromLayerSectionEndX=edgeLengthX;
2085          }
2086        }
2087        else
2088        {
2089          fromLayerSectionEndX = edgeLengthX;
2090        }
2091      }
2092      
2093      if ( fromLayerMultiplierY > 0 )
2094      {
2095        fromLayerStepY2 = 1;
2096        
2097        final double  fromLayerNeuronsPerSectionY
2098          = fromLayerMultiplierY * edgeLengthY / ( double ) sectionsInAxisY;
2099        
2100        if ( secY != 0 )
2101        {
2102          fromLayerSectionOriginY
2103            = ( int ) ( fromLayerNeuronsPerSectionY * secY );
2104        }
2105        else
2106        {
2107          fromLayerSectionOriginY = 0;
2108        }
2109        
2110        if ( secY != sectionsInAxisY - 1 )
2111        {
2112          fromLayerSectionEndY = ( int )
2113            ( fromLayerNeuronsPerSectionY * ( double ) ( secY + 1 ) );
2114        }
2115        else
2116        {
2117          fromLayerSectionEndY = fromLayerMultiplierY * edgeLengthY;
2118        }
2119      }
2120      else  // fromLayerMultiplierY <= 0
2121      {
2122        fromLayerStepY2 = -fromLayerMultiplierY;
2123        
2124        if ( secY != 0 )
2125        {
2126          fromLayerSectionOriginY = ( int ) ( ( double ) edgeLengthY
2127            / ( double ) sectionsInAxisY * ( double ) ( secY ) );
2128          
2129          fromLayerSectionOriginY = fromLayerSectionOriginY
2130            + fromLayerStepY2 - fromLayerSectionOriginY % fromLayerStepY2;
2131        }
2132        else
2133        {
2134          fromLayerSectionOriginY = 0;
2135        }
2136        
2137        if ( secY != sectionsInAxisY - 1 )
2138        {
2139          fromLayerSectionEndY = ( int ) ( ( double ) edgeLengthY
2140            / ( double ) sectionsInAxisY * ( double ) ( secY + 1 ) );
2141          
2142          fromLayerSectionEndY = fromLayerSectionEndY
2143            + fromLayerStepY2 -  fromLayerSectionEndY % fromLayerStepY2;
2144          
2145          if ( fromLayerSectionEndY > edgeLengthY )
2146          {
2147            fromLayerSectionEndY = edgeLengthY;
2148          }
2149        }
2150        else
2151        {
2152          fromLayerSectionEndY = edgeLengthY;
2153        }
2154      }
2155
2156      if ( toLayerMultiplierX > 0 )
2157      {
2158        toLayerStepX2 = 1;
2159        
2160        final double  toLayerNeuronsPerSectionX
2161          = toLayerMultiplierX * edgeLengthX / ( double ) sectionsInAxisX;        
2162        
2163        if ( secX != 0 )
2164        {
2165          toLayerSectionOriginX
2166            = ( int ) ( toLayerNeuronsPerSectionX * secX );
2167        }
2168        else
2169        {
2170          toLayerSectionOriginX = 0;
2171        }
2172        
2173        if ( secX != sectionsInAxisX - 1 )
2174        {
2175          toLayerSectionEndX
2176            = ( int ) ( toLayerNeuronsPerSectionX * ( secX + 1 ) );
2177        }
2178        else
2179        {
2180          toLayerSectionEndX = toLayerMultiplierX * edgeLengthX;
2181        }
2182      }
2183      else
2184      {
2185        toLayerStepX2 = -toLayerMultiplierX;
2186        
2187        if ( secX != 0 )
2188        {
2189          toLayerSectionOriginX = ( int ) ( ( double ) edgeLengthX
2190            / ( double ) sectionsInAxisX * ( double ) ( secX ) );
2191          
2192          toLayerSectionOriginX = toLayerSectionOriginX
2193            + toLayerStepX2 - toLayerSectionOriginX % toLayerStepX2;
2194        }
2195        else
2196        {
2197          toLayerSectionOriginX = 0;
2198        }
2199        
2200        if ( secX != sectionsInAxisX - 1 )
2201        {
2202          toLayerSectionEndX = ( int ) ( ( double ) edgeLengthX
2203            / ( double ) sectionsInAxisX * ( double ) ( secX + 1 ) );
2204          
2205          toLayerSectionEndX = toLayerSectionEndX
2206            + toLayerStepX2 -  toLayerSectionEndX % toLayerStepX2;
2207          
2208          if ( toLayerSectionEndX > edgeLengthX )
2209          {
2210            toLayerSectionEndX = edgeLengthX;
2211          }
2212        }
2213        else
2214        {
2215          toLayerSectionEndX = edgeLengthX;
2216        }
2217      }
2218      
2219      if ( toLayerMultiplierY > 0 )
2220      {
2221        toLayerStepY2 = 1;
2222        
2223        final double  toLayerNeuronsPerSectionY
2224          = toLayerMultiplierY * edgeLengthY / ( double ) sectionsInAxisY;        
2225      
2226        if ( secY != 0 )
2227        {
2228          toLayerSectionOriginY
2229            = ( int ) ( toLayerNeuronsPerSectionY * secY );
2230        }
2231        else
2232        {
2233          toLayerSectionOriginY = 0;
2234        }
2235        
2236        if ( secY != sectionsInAxisY - 1 )
2237        {
2238          toLayerSectionEndY
2239            = ( int ) ( toLayerNeuronsPerSectionY * ( secY + 1 ) );
2240        }
2241        else
2242        {
2243          toLayerSectionEndY = toLayerMultiplierY * edgeLengthY;
2244        }
2245      }
2246      else
2247      {
2248        toLayerStepY2 = -toLayerMultiplierY;
2249        
2250        if ( secY != 0 )
2251        {
2252          toLayerSectionOriginY = ( int ) ( ( double ) edgeLengthY
2253            / ( double ) sectionsInAxisY * ( double ) ( secY ) );
2254          
2255          toLayerSectionOriginY = toLayerSectionOriginY
2256            + toLayerStepY2 - toLayerSectionOriginY % toLayerStepY2;
2257        }
2258        else
2259        {
2260          toLayerSectionOriginY = 0;
2261        }
2262        
2263        if ( secY != sectionsInAxisY - 1 )
2264        {
2265          toLayerSectionEndY = ( int ) ( ( double ) edgeLengthY
2266            / ( double ) sectionsInAxisY * ( double ) ( secY + 1 ) );
2267          
2268          toLayerSectionEndY = toLayerSectionEndY
2269            + toLayerStepY2 -  toLayerSectionEndY % toLayerStepY2;
2270          
2271          if ( toLayerSectionEndY > edgeLengthY )
2272          {
2273            toLayerSectionEndY = edgeLengthY;
2274          }
2275        }
2276        else
2277        {
2278          toLayerSectionEndY = edgeLengthY;
2279        }
2280      }
2281
2282      // these may not be useful for new neuronal model
2283      
2284      if ( type == 1
2285        && strength > 0 )
2286      {
2287        throw new RuntimeException ( "sign of connection is wrong" );
2288      }
2289      
2290      if ( type == 0
2291        && strength < 0 )
2292      {
2293        throw new RuntimeException ( "sign of connection is wrong" );
2294      }
2295
2296      if ( strength != 0 )
2297      {
2298        if ( fromLayerMultiplierX > 0 )
2299        {
2300          fromLayerStepX = 1;
2301          
2302          fromLayerMultipliedEdgeLengthX
2303            = fromLayerMultiplierX * edgeLengthX;
2304        }
2305        else
2306        {
2307          fromLayerStepX = -fromLayerMultiplierX;
2308          
2309          fromLayerMultipliedEdgeLengthX = edgeLengthX;
2310        }
2311        
2312        if ( fromLayerMultiplierY > 0 )
2313        {
2314          fromLayerStepY = 1;
2315          
2316          fromLayerMultipliedEdgeLengthY
2317            = fromLayerMultiplierY * edgeLengthY;
2318        }
2319        else
2320        {
2321          fromLayerStepY = -fromLayerMultiplierY;
2322          
2323          fromLayerMultipliedEdgeLengthY = edgeLengthY;
2324        }
2325        
2326        if ( toLayerMultiplierX > 0 )
2327        {
2328          toLayerStepX = 1;
2329          
2330          toLayerMultipliedEdgeLengthX = toLayerMultiplierX * edgeLengthX;
2331        }
2332        else
2333        {
2334          toLayerStepX = -toLayerMultiplierX;
2335          
2336          toLayerMultipliedEdgeLengthX = edgeLengthX;
2337        }
2338        
2339        if ( toLayerMultiplierY > 0 )
2340        {
2341          toLayerStepY = 1;
2342          
2343          toLayerMultipliedEdgeLengthY = toLayerMultiplierY * edgeLengthY;
2344        }
2345        else
2346        {
2347          toLayerStepY = -toLayerMultiplierY;
2348          
2349          toLayerMultipliedEdgeLengthY = edgeLengthY;
2350        }
2351
2352        double [ ] [ ]  conn;
2353
2354        //find out the post synaptic neurons belong to which host?
2355          /*
2356      if(convergent) //convergence connections from many to 1, first iterate to side
2357      {
2358        conn = FunUtil.lRotate90(trans);
2359
2360        if(t_xmulti<0&&f_xmulti>0)
2361        {
2362          numX = 1;
2363          denomX = f_xmulti;
2364        }
2365        else if(t_xmulti<0&&f_xmulti<0)
2366        {
2367          numX = 1;
2368          denomX = 1;
2369        }
2370        else if(t_xmulti>0&&f_xmulti>0)
2371        {
2372          numX = t_xmulti;
2373          denomX = f_xmulti;
2374        }
2375        else if(t_xmulti>0&&f_xmulti<0)
2376        {
2377          numX = t_xmulti;
2378          denomX = 1;
2379        }
2380
2381
2382        if(t_ymulti<0&&f_ymulti>0)
2383        {
2384          numY = 1;
2385          denomY = f_ymulti;
2386        }
2387        else if(t_ymulti<0&&f_ymulti<0)
2388        {
2389          numY = 1;
2390          denomY = 1;
2391        }
2392        else if(t_ymulti>0&&f_ymulti>0)
2393        {
2394          numY = t_ymulti;
2395          denomY = f_ymulti;
2396        }
2397        else if(t_ymulti>0&&f_ymulti<0)
2398        {
2399          numY = t_ymulti;
2400          denomY = 1;
2401        }
2402
2403        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
2404        {
2405          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
2406          {
2407            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
2408            xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
2409
2410            newx=xy[0];
2411            newy=xy[1];
2412            //              if(neuronID == 18400 && t_pre.equals("SE") && t_suf.equals("U3") ) throw new RuntimeException("18400  has a target at host 6\n"+"x:"+(newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep)))+1)*(t_xstep))+"x:"+(newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep))))*(t_xstep))+" y:"+(newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep)))+1)*(t_ystep))+" y:"+(newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep))))*(t_ystep))+" \n center"+newx+","+newy);
2413            for(int itxx=newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep)))+1)*(t_xstep);itxx<=newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep))))*(t_xstep);itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
2414            {
2415              for(int ityy=newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep)))+1)*(t_ystep);ityy<=newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep))))*(t_ystep);ityy+=t_ystep)  
2416              {
2417                if(periodic)
2418                {
2419                  xborder = itxx % t_xresosize;
2420                  yborder = ityy % t_yresosize;
2421                  if(xborder<0) xborder+=t_xresosize;
2422                  if(yborder<0) yborder+=t_yresosize;
2423                }
2424                else
2425                {
2426                  if(itxx >= t_xresosize || itxx < 0 || ityy >= t_yresosize || ityy<0) // out of boundary
2427                  {
2428                    continue;
2429                  }
2430                  else //within boundary
2431                  {
2432                    xborder = itxx;
2433                    yborder = ityy;
2434                  }
2435                }
2436
2437
2438
2439
2440                int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
2441
2442
2443                int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/f_xstep+(((conn.length%2)==0?conn.length-1:conn.length)/2);
2444                int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/f_ystep+(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2);
2445                if(maX>=0 && maX < conn.length && maY>=0 && maY < conn[0].length )
2446                {
2447                  if(Math.abs(conn[maX][maY])!=0)
2448                  {
2449
2450                    int node=FunUtil.hostId(nodeEndIndices,toIndex);
2451                    //  if(neuronID == 18400 && node == 6 ) throw new RuntimeException("18400 "+f_pre+","+f_suf+","+iterx+","+itery+" has a target at host 6\n"+18400+" connects to"+toIndex+" "+t_pre+","+t_suf+","+xborder+","+yborder+" ,which is at 6");
2452                    if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
2453                    {
2454                      neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
2455
2456                    }
2457                  }
2458                }
2459
2460
2461              }
2462            }
2463
2464          }
2465        }
2466      }
2467      else //divergent
2468      {
2469        conn = FunUtil.rRotate90(trans);
2470        if(t_xmulti<0&&f_xmulti>0)
2471        {
2472          numX = 1;
2473          denomX = f_xmulti;
2474        }
2475        else if(t_xmulti<0&&f_xmulti<0)
2476        {
2477          numX = 1;
2478          denomX = 1;
2479        }
2480        else if(t_xmulti>0&&f_xmulti>0)
2481        {
2482          numX = t_xmulti;
2483          denomX = f_xmulti;
2484        }
2485        else if(t_xmulti>0&&f_xmulti<0)
2486        {
2487          numX = t_xmulti;
2488          denomX = 1;
2489        }
2490
2491
2492        if(t_ymulti<0&&f_ymulti>0)
2493        {
2494          numY = 1;
2495          denomY = f_ymulti;
2496        }
2497        else if(t_ymulti<0&&f_ymulti<0)
2498        {
2499          numY = 1;
2500          denomY = 1;
2501        }
2502        else if(t_ymulti>0&&f_ymulti>0)
2503        {
2504          numY = t_ymulti;
2505          denomY = f_ymulti;
2506        }
2507        else if(t_ymulti>0&&f_ymulti<0)
2508        {
2509          numY = t_ymulti;
2510          denomY = 1;
2511        }
2512        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
2513        {
2514          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
2515          {
2516            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
2517            if( neuronID <= neuron_end && neuronID >= base  )
2518            {
2519              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
2520
2521              newx=xy[0];
2522              newy=xy[1];
2523
2524              for(int itxx=newx-conn.length/2*t_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*t_xstep;itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
2525
2526              {
2527                for(int ityy=newy-conn[0].length/2*t_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*t_ystep;ityy+=t_ystep)
2528                {
2529                  if(periodic)
2530                  {
2531                    xborder = itxx % t_xresosize;
2532                    yborder = ityy % t_yresosize;
2533                    if(xborder<0) xborder+=t_xresosize;
2534                    if(yborder<0) yborder+=t_yresosize;
2535                  }
2536                  else
2537                  {
2538                    if(itxx >= t_xresosize || itxx < 0 || ityy >= t_yresosize || ityy<0) // out of boundary
2539                    {
2540                      continue;
2541                    }
2542                    else //within boundary
2543                    {
2544                      xborder = itxx;
2545                      yborder = ityy;
2546                    }
2547                  }
2548
2549                  int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
2550
2551
2552//                  synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses;                
2553                  if(Math.abs(conn[(itxx-newx+conn.length/2*t_xstep)/t_xstep][(ityy-newy+conn[0].length/2*t_ystep)/t_ystep])!=0)
2554                  {
2555                      int node=FunUtil.hostId(nodeEndIndices,toIndex);
2556                      if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
2557                      {
2558                        neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
2559
2560                      }
2561
2562                  }
2563
2564
2565                }
2566              }
2567            }
2568
2569          }
2570        }
2571
2572      }
2573           */
2574
2575
2576        //  make connections here.
2577        
2578        if ( convergent )
2579        {
2580          // convergence connections from many to 1, first iterate to side
2581
2582          conn = FunUtil.rRotate90 ( trans );
2583          
2584          if ( toLayerMultiplierX   < 0
2585            && fromLayerMultiplierX > 0 )
2586          {
2587            numX = fromLayerMultiplierX;
2588            
2589            denomX = 1;
2590          }
2591          else if ( toLayerMultiplierX < 0
2592            && fromLayerMultiplierX    < 0 )
2593          {
2594            numX = 1;
2595            
2596            denomX = 1;
2597          }
2598          else if ( toLayerMultiplierX > 0
2599            && fromLayerMultiplierX    > 0 )
2600          {
2601            numX = fromLayerMultiplierX;
2602            
2603            denomX = toLayerMultiplierX;
2604          }
2605          else if ( toLayerMultiplierX > 0
2606            && fromLayerMultiplierX    < 0 )
2607          {
2608            numX = 1;
2609            
2610            denomX = toLayerMultiplierX;
2611          }
2612
2613          if ( toLayerMultiplierY   < 0
2614            && fromLayerMultiplierY > 0 )
2615          {
2616            numY = fromLayerMultiplierY;
2617            
2618            denomY = 1;
2619          }
2620          else if ( toLayerMultiplierY < 0
2621            && fromLayerMultiplierY    < 0 )
2622          {
2623            numY = 1;
2624            
2625            denomY = 1;
2626          }
2627          else if ( toLayerMultiplierY > 0
2628            && fromLayerMultiplierY    > 0 )
2629          {
2630            numY = fromLayerMultiplierY;
2631            
2632            denomY = toLayerMultiplierY;
2633          }
2634          else if ( toLayerMultiplierY > 0
2635            && fromLayerMultiplierY    < 0 )
2636          {
2637            numY = 1;
2638            
2639            denomY = toLayerMultiplierY;
2640          }
2641
2642          for ( int  toLayerX = toLayerSectionOriginX;
2643            toLayerX < toLayerSectionEndX;
2644            toLayerX += toLayerStepX2 )
2645          {
2646            for ( int  toLayerY = toLayerSectionOriginY;
2647              toLayerY < toLayerSectionEndY;
2648              toLayerY += toLayerStepY2 )
2649            {
2650              final int  neuronID = cellmap_slow (
2651                toLayerPrefix,
2652                toLayerSuffix,
2653                toLayerX,
2654                toLayerY );
2655
2656              xy = closePoint (
2657                ( int ) ( ( double ) numX / ( double ) denomX * toLayerX ),
2658                ( int ) ( ( double ) numY / ( double ) denomY * toLayerY ),
2659                fromLayerPrefix,
2660                fromLayerSuffix );
2661              
2662              newx = xy [ 0 ];
2663              
2664              newy = xy [ 1 ];       
2665              
2666// TODO:  left off cleaning up source code here              
2667
2668              // if(neuronID == 59404
2669              //   && f_pre.equals("ONLGN")
2670              //   && f_suf.equals("E"))
2671              //   throw new RuntimeException(
2672              //     "find to and from neuron\n"
2673              //     +"x:"+(newx-conn.length/2*f_xstep)
2674              //     +"x:"+(newx+((conn.length%2)==0
2675              //     ?conn.length:conn.length+1)/2*f_xstep)
2676              //     +" y:"+(newy-conn[0].length/2*f_ystep)
2677              //     +" y:"+(newy+((conn[0].length%2)==0
2678              //     ?conn[0].length:conn[0].length+1)/2*f_ystep)
2679              //     +" \n center"+newx+","+newy);
2680
2681              for(int itxx=newx-conn.length/2*fromLayerStepX;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*fromLayerStepX;itxx+=fromLayerStepX) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
2682              {
2683                for(int ityy=newy-conn[0].length/2*fromLayerStepY;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*fromLayerStepY;ityy+=fromLayerStepY)
2684                {
2685                  if(periodic)
2686                  {
2687                    xborder = itxx % fromLayerMultipliedEdgeLengthX;
2688                    yborder = ityy % fromLayerMultipliedEdgeLengthY;
2689                    if(xborder<0) xborder+=fromLayerMultipliedEdgeLengthX;
2690                    if(yborder<0) yborder+=fromLayerMultipliedEdgeLengthY;
2691                  }
2692                  else
2693                  {
2694                    if(itxx >= fromLayerMultipliedEdgeLengthX || itxx < 0 || ityy >= fromLayerMultipliedEdgeLengthY || ityy<0) // out of boundary
2695                    {
2696                      continue;
2697                    }
2698                    else //within boundary
2699                    {
2700                      xborder = itxx;
2701                      yborder = ityy;
2702                    }
2703                  }
2704
2705                  int fromIndex =  cellmap_slow(fromLayerPrefix,fromLayerSuffix,xborder,yborder);
2706
2707                  //    if(neuronID == 59404 && fromIndex == 18400) throw new RuntimeException("find to and from neuron");
2708                  if(Math.abs(conn[(itxx-newx+conn.length/2*fromLayerStepX)/fromLayerStepX][(ityy-newy+conn[0].length/2*fromLayerStepY)/fromLayerStepY])!=0)
2709                  {
2710                    //  if(fromIndex == 18400 && hostId == 6 ) throw new RuntimeException("couting 18400 now");
2711
2712                    //  try {
2713                    Map<String, SizeID> content;
2714                    if(!scaffold.containsKey(fromIndex))  
2715                    {
2716                      scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
2717                    }
2718                    else
2719                    {
2720                      content = scaffold.get(fromIndex);
2721                    }
2722
2723                    if(!content.containsKey(String.valueOf(delay)))
2724                    {
2725                      int totSize=content.size(); // number of branches 
2726                      content.put(String.valueOf(delay), new SizeID(totSize,1));
2727                    }
2728                    else
2729                    {
2730                      (content.get(String.valueOf(delay)).size)++;
2731                    }
2732                    //  }
2733
2734                    //  catch(Exception ex) {
2735                    //    throw new RuntimeException("size"+scaffold.length+" fromIndex"+fromIndex+" total"+totalNumNeurons());
2736                    //      }
2737                  }
2738
2739                }
2740              }
2741
2742            }
2743          }
2744
2745
2746        }
2747        else //divergent // change it into convergent
2748        {
2749          conn = FunUtil.lRotate90(trans);
2750          
2751          if(toLayerMultiplierX<0&&fromLayerMultiplierX>0)
2752          {
2753            numX = fromLayerMultiplierX;
2754            denomX = 1;
2755          }
2756          else if(toLayerMultiplierX<0&&fromLayerMultiplierX<0)
2757          {
2758            numX = 1;
2759            denomX = 1;
2760          }
2761          else if(toLayerMultiplierX>0&&fromLayerMultiplierX>0)
2762          {
2763            numX = fromLayerMultiplierX;
2764            denomX = toLayerMultiplierX;
2765          }
2766          else if(toLayerMultiplierX>0&&fromLayerMultiplierX<0)
2767          {
2768            numX = 1;
2769            denomX = toLayerMultiplierX;
2770          }
2771
2772
2773          if(toLayerMultiplierY<0&&fromLayerMultiplierY>0)
2774          {
2775            numY = fromLayerMultiplierY;
2776            denomY = 1;
2777          }
2778          else if(toLayerMultiplierY<0&&fromLayerMultiplierY<0)
2779          {
2780            numY = 1;
2781            denomY = 1;
2782          }
2783          else if(toLayerMultiplierY>0&&fromLayerMultiplierY>0)
2784          {
2785            numY = fromLayerMultiplierY;
2786            denomY = toLayerMultiplierY;
2787          }
2788          else if(toLayerMultiplierY>0&&fromLayerMultiplierY<0)
2789          {
2790            numY = 1;
2791            denomY = toLayerMultiplierY;
2792          }
2793
2794          for(int iterx=toLayerSectionOriginX;iterx<toLayerSectionEndX;iterx+=toLayerStepX2)
2795          {
2796            for(int itery=toLayerSectionOriginY;itery<toLayerSectionEndY;itery+=toLayerStepY2)
2797            {
2798              int neuronID=cellmap_slow(toLayerPrefix,toLayerSuffix,iterx,itery);
2799
2800              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), fromLayerPrefix, fromLayerSuffix);
2801              newx=xy[0];
2802              newy=xy[1];            
2803
2804              for(int itxx=newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)toLayerStepX/(double)fromLayerStepX)))+1)*(fromLayerStepX);itxx<=newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)toLayerStepX/(double)fromLayerStepX))))*(fromLayerStepX);itxx+=fromLayerStepX) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
2805              {
2806                for(int ityy=newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)toLayerStepY/(double)denomY/(double)fromLayerStepY)))+1)*(fromLayerStepY);ityy<=newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)toLayerStepY/(double)denomY/(double)fromLayerStepY))))*(fromLayerStepY);ityy+=fromLayerStepY)  
2807                {
2808                  if(periodic)
2809                  {
2810                    xborder = itxx % fromLayerMultipliedEdgeLengthX;
2811                    yborder = ityy % fromLayerMultipliedEdgeLengthY;
2812                    if(xborder<0) xborder+=fromLayerMultipliedEdgeLengthX;
2813                    if(yborder<0) yborder+=fromLayerMultipliedEdgeLengthY;
2814                  }
2815                  else
2816                  {
2817                    if(itxx >= fromLayerMultipliedEdgeLengthX || itxx < 0 || ityy >= fromLayerMultipliedEdgeLengthY || ityy<0) // out of boundary
2818                    {
2819                      continue;
2820                    }
2821                    else //within boundary
2822                    {
2823                      xborder = itxx;
2824                      yborder = ityy;
2825                    }
2826                  }
2827
2828                  int fromIndex = cellmap_slow(fromLayerPrefix,fromLayerSuffix,xborder,yborder);
2829
2830                  int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/toLayerStepX+(((conn.length%2)==0?conn.length-1:conn.length)/2);
2831                  int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/toLayerStepY+(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2);
2832
2833                  if(maX>=0 && maX < conn.length && maY>=0 && maY < conn[0].length )
2834                  {
2835                    if(Math.abs(conn[maX][maY])!=0)
2836                    {
2837                      Map<String, SizeID> content;
2838                      if(!scaffold.containsKey(fromIndex))  
2839                      {
2840                        scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
2841                      }
2842                      else
2843                      {
2844                        content = scaffold.get(fromIndex);
2845                      }
2846
2847                      if(!content.containsKey(String.valueOf(delay)))
2848                      {
2849                        int totSize=content.size(); // number of branches 
2850                        content.put(String.valueOf(delay), new SizeID(totSize,1));
2851                      }
2852                      else
2853                      {
2854                        (content.get(String.valueOf(delay)).size)++;
2855                      }
2856                    }
2857                  }
2858                }
2859              }
2860            }
2861          }
2862        }
2863      }
2864    }
2865
2866    /***********************************************************************
2867    *  Build up the Scaffold for later buiding up network structure. L connection probability connection
2868    * 
2869    * @param f_pre
2870    * @param f_suf
2871    * @param t_pre
2872    * @param t_suf
2873    * @param convergent
2874    * @param stre
2875    * @param type
2876    * @param delay
2877    * @param trans
2878    * @param hostId
2879    * @param periodic
2880    ***********************************************************************/
2881    public void popScaffold(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] proma, double [][] strma, int hostId, boolean periodic) // probability connections
2882    ////////////////////////////////////////////////////////////////////////
2883    {
2884      if(strma!=null && (proma.length != strma.length  || proma[0].length != strma[0].length)) throw new RuntimeException("matrix size doesn't match for probability connection");
2885
2886      double maxOutput=-1.0;
2887      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
2888      f_xmulti=getXmultiplier(f_pre,f_suf);
2889      f_ymulti=getYmultiplier(f_pre,f_suf);
2890      t_xmulti=getXmultiplier(t_pre,t_suf);
2891      t_ymulti=getYmultiplier(t_pre,t_suf);
2892      int f_xstep,f_ystep,f_xresosize,f_yresosize;
2893      int t_xstep,t_ystep,t_xresosize,t_yresosize;
2894      int denomX=0,numX=0;
2895      int denomY=0,numY=0;
2896      int xmagratio=0;
2897      int ymagratio=0;
2898      int xborder,yborder;
2899      int newx=0;
2900      int newy=0;
2901      //    double[] curr=new double[2];
2902      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
2903      //    String fromNeur,toNeur;
2904      int[] xy=new int[2];
2905
2906      int secX = hostId/sectionsInAxisY;
2907      int secY = hostId%sectionsInAxisY;
2908
2909      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
2910      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
2911      int xOri_ff,yOri_ff;
2912      int xOri_tt,yOri_tt;
2913
2914
2915      if(f_xmulti>0)
2916      {
2917        xstep_ff=1;
2918        if(secX!=0)
2919        {
2920          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
2921        }
2922        else
2923        {
2924          xOri_ff=0;
2925        }
2926        if(secX!=sectionsInAxisX-1)
2927        {
2928          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
2929        }
2930        else
2931        {
2932          xresosize_ff=f_xmulti*edgeLengthX;
2933        }
2934      }
2935      else
2936      {
2937        xstep_ff=-f_xmulti;
2938        if(secX!=0)
2939        {
2940          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
2941          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
2942        }
2943        else
2944        {
2945          xOri_ff=0;
2946        }
2947        if(secX!=sectionsInAxisX-1)
2948        {
2949          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
2950          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
2951          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
2952        }
2953        else
2954        {
2955          xresosize_ff=edgeLengthX;
2956        }
2957      }
2958      if(f_ymulti>0)
2959      {
2960        ystep_ff=1;
2961        if(secY!=0)
2962        {
2963          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
2964        }
2965        else
2966        {
2967          yOri_ff=0;
2968        }
2969        if(secY!=sectionsInAxisY-1)
2970        {
2971          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
2972        }
2973        else
2974        {
2975          yresosize_ff=f_ymulti*edgeLengthY;
2976        }
2977      }
2978      else
2979      {
2980        ystep_ff=-f_ymulti;
2981        if(secY!=0)
2982        {
2983          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
2984          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
2985        }
2986        else
2987        {
2988          yOri_ff=0;
2989        }
2990        if(secY!=sectionsInAxisY-1)
2991        {
2992          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
2993          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
2994          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
2995        }
2996        else
2997        {
2998          yresosize_ff=edgeLengthY;
2999        }
3000      }
3001
3002      if(t_xmulti>0)
3003      {
3004        xstep_tt=1;
3005        if(secX!=0)
3006        {
3007          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
3008        }
3009        else
3010        {
3011          xOri_tt=0;
3012        }
3013        if(secX!=sectionsInAxisX-1)
3014        {
3015          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
3016        }
3017        else
3018        {
3019          xresosize_tt=t_xmulti*edgeLengthX;
3020        }
3021      }
3022      else
3023      {
3024        xstep_tt=-t_xmulti;
3025        if(secX!=0)
3026        {
3027          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
3028          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
3029        }
3030        else
3031        {
3032          xOri_tt=0;
3033        }
3034        if(secX!=sectionsInAxisX-1)
3035        {
3036          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
3037          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
3038          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
3039        }
3040        else
3041        {
3042          xresosize_tt=edgeLengthX;
3043        }
3044      }
3045      if(t_ymulti>0)
3046      {
3047        ystep_tt=1;
3048        if(secY!=0)
3049        {
3050          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
3051        }
3052        else
3053        {
3054          yOri_tt=0;
3055        }
3056        if(secY!=sectionsInAxisY-1)
3057        {
3058          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
3059        }
3060        else
3061        {
3062          yresosize_tt=t_ymulti*edgeLengthY;
3063        }
3064      }
3065      else
3066      {
3067        ystep_tt=-t_ymulti;
3068        if(secY!=0)
3069        {
3070          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
3071          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
3072        }
3073        else
3074        {
3075          yOri_tt=0;
3076        }
3077        if(secY!=sectionsInAxisY-1)
3078        {
3079          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
3080          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
3081          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
3082        }
3083        else
3084        {
3085          yresosize_tt=edgeLengthY;
3086        }
3087      }
3088
3089      if(type==1&&stre>0) // these maynot be useful for new neuronal model
3090      throw new RuntimeException("sign of connection is wrong");
3091      if(type==0&&stre<0)
3092        throw new RuntimeException("sign of connection is wrong");
3093
3094
3095
3096      if(stre!=0)
3097      {
3098        if(f_xmulti>0)
3099        {
3100          f_xstep=1;
3101          f_xresosize=f_xmulti*edgeLengthX;
3102        }
3103        else
3104        {
3105          f_xstep=-f_xmulti;
3106          f_xresosize=edgeLengthX;
3107        }
3108        if(f_ymulti>0)
3109        {
3110          f_ystep=1;
3111          f_yresosize=f_ymulti*edgeLengthY;
3112        }
3113        else
3114        {
3115          f_ystep=-f_ymulti;
3116          f_yresosize=edgeLengthY;
3117        }
3118        if(t_xmulti>0)
3119        {
3120          t_xstep=1;
3121          t_xresosize=t_xmulti*edgeLengthX;
3122        }
3123        else
3124        {
3125          t_xstep=-t_xmulti;
3126          t_xresosize=edgeLengthX;
3127        }
3128        if(t_ymulti>0)
3129        {
3130          t_ystep=1;
3131          t_yresosize=t_ymulti*edgeLengthY;
3132        }
3133        else
3134        {
3135          t_ystep=-t_ymulti;
3136          t_yresosize=edgeLengthY;
3137        }
3138
3139        double [][] conn=null;
3140        double [][] pconn;
3141        //find out the post synaptic neurons belong to which host?
3142          /*
3143      if(convergent) //convergence connections from many to 1, first iterate to side
3144      {
3145        if(strma!=null) conn = FunUtil.lRotate90(strma);
3146        pconn = FunUtil.lRotate90(proma);
3147
3148        if(t_xmulti<0&&f_xmulti>0)
3149        {
3150          numX = 1;
3151          denomX = f_xmulti;
3152        }
3153        else if(t_xmulti<0&&f_xmulti<0)
3154        {
3155          numX = 1;
3156          denomX = 1;
3157        }
3158        else if(t_xmulti>0&&f_xmulti>0)
3159        {
3160          numX = t_xmulti;
3161          denomX = f_xmulti;
3162        }
3163        else if(t_xmulti>0&&f_xmulti<0)
3164        {
3165          numX = t_xmulti;
3166          denomX = 1;
3167        }
3168
3169
3170        if(t_ymulti<0&&f_ymulti>0)
3171        {
3172          numY = 1;
3173          denomY = f_ymulti;
3174        }
3175        else if(t_ymulti<0&&f_ymulti<0)
3176        {
3177          numY = 1;
3178          denomY = 1;
3179        }
3180        else if(t_ymulti>0&&f_ymulti>0)
3181        {
3182          numY = t_ymulti;
3183          denomY = f_ymulti;
3184        }
3185        else if(t_ymulti>0&&f_ymulti<0)
3186        {
3187          numY = t_ymulti;
3188          denomY = 1;
3189        }
3190
3191        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
3192        {
3193          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
3194          {
3195            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
3196            xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
3197
3198            newx=xy[0];
3199            newy=xy[1];
3200            //              if(neuronID == 18400 && t_pre.equals("SE") && t_suf.equals("U3") ) throw new RuntimeException("18400  has a target at host 6\n"+"x:"+(newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep)))+1)*(t_xstep))+"x:"+(newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep))))*(t_xstep))+" y:"+(newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep)))+1)*(t_ystep))+" y:"+(newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep))))*(t_ystep))+" \n center"+newx+","+newy);
3201            for(int itxx=newx-((int)((double)(pconn.length/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep)))+1)*(t_xstep);itxx<=newx+((int)((double)(((pconn.length%2)==0?pconn.length-1:pconn.length)/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep))))*(t_xstep);itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
3202            {
3203              for(int ityy=newy-((int)((double)(pconn[0].length/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep)))+1)*(t_ystep);ityy<=newy+((int)((double)(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep))))*(t_ystep);ityy+=t_ystep)  
3204              {
3205                if(periodic)
3206                {
3207                  xborder = itxx % t_xresosize;
3208                  yborder = ityy % t_yresosize;
3209                  if(xborder<0) xborder+=t_xresosize;
3210                  if(yborder<0) yborder+=t_yresosize;
3211                }
3212                else
3213                {
3214                  if(itxx >= t_xresosize || itxx < 0 || ityy >= t_yresosize || ityy<0) // out of boundary
3215                  {
3216                    continue;
3217                  }
3218                  else //within boundary
3219                  {
3220                    xborder = itxx;
3221                    yborder = ityy;
3222                  }
3223                }
3224
3225
3226
3227
3228                int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
3229
3230
3231                int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/f_xstep+(((pconn.length%2)==0?pconn.length-1:pconn.length)/2);
3232                int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/f_ystep+(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2);
3233                if(maX>=0 && maX < pconn.length && maY>=0 && maY < pconn[0].length )
3234                {
3235                  if(strma != null)
3236                  {
3237                    if(Math.abs(conn[maX][maY])!=0)
3238                    {
3239
3240                      int node=FunUtil.hostId(nodeEndIndices,toIndex);
3241                      if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
3242                      {
3243                        neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
3244
3245                      }
3246                    }
3247                  }
3248                  else
3249                  {
3250                    int node=FunUtil.hostId(nodeEndIndices,toIndex);
3251                    if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
3252                    {
3253                      neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
3254
3255                    }
3256
3257                  }
3258                }
3259
3260
3261              }
3262            }
3263
3264          }
3265        }
3266
3267      }
3268      else //divergent
3269      {
3270        if(strma!=null) conn = FunUtil.rRotate90(strma);
3271        pconn = FunUtil.rRotate90(proma);
3272        if(t_xmulti<0&&f_xmulti>0)
3273        {
3274          numX = 1;
3275          denomX = f_xmulti;
3276        }
3277        else if(t_xmulti<0&&f_xmulti<0)
3278        {
3279          numX = 1;
3280          denomX = 1;
3281        }
3282        else if(t_xmulti>0&&f_xmulti>0)
3283        {
3284          numX = t_xmulti;
3285          denomX = f_xmulti;
3286        }
3287        else if(t_xmulti>0&&f_xmulti<0)
3288        {
3289          numX = t_xmulti;
3290          denomX = 1;
3291        }
3292
3293
3294        if(t_ymulti<0&&f_ymulti>0)
3295        {
3296          numY = 1;
3297          denomY = f_ymulti;
3298        }
3299        else if(t_ymulti<0&&f_ymulti<0)
3300        {
3301          numY = 1;
3302          denomY = 1;
3303        }
3304        else if(t_ymulti>0&&f_ymulti>0)
3305        {
3306          numY = t_ymulti;
3307          denomY = f_ymulti;
3308        }
3309        else if(t_ymulti>0&&f_ymulti<0)
3310        {
3311          numY = t_ymulti;
3312          denomY = 1;
3313        }
3314        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
3315        {
3316          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
3317          {
3318            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
3319            if( neuronID <= neuron_end && neuronID >= base  )
3320            {
3321              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
3322
3323              newx=xy[0];
3324              newy=xy[1];
3325
3326              for(int itxx=newx-pconn.length/2*t_xstep;itxx<newx+((pconn.length%2)==0?pconn.length:pconn.length+1)/2*t_xstep;itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
3327
3328              {
3329                for(int ityy=newy-pconn[0].length/2*t_ystep;ityy<newy+((pconn[0].length%2)==0?pconn[0].length:pconn[0].length+1)/2*t_ystep;ityy+=t_ystep)
3330                {
3331                  if(periodic)
3332                  {
3333                    xborder = itxx % t_xresosize;
3334                    yborder = ityy % t_yresosize;
3335                    if(xborder<0) xborder+=t_xresosize;
3336                    if(yborder<0) yborder+=t_yresosize;
3337                  }
3338                  else
3339                  {
3340                    if(itxx >= t_xresosize || itxx < 0 || ityy >= t_yresosize || ityy<0) // out of boundary
3341                    {
3342                      continue;
3343                    }
3344                    else //within boundary
3345                    {
3346                      xborder = itxx;
3347                      yborder = ityy;
3348                    }
3349                  }
3350
3351                  int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
3352
3353
3354                  //                  synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses;                
3355                  if(strma != null)
3356                  {
3357                    if(Math.abs(pconn[(itxx-newx+pconn.length/2*t_xstep)/t_xstep][(ityy-newy+pconn[0].length/2*t_ystep)/t_ystep])!=0)
3358                    {
3359                      int node=FunUtil.hostId(nodeEndIndices,toIndex);
3360                      if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
3361                      {
3362                        neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
3363
3364                      }
3365                    }
3366                  }
3367                  else
3368                  {
3369                    int node=FunUtil.hostId(nodeEndIndices,toIndex);
3370                    if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
3371                    {
3372                      neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
3373
3374                    }
3375                  }
3376                }
3377              }
3378            }
3379
3380          }
3381        }
3382
3383      }
3384           */
3385
3386
3387        //  make connections here.
3388        if(convergent) //convergence connections from many to 1, first iterate to side
3389        {
3390
3391          if(strma!=null) conn = FunUtil.rRotate90(strma);
3392          pconn = FunUtil.rRotate90(proma);
3393          if(t_xmulti<0&&f_xmulti>0)
3394          {
3395            numX = f_xmulti;
3396            denomX = 1;
3397          }
3398          else if(t_xmulti<0&&f_xmulti<0)
3399          {
3400            numX = 1;
3401            denomX = 1;
3402          }
3403          else if(t_xmulti>0&&f_xmulti>0)
3404          {
3405            numX = f_xmulti;
3406            denomX = t_xmulti;
3407          }
3408          else if(t_xmulti>0&&f_xmulti<0)
3409          {
3410            numX = 1;
3411            denomX = t_xmulti;
3412          }
3413
3414
3415          if(t_ymulti<0&&f_ymulti>0)
3416          {
3417            numY = f_ymulti;
3418            denomY = 1;
3419          }
3420          else if(t_ymulti<0&&f_ymulti<0)
3421          {
3422            numY = 1;
3423            denomY = 1;
3424          }
3425          else if(t_ymulti>0&&f_ymulti>0)
3426          {
3427            numY = f_ymulti;
3428            denomY = t_ymulti;
3429          }
3430          else if(t_ymulti>0&&f_ymulti<0)
3431          {
3432            numY = 1;
3433            denomY = t_ymulti;
3434          }
3435
3436          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
3437          {
3438            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
3439            {
3440              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
3441
3442              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
3443              newx=xy[0];
3444              newy=xy[1];            
3445
3446
3447              for(int itxx=newx-pconn.length/2*f_xstep;itxx<newx+((pconn.length%2)==0?pconn.length:pconn.length+1)/2*f_xstep;itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
3448              {
3449                for(int ityy=newy-pconn[0].length/2*f_ystep;ityy<newy+((pconn[0].length%2)==0?pconn[0].length:pconn[0].length+1)/2*f_ystep;ityy+=f_ystep)
3450                {
3451                  if(periodic)
3452                  {
3453                    xborder = itxx % f_xresosize;
3454                    yborder = ityy % f_yresosize;
3455                    if(xborder<0) xborder+=f_xresosize;
3456                    if(yborder<0) yborder+=f_yresosize;
3457                  }
3458                  else
3459                  {
3460                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
3461                    {
3462                      continue;
3463                    }
3464                    else //within boundary
3465                    {
3466                      xborder = itxx;
3467                      yborder = ityy;
3468                    }
3469                  }
3470
3471                  int fromIndex =  cellmap_slow(f_pre,f_suf,xborder,yborder);
3472
3473                  //    if(neuronID == 59404 && fromIndex == 18400) throw new RuntimeException("find to and from neuron");
3474                  if(pconn[(itxx-newx+pconn.length/2*f_xstep)/f_xstep][(ityy-newy+pconn[0].length/2*f_ystep)/f_ystep]> Cnsran.ran2(idum))
3475                  {
3476                    if(strma != null)
3477                    {
3478                      if(Math.abs(conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep])!=0)
3479                      {
3480                        //  if(fromIndex == 18400 && hostId == 6 ) throw new RuntimeException("couting 18400 now");
3481
3482                        //  try {
3483                        Map<String, SizeID> content;
3484                        if(!scaffold.containsKey(fromIndex))  
3485                        {
3486                          scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
3487                        }
3488                        else
3489                        {
3490                          content = scaffold.get(fromIndex);
3491                        }
3492
3493                        if(!content.containsKey(String.valueOf(delay)))
3494                        {
3495                          int totSize=content.size(); // number of branches 
3496                          content.put(String.valueOf(delay), new SizeID(totSize,1));
3497                        }
3498                        else
3499                        {
3500                          (content.get(String.valueOf(delay)).size)++;
3501                        }
3502                        //  }
3503
3504                        //  catch(Exception ex) {
3505                        //    throw new RuntimeException("size"+scaffold.length+" fromIndex"+fromIndex+" total"+totalNumNeurons());
3506                        //      }
3507                      }
3508                    }
3509                    else
3510                    {
3511                      Map<String, SizeID> content;
3512                      if(!scaffold.containsKey(fromIndex))  
3513                      {
3514                        scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
3515                      }
3516                      else
3517                      {
3518                        content = scaffold.get(fromIndex);
3519                      }
3520
3521                      if(!content.containsKey(String.valueOf(delay)))
3522                      {
3523                        int totSize=content.size(); // number of branches 
3524                        content.put(String.valueOf(delay), new SizeID(totSize,1));
3525                      }
3526                      else
3527                      {
3528                        (content.get(String.valueOf(delay)).size)++;
3529                      }
3530
3531                    }
3532                  }
3533
3534                }
3535              }
3536
3537            }
3538          }
3539
3540
3541        }
3542        else //divergent // change it into convergent
3543        {
3544          if(strma!=null) conn = FunUtil.lRotate90(strma);
3545          pconn = FunUtil.lRotate90(proma);
3546
3547          if(t_xmulti<0&&f_xmulti>0)
3548          {
3549            numX = f_xmulti;
3550            denomX = 1;
3551          }
3552          else if(t_xmulti<0&&f_xmulti<0)
3553          {
3554            numX = 1;
3555            denomX = 1;
3556          }
3557          else if(t_xmulti>0&&f_xmulti>0)
3558          {
3559            numX = f_xmulti;
3560            denomX = t_xmulti;
3561          }
3562          else if(t_xmulti>0&&f_xmulti<0)
3563          {
3564            numX = 1;
3565            denomX = t_xmulti;
3566          }
3567
3568
3569          if(t_ymulti<0&&f_ymulti>0)
3570          {
3571            numY = f_ymulti;
3572            denomY = 1;
3573          }
3574          else if(t_ymulti<0&&f_ymulti<0)
3575          {
3576            numY = 1;
3577            denomY = 1;
3578          }
3579          else if(t_ymulti>0&&f_ymulti>0)
3580          {
3581            numY = f_ymulti;
3582            denomY = t_ymulti;
3583          }
3584          else if(t_ymulti>0&&f_ymulti<0)
3585          {
3586            numY = 1;
3587            denomY = t_ymulti;
3588          }
3589
3590          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
3591          {
3592            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
3593            {
3594              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
3595
3596              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
3597              newx=xy[0];
3598              newy=xy[1];            
3599              for(int itxx=newx-((int)((double)(pconn.length/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep)))+1)*(f_xstep);itxx<=newx+((int)((double)(((pconn.length%2)==0?pconn.length-1:pconn.length)/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep))))*(f_xstep);itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
3600              {
3601                for(int ityy=newy-((int)((double)(pconn[0].length/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep)))+1)*(f_ystep);ityy<=newy+((int)((double)(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep))))*(f_ystep);ityy+=f_ystep)
3602                {
3603
3604                  if(periodic)
3605                  {
3606                    xborder = itxx % f_xresosize;
3607                    yborder = ityy % f_yresosize;
3608                    if(xborder<0) xborder+=f_xresosize;
3609                    if(yborder<0) yborder+=f_yresosize;
3610                  }
3611                  else
3612                  {
3613                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
3614                    {
3615                      continue;
3616                    }
3617                    else //within boundary
3618                    {
3619                      xborder = itxx;
3620                      yborder = ityy;
3621                    }
3622                  }
3623
3624                  int fromIndex = cellmap_slow(f_pre,f_suf,xborder,yborder);
3625
3626                  int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/t_xstep+(((pconn.length%2)==0?pconn.length-1:pconn.length)/2);
3627                  int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/t_ystep+(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2);
3628
3629                  if(maX>=0 && maX < pconn.length && maY>=0 && maY < pconn[0].length )
3630                  {
3631                    if(pconn[maX][maY] > Cnsran.ran2(idum))
3632                    {
3633                      if(strma != null)
3634                      {
3635                        if(Math.abs(conn[maX][maY])!=0)
3636                        {
3637                          Map<String, SizeID> content;
3638                          if(!scaffold.containsKey(fromIndex))  
3639                          {
3640                            scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
3641                          }
3642                          else
3643                          {
3644                            content = scaffold.get(fromIndex);
3645                          }
3646
3647                          if(!content.containsKey(String.valueOf(delay)))
3648                          {
3649                            int totSize=content.size(); // number of branches 
3650                            content.put(String.valueOf(delay), new SizeID(totSize,1));
3651                          }
3652                          else
3653                          {
3654                            (content.get(String.valueOf(delay)).size)++;
3655                          }
3656                        }
3657                      }
3658                      else
3659                      {
3660                        Map<String, SizeID> content;
3661                        if(!scaffold.containsKey(fromIndex))  
3662                        {
3663                          scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
3664                        }
3665                        else
3666                        {
3667                          content = scaffold.get(fromIndex);
3668                        }
3669
3670                        if(!content.containsKey(String.valueOf(delay)))
3671                        {
3672                          int totSize=content.size(); // number of branches 
3673                          content.put(String.valueOf(delay), new SizeID(totSize,1));
3674                        }
3675                        else
3676                        {
3677                          (content.get(String.valueOf(delay)).size)++;
3678                        }
3679
3680                      }
3681                    }
3682                  }
3683
3684                }
3685              }
3686
3687            }
3688          }
3689
3690
3691        }
3692
3693      }
3694    }
3695
3696    /***********************************************************************
3697    * Build up the Scaffold for later building up network structure.
3698    * General connection
3699    ***********************************************************************/
3700    public void  popScaffold (
3701      final String          fromLayerPrefix,
3702      final String          fromLayerSuffix,
3703      final String          toLayerPrefix,
3704      final String          toLayerSuffix,
3705      final double          strength,
3706      final int             type,
3707      final double          delay,
3708      final double [ ] [ ]  trans,
3709      final int             hostId )
3710    ////////////////////////////////////////////////////////////////////////
3711    {
3712      // general pop up the scaffold
3713      
3714      // double maxOutput=-1.0;
3715      
3716      final int
3717        fromLayerMultiplierX
3718          = getXmultiplier ( fromLayerPrefix, fromLayerSuffix ),
3719        fromLayerMultiplierY
3720          = getYmultiplier ( fromLayerPrefix, fromLayerSuffix ),
3721        toLayerMultiplierX
3722          = getXmultiplier ( toLayerPrefix,   toLayerSuffix   ),
3723        toLayerMultiplierY
3724          = getYmultiplier ( toLayerPrefix,   toLayerSuffix   );
3725      
3726      int
3727        fromLayerStepX, // previously named f_xstep
3728        fromLayerStepY,
3729        fromLayerMultipliedEdgeLengthX, // previously named f_xresosize
3730        fromLayerMultipliedEdgeLengthY;
3731      
3732      int
3733        toLayerStepX,
3734        toLayerStepY,
3735        toLayerMultipliedEdgeLengthX,
3736        toLayerMultipliedEdgeLengthY;
3737      
3738      int
3739        denomX,
3740        numX;
3741      
3742      int
3743        denomY,
3744        numY;
3745      
3746//      int xmagratio=0;
3747//      int ymagratio=0;
3748//      int xborder,yborder;
3749//      int newx=0;
3750//      int newy=0;
3751//      int[] xy=new int[2];
3752
3753      final int
3754        secX = hostId / sectionsInAxisY,
3755        secY = hostId % sectionsInAxisY;
3756
3757      int
3758        fromLayerStepX2, // previously named xstep_ff
3759        fromLayerStepY2,
3760        fromLayerSectionEndX, // previously named xresosize_ff
3761        fromLayerSectionEndY;
3762      
3763      int
3764        toLayerStepX2,
3765        toLayerStepY2,
3766        toLayerSectionEndX,
3767        toLayerSectionEndY;
3768      
3769      int
3770        fromLayerSectionOriginX, // previously named xOri_ff
3771        fromLayerSectionOriginY;
3772      
3773      int
3774        toLayerSectionOriginX,
3775        toLayerSectionOriginY;
3776
3777      if ( fromLayerMultiplierX > 0 )
3778      {
3779        fromLayerStepX2 = 1;
3780        
3781        final double  layerNeuronsPerSectionX
3782          = fromLayerMultiplierX * edgeLengthX / ( double ) sectionsInAxisX;
3783        
3784        if ( secX != 0 )
3785        {
3786          fromLayerSectionOriginX
3787            = ( int ) ( layerNeuronsPerSectionX * secX );
3788        }
3789        else
3790        {
3791          fromLayerSectionOriginX = 0;
3792        }
3793        
3794        if ( secX != sectionsInAxisX - 1 )
3795        {
3796          fromLayerSectionEndX
3797            = ( int ) ( layerNeuronsPerSectionX * ( secX + 1 ) );
3798        }
3799        else
3800        {
3801          fromLayerSectionEndX = fromLayerMultiplierX * edgeLengthX;
3802        }
3803      }
3804      else // f_xmulti <= 0
3805      {
3806        fromLayerStepX2 = -fromLayerMultiplierX;
3807        
3808        if ( secX != 0 )
3809        {
3810          fromLayerSectionOriginX = ( int ) ( ( double ) edgeLengthX
3811            / ( double ) sectionsInAxisX
3812            * ( double ) ( secX ) );
3813          
3814          fromLayerSectionOriginX = fromLayerSectionOriginX
3815            + fromLayerStepX2 - fromLayerSectionOriginX % fromLayerStepX2;
3816        }
3817        else
3818        {
3819          fromLayerSectionOriginX = 0;
3820        }
3821        
3822        if ( secX != sectionsInAxisX - 1 )
3823        {
3824          fromLayerSectionEndX = ( int ) ( ( double ) edgeLengthX
3825            / ( double ) sectionsInAxisX
3826            * ( double ) ( secX + 1 ) );
3827          
3828          fromLayerSectionEndX = fromLayerSectionEndX
3829            + fromLayerStepX2 -  fromLayerSectionEndX % fromLayerStepX2;
3830          
3831          if ( fromLayerSectionEndX > edgeLengthX )
3832          {
3833            fromLayerSectionEndX = edgeLengthX;
3834          }
3835        }
3836        else
3837        {
3838          fromLayerSectionEndX = edgeLengthX;
3839        }
3840      }
3841      
3842      if ( fromLayerMultiplierY > 0 )
3843      {
3844        fromLayerStepY2 = 1;
3845        
3846        final double  layerNeuronsPerSectionY
3847          = fromLayerMultiplierY * edgeLengthY / ( double ) sectionsInAxisY;
3848        
3849        if ( secY != 0 )
3850        {          
3851          fromLayerSectionOriginY
3852            = ( int ) ( layerNeuronsPerSectionY * secY );
3853        }
3854        else
3855        {
3856          fromLayerSectionOriginY = 0;
3857        }
3858        
3859        if ( secY != sectionsInAxisY - 1 )
3860        {
3861          fromLayerSectionEndY
3862            = ( int ) ( layerNeuronsPerSectionY * ( secY + 1 ) );
3863        }
3864        else
3865        {
3866          fromLayerSectionEndY = fromLayerMultiplierY * edgeLengthY;
3867        }
3868      }
3869      else
3870      {
3871        fromLayerStepY2 = -fromLayerMultiplierY;
3872        
3873        if ( secY != 0 )
3874        {
3875          fromLayerSectionOriginY = ( int ) ( ( double ) edgeLengthY
3876            / ( double ) sectionsInAxisY * ( double ) ( secY ) );
3877          
3878          fromLayerSectionOriginY = fromLayerSectionOriginY
3879            + fromLayerStepY2 - fromLayerSectionOriginY % fromLayerStepY2;
3880        }
3881        else
3882        {
3883          fromLayerSectionOriginY = 0;
3884        }
3885        
3886        if ( secY != sectionsInAxisY - 1 )
3887        {
3888          fromLayerSectionEndY = ( int ) ( ( double ) edgeLengthY
3889            / ( double ) sectionsInAxisY * ( double ) ( secY + 1 ) );
3890          
3891          fromLayerSectionEndY = fromLayerSectionEndY
3892            + fromLayerStepY2 - fromLayerSectionEndY % fromLayerStepY2;
3893          
3894          if ( fromLayerSectionEndY > edgeLengthY )
3895          {
3896            fromLayerSectionEndY = edgeLengthY;
3897          }
3898        }
3899        else
3900        {
3901          fromLayerSectionEndY = edgeLengthY;
3902        }
3903      }
3904
3905      if ( toLayerMultiplierX > 0 )
3906      {
3907        toLayerStepX2 = 1;
3908        
3909        if ( secX != 0 )
3910        {
3911          toLayerSectionOriginX = ( int ) ( ( double ) toLayerMultiplierX
3912            * ( double ) edgeLengthX
3913            / ( double ) sectionsInAxisX * ( double ) ( secX ) );
3914        }
3915        else
3916        {
3917          toLayerSectionOriginX = 0;
3918        }
3919        
3920        if ( secX != sectionsInAxisX - 1 )
3921        {
3922          toLayerSectionEndX = ( int ) ( ( double ) toLayerMultiplierX
3923            * ( double ) edgeLengthX
3924            / ( double ) sectionsInAxisX * ( double ) ( secX + 1 ) );
3925        }
3926        else
3927        {
3928          toLayerSectionEndX = toLayerMultiplierX * edgeLengthX;
3929        }
3930      }
3931      else
3932      {
3933        toLayerStepX2 = -toLayerMultiplierX;
3934        
3935        if ( secX != 0 )
3936        {
3937          toLayerSectionOriginX = ( int ) ( ( double ) edgeLengthX
3938            / ( double ) sectionsInAxisX * ( double ) ( secX ) );
3939          
3940          toLayerSectionOriginX = toLayerSectionOriginX
3941            + toLayerStepX2 - toLayerSectionOriginX % toLayerStepX2;
3942        }
3943        else
3944        {
3945          toLayerSectionOriginX = 0;
3946        }
3947        
3948        if ( secX != sectionsInAxisX - 1 )
3949        {
3950          toLayerSectionEndX = ( int ) ( ( double ) edgeLengthX
3951            / ( double ) sectionsInAxisX * ( double ) ( secX + 1 ) );
3952          
3953          toLayerSectionEndX = toLayerSectionEndX
3954            + toLayerStepX2 - toLayerSectionEndX % toLayerStepX2;
3955          
3956          if ( toLayerSectionEndX > edgeLengthX )
3957          {
3958            toLayerSectionEndX = edgeLengthX;
3959          }
3960        }
3961        else
3962        {
3963          toLayerSectionEndX = edgeLengthX;
3964        }
3965      }
3966      
3967      if ( toLayerMultiplierY > 0 )
3968      {
3969        toLayerStepY2 = 1;
3970        
3971        if ( secY != 0 )
3972        {
3973          toLayerSectionOriginY = ( int ) ( ( double ) toLayerMultiplierY
3974            * ( double ) edgeLengthY
3975            / ( double ) sectionsInAxisY * ( double ) ( secY ) );
3976        }
3977        else
3978        {
3979          toLayerSectionOriginY = 0;
3980        }
3981        
3982        if ( secY != sectionsInAxisY - 1 )
3983        {
3984          toLayerSectionEndY = ( int ) ( ( double ) toLayerMultiplierY
3985            * ( double ) edgeLengthY / ( double ) sectionsInAxisY
3986            * ( double ) ( secY + 1 ) );
3987        }
3988        else
3989        {
3990          toLayerSectionEndY = toLayerMultiplierY * edgeLengthY;
3991        }
3992      }
3993      else
3994      {
3995        toLayerStepY2 = -toLayerMultiplierY;
3996        
3997        if ( secY != 0 )
3998        {
3999          toLayerSectionOriginY = ( int ) ( ( double ) edgeLengthY
4000            / ( double ) sectionsInAxisY * ( double ) ( secY ) );
4001          
4002          toLayerSectionOriginY = toLayerSectionOriginY
4003            + toLayerStepY2 - toLayerSectionOriginY % toLayerStepY2;
4004        }
4005        else
4006        {
4007          toLayerSectionOriginY=0;
4008        }
4009        
4010        if ( secY != sectionsInAxisY-1 )
4011        {
4012          toLayerSectionEndY = ( int ) ( ( double ) edgeLengthY
4013            / ( double ) sectionsInAxisY * ( double ) ( secY + 1 ) );
4014          
4015          toLayerSectionEndY = toLayerSectionEndY
4016            + toLayerStepY2 - toLayerSectionEndY % toLayerStepY2;
4017          
4018          if ( toLayerSectionEndY > edgeLengthY )
4019          {
4020            toLayerSectionEndY = edgeLengthY;
4021          }
4022        }
4023        else
4024        {
4025          toLayerSectionEndY = edgeLengthY;
4026        }
4027      }
4028      
4029      // these may not be useful for new neuronal model
4030
4031      if ( type == 1
4032        && strength > 0 )
4033      {        
4034        throw new RuntimeException ( "sign of connection is wrong" );
4035      }
4036      
4037      if ( type == 0
4038        && strength < 0 )
4039      {
4040        throw new RuntimeException ( "sign of connection is wrong" );
4041      }
4042
4043      if ( strength != 0 )
4044      {
4045        if ( fromLayerMultiplierX > 0 )
4046        {
4047          fromLayerStepX = 1;
4048          
4049          fromLayerMultipliedEdgeLengthX
4050            = fromLayerMultiplierX * edgeLengthX;
4051        }
4052        else
4053        {
4054          fromLayerStepX = -fromLayerMultiplierX;
4055          
4056          fromLayerMultipliedEdgeLengthX = edgeLengthX;
4057        }
4058        
4059        if ( fromLayerMultiplierY > 0 )
4060        {
4061          fromLayerStepY = 1;
4062          
4063          fromLayerMultipliedEdgeLengthY
4064            = fromLayerMultiplierY * edgeLengthY;
4065        }
4066        else
4067        {
4068          fromLayerStepY = -fromLayerMultiplierY;
4069          
4070          fromLayerMultipliedEdgeLengthY = edgeLengthY;
4071        }
4072        
4073        if ( toLayerMultiplierX > 0 )
4074        {
4075          toLayerStepX = 1;
4076          
4077          toLayerMultipliedEdgeLengthX = toLayerMultiplierX * edgeLengthX;
4078        }
4079        else
4080        {
4081          toLayerStepX = -toLayerMultiplierX;
4082          
4083          toLayerMultipliedEdgeLengthX = edgeLengthX;
4084        }
4085        
4086        if ( toLayerMultiplierY > 0 )
4087        {
4088          toLayerStepY = 1;
4089          
4090          toLayerMultipliedEdgeLengthY = toLayerMultiplierY * edgeLengthY;
4091        }
4092        else
4093        {
4094          toLayerStepY = -toLayerMultiplierY;
4095          
4096          toLayerMultipliedEdgeLengthY = edgeLengthY;
4097        }
4098
4099        //find out the post synaptic neurons belong to which host?
4100        
4101        /*
4102      {
4103
4104        if(t_xmulti<0&&f_xmulti>0)
4105        {
4106          numX = 1;
4107          denomX = f_xmulti;
4108        }
4109        else if(t_xmulti<0&&f_xmulti<0)
4110        {
4111          numX = 1;
4112          denomX = 1;
4113        }
4114        else if(t_xmulti>0&&f_xmulti>0)
4115        {
4116          numX = t_xmulti;
4117          denomX = f_xmulti;
4118        }
4119        else if(t_xmulti>0&&f_xmulti<0)
4120        {
4121          numX = t_xmulti;
4122          denomX = 1;
4123        }
4124
4125
4126        if(t_ymulti<0&&f_ymulti>0)
4127        {
4128          numY = 1;
4129          denomY = f_ymulti;
4130        }
4131        else if(t_ymulti<0&&f_ymulti<0)
4132        {
4133          numY = 1;
4134          denomY = 1;
4135        }
4136        else if(t_ymulti>0&&f_ymulti>0)
4137        {
4138          numY = t_ymulti;
4139          denomY = f_ymulti;
4140        }
4141        else if(t_ymulti>0&&f_ymulti<0)
4142        {
4143          numY = t_ymulti;
4144          denomY = 1;
4145        }
4146
4147        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
4148        {
4149          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
4150          {
4151            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
4152
4153            int fIndex = (iterx / f_xstep)
4154              * (f_yresosize / f_ystep) + itery / f_ystep;
4155             
4156            for(int itxx=0;itxx<t_xresosize;itxx+=t_xstep)
4157            {
4158              for(int ityy=0;ityy<t_yresosize;ityy+=t_ystep)  
4159              {
4160                int toIndex = cellmap_slow(t_pre,t_suf,itxx,ityy);
4161                int tIndex = (itxx / t_xstep)*(t_yresosize / t_ystep)
4162                  + ityy / t_ystep;
4163                if(Math.abs(trans[fIndex % trans.length]
4164                  [tIndex % trans[0].length])!=0)
4165                {
4166
4167                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
4168                  // if the neuron doen'st have a target synapse at node
4169                  // then set it.
4170                  if((neurons[neuronID - base].getTHost() & (1L<<node) )==0)
4171                  {
4172                    neurons[neuronID - base].setTHost(
4173                      (neurons[neuronID - base].getTHost() | (1L<< node)));
4174                  }
4175                }
4176              }
4177            }
4178
4179          }
4180        }
4181
4182      }
4183         */
4184
4185        {
4186          if (   toLayerMultiplierX < 0
4187            && fromLayerMultiplierX > 0 )
4188          {
4189            numX = fromLayerMultiplierX;
4190            
4191            denomX = 1;
4192          }
4193          else if (   toLayerMultiplierX < 0
4194                 && fromLayerMultiplierX < 0 )
4195          {
4196            numX = 1;
4197            
4198            denomX = 1;
4199          }
4200          else if (   toLayerMultiplierX > 0
4201                 && fromLayerMultiplierX > 0 )
4202          {
4203            numX = fromLayerMultiplierX;
4204            
4205            denomX = toLayerMultiplierX;
4206          }
4207          else if (   toLayerMultiplierX > 0
4208                 && fromLayerMultiplierX < 0 )
4209          {
4210            numX = 1;
4211            
4212            denomX = toLayerMultiplierX;
4213          }
4214
4215          if (   toLayerMultiplierY < 0
4216            && fromLayerMultiplierY > 0 )
4217          {
4218            numY = fromLayerMultiplierY;
4219            
4220            denomY = 1;
4221          }
4222          else if (   toLayerMultiplierY < 0
4223                 && fromLayerMultiplierY < 0 )
4224          {
4225            numY = 1;
4226            
4227            denomY = 1;
4228          }
4229          else if (   toLayerMultiplierY > 0
4230                 && fromLayerMultiplierY > 0 )
4231          {
4232            numY = fromLayerMultiplierY;
4233            
4234            denomY = toLayerMultiplierY;
4235          }
4236          else if (   toLayerMultiplierY > 0
4237                 && fromLayerMultiplierY < 0 )
4238          {
4239            numY = 1;
4240            
4241            denomY = toLayerMultiplierY;
4242          }
4243
4244          for ( int  toLayerX = toLayerSectionOriginX;
4245            toLayerX < toLayerSectionEndX;
4246            toLayerX += toLayerStepX2 )
4247          {
4248            for ( int  toLayerY = toLayerSectionOriginY;
4249              toLayerY < toLayerSectionEndY;
4250              toLayerY += toLayerStepY2 )
4251            {
4252              final int  neuronID = cellmap_slow (
4253                toLayerPrefix,
4254                toLayerSuffix,
4255                toLayerX,
4256                toLayerY );
4257              
4258              final int  tIndex = ( toLayerX / toLayerStepX )
4259                * ( toLayerMultipliedEdgeLengthY / toLayerStepY )
4260                + toLayerY / toLayerStepY;
4261              
4262              for ( int  itxx = 0;
4263                itxx < fromLayerMultipliedEdgeLengthX;
4264                itxx += fromLayerStepX )
4265              {
4266                for ( int  ityy = 0;
4267                  ityy < fromLayerMultipliedEdgeLengthY;
4268                  ityy += fromLayerStepY )
4269                {
4270                  final int  fromIndex = cellmap_slow (
4271                    fromLayerPrefix,
4272                    fromLayerSuffix,
4273                    itxx,
4274                    ityy );
4275                  
4276                  final int  fIndex = ( itxx / fromLayerStepX )
4277                    * ( fromLayerMultipliedEdgeLengthY / fromLayerStepY )
4278                    + ityy / fromLayerStepY;
4279                  
4280                  if ( Math.abs (
4281                    trans [ fIndex % trans.length ]
4282                          [ tIndex % trans [ 0 ].length ] ) != 0 )
4283                  {
4284                    Map<String, SizeID>  content;
4285                    
4286                    if ( !scaffold.containsKey ( fromIndex ) )  
4287                    {
4288                      scaffold.put (
4289                        fromIndex,
4290                        content = ( new TreeMap<String, SizeID> ( ) ) );
4291                    }
4292                    else
4293                    {
4294                      content = scaffold.get ( fromIndex );
4295                    }
4296
4297                    if ( !content.containsKey ( String.valueOf ( delay ) ) )
4298                    {
4299                      // number of branches
4300                      
4301                      final int  totSize = content.size ( );
4302                      
4303                      content.put (
4304                        String.valueOf ( delay ),
4305                        new SizeID ( totSize, 1 ) );
4306                    }
4307                    else
4308                    {
4309                      ( content.get ( String.valueOf ( delay ) ).size )++;
4310                    }
4311                  }
4312                }
4313              }
4314            }
4315          }
4316        }
4317      }
4318    }
4319
4320    /***********************************************************************
4321    * Build up the Scaffold for later buiding up network structure.
4322    * General population connection
4323    * 
4324    * @param f_pre
4325    * @param f_suf
4326    * @param t_pre
4327    * @param t_suf
4328    * @param convergent
4329    * @param stre
4330    * @param type
4331    * @param delay
4332    * @param trans
4333    * @param hostId
4334    * @param periodic
4335    ***********************************************************************/
4336    public void popScaffold(String f_pre, String f_suf, String t_pre, String t_suf, double stre, int type, double delay, double [][] proma, double[][] strma, int hostId) //general probability pop up the scaffold
4337    ////////////////////////////////////////////////////////////////////////
4338    {
4339      double maxOutput=-1.0;
4340      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
4341      f_xmulti=getXmultiplier(f_pre,f_suf);
4342      f_ymulti=getYmultiplier(f_pre,f_suf);
4343      t_xmulti=getXmultiplier(t_pre,t_suf);
4344      t_ymulti=getYmultiplier(t_pre,t_suf);
4345      int f_xstep,f_ystep,f_xresosize,f_yresosize;
4346      int t_xstep,t_ystep,t_xresosize,t_yresosize;
4347      int denomX=0,numX=0;
4348      int denomY=0,numY=0;
4349      int xmagratio=0;
4350      int ymagratio=0;
4351      int xborder,yborder;
4352      int newx=0;
4353      int newy=0;
4354      int[] xy=new int[2];
4355
4356      int secX = hostId/sectionsInAxisY;
4357      int secY = hostId%sectionsInAxisY;
4358
4359      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
4360      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
4361      int xOri_ff,yOri_ff;
4362      int xOri_tt,yOri_tt;
4363
4364
4365      if(f_xmulti>0)
4366      {
4367        xstep_ff=1;
4368        if(secX!=0)
4369        {
4370          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4371        }
4372        else
4373        {
4374          xOri_ff=0;
4375        }
4376        if(secX!=sectionsInAxisX-1)
4377        {
4378          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4379        }
4380        else
4381        {
4382          xresosize_ff=f_xmulti*edgeLengthX;
4383        }
4384      }
4385      else
4386      {
4387        xstep_ff=-f_xmulti;
4388        if(secX!=0)
4389        {
4390          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4391          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
4392        }
4393        else
4394        {
4395          xOri_ff=0;
4396        }
4397        if(secX!=sectionsInAxisX-1)
4398        {
4399          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4400          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
4401          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
4402        }
4403        else
4404        {
4405          xresosize_ff=edgeLengthX;
4406        }
4407      }
4408      if(f_ymulti>0)
4409      {
4410        ystep_ff=1;
4411        if(secY!=0)
4412        {
4413          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4414        }
4415        else
4416        {
4417          yOri_ff=0;
4418        }
4419        if(secY!=sectionsInAxisY-1)
4420        {
4421          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4422        }
4423        else
4424        {
4425          yresosize_ff=f_ymulti*edgeLengthY;
4426        }
4427      }
4428      else
4429      {
4430        ystep_ff=-f_ymulti;
4431        if(secY!=0)
4432        {
4433          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4434          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
4435        }
4436        else
4437        {
4438          yOri_ff=0;
4439        }
4440        if(secY!=sectionsInAxisY-1)
4441        {
4442          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4443          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
4444          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
4445        }
4446        else
4447        {
4448          yresosize_ff=edgeLengthY;
4449        }
4450      }
4451
4452      if(t_xmulti>0)
4453      {
4454        xstep_tt=1;
4455        if(secX!=0)
4456        {
4457          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4458        }
4459        else
4460        {
4461          xOri_tt=0;
4462        }
4463        if(secX!=sectionsInAxisX-1)
4464        {
4465          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4466        }
4467        else
4468        {
4469          xresosize_tt=t_xmulti*edgeLengthX;
4470        }
4471      }
4472      else
4473      {
4474        xstep_tt=-t_xmulti;
4475        if(secX!=0)
4476        {
4477          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4478          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
4479        }
4480        else
4481        {
4482          xOri_tt=0;
4483        }
4484        if(secX!=sectionsInAxisX-1)
4485        {
4486          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4487          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
4488          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
4489        }
4490        else
4491        {
4492          xresosize_tt=edgeLengthX;
4493        }
4494      }
4495      if(t_ymulti>0)
4496      {
4497        ystep_tt=1;
4498        if(secY!=0)
4499        {
4500          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4501        }
4502        else
4503        {
4504          yOri_tt=0;
4505        }
4506        if(secY!=sectionsInAxisY-1)
4507        {
4508          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4509        }
4510        else
4511        {
4512          yresosize_tt=t_ymulti*edgeLengthY;
4513        }
4514      }
4515      else
4516      {
4517        ystep_tt=-t_ymulti;
4518        if(secY!=0)
4519        {
4520          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4521          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
4522        }
4523        else
4524        {
4525          yOri_tt=0;
4526        }
4527        if(secY!=sectionsInAxisY-1)
4528        {
4529          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4530          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
4531          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
4532        }
4533        else
4534        {
4535          yresosize_tt=edgeLengthY;
4536        }
4537      }
4538
4539      if(type==1&&stre>0) // these maynot be useful for new neuronal model
4540      throw new RuntimeException("sign of connection is wrong");
4541      if(type==0&&stre<0)
4542        throw new RuntimeException("sign of connection is wrong");
4543
4544
4545
4546      if(stre!=0)
4547      {
4548        if(f_xmulti>0)
4549        {
4550          f_xstep=1;
4551          f_xresosize=f_xmulti*edgeLengthX;
4552        }
4553        else
4554        {
4555          f_xstep=-f_xmulti;
4556          f_xresosize=edgeLengthX;
4557        }
4558        if(f_ymulti>0)
4559        {
4560          f_ystep=1;
4561          f_yresosize=f_ymulti*edgeLengthY;
4562        }
4563        else
4564        {
4565          f_ystep=-f_ymulti;
4566          f_yresosize=edgeLengthY;
4567        }
4568        if(t_xmulti>0)
4569        {
4570          t_xstep=1;
4571          t_xresosize=t_xmulti*edgeLengthX;
4572        }
4573        else
4574        {
4575          t_xstep=-t_xmulti;
4576          t_xresosize=edgeLengthX;
4577        }
4578        if(t_ymulti>0)
4579        {
4580          t_ystep=1;
4581          t_yresosize=t_ymulti*edgeLengthY;
4582        }
4583        else
4584        {
4585          t_ystep=-t_ymulti;
4586          t_yresosize=edgeLengthY;
4587        }
4588
4589
4590        //find out the post synaptic neurons belong to which host?
4591        /*
4592      {
4593
4594        if(t_xmulti<0&&f_xmulti>0)
4595        {
4596          numX = 1;
4597          denomX = f_xmulti;
4598        }
4599        else if(t_xmulti<0&&f_xmulti<0)
4600        {
4601          numX = 1;
4602          denomX = 1;
4603        }
4604        else if(t_xmulti>0&&f_xmulti>0)
4605        {
4606          numX = t_xmulti;
4607          denomX = f_xmulti;
4608        }
4609        else if(t_xmulti>0&&f_xmulti<0)
4610        {
4611          numX = t_xmulti;
4612          denomX = 1;
4613        }
4614
4615
4616        if(t_ymulti<0&&f_ymulti>0)
4617        {
4618          numY = 1;
4619          denomY = f_ymulti;
4620        }
4621        else if(t_ymulti<0&&f_ymulti<0)
4622        {
4623          numY = 1;
4624          denomY = 1;
4625        }
4626        else if(t_ymulti>0&&f_ymulti>0)
4627        {
4628          numY = t_ymulti;
4629          denomY = f_ymulti;
4630        }
4631        else if(t_ymulti>0&&f_ymulti<0)
4632        {
4633          numY = t_ymulti;
4634          denomY = 1;
4635        }
4636
4637        for(int iterx=xOri_ff;iterx<xresosize_ff;iterx+=xstep_ff)
4638        {
4639          for(int itery=yOri_ff;itery<yresosize_ff;itery+=ystep_ff)
4640          {
4641            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
4642
4643            int fIndex = (iterx / f_xstep) * (f_yresosize / f_ystep) + itery / f_ystep;
4644            for(int itxx=0;itxx<t_xresosize;itxx+=t_xstep)
4645            {
4646              for(int ityy=0;ityy<t_yresosize;ityy+=t_ystep)  
4647              {
4648                int toIndex = cellmap_slow(t_pre,t_suf,itxx,ityy);
4649                int tIndex = (itxx / t_xstep)*(t_yresosize / t_ystep) + ityy / t_ystep;
4650                if(strma != null)
4651                {
4652                  if(Math.abs(strma[fIndex % strma.length][tIndex % strma[0].length])!=0)
4653                  {
4654
4655                    int node=FunUtil.hostId(nodeEndIndices,toIndex);
4656                    if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
4657                    {
4658                      neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
4659
4660                    }
4661                  }
4662                }
4663                else
4664                {
4665                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
4666                  if((neurons[neuronID - base].getTHost() & (1L<<node) )==0) // if the neuron doen'st have a target synapse at node then set it.
4667                  {
4668                    neurons[neuronID - base].setTHost((neurons[neuronID - base].getTHost() | (1L<< node)));
4669
4670                  }
4671
4672                }
4673              }
4674            }
4675
4676          }
4677        }
4678
4679      }
4680         */
4681
4682        {
4683          if(t_xmulti<0&&f_xmulti>0)
4684          {
4685            numX = f_xmulti;
4686            denomX = 1;
4687          }
4688          else if(t_xmulti<0&&f_xmulti<0)
4689          {
4690            numX = 1;
4691            denomX = 1;
4692          }
4693          else if(t_xmulti>0&&f_xmulti>0)
4694          {
4695            numX = f_xmulti;
4696            denomX = t_xmulti;
4697          }
4698          else if(t_xmulti>0&&f_xmulti<0)
4699          {
4700            numX = 1;
4701            denomX = t_xmulti;
4702          }
4703
4704
4705          if(t_ymulti<0&&f_ymulti>0)
4706          {
4707            numY = f_ymulti;
4708            denomY = 1;
4709          }
4710          else if(t_ymulti<0&&f_ymulti<0)
4711          {
4712            numY = 1;
4713            denomY = 1;
4714          }
4715          else if(t_ymulti>0&&f_ymulti>0)
4716          {
4717            numY = f_ymulti;
4718            denomY = t_ymulti;
4719          }
4720          else if(t_ymulti>0&&f_ymulti<0)
4721          {
4722            numY = 1;
4723            denomY = t_ymulti;
4724          }
4725
4726          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
4727          {
4728            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
4729            {
4730              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
4731              int tIndex = (iterx / xstep_tt) * (yresosize_tt / ystep_tt) + itery / ystep_tt;
4732              for(int itxx=0;itxx<f_xresosize;itxx+=f_xstep)
4733              {
4734                for(int ityy=0;ityy<f_yresosize;ityy+=f_ystep)
4735                {
4736                  int fromIndex =  cellmap_slow(f_pre,f_suf,itxx,ityy);
4737                  int fIndex = (itxx / f_xstep)*(f_yresosize / f_ystep) + ityy / f_ystep;
4738                  if(Math.abs(proma[fIndex % proma.length][tIndex % proma[0].length])> Cnsran.ran2(idum))
4739                  {
4740                    if(strma != null)
4741                    {
4742                      if(Math.abs(strma[fIndex % strma.length][tIndex % strma[0].length])!=0)
4743                      {
4744                        Map<String, SizeID> content;
4745                        if(!scaffold.containsKey(fromIndex))  
4746                        {
4747                          scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
4748                        }
4749                        else
4750                        {
4751                          content = scaffold.get(fromIndex);
4752                        }
4753
4754                        if(!content.containsKey(String.valueOf(delay)))
4755                        {
4756                          int totSize=content.size(); // number of branches 
4757                          content.put(String.valueOf(delay), new SizeID(totSize,1));
4758                        }
4759                        else
4760                        {
4761                          (content.get(String.valueOf(delay)).size)++;
4762                        }
4763                      }
4764                    }
4765                    else
4766                    {
4767                      Map<String, SizeID> content;
4768                      if(!scaffold.containsKey(fromIndex))  
4769                      {
4770                        scaffold.put(fromIndex,content = (new TreeMap<String, SizeID>()) );
4771                      }
4772                      else
4773                      {
4774                        content = scaffold.get(fromIndex);
4775                      }
4776
4777                      if(!content.containsKey(String.valueOf(delay)))
4778                      {
4779                        int totSize=content.size(); // number of branches 
4780                        content.put(String.valueOf(delay), new SizeID(totSize,1));
4781                      }
4782                      else
4783                      {
4784                        (content.get(String.valueOf(delay)).size)++;
4785                      }
4786
4787                    }
4788                  }
4789                }
4790              }
4791
4792            }
4793          }
4794
4795
4796        }
4797      }
4798
4799    }
4800
4801    /***********************************************************************
4802    *  For nethost with id Hostid, build up the structure by using the scaffold build before.
4803    * 
4804    * @param hostId
4805    ***********************************************************************/
4806    public void buildStructure(int hostId)
4807    {
4808      //    axons = new HashMap<Integer, Axon>((int)((double)scaffold.size()/0.75));
4809      axons = new HashMap<Integer, Axon>(scaffold.size());
4810      Set entries = scaffold.entrySet();
4811      Iterator entryIter = entries.iterator();
4812      while(entryIter.hasNext())
4813      {
4814        Map.Entry<Integer, Map<String, SizeID> > entry = (Map.Entry<Integer, Map<String, SizeID> >)entryIter.next();          
4815        Integer key = entry.getKey();
4816        Map<String, SizeID> value = entry.getValue(); 
4817
4818        Iterator<String> iter = value.keySet().iterator();
4819
4820        Axon caxon;
4821
4822        if(!axons.containsKey(key))
4823        {
4824          axons.put(key, caxon=(new Axon()));
4825        }
4826        else
4827        {
4828          caxon = axons.get(key);
4829        }
4830
4831        caxon.branches = new Branch[value.size()];
4832        //      Branch[] mybranches=new Branch[scaffold[a].size()];
4833        //      int currBranch=0;
4834        while(iter.hasNext()) 
4835        {
4836          String branchKey = iter.next();
4837          SizeID sid = value.get(branchKey);
4838          Synapse[] syns=new Synapse[(int)(sid.size)];
4839          sid.size=0;
4840          //        double delay=Double.parseDouble(branchKey.substring(0,branchKey.lastIndexOf(" ")));
4841          double delay=Double.parseDouble(branchKey);
4842          //        mybranches[currBranch]=new Branch(syns,delay);
4843          caxon.branches[(int)(sid.id)]=new Branch(syns,delay);
4844          //        currBranch++;
4845        }
4846      }
4847    }
4848
4849    public void sortSynapses(int hostId)
4850    ////////////////////////////////////////////////////////////////////////
4851    {
4852      Iterator<Axon> values = axons.values().iterator();
4853      while(values.hasNext())
4854      {
4855        Axon caxon = values.next();
4856        for(int i=0;i<caxon.branches.length; i++)
4857        {
4858          Arrays.sort(caxon.branches[i].synapses);
4859        }
4860      }
4861    }
4862
4863    /***********************************************************************
4864    *  Makeing connections between from and to layer of neurons, L connection.
4865    * 
4866    * @param f_pre
4867    * @param f_suf
4868    * @param t_pre
4869    * @param t_suf
4870    * @param convergent
4871    * @param stre
4872    * @param type
4873    * @param delay
4874    * @param trans
4875    * @param hostId
4876    * @param periodic
4877    * @return Largest weight
4878    ***********************************************************************/
4879    public double connect(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] trans, int hostId, boolean periodic)
4880    ////////////////////////////////////////////////////////////////////////
4881    {
4882      double maxOutput=-1.0;
4883      //    System.out.println("connect");
4884      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
4885      f_xmulti=getXmultiplier(f_pre,f_suf);
4886      f_ymulti=getYmultiplier(f_pre,f_suf);
4887      t_xmulti=getXmultiplier(t_pre,t_suf);
4888      t_ymulti=getYmultiplier(t_pre,t_suf);
4889      int f_xstep,f_ystep,f_xresosize,f_yresosize;
4890      int t_xstep,t_ystep,t_xresosize,t_yresosize;
4891      int denomX=0,numX=0;
4892      int denomY=0,numY=0;
4893      int xmagratio=0;
4894      int ymagratio=0;
4895      int xborder,yborder;
4896      int newx=0;
4897      int newy=0;
4898      //    double[] curr=new double[2];
4899      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
4900      //    String fromNeur,toNeur;
4901      int[] xy=new int[2];
4902
4903      int secX = hostId/sectionsInAxisY;
4904      int secY = hostId%sectionsInAxisY;
4905
4906      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
4907      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
4908      int xOri_ff,yOri_ff;
4909      int xOri_tt,yOri_tt;
4910
4911
4912      if(f_xmulti>0)
4913      {
4914        xstep_ff=1;
4915        if(secX!=0)
4916        {
4917          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4918        }
4919        else
4920        {
4921          xOri_ff=0;
4922        }
4923        if(secX!=sectionsInAxisX-1)
4924        {
4925          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4926        }
4927        else
4928        {
4929          xresosize_ff=f_xmulti*edgeLengthX;
4930        }
4931      }
4932      else
4933      {
4934        xstep_ff=-f_xmulti;
4935        if(secX!=0)
4936        {
4937          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
4938          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
4939        }
4940        else
4941        {
4942          xOri_ff=0;
4943        }
4944        if(secX!=sectionsInAxisX-1)
4945        {
4946          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
4947          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
4948          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
4949        }
4950        else
4951        {
4952          xresosize_ff=edgeLengthX;
4953        }
4954      }
4955      if(f_ymulti>0)
4956      {
4957        ystep_ff=1;
4958        if(secY!=0)
4959        {
4960          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4961        }
4962        else
4963        {
4964          yOri_ff=0;
4965        }
4966        if(secY!=sectionsInAxisY-1)
4967        {
4968          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4969        }
4970        else
4971        {
4972          yresosize_ff=f_ymulti*edgeLengthY;
4973        }
4974      }
4975      else
4976      {
4977        ystep_ff=-f_ymulti;
4978        if(secY!=0)
4979        {
4980          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
4981          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
4982        }
4983        else
4984        {
4985          yOri_ff=0;
4986        }
4987        if(secY!=sectionsInAxisY-1)
4988        {
4989          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
4990          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
4991          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
4992        }
4993        else
4994        {
4995          yresosize_ff=edgeLengthY;
4996        }
4997      }
4998
4999      if(t_xmulti>0)
5000      {
5001        xstep_tt=1;
5002        if(secX!=0)
5003        {
5004          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5005        }
5006        else
5007        {
5008          xOri_tt=0;
5009        }
5010        if(secX!=sectionsInAxisX-1)
5011        {
5012          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5013        }
5014        else
5015        {
5016          xresosize_tt=t_xmulti*edgeLengthX;
5017        }
5018      }
5019      else
5020      {
5021        xstep_tt=-t_xmulti;
5022        if(secX!=0)
5023        {
5024          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5025          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
5026        }
5027        else
5028        {
5029          xOri_tt=0;
5030        }
5031        if(secX!=sectionsInAxisX-1)
5032        {
5033          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5034          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
5035          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
5036        }
5037        else
5038        {
5039          xresosize_tt=edgeLengthX;
5040        }
5041      }
5042      if(t_ymulti>0)
5043      {
5044        ystep_tt=1;
5045        if(secY!=0)
5046        {
5047          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5048        }
5049        else
5050        {
5051          yOri_tt=0;
5052        }
5053        if(secY!=sectionsInAxisY-1)
5054        {
5055          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5056        }
5057        else
5058        {
5059          yresosize_tt=t_ymulti*edgeLengthY;
5060        }
5061      }
5062      else
5063      {
5064        ystep_tt=-t_ymulti;
5065        if(secY!=0)
5066        {
5067          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5068          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
5069        }
5070        else
5071        {
5072          yOri_tt=0;
5073        }
5074        if(secY!=sectionsInAxisY-1)
5075        {
5076          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5077          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
5078          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
5079        }
5080        else
5081        {
5082          yresosize_tt=edgeLengthY;
5083        }
5084      }
5085
5086      if(type==1&&stre>0) // these maynot be useful for new neuronal model
5087      System.err.println("sign of connection is wrong");
5088      if(type==0&&stre<0)
5089        System.err.println("sign of connection is wrong");
5090
5091
5092      if(stre!=0)
5093      {
5094        if(f_xmulti>0)
5095        {
5096          f_xstep=1;
5097          f_xresosize=f_xmulti*edgeLengthX;
5098        }
5099        else
5100        {
5101          f_xstep=-f_xmulti;
5102          f_xresosize=edgeLengthX;
5103        }
5104        if(f_ymulti>0)
5105        {
5106          f_ystep=1;
5107          f_yresosize=f_ymulti*edgeLengthY;
5108        }
5109        else
5110        {
5111          f_ystep=-f_ymulti;
5112          f_yresosize=edgeLengthY;
5113        }
5114        if(t_xmulti>0)
5115        {
5116          t_xstep=1;
5117          t_xresosize=t_xmulti*edgeLengthX;
5118        }
5119        else
5120        {
5121          t_xstep=-t_xmulti;
5122          t_xresosize=edgeLengthX;
5123        }
5124        if(t_ymulti>0)
5125        {
5126          t_ystep=1;
5127          t_yresosize=t_ymulti*edgeLengthY;
5128        }
5129        else
5130        {
5131          t_ystep=-t_ymulti;
5132          t_yresosize=edgeLengthY;
5133        }
5134
5135        double [][] conn;
5136        //  make connections here.
5137        if(convergent) //convergence connections from many to 1, first iterate to side
5138        {
5139
5140          conn = FunUtil.rRotate90(trans);
5141          if(t_xmulti<0&&f_xmulti>0)
5142          {
5143            numX = f_xmulti;
5144            denomX = 1;
5145          }
5146          else if(t_xmulti<0&&f_xmulti<0)
5147          {
5148            numX = 1;
5149            denomX = 1;
5150          }
5151          else if(t_xmulti>0&&f_xmulti>0)
5152          {
5153            numX = f_xmulti;
5154            denomX = t_xmulti;
5155          }
5156          else if(t_xmulti>0&&f_xmulti<0)
5157          {
5158            numX = 1;
5159            denomX = t_xmulti;
5160          }
5161
5162
5163          if(t_ymulti<0&&f_ymulti>0)
5164          {
5165            numY = f_ymulti;
5166            denomY = 1;
5167          }
5168          else if(t_ymulti<0&&f_ymulti<0)
5169          {
5170            numY = 1;
5171            denomY = 1;
5172          }
5173          else if(t_ymulti>0&&f_ymulti>0)
5174          {
5175            numY = f_ymulti;
5176            denomY = t_ymulti;
5177          }
5178          else if(t_ymulti>0&&f_ymulti<0)
5179          {
5180            numY = 1;
5181            denomY = t_ymulti;
5182          }
5183
5184          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
5185          {
5186            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
5187            {
5188              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
5189
5190              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
5191              newx=xy[0];
5192              newy=xy[1];            
5193
5194              for(int itxx=newx-conn.length/2*f_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*f_xstep;itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
5195              {
5196                for(int ityy=newy-conn[0].length/2*f_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*f_ystep;ityy+=f_ystep)
5197                {
5198                  if(periodic)
5199                  {
5200                    xborder = itxx % f_xresosize;
5201                    yborder = ityy % f_yresosize;
5202                    if(xborder<0) xborder+=f_xresosize;
5203                    if(yborder<0) yborder+=f_yresosize;
5204                  }
5205                  else
5206                  {
5207                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
5208                    {
5209                      continue;
5210                    }
5211                    else //within boundary
5212                    {
5213                      xborder = itxx;
5214                      yborder = ityy;
5215                    }
5216                  }
5217
5218                  int fromIndex =  cellmap_slow(f_pre,f_suf,xborder,yborder);
5219                  if(Math.abs(conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep])!=0)
5220                  {
5221                    double synWei = stre*conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep];
5222                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
5223                    {
5224                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5225                    }
5226
5227                    //                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
5228                    SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5229                    //if(fromIndex == 38036 && hostId == 1) throw new RuntimeException("this has a syn"+axons[fromIndex].branches.length);
5230                    
5231                    axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5232                      = modelFactory.createSynapse (
5233                        neuronID,
5234                        ( byte ) type,
5235                        ( float ) synWei );
5236                    
5237                    numSYN++;
5238
5239
5240                    //  neurons[neuronID-base].getAxon().branches[(int)(sid.id)].synapses[(int)(sid.size)] = new Synapse(toIndex,synWei,type);
5241                    sid.size++;
5242                  }
5243
5244                }
5245              }
5246
5247            }
5248          }
5249
5250
5251        }
5252        else //divergent // change it into convergent
5253        {
5254          conn = FunUtil.lRotate90(trans);
5255          if(t_xmulti<0&&f_xmulti>0)
5256          {
5257            numX = f_xmulti;
5258            denomX = 1;
5259          }
5260          else if(t_xmulti<0&&f_xmulti<0)
5261          {
5262            numX = 1;
5263            denomX = 1;
5264          }
5265          else if(t_xmulti>0&&f_xmulti>0)
5266          {
5267            numX = f_xmulti;
5268            denomX = t_xmulti;
5269          }
5270          else if(t_xmulti>0&&f_xmulti<0)
5271          {
5272            numX = 1;
5273            denomX = t_xmulti;
5274          }
5275
5276
5277          if(t_ymulti<0&&f_ymulti>0)
5278          {
5279            numY = f_ymulti;
5280            denomY = 1;
5281          }
5282          else if(t_ymulti<0&&f_ymulti<0)
5283          {
5284            numY = 1;
5285            denomY = 1;
5286          }
5287          else if(t_ymulti>0&&f_ymulti>0)
5288          {
5289            numY = f_ymulti;
5290            denomY = t_ymulti;
5291          }
5292          else if(t_ymulti>0&&f_ymulti<0)
5293          {
5294            numY = 1;
5295            denomY = t_ymulti;
5296          }
5297
5298          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
5299          {
5300            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
5301            {
5302              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
5303
5304              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
5305              newx=xy[0];
5306              newy=xy[1];            
5307
5308              for(int itxx=newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep)))+1)*(f_xstep);itxx<=newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep))))*(f_xstep);itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
5309              {
5310                for(int ityy=newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep)))+1)*(f_ystep);ityy<=newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep))))*(f_ystep);ityy+=f_ystep)  
5311                {
5312                  if(periodic)
5313                  {
5314                    xborder = itxx % f_xresosize;
5315                    yborder = ityy % f_yresosize;
5316                    if(xborder<0) xborder+=f_xresosize;
5317                    if(yborder<0) yborder+=f_yresosize;
5318                  }
5319                  else
5320                  {
5321                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
5322                    {
5323                      continue;
5324                    }
5325                    else //within boundary
5326                    {
5327                      xborder = itxx;
5328                      yborder = ityy;
5329                    }
5330                  }
5331                  int fromIndex = cellmap_slow(f_pre,f_suf,xborder,yborder);
5332
5333                  int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/t_xstep+(((conn.length%2)==0?conn.length-1:conn.length)/2);
5334                  int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/t_ystep+(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2);
5335                  if(maX>=0 && maX < conn.length && maY>=0 && maY < conn[0].length )
5336                  {
5337                    if(Math.abs(conn[maX][maY])!=0)
5338                    {
5339                      double synWei = stre*conn[maX][maY];
5340                      if(Math.abs(synWei) > SIFNeuron.maxWeight)
5341                      {
5342                        if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5343                      }
5344
5345                      SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5346                      
5347                      axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5348                        = modelFactory.createSynapse (
5349                          neuronID,
5350                          ( byte ) type,
5351                          ( float ) synWei );
5352                      
5353                      numSYN++;
5354
5355
5356                      sid.size++;
5357                    }
5358                  }
5359
5360                }
5361              }
5362
5363            }
5364          }
5365
5366
5367        }
5368
5369      }
5370      return maxOutput;  
5371    }
5372
5373    public void setSeed(Seed i)
5374    ////////////////////////////////////////////////////////////////////////
5375    {
5376      backseed = i.seed;
5377      System.arraycopy(Cnsran.iv,0,back_iv,0,32);
5378      back_iy = Cnsran.iy;
5379      back_idum2=Cnsran.idum2;
5380      this.idum = new Seed(backseed);
5381    }
5382
5383    public void reSetSeed()
5384    ////////////////////////////////////////////////////////////////////////
5385    {
5386      this.idum = new Seed(backseed);
5387      System.arraycopy(back_iv,0,Cnsran.iv,0,32);
5388      Cnsran.iy = back_iy;
5389      Cnsran.idum2 = back_idum2;
5390    }
5391
5392    /***********************************************************************
5393    *  Makeing connections between from and to layer of neurons, probability connection.
5394    * 
5395    * @param f_pre
5396    * @param f_suf
5397    * @param t_pre
5398    * @param t_suf
5399    * @param convergent
5400    * @param stre
5401    * @param type
5402    * @param delay
5403    * @param trans
5404    * @param hostId
5405    * @param periodic
5406    * @return Largest weight
5407    ***********************************************************************/
5408    public double connect(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] proma, double [][] strma, int hostId, boolean periodic) // probability connections
5409    ////////////////////////////////////////////////////////////////////////
5410    {
5411      if(strma!=null && (proma.length != strma.length  || proma[0].length != strma[0].length)) throw new RuntimeException("matrix size doesn't match for probability connection");
5412
5413
5414      double maxOutput=-1.0;
5415      //    System.out.println("connect");
5416      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
5417      f_xmulti=getXmultiplier(f_pre,f_suf);
5418      f_ymulti=getYmultiplier(f_pre,f_suf);
5419      t_xmulti=getXmultiplier(t_pre,t_suf);
5420      t_ymulti=getYmultiplier(t_pre,t_suf);
5421      int f_xstep,f_ystep,f_xresosize,f_yresosize;
5422      int t_xstep,t_ystep,t_xresosize,t_yresosize;
5423      int denomX=0,numX=0;
5424      int denomY=0,numY=0;
5425      int xmagratio=0;
5426      int ymagratio=0;
5427      int xborder,yborder;
5428      int newx=0;
5429      int newy=0;
5430      //    double[] curr=new double[2];
5431      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
5432      //    String fromNeur,toNeur;
5433      int[] xy=new int[2];
5434
5435      int secX = hostId/sectionsInAxisY;
5436      int secY = hostId%sectionsInAxisY;
5437
5438      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
5439      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
5440      int xOri_ff,yOri_ff;
5441      int xOri_tt,yOri_tt;
5442
5443
5444      if(f_xmulti>0)
5445      {
5446        xstep_ff=1;
5447        if(secX!=0)
5448        {
5449          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5450        }
5451        else
5452        {
5453          xOri_ff=0;
5454        }
5455        if(secX!=sectionsInAxisX-1)
5456        {
5457          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5458        }
5459        else
5460        {
5461          xresosize_ff=f_xmulti*edgeLengthX;
5462        }
5463      }
5464      else
5465      {
5466        xstep_ff=-f_xmulti;
5467        if(secX!=0)
5468        {
5469          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5470          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
5471        }
5472        else
5473        {
5474          xOri_ff=0;
5475        }
5476        if(secX!=sectionsInAxisX-1)
5477        {
5478          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5479          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
5480          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
5481        }
5482        else
5483        {
5484          xresosize_ff=edgeLengthX;
5485        }
5486      }
5487      if(f_ymulti>0)
5488      {
5489        ystep_ff=1;
5490        if(secY!=0)
5491        {
5492          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5493        }
5494        else
5495        {
5496          yOri_ff=0;
5497        }
5498        if(secY!=sectionsInAxisY-1)
5499        {
5500          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5501        }
5502        else
5503        {
5504          yresosize_ff=f_ymulti*edgeLengthY;
5505        }
5506      }
5507      else
5508      {
5509        ystep_ff=-f_ymulti;
5510        if(secY!=0)
5511        {
5512          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5513          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
5514        }
5515        else
5516        {
5517          yOri_ff=0;
5518        }
5519        if(secY!=sectionsInAxisY-1)
5520        {
5521          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5522          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
5523          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
5524        }
5525        else
5526        {
5527          yresosize_ff=edgeLengthY;
5528        }
5529      }
5530
5531      if(t_xmulti>0)
5532      {
5533        xstep_tt=1;
5534        if(secX!=0)
5535        {
5536          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5537        }
5538        else
5539        {
5540          xOri_tt=0;
5541        }
5542        if(secX!=sectionsInAxisX-1)
5543        {
5544          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5545        }
5546        else
5547        {
5548          xresosize_tt=t_xmulti*edgeLengthX;
5549        }
5550      }
5551      else
5552      {
5553        xstep_tt=-t_xmulti;
5554        if(secX!=0)
5555        {
5556          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
5557          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
5558        }
5559        else
5560        {
5561          xOri_tt=0;
5562        }
5563        if(secX!=sectionsInAxisX-1)
5564        {
5565          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
5566          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
5567          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
5568        }
5569        else
5570        {
5571          xresosize_tt=edgeLengthX;
5572        }
5573      }
5574      if(t_ymulti>0)
5575      {
5576        ystep_tt=1;
5577        if(secY!=0)
5578        {
5579          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5580        }
5581        else
5582        {
5583          yOri_tt=0;
5584        }
5585        if(secY!=sectionsInAxisY-1)
5586        {
5587          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5588        }
5589        else
5590        {
5591          yresosize_tt=t_ymulti*edgeLengthY;
5592        }
5593      }
5594      else
5595      {
5596        ystep_tt=-t_ymulti;
5597        if(secY!=0)
5598        {
5599          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
5600          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
5601        }
5602        else
5603        {
5604          yOri_tt=0;
5605        }
5606        if(secY!=sectionsInAxisY-1)
5607        {
5608          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
5609          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
5610          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
5611        }
5612        else
5613        {
5614          yresosize_tt=edgeLengthY;
5615        }
5616      }
5617
5618      if(type==1&&stre>0) // these maynot be useful for new neuronal model
5619      System.err.println("sign of connection is wrong");
5620      if(type==0&&stre<0)
5621        System.err.println("sign of connection is wrong");
5622
5623
5624      if(stre!=0)
5625      {
5626        if(f_xmulti>0)
5627        {
5628          f_xstep=1;
5629          f_xresosize=f_xmulti*edgeLengthX;
5630        }
5631        else
5632        {
5633          f_xstep=-f_xmulti;
5634          f_xresosize=edgeLengthX;
5635        }
5636        if(f_ymulti>0)
5637        {
5638          f_ystep=1;
5639          f_yresosize=f_ymulti*edgeLengthY;
5640        }
5641        else
5642        {
5643          f_ystep=-f_ymulti;
5644          f_yresosize=edgeLengthY;
5645        }
5646        if(t_xmulti>0)
5647        {
5648          t_xstep=1;
5649          t_xresosize=t_xmulti*edgeLengthX;
5650        }
5651        else
5652        {
5653          t_xstep=-t_xmulti;
5654          t_xresosize=edgeLengthX;
5655        }
5656        if(t_ymulti>0)
5657        {
5658          t_ystep=1;
5659          t_yresosize=t_ymulti*edgeLengthY;
5660        }
5661        else
5662        {
5663          t_ystep=-t_ymulti;
5664          t_yresosize=edgeLengthY;
5665        }
5666
5667        double [][] conn=null;
5668        double [][] pconn;
5669        //  make connections here.
5670        if(convergent) //convergence connections from many to 1, first iterate to side
5671        {
5672
5673          if(strma!=null) conn = FunUtil.rRotate90(strma);
5674          pconn = FunUtil.rRotate90(proma);
5675          if(t_xmulti<0&&f_xmulti>0)
5676          {
5677            numX = f_xmulti;
5678            denomX = 1;
5679          }
5680          else if(t_xmulti<0&&f_xmulti<0)
5681          {
5682            numX = 1;
5683            denomX = 1;
5684          }
5685          else if(t_xmulti>0&&f_xmulti>0)
5686          {
5687            numX = f_xmulti;
5688            denomX = t_xmulti;
5689          }
5690          else if(t_xmulti>0&&f_xmulti<0)
5691          {
5692            numX = 1;
5693            denomX = t_xmulti;
5694          }
5695
5696
5697          if(t_ymulti<0&&f_ymulti>0)
5698          {
5699            numY = f_ymulti;
5700            denomY = 1;
5701          }
5702          else if(t_ymulti<0&&f_ymulti<0)
5703          {
5704            numY = 1;
5705            denomY = 1;
5706          }
5707          else if(t_ymulti>0&&f_ymulti>0)
5708          {
5709            numY = f_ymulti;
5710            denomY = t_ymulti;
5711          }
5712          else if(t_ymulti>0&&f_ymulti<0)
5713          {
5714            numY = 1;
5715            denomY = t_ymulti;
5716          }
5717
5718          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
5719          {
5720            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
5721            {
5722              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
5723
5724              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
5725              newx=xy[0];
5726              newy=xy[1];            
5727
5728              for(int itxx=newx-pconn.length/2*f_xstep;itxx<newx+((pconn.length%2)==0?pconn.length:pconn.length+1)/2*f_xstep;itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
5729              {
5730                for(int ityy=newy-pconn[0].length/2*f_ystep;ityy<newy+((pconn[0].length%2)==0?pconn[0].length:pconn[0].length+1)/2*f_ystep;ityy+=f_ystep)
5731                {
5732                  if(periodic)
5733                  {
5734                    xborder = itxx % f_xresosize;
5735                    yborder = ityy % f_yresosize;
5736                    if(xborder<0) xborder+=f_xresosize;
5737                    if(yborder<0) yborder+=f_yresosize;
5738                  }
5739                  else
5740                  {
5741                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
5742                    {
5743                      continue;
5744                    }
5745                    else //within boundary
5746                    {
5747                      xborder = itxx;
5748                      yborder = ityy;
5749                    }
5750                  }
5751
5752                  int fromIndex =  cellmap_slow(f_pre,f_suf,xborder,yborder);
5753                  if(pconn[(itxx-newx+pconn.length/2*f_xstep)/f_xstep][(ityy-newy+pconn[0].length/2*f_ystep)/f_ystep]> Cnsran.ran2(idum))
5754                  {
5755                    if(strma != null)
5756                    {
5757                      if(Math.abs(conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep])!=0)
5758                      {
5759                        double synWei = stre*conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep];
5760                        if(Math.abs(synWei) > SIFNeuron.maxWeight)
5761                        {
5762                          if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5763                        }
5764
5765                        //                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
5766                        SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5767                        //if(fromIndex == 38036 && hostId == 1) throw new RuntimeException("this has a syn"+axons[fromIndex].branches.length);
5768                        
5769                        axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5770                          = modelFactory.createSynapse (
5771                            neuronID,
5772                            ( byte ) type,
5773                            ( float ) synWei );
5774                        
5775                        numSYN++;
5776
5777
5778                        //  neurons[neuronID-base].getAxon().branches[(int)(sid.id)].synapses[(int)(sid.size)] = new Synapse(toIndex,synWei,type);
5779                        sid.size++;
5780                      }
5781                    }
5782                    else
5783                    {
5784                      double synWei = stre;
5785                      if(Math.abs(synWei) > SIFNeuron.maxWeight)
5786                      {
5787                        if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5788                      }
5789
5790                      //                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
5791                      SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5792                      //if(fromIndex == 38036 && hostId == 1) throw new RuntimeException("this has a syn"+axons[fromIndex].branches.length);
5793                      
5794                      axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5795                        = modelFactory.createSynapse (
5796                          neuronID,
5797                          ( byte ) type,
5798                          ( float ) synWei );
5799                      
5800                      numSYN++;
5801
5802                      //  neurons[neuronID-base].getAxon().branches[(int)(sid.id)].synapses[(int)(sid.size)] = new Synapse(toIndex,synWei,type);
5803                      
5804                      sid.size++;
5805                    }
5806                  }
5807
5808                }
5809              }
5810
5811            }
5812          }
5813
5814
5815        }
5816        else //divergent // change it into convergent
5817        {
5818          if(strma!=null) conn = FunUtil.lRotate90(strma);
5819          pconn = FunUtil.lRotate90(proma);
5820          if(t_xmulti<0&&f_xmulti>0)
5821          {
5822            numX = f_xmulti;
5823            denomX = 1;
5824          }
5825          else if(t_xmulti<0&&f_xmulti<0)
5826          {
5827            numX = 1;
5828            denomX = 1;
5829          }
5830          else if(t_xmulti>0&&f_xmulti>0)
5831          {
5832            numX = f_xmulti;
5833            denomX = t_xmulti;
5834          }
5835          else if(t_xmulti>0&&f_xmulti<0)
5836          {
5837            numX = 1;
5838            denomX = t_xmulti;
5839          }
5840
5841
5842          if(t_ymulti<0&&f_ymulti>0)
5843          {
5844            numY = f_ymulti;
5845            denomY = 1;
5846          }
5847          else if(t_ymulti<0&&f_ymulti<0)
5848          {
5849            numY = 1;
5850            denomY = 1;
5851          }
5852          else if(t_ymulti>0&&f_ymulti>0)
5853          {
5854            numY = f_ymulti;
5855            denomY = t_ymulti;
5856          }
5857          else if(t_ymulti>0&&f_ymulti<0)
5858          {
5859            numY = 1;
5860            denomY = t_ymulti;
5861          }
5862
5863          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
5864          {
5865            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
5866            {
5867              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
5868
5869              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
5870              newx=xy[0];
5871              newy=xy[1];            
5872
5873              for(int itxx=newx-((int)((double)(pconn.length/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep)))+1)*(f_xstep);itxx<=newx+((int)((double)(((pconn.length%2)==0?pconn.length-1:pconn.length)/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep))))*(f_xstep);itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
5874              {
5875                for(int ityy=newy-((int)((double)(pconn[0].length/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep)))+1)*(f_ystep);ityy<=newy+((int)((double)(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep))))*(f_ystep);ityy+=f_ystep)  
5876                {
5877                  if(periodic)
5878                  {
5879                    xborder = itxx % f_xresosize;
5880                    yborder = ityy % f_yresosize;
5881                    if(xborder<0) xborder+=f_xresosize;
5882                    if(yborder<0) yborder+=f_yresosize;
5883                  }
5884                  else
5885                  {
5886                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
5887                    {
5888                      continue;
5889                    }
5890                    else //within boundary
5891                    {
5892                      xborder = itxx;
5893                      yborder = ityy;
5894                    }
5895                  }
5896                  int fromIndex = cellmap_slow(f_pre,f_suf,xborder,yborder);
5897
5898                  int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/t_xstep+(((pconn.length%2)==0?pconn.length-1:pconn.length)/2);
5899                  int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/t_ystep+(((pconn[0].length%2)==0?pconn[0].length-1:pconn[0].length)/2);
5900                  if(maX>=0 && maX < pconn.length && maY>=0 && maY < pconn[0].length )
5901                  {
5902                    if(pconn[maX][maY] > Cnsran.ran2(idum))
5903                    {
5904                      if(strma != null)
5905                      {
5906                        if(Math.abs(conn[maX][maY])!=0)
5907                        {
5908                          double synWei = stre*conn[maX][maY];
5909                          if(Math.abs(synWei) > SIFNeuron.maxWeight)
5910                          {
5911                            if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5912                          }
5913
5914                          SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5915                          
5916                          axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5917                            = modelFactory.createSynapse (
5918                              neuronID,
5919                              ( byte ) type,
5920                              ( float ) synWei );
5921                          
5922                          numSYN++;
5923                          sid.size++;
5924                        }
5925                      }
5926                      else
5927                      {
5928                        double synWei = stre;
5929                        if(Math.abs(synWei) > SIFNeuron.maxWeight)
5930                        {
5931                          if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
5932                        }
5933
5934                        SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
5935                        
5936                        axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
5937                          = modelFactory.createSynapse (
5938                            neuronID,
5939                            ( byte ) type,
5940                            ( float ) synWei );
5941                        
5942                        numSYN++;
5943
5944                        sid.size++;
5945
5946                      }
5947                    }
5948                  }
5949
5950                }
5951              }
5952
5953            }
5954          }
5955
5956
5957        }
5958
5959      }
5960      return maxOutput;  
5961    }
5962
5963    /***********************************************************************
5964    *  Makeing connections between from and to layer of neurons, general connection.
5965    * 
5966    * @param f_pre
5967    * @param f_suf
5968    * @param t_pre
5969    * @param t_suf
5970    * @param convergent
5971    * @param stre
5972    * @param type
5973    * @param delay
5974    * @param trans
5975    * @param hostId
5976    * @param periodic
5977    * @return Largest weight
5978    ***********************************************************************/
5979    public double connect(String f_pre, String f_suf, String t_pre, String t_suf, double stre, int type, double delay, double[][] trans, int hostId) //general connection
5980    ////////////////////////////////////////////////////////////////////////
5981    {
5982      double maxOutput=-1.0;
5983      //    System.out.println("connect");
5984      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
5985      f_xmulti=getXmultiplier(f_pre,f_suf);
5986      f_ymulti=getYmultiplier(f_pre,f_suf);
5987      t_xmulti=getXmultiplier(t_pre,t_suf);
5988      t_ymulti=getYmultiplier(t_pre,t_suf);
5989      int f_xstep,f_ystep,f_xresosize,f_yresosize;
5990      int t_xstep,t_ystep,t_xresosize,t_yresosize;
5991      int denomX=0,numX=0;
5992      int denomY=0,numY=0;
5993      int xmagratio=0;
5994      int ymagratio=0;
5995      int xborder,yborder;
5996      int newx=0;
5997      int newy=0;
5998      //    double[] curr=new double[2];
5999      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
6000      //    String fromNeur,toNeur;
6001      TreeSet<Synapse> synapses;
6002      int[] xy=new int[2];
6003
6004      int secX = hostId/sectionsInAxisY;
6005      int secY = hostId%sectionsInAxisY;
6006
6007      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
6008      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
6009      int xOri_ff,yOri_ff;
6010      int xOri_tt,yOri_tt;
6011
6012
6013      if(f_xmulti>0)
6014      {
6015        xstep_ff=1;
6016        if(secX!=0)
6017        {
6018          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6019        }
6020        else
6021        {
6022          xOri_ff=0;
6023        }
6024        if(secX!=sectionsInAxisX-1)
6025        {
6026          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6027        }
6028        else
6029        {
6030          xresosize_ff=f_xmulti*edgeLengthX;
6031        }
6032      }
6033      else
6034      {
6035        xstep_ff=-f_xmulti;
6036        if(secX!=0)
6037        {
6038          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6039          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
6040        }
6041        else
6042        {
6043          xOri_ff=0;
6044        }
6045        if(secX!=sectionsInAxisX-1)
6046        {
6047          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6048          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
6049          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
6050        }
6051        else
6052        {
6053          xresosize_ff=edgeLengthX;
6054        }
6055      }
6056      if(f_ymulti>0)
6057      {
6058        ystep_ff=1;
6059        if(secY!=0)
6060        {
6061          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6062        }
6063        else
6064        {
6065          yOri_ff=0;
6066        }
6067        if(secY!=sectionsInAxisY-1)
6068        {
6069          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6070        }
6071        else
6072        {
6073          yresosize_ff=f_ymulti*edgeLengthY;
6074        }
6075      }
6076      else
6077      {
6078        ystep_ff=-f_ymulti;
6079        if(secY!=0)
6080        {
6081          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6082          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
6083        }
6084        else
6085        {
6086          yOri_ff=0;
6087        }
6088        if(secY!=sectionsInAxisY-1)
6089        {
6090          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6091          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
6092          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
6093        }
6094        else
6095        {
6096          yresosize_ff=edgeLengthY;
6097        }
6098      }
6099
6100      if(t_xmulti>0)
6101      {
6102        xstep_tt=1;
6103        if(secX!=0)
6104        {
6105          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6106        }
6107        else
6108        {
6109          xOri_tt=0;
6110        }
6111        if(secX!=sectionsInAxisX-1)
6112        {
6113          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6114        }
6115        else
6116        {
6117          xresosize_tt=t_xmulti*edgeLengthX;
6118        }
6119      }
6120      else
6121      {
6122        xstep_tt=-t_xmulti;
6123        if(secX!=0)
6124        {
6125          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6126          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
6127        }
6128        else
6129        {
6130          xOri_tt=0;
6131        }
6132        if(secX!=sectionsInAxisX-1)
6133        {
6134          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6135          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
6136          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
6137        }
6138        else
6139        {
6140          xresosize_tt=edgeLengthX;
6141        }
6142      }
6143      if(t_ymulti>0)
6144      {
6145        ystep_tt=1;
6146        if(secY!=0)
6147        {
6148          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6149        }
6150        else
6151        {
6152          yOri_tt=0;
6153        }
6154        if(secY!=sectionsInAxisY-1)
6155        {
6156          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6157        }
6158        else
6159        {
6160          yresosize_tt=t_ymulti*edgeLengthY;
6161        }
6162      }
6163      else
6164      {
6165        ystep_tt=-t_ymulti;
6166        if(secY!=0)
6167        {
6168          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6169          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
6170        }
6171        else
6172        {
6173          yOri_tt=0;
6174        }
6175        if(secY!=sectionsInAxisY-1)
6176        {
6177          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6178          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
6179          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
6180        }
6181        else
6182        {
6183          yresosize_tt=edgeLengthY;
6184        }
6185      }
6186
6187      if(type==1&&stre>0) // these maynot be useful for new neuronal model
6188      System.err.println("sign of connection is wrong");
6189      if(type==0&&stre<0)
6190        System.err.println("sign of connection is wrong");
6191
6192
6193      if(stre!=0)
6194      {
6195        if(f_xmulti>0)
6196        {
6197          f_xstep=1;
6198          f_xresosize=f_xmulti*edgeLengthX;
6199        }
6200        else
6201        {
6202          f_xstep=-f_xmulti;
6203          f_xresosize=edgeLengthX;
6204        }
6205        if(f_ymulti>0)
6206        {
6207          f_ystep=1;
6208          f_yresosize=f_ymulti*edgeLengthY;
6209        }
6210        else
6211        {
6212          f_ystep=-f_ymulti;
6213          f_yresosize=edgeLengthY;
6214        }
6215        if(t_xmulti>0)
6216        {
6217          t_xstep=1;
6218          t_xresosize=t_xmulti*edgeLengthX;
6219        }
6220        else
6221        {
6222          t_xstep=-t_xmulti;
6223          t_xresosize=edgeLengthX;
6224        }
6225        if(t_ymulti>0)
6226        {
6227          t_ystep=1;
6228          t_yresosize=t_ymulti*edgeLengthY;
6229        }
6230        else
6231        {
6232          t_ystep=-t_ymulti;
6233          t_yresosize=edgeLengthY;
6234        }
6235
6236
6237        if(t_xmulti<0&&f_xmulti>0)
6238        {
6239          numX = f_xmulti;
6240          denomX = 1;
6241        }
6242        else if(t_xmulti<0&&f_xmulti<0)
6243        {
6244          numX = 1;
6245          denomX = 1;
6246        }
6247        else if(t_xmulti>0&&f_xmulti>0)
6248        {
6249          numX = f_xmulti;
6250          denomX = t_xmulti;
6251        }
6252        else if(t_xmulti>0&&f_xmulti<0)
6253        {
6254          numX = 1;
6255          denomX = t_xmulti;
6256        }
6257
6258
6259        if(t_ymulti<0&&f_ymulti>0)
6260        {
6261          numY = f_ymulti;
6262          denomY = 1;
6263        }
6264        else if(t_ymulti<0&&f_ymulti<0)
6265        {
6266          numY = 1;
6267          denomY = 1;
6268        }
6269        else if(t_ymulti>0&&f_ymulti>0)
6270        {
6271          numY = f_ymulti;
6272          denomY = t_ymulti;
6273        }
6274        else if(t_ymulti>0&&f_ymulti<0)
6275        {
6276          numY = 1;
6277          denomY = t_ymulti;
6278        }
6279
6280        for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
6281        {
6282          for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
6283          {
6284            int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
6285            int tIndex = (iterx / t_xstep) * (t_yresosize / t_ystep) + itery / t_ystep;
6286
6287            for(int itxx=0;itxx<f_xresosize;itxx+=f_xstep)
6288            {
6289              for(int ityy=0;ityy<f_yresosize;ityy+=f_ystep)
6290              {
6291                int fIndex = (itxx / f_xstep)*(f_yresosize / f_ystep) + ityy / f_ystep;
6292
6293                int fromIndex =  cellmap_slow(f_pre,f_suf,itxx,ityy);
6294                if(Math.abs(trans[fIndex % trans.length][tIndex % trans[0].length])!=0)
6295                {
6296                  double synWei = stre*trans[fIndex % trans.length][tIndex % trans[0].length];
6297                  if(Math.abs(synWei) > SIFNeuron.maxWeight)
6298                  {
6299                    if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
6300                  }
6301
6302                  SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
6303                  
6304                  axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
6305                    = modelFactory.createSynapse (
6306                      neuronID,
6307                      ( byte ) type,
6308                      ( float ) synWei );
6309                  
6310                  numSYN++;
6311
6312
6313                  sid.size++;
6314                }
6315              }
6316            }
6317
6318          }
6319        }
6320      }
6321      return maxOutput;  
6322    }
6323
6324    /***********************************************************************
6325    *  Makeing connections between from and to layer of neurons, general probability connection.
6326    * 
6327    * @param f_pre
6328    * @param f_suf
6329    * @param t_pre
6330    * @param t_suf
6331    * @param convergent
6332    * @param stre
6333    * @param type
6334    * @param delay
6335    * @param trans
6336    * @param hostId
6337    * @param periodic
6338    * @return Largest weight
6339    ***********************************************************************/
6340    public double connectgp(String f_pre, String f_suf, String t_pre, String t_suf, double stre, int type, double delay, double[][] proma, double [][] strma, int hostId) //general probability connection
6341    ////////////////////////////////////////////////////////////////////////
6342    {
6343      double maxOutput=-1.0;
6344      //    System.out.println("connect");
6345      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
6346      f_xmulti=getXmultiplier(f_pre,f_suf);
6347      f_ymulti=getYmultiplier(f_pre,f_suf);
6348      t_xmulti=getXmultiplier(t_pre,t_suf);
6349      t_ymulti=getYmultiplier(t_pre,t_suf);
6350      int f_xstep,f_ystep,f_xresosize,f_yresosize;
6351      int t_xstep,t_ystep,t_xresosize,t_yresosize;
6352      int denomX=0,numX=0;
6353      int denomY=0,numY=0;
6354      int xmagratio=0;
6355      int ymagratio=0;
6356      int xborder,yborder;
6357      int newx=0;
6358      int newy=0;
6359      //    double[] curr=new double[2];
6360      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
6361      //    String fromNeur,toNeur;
6362      TreeSet<Synapse> synapses;
6363      int[] xy=new int[2];
6364
6365      int secX = hostId/sectionsInAxisY;
6366      int secY = hostId%sectionsInAxisY;
6367
6368      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
6369      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
6370      int xOri_ff,yOri_ff;
6371      int xOri_tt,yOri_tt;
6372
6373
6374      if(f_xmulti>0)
6375      {
6376        xstep_ff=1;
6377        if(secX!=0)
6378        {
6379          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6380        }
6381        else
6382        {
6383          xOri_ff=0;
6384        }
6385        if(secX!=sectionsInAxisX-1)
6386        {
6387          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6388        }
6389        else
6390        {
6391          xresosize_ff=f_xmulti*edgeLengthX;
6392        }
6393      }
6394      else
6395      {
6396        xstep_ff=-f_xmulti;
6397        if(secX!=0)
6398        {
6399          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6400          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
6401        }
6402        else
6403        {
6404          xOri_ff=0;
6405        }
6406        if(secX!=sectionsInAxisX-1)
6407        {
6408          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6409          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
6410          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
6411        }
6412        else
6413        {
6414          xresosize_ff=edgeLengthX;
6415        }
6416      }
6417      if(f_ymulti>0)
6418      {
6419        ystep_ff=1;
6420        if(secY!=0)
6421        {
6422          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6423        }
6424        else
6425        {
6426          yOri_ff=0;
6427        }
6428        if(secY!=sectionsInAxisY-1)
6429        {
6430          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6431        }
6432        else
6433        {
6434          yresosize_ff=f_ymulti*edgeLengthY;
6435        }
6436      }
6437      else
6438      {
6439        ystep_ff=-f_ymulti;
6440        if(secY!=0)
6441        {
6442          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6443          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
6444        }
6445        else
6446        {
6447          yOri_ff=0;
6448        }
6449        if(secY!=sectionsInAxisY-1)
6450        {
6451          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6452          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
6453          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
6454        }
6455        else
6456        {
6457          yresosize_ff=edgeLengthY;
6458        }
6459      }
6460
6461      if(t_xmulti>0)
6462      {
6463        xstep_tt=1;
6464        if(secX!=0)
6465        {
6466          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6467        }
6468        else
6469        {
6470          xOri_tt=0;
6471        }
6472        if(secX!=sectionsInAxisX-1)
6473        {
6474          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6475        }
6476        else
6477        {
6478          xresosize_tt=t_xmulti*edgeLengthX;
6479        }
6480      }
6481      else
6482      {
6483        xstep_tt=-t_xmulti;
6484        if(secX!=0)
6485        {
6486          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6487          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
6488        }
6489        else
6490        {
6491          xOri_tt=0;
6492        }
6493        if(secX!=sectionsInAxisX-1)
6494        {
6495          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6496          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
6497          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
6498        }
6499        else
6500        {
6501          xresosize_tt=edgeLengthX;
6502        }
6503      }
6504      if(t_ymulti>0)
6505      {
6506        ystep_tt=1;
6507        if(secY!=0)
6508        {
6509          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6510        }
6511        else
6512        {
6513          yOri_tt=0;
6514        }
6515        if(secY!=sectionsInAxisY-1)
6516        {
6517          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6518        }
6519        else
6520        {
6521          yresosize_tt=t_ymulti*edgeLengthY;
6522        }
6523      }
6524      else
6525      {
6526        ystep_tt=-t_ymulti;
6527        if(secY!=0)
6528        {
6529          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6530          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
6531        }
6532        else
6533        {
6534          yOri_tt=0;
6535        }
6536        if(secY!=sectionsInAxisY-1)
6537        {
6538          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6539          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
6540          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
6541        }
6542        else
6543        {
6544          yresosize_tt=edgeLengthY;
6545        }
6546      }
6547
6548      if(type==1&&stre>0) // these maynot be useful for new neuronal model
6549      System.err.println("sign of connection is wrong");
6550      if(type==0&&stre<0)
6551        System.err.println("sign of connection is wrong");
6552
6553
6554      if(stre!=0)
6555      {
6556        if(f_xmulti>0)
6557        {
6558          f_xstep=1;
6559          f_xresosize=f_xmulti*edgeLengthX;
6560        }
6561        else
6562        {
6563          f_xstep=-f_xmulti;
6564          f_xresosize=edgeLengthX;
6565        }
6566        if(f_ymulti>0)
6567        {
6568          f_ystep=1;
6569          f_yresosize=f_ymulti*edgeLengthY;
6570        }
6571        else
6572        {
6573          f_ystep=-f_ymulti;
6574          f_yresosize=edgeLengthY;
6575        }
6576        if(t_xmulti>0)
6577        {
6578          t_xstep=1;
6579          t_xresosize=t_xmulti*edgeLengthX;
6580        }
6581        else
6582        {
6583          t_xstep=-t_xmulti;
6584          t_xresosize=edgeLengthX;
6585        }
6586        if(t_ymulti>0)
6587        {
6588          t_ystep=1;
6589          t_yresosize=t_ymulti*edgeLengthY;
6590        }
6591        else
6592        {
6593          t_ystep=-t_ymulti;
6594          t_yresosize=edgeLengthY;
6595        }
6596
6597
6598        if(t_xmulti<0&&f_xmulti>0)
6599        {
6600          numX = f_xmulti;
6601          denomX = 1;
6602        }
6603        else if(t_xmulti<0&&f_xmulti<0)
6604        {
6605          numX = 1;
6606          denomX = 1;
6607        }
6608        else if(t_xmulti>0&&f_xmulti>0)
6609        {
6610          numX = f_xmulti;
6611          denomX = t_xmulti;
6612        }
6613        else if(t_xmulti>0&&f_xmulti<0)
6614        {
6615          numX = 1;
6616          denomX = t_xmulti;
6617        }
6618
6619
6620        if(t_ymulti<0&&f_ymulti>0)
6621        {
6622          numY = f_ymulti;
6623          denomY = 1;
6624        }
6625        else if(t_ymulti<0&&f_ymulti<0)
6626        {
6627          numY = 1;
6628          denomY = 1;
6629        }
6630        else if(t_ymulti>0&&f_ymulti>0)
6631        {
6632          numY = f_ymulti;
6633          denomY = t_ymulti;
6634        }
6635        else if(t_ymulti>0&&f_ymulti<0)
6636        {
6637          numY = 1;
6638          denomY = t_ymulti;
6639        }
6640
6641        for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
6642        {
6643          for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
6644          {
6645            int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
6646            int tIndex = (iterx / t_xstep) * (t_yresosize / t_ystep) + itery / t_ystep;
6647
6648            for(int itxx=0;itxx<f_xresosize;itxx+=f_xstep)
6649            {
6650              for(int ityy=0;ityy<f_yresosize;ityy+=f_ystep)
6651              {
6652                int fIndex = (itxx / f_xstep)*(f_yresosize / f_ystep) + ityy / f_ystep;
6653
6654                int fromIndex =  cellmap_slow(f_pre,f_suf,itxx,ityy);
6655                if(Math.abs(proma[fIndex % proma.length][tIndex % proma[0].length])> Cnsran.ran2(idum))
6656                {
6657                  if(strma != null)
6658                  {
6659                    if(Math.abs(strma[fIndex % strma.length][tIndex % strma[0].length])!=0)
6660                    {
6661                      double synWei = stre*strma[fIndex % strma.length][tIndex % strma[0].length];
6662                      if(Math.abs(synWei) > SIFNeuron.maxWeight)
6663                      {
6664                        if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
6665                      }
6666
6667                      SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
6668                      
6669                      axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
6670                        = modelFactory.createSynapse (
6671                          neuronID,
6672                          ( byte ) type,
6673                          ( float ) synWei );
6674                      
6675                      numSYN++;
6676
6677                      sid.size++;
6678                    }
6679                  }
6680                  else
6681                  {
6682                    double synWei = stre;
6683                    
6684                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
6685                    {
6686                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
6687                    }
6688
6689                    SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
6690                    
6691                    axons.get(fromIndex).branches[(int)(sid.id)].synapses[(int)(sid.size)]
6692                      = modelFactory.createSynapse (
6693                        neuronID,
6694                        ( byte ) type,
6695                        ( float ) synWei );
6696                    
6697                    numSYN++;
6698                    
6699                    sid.size++;
6700                  }
6701                }
6702
6703              }
6704            }
6705
6706          }
6707        }
6708      }
6709      return maxOutput;  
6710    }
6711
6712    @Deprecated
6713    public double changeConnection(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] trans, int hostId, boolean periodic)
6714    ////////////////////////////////////////////////////////////////////////
6715    {
6716      double maxOutput=-1.0;
6717      //    System.out.println("connect");
6718      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
6719      f_xmulti=getXmultiplier(f_pre,f_suf);
6720      f_ymulti=getYmultiplier(f_pre,f_suf);
6721      t_xmulti=getXmultiplier(t_pre,t_suf);
6722      t_ymulti=getYmultiplier(t_pre,t_suf);
6723      int f_xstep,f_ystep,f_xresosize,f_yresosize;
6724      int t_xstep,t_ystep,t_xresosize,t_yresosize;
6725      int denomX=0,numX=0;
6726      int denomY=0,numY=0;
6727      int xmagratio=0;
6728      int ymagratio=0;
6729      int xborder,yborder;
6730      int newx=0;
6731      int newy=0;
6732      //    double[] curr=new double[2];
6733      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
6734      //    String fromNeur,toNeur;
6735      int[] xy=new int[2];
6736
6737      int secX = hostId/sectionsInAxisY;
6738      int secY = hostId%sectionsInAxisY;
6739
6740      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
6741      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
6742      int xOri_ff,yOri_ff;
6743      int xOri_tt,yOri_tt;
6744
6745
6746      if(f_xmulti>0)
6747      {
6748        xstep_ff=1;
6749        if(secX!=0)
6750        {
6751          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6752        }
6753        else
6754        {
6755          xOri_ff=0;
6756        }
6757        if(secX!=sectionsInAxisX-1)
6758        {
6759          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6760        }
6761        else
6762        {
6763          xresosize_ff=f_xmulti*edgeLengthX;
6764        }
6765      }
6766      else
6767      {
6768        xstep_ff=-f_xmulti;
6769        if(secX!=0)
6770        {
6771          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6772          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
6773        }
6774        else
6775        {
6776          xOri_ff=0;
6777        }
6778        if(secX!=sectionsInAxisX-1)
6779        {
6780          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6781          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
6782          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
6783        }
6784        else
6785        {
6786          xresosize_ff=edgeLengthX;
6787        }
6788      }
6789      if(f_ymulti>0)
6790      {
6791        ystep_ff=1;
6792        if(secY!=0)
6793        {
6794          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6795        }
6796        else
6797        {
6798          yOri_ff=0;
6799        }
6800        if(secY!=sectionsInAxisY-1)
6801        {
6802          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6803        }
6804        else
6805        {
6806          yresosize_ff=f_ymulti*edgeLengthY;
6807        }
6808      }
6809      else
6810      {
6811        ystep_ff=-f_ymulti;
6812        if(secY!=0)
6813        {
6814          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6815          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
6816        }
6817        else
6818        {
6819          yOri_ff=0;
6820        }
6821        if(secY!=sectionsInAxisY-1)
6822        {
6823          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6824          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
6825          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
6826        }
6827        else
6828        {
6829          yresosize_ff=edgeLengthY;
6830        }
6831      }
6832
6833      if(t_xmulti>0)
6834      {
6835        xstep_tt=1;
6836        if(secX!=0)
6837        {
6838          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6839        }
6840        else
6841        {
6842          xOri_tt=0;
6843        }
6844        if(secX!=sectionsInAxisX-1)
6845        {
6846          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6847        }
6848        else
6849        {
6850          xresosize_tt=t_xmulti*edgeLengthX;
6851        }
6852      }
6853      else
6854      {
6855        xstep_tt=-t_xmulti;
6856        if(secX!=0)
6857        {
6858          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
6859          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
6860        }
6861        else
6862        {
6863          xOri_tt=0;
6864        }
6865        if(secX!=sectionsInAxisX-1)
6866        {
6867          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
6868          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
6869          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
6870        }
6871        else
6872        {
6873          xresosize_tt=edgeLengthX;
6874        }
6875      }
6876      if(t_ymulti>0)
6877      {
6878        ystep_tt=1;
6879        if(secY!=0)
6880        {
6881          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6882        }
6883        else
6884        {
6885          yOri_tt=0;
6886        }
6887        if(secY!=sectionsInAxisY-1)
6888        {
6889          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6890        }
6891        else
6892        {
6893          yresosize_tt=t_ymulti*edgeLengthY;
6894        }
6895      }
6896      else
6897      {
6898        ystep_tt=-t_ymulti;
6899        if(secY!=0)
6900        {
6901          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
6902          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
6903        }
6904        else
6905        {
6906          yOri_tt=0;
6907        }
6908        if(secY!=sectionsInAxisY-1)
6909        {
6910          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
6911          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
6912          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
6913        }
6914        else
6915        {
6916          yresosize_tt=edgeLengthY;
6917        }
6918      }
6919
6920      if(type==1&&stre>0) // these maynot be useful for new neuronal model
6921      System.err.println("sign of connection is wrong");
6922      if(type==0&&stre<0)
6923        System.err.println("sign of connection is wrong");
6924
6925
6926      if(stre!=0)
6927      {
6928        if(f_xmulti>0)
6929        {
6930          f_xstep=1;
6931          f_xresosize=f_xmulti*edgeLengthX;
6932        }
6933        else
6934        {
6935          f_xstep=-f_xmulti;
6936          f_xresosize=edgeLengthX;
6937        }
6938        if(f_ymulti>0)
6939        {
6940          f_ystep=1;
6941          f_yresosize=f_ymulti*edgeLengthY;
6942        }
6943        else
6944        {
6945          f_ystep=-f_ymulti;
6946          f_yresosize=edgeLengthY;
6947        }
6948        if(t_xmulti>0)
6949        {
6950          t_xstep=1;
6951          t_xresosize=t_xmulti*edgeLengthX;
6952        }
6953        else
6954        {
6955          t_xstep=-t_xmulti;
6956          t_xresosize=edgeLengthX;
6957        }
6958        if(t_ymulti>0)
6959        {
6960          t_ystep=1;
6961          t_yresosize=t_ymulti*edgeLengthY;
6962        }
6963        else
6964        {
6965          t_ystep=-t_ymulti;
6966          t_yresosize=edgeLengthY;
6967        }
6968
6969        double [][] conn;
6970        //  make connections here.
6971        if(convergent) //convergence connections from many to 1, first iterate to side
6972        {
6973
6974          conn = FunUtil.rRotate90(trans);
6975          if(t_xmulti<0&&f_xmulti>0)
6976          {
6977            numX = f_xmulti;
6978            denomX = 1;
6979          }
6980          else if(t_xmulti<0&&f_xmulti<0)
6981          {
6982            numX = 1;
6983            denomX = 1;
6984          }
6985          else if(t_xmulti>0&&f_xmulti>0)
6986          {
6987            numX = f_xmulti;
6988            denomX = t_xmulti;
6989          }
6990          else if(t_xmulti>0&&f_xmulti<0)
6991          {
6992            numX = 1;
6993            denomX = t_xmulti;
6994          }
6995
6996
6997          if(t_ymulti<0&&f_ymulti>0)
6998          {
6999            numY = f_ymulti;
7000            denomY = 1;
7001          }
7002          else if(t_ymulti<0&&f_ymulti<0)
7003          {
7004            numY = 1;
7005            denomY = 1;
7006          }
7007          else if(t_ymulti>0&&f_ymulti>0)
7008          {
7009            numY = f_ymulti;
7010            denomY = t_ymulti;
7011          }
7012          else if(t_ymulti>0&&f_ymulti<0)
7013          {
7014            numY = 1;
7015            denomY = t_ymulti;
7016          }
7017
7018          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
7019          {
7020            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
7021            {
7022              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
7023
7024              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
7025              newx=xy[0];
7026              newy=xy[1];            
7027
7028              for(int itxx=newx-conn.length/2*f_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*f_xstep;itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
7029              {
7030                for(int ityy=newy-conn[0].length/2*f_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*f_ystep;ityy+=f_ystep)
7031                {
7032                  if(periodic)
7033                  {
7034                    xborder = itxx % f_xresosize;
7035                    yborder = ityy % f_yresosize;
7036                    if(xborder<0) xborder+=f_xresosize;
7037                    if(yborder<0) yborder+=f_yresosize;
7038                  }
7039                  else
7040                  {
7041                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
7042                    {
7043                      continue;
7044                    }
7045                    else //within boundary
7046                    {
7047                      xborder = itxx;
7048                      yborder = ityy;
7049                    }
7050                  }
7051
7052                  int fromIndex =  cellmap_slow(f_pre,f_suf,xborder,yborder);
7053                  if(Math.abs(conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep])!=0)
7054                  {
7055                    double synWei = stre*conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep];
7056                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
7057                    {
7058                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
7059                    }
7060
7061                    //                  int node=FunUtil.hostId(nodeEndIndices,toIndex);
7062                    SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
7063
7064                    final int index = Arrays.binarySearch (
7065                      axons.get ( fromIndex ).branches [ ( int ) ( sid.id ) ].synapses,
7066                      modelFactory.createSynapse (
7067                        neuronID,
7068                        ( byte ) type,
7069                        ( float ) synWei ) );
7070
7071                    if(index>=0)
7072                    {
7073                      final MutableSynapse  synapseMut = ( MutableSynapse )
7074                        axons.get(fromIndex).branches[(int)(sid.id)].synapses[index];
7075                      
7076                      synapseMut.setWeight ( ( float ) synWei );
7077                    }
7078                    else
7079                    {
7080                      throw new RuntimeException("modify none existing synapse");
7081                    }
7082                  }
7083
7084                }
7085              }
7086
7087            }
7088          }
7089
7090
7091        }
7092        else //divergent // change it into convergent
7093        {
7094          conn = FunUtil.lRotate90(trans);
7095          if(t_xmulti<0&&f_xmulti>0)
7096          {
7097            numX = f_xmulti;
7098            denomX = 1;
7099          }
7100          else if(t_xmulti<0&&f_xmulti<0)
7101          {
7102            numX = 1;
7103            denomX = 1;
7104          }
7105          else if(t_xmulti>0&&f_xmulti>0)
7106          {
7107            numX = f_xmulti;
7108            denomX = t_xmulti;
7109          }
7110          else if(t_xmulti>0&&f_xmulti<0)
7111          {
7112            numX = 1;
7113            denomX = t_xmulti;
7114          }
7115
7116
7117          if(t_ymulti<0&&f_ymulti>0)
7118          {
7119            numY = f_ymulti;
7120            denomY = 1;
7121          }
7122          else if(t_ymulti<0&&f_ymulti<0)
7123          {
7124            numY = 1;
7125            denomY = 1;
7126          }
7127          else if(t_ymulti>0&&f_ymulti>0)
7128          {
7129            numY = f_ymulti;
7130            denomY = t_ymulti;
7131          }
7132          else if(t_ymulti>0&&f_ymulti<0)
7133          {
7134            numY = 1;
7135            denomY = t_ymulti;
7136          }
7137
7138          for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
7139          {
7140            for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
7141            {
7142              int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
7143
7144              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
7145              newx=xy[0];
7146              newy=xy[1];            
7147
7148              for(int itxx=newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep)))+1)*(f_xstep);itxx<=newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)t_xstep/(double)f_xstep))))*(f_xstep);itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
7149              {
7150                for(int ityy=newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep)))+1)*(f_ystep);ityy<=newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)t_ystep/(double)denomY/(double)f_ystep))))*(f_ystep);ityy+=f_ystep)  
7151                {
7152                  if(periodic)
7153                  {
7154                    xborder = itxx % f_xresosize;
7155                    yborder = ityy % f_yresosize;
7156                    if(xborder<0) xborder+=f_xresosize;
7157                    if(yborder<0) yborder+=f_yresosize;
7158                  }
7159                  else
7160                  {
7161                    if(itxx >= f_xresosize || itxx < 0 || ityy >= f_yresosize || ityy<0) // out of boundary
7162                    {
7163                      continue;
7164                    }
7165                    else //within boundary
7166                    {
7167                      xborder = itxx;
7168                      yborder = ityy;
7169                    }
7170                  }
7171                  int fromIndex = cellmap_slow(f_pre,f_suf,xborder,yborder);
7172
7173
7174                  int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/t_xstep+(((conn.length%2)==0?conn.length-1:conn.length)/2);
7175                  int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/t_ystep+(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2);
7176
7177                  if(maX>=0 && maX < conn.length && maY>=0 && maY < conn[0].length )
7178                  {
7179                    if(Math.abs(conn[maX][maY])!=0)
7180                    {
7181                      double synWei = stre*conn[maX][maY];
7182                      if(Math.abs(synWei) > SIFNeuron.maxWeight)
7183                      {
7184                        if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
7185                      }
7186
7187                      SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
7188
7189                      int index = Arrays.binarySearch (
7190                        axons.get(fromIndex).branches[(int)(sid.id)].synapses,
7191                        modelFactory.createSynapse (
7192                          neuronID,
7193                          ( byte ) type,
7194                          ( float ) synWei ) );
7195
7196                      if(index>=0)
7197                      {
7198                        final MutableSynapse  synapseMut = ( MutableSynapse )
7199                          axons.get(fromIndex).branches[(int)(sid.id)].synapses[index];
7200                        
7201                        synapseMut.setWeight ( ( float ) synWei );
7202                      }
7203                      else
7204                      {
7205                        throw new RuntimeException("modify none existing synapse");
7206                      }
7207
7208                    }
7209                  }
7210
7211                }
7212              }
7213
7214            }
7215          }
7216
7217
7218        }
7219
7220      }
7221      return maxOutput;  
7222    }
7223
7224    @Deprecated
7225    public double changeConnection(String f_pre, String f_suf, String t_pre, String t_suf, double stre, int type, double delay, double[][] trans, int hostId) //general change connection
7226    ////////////////////////////////////////////////////////////////////////
7227    {
7228      double maxOutput=-1.0;
7229      //    System.out.println("connect");
7230      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
7231      f_xmulti=getXmultiplier(f_pre,f_suf);
7232      f_ymulti=getYmultiplier(f_pre,f_suf);
7233      t_xmulti=getXmultiplier(t_pre,t_suf);
7234      t_ymulti=getYmultiplier(t_pre,t_suf);
7235      int f_xstep,f_ystep,f_xresosize,f_yresosize;
7236      int t_xstep,t_ystep,t_xresosize,t_yresosize;
7237      int denomX=0,numX=0;
7238      int denomY=0,numY=0;
7239      int xmagratio=0;
7240      int ymagratio=0;
7241      int xborder,yborder;
7242      int newx=0;
7243      int newy=0;
7244      //    double[] curr=new double[2];
7245      //    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
7246      //    String fromNeur,toNeur;
7247      TreeSet<Synapse> synapses;
7248      int[] xy=new int[2];
7249
7250      int secX = hostId/sectionsInAxisY;
7251      int secY = hostId%sectionsInAxisY;
7252
7253      int xstep_ff,ystep_ff,xresosize_ff,yresosize_ff;
7254      int xstep_tt,ystep_tt,xresosize_tt,yresosize_tt;
7255      int xOri_ff,yOri_ff;
7256      int xOri_tt,yOri_tt;
7257
7258
7259      if(f_xmulti>0)
7260      {
7261        xstep_ff=1;
7262        if(secX!=0)
7263        {
7264          xOri_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
7265        }
7266        else
7267        {
7268          xOri_ff=0;
7269        }
7270        if(secX!=sectionsInAxisX-1)
7271        {
7272          xresosize_ff=(int)((double)f_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
7273        }
7274        else
7275        {
7276          xresosize_ff=f_xmulti*edgeLengthX;
7277        }
7278      }
7279      else
7280      {
7281        xstep_ff=-f_xmulti;
7282        if(secX!=0)
7283        {
7284          xOri_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
7285          xOri_ff=xOri_ff + xstep_ff - xOri_ff %xstep_ff;
7286        }
7287        else
7288        {
7289          xOri_ff=0;
7290        }
7291        if(secX!=sectionsInAxisX-1)
7292        {
7293          xresosize_ff=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
7294          xresosize_ff=xresosize_ff + xstep_ff -  xresosize_ff % xstep_ff;
7295          if(xresosize_ff>edgeLengthX)xresosize_ff=edgeLengthX;
7296        }
7297        else
7298        {
7299          xresosize_ff=edgeLengthX;
7300        }
7301      }
7302      if(f_ymulti>0)
7303      {
7304        ystep_ff=1;
7305        if(secY!=0)
7306        {
7307          yOri_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
7308        }
7309        else
7310        {
7311          yOri_ff=0;
7312        }
7313        if(secY!=sectionsInAxisY-1)
7314        {
7315          yresosize_ff=(int)((double)f_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
7316        }
7317        else
7318        {
7319          yresosize_ff=f_ymulti*edgeLengthY;
7320        }
7321      }
7322      else
7323      {
7324        ystep_ff=-f_ymulti;
7325        if(secY!=0)
7326        {
7327          yOri_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
7328          yOri_ff=yOri_ff + ystep_ff - yOri_ff % ystep_ff;
7329        }
7330        else
7331        {
7332          yOri_ff=0;
7333        }
7334        if(secY!=sectionsInAxisY-1)
7335        {
7336          yresosize_ff=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
7337          yresosize_ff=yresosize_ff + ystep_ff -  yresosize_ff % ystep_ff;
7338          if(yresosize_ff>edgeLengthY)yresosize_ff=edgeLengthY;
7339        }
7340        else
7341        {
7342          yresosize_ff=edgeLengthY;
7343        }
7344      }
7345
7346      if(t_xmulti>0)
7347      {
7348        xstep_tt=1;
7349        if(secX!=0)
7350        {
7351          xOri_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
7352        }
7353        else
7354        {
7355          xOri_tt=0;
7356        }
7357        if(secX!=sectionsInAxisX-1)
7358        {
7359          xresosize_tt=(int)((double)t_xmulti*(double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
7360        }
7361        else
7362        {
7363          xresosize_tt=t_xmulti*edgeLengthX;
7364        }
7365      }
7366      else
7367      {
7368        xstep_tt=-t_xmulti;
7369        if(secX!=0)
7370        {
7371          xOri_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX));
7372          xOri_tt=xOri_tt + xstep_tt - xOri_tt %xstep_tt;
7373        }
7374        else
7375        {
7376          xOri_tt=0;
7377        }
7378        if(secX!=sectionsInAxisX-1)
7379        {
7380          xresosize_tt=(int)((double)edgeLengthX/(double)sectionsInAxisX*(double)(secX+1));
7381          xresosize_tt=xresosize_tt + xstep_tt -  xresosize_tt % xstep_tt;
7382          if(xresosize_tt>edgeLengthX)xresosize_tt=edgeLengthX;
7383        }
7384        else
7385        {
7386          xresosize_tt=edgeLengthX;
7387        }
7388      }
7389      if(t_ymulti>0)
7390      {
7391        ystep_tt=1;
7392        if(secY!=0)
7393        {
7394          yOri_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
7395        }
7396        else
7397        {
7398          yOri_tt=0;
7399        }
7400        if(secY!=sectionsInAxisY-1)
7401        {
7402          yresosize_tt=(int)((double)t_ymulti*(double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
7403        }
7404        else
7405        {
7406          yresosize_tt=t_ymulti*edgeLengthY;
7407        }
7408      }
7409      else
7410      {
7411        ystep_tt=-t_ymulti;
7412        if(secY!=0)
7413        {
7414          yOri_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY));
7415          yOri_tt=yOri_tt + ystep_tt - yOri_tt % ystep_tt;
7416        }
7417        else
7418        {
7419          yOri_tt=0;
7420        }
7421        if(secY!=sectionsInAxisY-1)
7422        {
7423          yresosize_tt=(int)((double)edgeLengthY/(double)sectionsInAxisY*(double)(secY+1));
7424          yresosize_tt=yresosize_tt + ystep_tt -  yresosize_tt % ystep_tt;
7425          if(yresosize_tt>edgeLengthY)yresosize_tt=edgeLengthY;
7426        }
7427        else
7428        {
7429          yresosize_tt=edgeLengthY;
7430        }
7431      }
7432
7433      if(type==1&&stre>0) // these maynot be useful for new neuronal model
7434      System.err.println("sign of connection is wrong");
7435      if(type==0&&stre<0)
7436        System.err.println("sign of connection is wrong");
7437
7438
7439      if(stre!=0)
7440      {
7441        if(f_xmulti>0)
7442        {
7443          f_xstep=1;
7444          f_xresosize=f_xmulti*edgeLengthX;
7445        }
7446        else
7447        {
7448          f_xstep=-f_xmulti;
7449          f_xresosize=edgeLengthX;
7450        }
7451        if(f_ymulti>0)
7452        {
7453          f_ystep=1;
7454          f_yresosize=f_ymulti*edgeLengthY;
7455        }
7456        else
7457        {
7458          f_ystep=-f_ymulti;
7459          f_yresosize=edgeLengthY;
7460        }
7461        if(t_xmulti>0)
7462        {
7463          t_xstep=1;
7464          t_xresosize=t_xmulti*edgeLengthX;
7465        }
7466        else
7467        {
7468          t_xstep=-t_xmulti;
7469          t_xresosize=edgeLengthX;
7470        }
7471        if(t_ymulti>0)
7472        {
7473          t_ystep=1;
7474          t_yresosize=t_ymulti*edgeLengthY;
7475        }
7476        else
7477        {
7478          t_ystep=-t_ymulti;
7479          t_yresosize=edgeLengthY;
7480        }
7481
7482
7483        if(t_xmulti<0&&f_xmulti>0)
7484        {
7485          numX = f_xmulti;
7486          denomX = 1;
7487        }
7488        else if(t_xmulti<0&&f_xmulti<0)
7489        {
7490          numX = 1;
7491          denomX = 1;
7492        }
7493        else if(t_xmulti>0&&f_xmulti>0)
7494        {
7495          numX = f_xmulti;
7496          denomX = t_xmulti;
7497        }
7498        else if(t_xmulti>0&&f_xmulti<0)
7499        {
7500          numX = 1;
7501          denomX = t_xmulti;
7502        }
7503
7504
7505        if(t_ymulti<0&&f_ymulti>0)
7506        {
7507          numY = f_ymulti;
7508          denomY = 1;
7509        }
7510        else if(t_ymulti<0&&f_ymulti<0)
7511        {
7512          numY = 1;
7513          denomY = 1;
7514        }
7515        else if(t_ymulti>0&&f_ymulti>0)
7516        {
7517          numY = f_ymulti;
7518          denomY = t_ymulti;
7519        }
7520        else if(t_ymulti>0&&f_ymulti<0)
7521        {
7522          numY = 1;
7523          denomY = t_ymulti;
7524        }
7525
7526        for(int iterx=xOri_tt;iterx<xresosize_tt;iterx+=xstep_tt)
7527        {
7528          for(int itery=yOri_tt;itery<yresosize_tt;itery+=ystep_tt)
7529          {
7530            int neuronID=cellmap_slow(t_pre,t_suf,iterx,itery);
7531            int tIndex = (iterx / t_xstep) * (t_yresosize / t_ystep) + itery / t_ystep;
7532
7533            for(int itxx=0;itxx<f_xresosize;itxx+=f_xstep)
7534            {
7535              for(int ityy=0;ityy<f_yresosize;ityy+=f_ystep)
7536              {
7537                int fIndex = (itxx / f_xstep)*(f_yresosize / f_ystep) + ityy / f_ystep;
7538
7539                int fromIndex =  cellmap_slow(f_pre,f_suf,itxx,ityy);
7540                if(Math.abs(trans[fIndex % trans.length][tIndex % trans[0].length])!=0)
7541                {
7542                  double synWei = stre*trans[fIndex % trans.length][tIndex % trans[0].length];
7543                  if(Math.abs(synWei) > SIFNeuron.maxWeight)
7544                  {
7545                    if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
7546                  }
7547
7548
7549                  SizeID sid = scaffold.get(fromIndex).get(String.valueOf(delay));
7550
7551                  int index = Arrays.binarySearch (
7552                    axons.get(fromIndex).branches[(int)(sid.id)].synapses,
7553                    modelFactory.createSynapse (
7554                      neuronID,
7555                      ( byte ) type,
7556                      ( float ) synWei ) );
7557
7558                  if(index>=0)
7559                  {
7560                    final MutableSynapse  synapseMut = ( MutableSynapse )
7561                      axons.get(fromIndex).branches[(int)(sid.id)].synapses[index];
7562                    
7563                    synapseMut.setWeight ( ( float ) synWei );
7564                  }
7565                  else
7566                  {
7567                    throw new RuntimeException("modify none existing synapse");
7568                  }
7569                }
7570
7571              }
7572            }
7573
7574          }
7575        }
7576      }
7577      return maxOutput;  
7578    }
7579
7580    /*
7581  public double connect(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] trans, int hostId)
7582    ////////////////////////////////////////////////////////////////////////
7583  {
7584    double maxOutput=-1.0;
7585    double [][] conn = FunUtil.rRotate90(trans);
7586//    System.out.println("connect");
7587    int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
7588    f_xmulti=getXmultiplier(f_pre,f_suf);
7589    f_ymulti=getYmultiplier(f_pre,f_suf);
7590    t_xmulti=getXmultiplier(t_pre,t_suf);
7591    t_ymulti=getYmultiplier(t_pre,t_suf);
7592    int f_xstep,f_ystep,f_xresosize,f_yresosize;
7593    int t_xstep,t_ystep,t_xresosize,t_yresosize;
7594    int denomX=0,numX=0;
7595    int denomY=0,numY=0;
7596    int xmagratio=0;
7597    int ymagratio=0;
7598    int xborder,yborder;
7599    int newx=0;
7600    int newy=0;
7601    double[] curr=new double[2];
7602    curr[0]=0.0;curr[1]=0.0;//no initial currents in neurons
7603//    String fromNeur,toNeur;
7604    TreeSet<Synapse> synapses;
7605    int[] xy=new int[2];
7606
7607
7608    if(type==1&&stre>0) // these maynot be useful for new neuronal model
7609      System.err.println("sign of connection is wrong");
7610    if(type==0&&stre<0)
7611      System.err.println("sign of connection is wrong");
7612
7613
7614
7615    if(stre!=0)
7616    {
7617      if(f_xmulti>0)
7618      {
7619        f_xstep=1;
7620        f_xresosize=f_xmulti*xedgeLength;
7621      }
7622      else
7623      {
7624        f_xstep=-f_xmulti;
7625        f_xresosize=xedgeLength;
7626      }
7627      if(f_ymulti>0)
7628                        {
7629                                f_ystep=1;
7630                                f_yresosize=f_ymulti*yedgeLength;
7631                        }
7632                        else
7633                        {
7634                                f_ystep=-f_ymulti;
7635                                f_yresosize=yedgeLength;
7636                        }
7637      if(t_xmulti>0)
7638      {
7639        t_xstep=1;
7640        t_xresosize=t_xmulti*xedgeLength;
7641      }
7642      else
7643      {
7644        t_xstep=-t_xmulti;
7645        t_xresosize=xedgeLength;
7646      }
7647      if(t_ymulti>0)
7648                        {
7649                                t_ystep=1;
7650                                t_yresosize=t_ymulti*yedgeLength;
7651                        }
7652                        else
7653                        {
7654                                t_ystep=-t_ymulti;
7655                                t_yresosize=yedgeLength;
7656                        }
7657      if(convergent) //convergence connections from many to 1, first iterate to side
7658      {
7659        if(t_xmulti<0&&f_xmulti>0)
7660        {
7661          numX = f_xmulti;
7662          denomX = 1;
7663//          xmagratio=f_xmulti;
7664        }
7665        else if(t_xmulti<0&&f_xmulti<0)
7666        {
7667          numX = 1;
7668          denomX = 1;
7669//          xmagratio=1;
7670        }
7671        else if(t_xmulti>0&&f_xmulti>0)
7672        {
7673          numX = f_xmulti;
7674          denomX = t_xmulti;
7675//          xmagratio=(f_xmulti/t_xmulti);
7676        }
7677        else if(t_xmulti>0&&f_xmulti<0)
7678        {
7679          numX = 1;
7680          denomX = t_xmulti;
7681//          xmagratio=1/t_xmulti;
7682        }
7683
7684
7685        if(t_ymulti<0&&f_ymulti>0)
7686        {
7687          numY = f_ymulti;
7688          denomY = 1;
7689//                                       ymagratio=(int)f_ymulti;
7690        }
7691        else if(t_ymulti<0&&f_ymulti<0)
7692        {
7693          numY = 1;
7694          denomY = 1;
7695//          ymagratio=1;
7696        }
7697        else if(t_ymulti>0&&f_ymulti>0)
7698        {
7699          numY = f_ymulti;
7700          denomY = t_ymulti;
7701//          ymagratio=(int)(f_ymulti/t_ymulti);
7702        }
7703        else if(t_ymulti>0&&f_ymulti<0)
7704        {
7705          numY = 1;
7706          denomY = t_ymulti;
7707        }
7708
7709        for(int iterx=0;iterx<t_xresosize;iterx+=t_xstep)
7710        {
7711          for(int itery=0;itery<t_yresosize;itery+=t_ystep)
7712          {
7713            int toIndex = cellmap_slow(t_pre,t_suf,iterx,itery);
7714            //get the closest point to the from layer in the to neuron layer.
7715            xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), f_pre, f_suf);
7716            newx=xy[0];
7717            newy=xy[1];            
7718
7719            for(int itxx=newx-conn.length/2*f_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*f_xstep;itxx+=f_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
7720            {
7721              for(int ityy=newy-conn[0].length/2*f_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*f_ystep;ityy+=f_ystep)
7722              {
7723                xborder = itxx % f_xresosize;
7724                yborder = ityy % f_yresosize;
7725
7726                if(xborder<0) xborder+=f_xresosize;
7727                if(yborder<0) yborder+=f_yresosize;
7728
7729                int neuronID;
7730                neuronID=cellmap_slow(f_pre,f_suf,xborder,yborder);
7731
7732                if( neuronID <= neuron_end && neuronID >= base )
7733                {
7734                  if(Math.abs(conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep])!=0)
7735                  {
7736                    synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses
7737                    double synWei = stre*conn[(itxx-newx+conn.length/2*f_xstep)/f_xstep][(ityy-newy+conn[0].length/2*f_ystep)/f_ystep];
7738                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
7739                    {
7740                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
7741                    }
7742                    syn= new Synapse(toIndex,synWei,type);
7743                    synapses.add(syn);
7744                  }
7745                }
7746
7747              }
7748            }
7749
7750          }
7751        }
7752
7753
7754      }
7755      else //divergent
7756      {
7757        if(t_xmulti<0&&f_xmulti>0)
7758        {
7759          numX = 1;
7760          denomX = f_xmulti;
7761        }
7762        else if(t_xmulti<0&&f_xmulti<0)
7763        {
7764          numX = 1;
7765          denomX = 1;
7766        }
7767        else if(t_xmulti>0&&f_xmulti>0)
7768        {
7769          numX = t_xmulti;
7770          denomX = f_xmulti;
7771        }
7772        else if(t_xmulti>0&&f_xmulti<0)
7773        {
7774          numX = t_xmulti;
7775          denomX = 1;
7776        }
7777
7778
7779        if(t_ymulti<0&&f_ymulti>0)
7780        {
7781          numY = 1;
7782          denomY = f_ymulti;
7783        }
7784        else if(t_ymulti<0&&f_ymulti<0)
7785        {
7786          numY = 1;
7787          denomY = 1;
7788        }
7789        else if(t_ymulti>0&&f_ymulti>0)
7790        {
7791          numY = t_ymulti;
7792          denomY = f_ymulti;
7793        }
7794        else if(t_ymulti>0&&f_ymulti<0)
7795        {
7796          numY = t_ymulti;
7797          denomY = 1;
7798        }
7799
7800        for(int iterx=0;iterx<f_xresosize;iterx+=f_xstep)
7801        {
7802          for(int itery=0;itery<f_yresosize;itery+=f_ystep)
7803          {
7804            int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
7805            if( neuronID <= neuron_end && neuronID >= base  )
7806            {
7807              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
7808
7809              newx=xy[0];
7810              newy=xy[1];
7811
7812              for(int itxx=newx-conn.length/2*t_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*t_xstep;itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
7813
7814              {
7815                for(int ityy=newy-conn[0].length/2*t_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*t_ystep;ityy+=t_ystep)
7816                {
7817                  xborder = itxx % t_xresosize;
7818                  yborder = ityy % t_yresosize;
7819
7820                  if(xborder<0) xborder+=t_xresosize;
7821                  if(yborder<0) yborder+=t_yresosize;
7822
7823
7824
7825                  int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
7826
7827
7828                  synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses;                
7829                  if(Math.abs(conn[(itxx-newx+conn.length/2*t_xstep)/t_xstep][(ityy-newy+conn[0].length/2*t_ystep)/t_ystep])!=0)
7830                  {
7831                    double synWei = stre*conn[(itxx-newx+conn.length/2*t_xstep)/t_xstep][(ityy-newy+conn[0].length/2*t_ystep)/t_ystep];
7832                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
7833                    {
7834                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
7835                    }
7836
7837                    syn=new Synapse(toIndex,synWei,type);
7838                    synapses.add(syn);
7839                  }
7840
7841
7842                }
7843              }
7844            }
7845
7846          }
7847        }
7848
7849      }
7850    }
7851
7852    return maxOutput;  
7853  }
7854     */
7855    @Deprecated
7856    public double connect(String f_pre, String f_suf, String t_pre, String t_suf, boolean convergent, double stre, int type, double delay, double[][] trans)
7857    ////////////////////////////////////////////////////////////////////////
7858    {
7859      double maxOutput = -1.0;
7860      double [][] conn;
7861      //    System.out.println("connect");
7862      int f_xmulti,f_ymulti,t_xmulti,t_ymulti;
7863      f_xmulti=getXmultiplier(f_pre,f_suf);
7864      f_ymulti=getYmultiplier(f_pre,f_suf);
7865      t_xmulti=getXmultiplier(t_pre,t_suf);
7866      t_ymulti=getYmultiplier(t_pre,t_suf);
7867      int f_xstep,f_ystep,f_xresosize,f_yresosize;
7868      int t_xstep,t_ystep,t_xresosize,t_yresosize;
7869      int denomX=0,numX=0;
7870      int denomY=0,numY=0;
7871      int xmagratio=0;
7872      int ymagratio=0;
7873      int xborder,yborder;
7874      int newx=0;
7875      int newy=0;
7876      String fromNeur,toNeur;
7877      Synapse syn;
7878      TreeSet<Synapse> synapses;
7879      int[] xy=new int[2];
7880
7881
7882      if(type==1&&stre>0) // these maynot be useful for new neuronal model
7883        System.err.println("sign of connection is wrong");
7884      if(type==0&&stre<0)
7885        System.err.println("sign of connection is wrong");
7886
7887
7888
7889      if(stre!=0)
7890      {
7891        if(f_xmulti>0)
7892        {
7893          f_xstep=1;
7894          f_xresosize=f_xmulti*edgeLengthX;
7895        }
7896        else
7897        {
7898          f_xstep=-f_xmulti;
7899          f_xresosize=edgeLengthX;
7900        }
7901        if(f_ymulti>0)
7902        {
7903          f_ystep=1;
7904          f_yresosize=f_ymulti*edgeLengthY;
7905        }
7906        else
7907        {
7908          f_ystep=-f_ymulti;
7909          f_yresosize=edgeLengthY;
7910        }
7911        if(t_xmulti>0)
7912        {
7913          t_xstep=1;
7914          t_xresosize=t_xmulti*edgeLengthX;
7915        }
7916        else
7917        {
7918          t_xstep=-t_xmulti;
7919          t_xresosize=edgeLengthX;
7920        }
7921        if(t_ymulti>0)
7922        {
7923          t_ystep=1;
7924          t_yresosize=t_ymulti*edgeLengthY;
7925        }
7926        else
7927        {
7928          t_ystep=-t_ymulti;
7929          t_yresosize=edgeLengthY;
7930        }
7931
7932        //      System.gc();
7933        if(convergent) //convergence connections from many to 1, first iterate to side
7934        {
7935          conn = FunUtil.lRotate90(trans);
7936
7937          if(t_xmulti<0&&f_xmulti>0)
7938          {
7939            numX = 1;
7940            denomX = f_xmulti;
7941          }
7942          else if(t_xmulti<0&&f_xmulti<0)
7943          {
7944            numX = 1;
7945            denomX = 1;
7946          }
7947          else if(t_xmulti>0&&f_xmulti>0)
7948          {
7949            numX = t_xmulti;
7950            denomX = f_xmulti;
7951          }
7952          else if(t_xmulti>0&&f_xmulti<0)
7953          {
7954            numX = t_xmulti;
7955            denomX = 1;
7956          }
7957
7958
7959          if(t_ymulti<0&&f_ymulti>0)
7960          {
7961            numY = 1;
7962            denomY = f_ymulti;
7963          }
7964          else if(t_ymulti<0&&f_ymulti<0)
7965          {
7966            numY = 1;
7967            denomY = 1;
7968          }
7969          else if(t_ymulti>0&&f_ymulti>0)
7970          {
7971            numY = t_ymulti;
7972            denomY = f_ymulti;
7973          }
7974          else if(t_ymulti>0&&f_ymulti<0)
7975          {
7976            numY = t_ymulti;
7977            denomY = 1;
7978          }
7979          for(int iterx=0;iterx<f_xresosize;iterx+=f_xstep)
7980          {
7981            for(int itery=0;itery<f_yresosize;itery+=f_ystep)
7982            {
7983
7984              int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
7985              //            if( neuronID <= neuron_end && neuronID >= base  )
7986              {
7987
7988                xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
7989
7990                newx=xy[0];
7991                newy=xy[1];
7992
7993                for(int itxx=newx-((int)((double)(conn.length/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep)))+1)*(t_xstep);itxx<=newx+((int)((double)(((conn.length%2)==0?conn.length-1:conn.length)/2)*(((double)numX/(double)denomX*(double)f_xstep/(double)t_xstep))))*(t_xstep);itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
7994                {
7995                  for(int ityy=newy-((int)((double)(conn[0].length/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep)))+1)*(t_ystep);ityy<=newy+((int)((double)(((conn[0].length%2)==0?conn[0].length-1:conn[0].length)/2)*(((double)numY*(double)f_ystep/(double)denomY/(double)t_ystep))))*(t_ystep);ityy+=t_ystep)  
7996                  {
7997                    xborder = itxx % t_xresosize;
7998                    yborder = ityy % t_yresosize;
7999
8000                    if(xborder<0) xborder+=t_xresosize;
8001                    if(yborder<0) yborder+=t_yresosize;
8002
8003
8004
8005                    int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
8006
8007
8008                    synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses;                
8009                    int maX = (int)((((double)itxx)/(double)numX*(double)denomX)-iterx)/f_xstep+conn.length/2;
8010                    int maY = (int)((((double)ityy)/(double)numY*(double)denomY)-itery)/f_ystep+conn[0].length/2;
8011                    if(maX>=0 && maX < conn.length && maY>=0 && maY < conn[0].length )
8012                    {
8013                      if(Math.abs(conn[maX][maY])!=0)
8014                      {
8015                        double synWei = stre*conn[maX][maY];
8016                        if(Math.abs(synWei) > SIFNeuron.maxWeight)
8017                        {
8018                          if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
8019                        }
8020
8021                        syn = modelFactory.createSynapse (
8022                          toIndex,
8023                          ( byte ) type,
8024                          ( float ) synWei );
8025                        
8026                        synapses.add(syn);
8027                      }
8028                    }
8029
8030
8031                  }
8032                }
8033              }
8034
8035            }
8036          }
8037        }
8038        else //divergent
8039        {
8040          conn = FunUtil.rRotate90(trans);
8041          if(t_xmulti<0&&f_xmulti>0)
8042          {
8043            numX = 1;
8044            denomX = f_xmulti;
8045          }
8046          else if(t_xmulti<0&&f_xmulti<0)
8047          {
8048            numX = 1;
8049            denomX = 1;
8050          }
8051          else if(t_xmulti>0&&f_xmulti>0)
8052          {
8053            numX = t_xmulti;
8054            denomX = f_xmulti;
8055          }
8056          else if(t_xmulti>0&&f_xmulti<0)
8057          {
8058            numX = t_xmulti;
8059            denomX = 1;
8060          }
8061
8062
8063          if(t_ymulti<0&&f_ymulti>0)
8064          {
8065            numY = 1;
8066            denomY = f_ymulti;
8067          }
8068          else if(t_ymulti<0&&f_ymulti<0)
8069          {
8070            numY = 1;
8071            denomY = 1;
8072          }
8073          else if(t_ymulti>0&&f_ymulti>0)
8074          {
8075            numY = t_ymulti;
8076            denomY = f_ymulti;
8077          }
8078          else if(t_ymulti>0&&f_ymulti<0)
8079          {
8080            numY = t_ymulti;
8081            denomY = 1;
8082          }
8083          for(int iterx=0;iterx<f_xresosize;iterx+=f_xstep)
8084          {
8085            for(int itery=0;itery<f_yresosize;itery+=f_ystep)
8086            {
8087              int neuronID=cellmap_slow(f_pre,f_suf,iterx,itery);
8088              //            if( neuronID <= neuron_end && neuronID >= base  )
8089                //            {
8090              xy=closePoint((int)((double)numX/(double)denomX*iterx),(int)((double)numY/(double)denomY*itery), t_pre, t_suf);
8091
8092              newx=xy[0];
8093              newy=xy[1];
8094
8095              for(int itxx=newx-conn.length/2*t_xstep;itxx<newx+((conn.length%2)==0?conn.length:conn.length+1)/2*t_xstep;itxx+=t_xstep) // if matrix is even, the center is center+0.5, if matrix is odd, center is center
8096
8097              {
8098                for(int ityy=newy-conn[0].length/2*t_ystep;ityy<newy+((conn[0].length%2)==0?conn[0].length:conn[0].length+1)/2*t_ystep;ityy+=t_ystep)
8099                {
8100                  xborder = itxx % t_xresosize;
8101                  yborder = ityy % t_yresosize;
8102
8103                  if(xborder<0) xborder+=t_xresosize;
8104                  if(yborder<0) yborder+=t_yresosize;
8105
8106
8107
8108                  int toIndex = cellmap_slow(t_pre,t_suf,xborder,yborder);
8109
8110
8111                  synapses=getSynapses(neuronID,delay,toIndex); //read the old synapses;                
8112                  if(Math.abs(conn[(itxx-newx+conn.length/2*t_xstep)/t_xstep][(ityy-newy+conn[0].length/2*t_ystep)/t_ystep])!=0)
8113                  {
8114                    double synWei = stre*conn[(itxx-newx+conn.length/2*t_xstep)/t_xstep][(ityy-newy+conn[0].length/2*t_ystep)/t_ystep];
8115                    if(Math.abs(synWei) > SIFNeuron.maxWeight)
8116                    {
8117                      if( Math.abs(synWei) / SIFNeuron.maxWeight > maxOutput) maxOutput = Math.abs(synWei) / SIFNeuron.maxWeight;
8118                    }
8119
8120                    syn = modelFactory.createSynapse (
8121                      toIndex,
8122                      ( byte ) type,
8123                      ( float ) synWei );
8124                    
8125                    synapses.add(syn);
8126                  }
8127                }
8128              }
8129              //            }
8130
8131            }
8132          }
8133
8134        }
8135      }
8136
8137      return maxOutput;    
8138    }
8139
8140    /*  private TreeSet<Synapse> getSynapses(String from, double delay, String to)
8141  {
8142
8143    if(!branchmaps[( cellmap.get(from)).intValue()- base].containsKey(delay+" "+node))
8144      branchmaps[( cellmap.get(from)).intValue()-base].put(delay+" "+node,new TreeSet<Synapse>());
8145
8146    return branchmaps[(cellmap.get(from)).intValue()-base].get(delay+" "+node);    
8147  //return branchmaps[( cellmap.get(from)).intValue()].get(delay+" "+node);    
8148  }
8149     */
8150
8151    private TreeSet<Synapse> getSynapses(int from, double delay, int to)
8152    ////////////////////////////////////////////////////////////////////////
8153    {
8154      int node=FunUtil.hostId(nodeEndIndices,to);    
8155
8156      if(!branchmaps[from- base].containsKey(delay+" "+node))
8157        branchmaps[from-base].put(delay+" "+node,new TreeSet<Synapse>());
8158      return branchmaps[from-base].get(delay+" "+node);    
8159      //return branchmaps[( cellmap.get(from)).intValue()].get(delay+" "+node);    
8160    }
8161    /*
8162
8163  public void populateNeurons()
8164    ////////////////////////////////////////////////////////////////////////
8165  {
8166
8167    neurons= new Neuron[numberOfNeurons];
8168    int xTotal=0;
8169    int yTotal=0;
8170    int xstep=0;
8171    int ystep=0;
8172    int xMul,yMul;
8173    String neu;
8174    for(int iter=0;iter<layer_structure.size();iter++)
8175    {
8176      xMul = layer_structure.get(iter).getXmultiplier();
8177      yMul = layer_structure.get(iter).getYmultiplier();
8178
8179      if(xMul < 0 )
8180      {
8181        xTotal=xedgeLength;
8182        xstep=-xMul;
8183      }
8184      else
8185      {
8186        xTotal=xedgeLength*xMul;
8187        xstep=1;
8188      }
8189      if(yMul < 0 )
8190      {
8191        yTotal=yedgeLength;
8192        ystep=-yMul;
8193      }
8194      else
8195      {
8196        yTotal=yedgeLength*yMul;
8197        ystep=1;
8198      }
8199
8200      for(int x = 0 ; x < xTotal; x+=xstep)
8201      {
8202        for(int y = 0 ; y < yTotal; y+=ystep)
8203        {
8204          neu=layer_structure.get(iter).getPrefix()+","+x+","+y+","+layer_structure.get(iter).getSuffix();
8205        //  System.out.println(neu+cellmap.get(neu));
8206          neurons[cellmap.get(neu)] = new SIFNeuron(-0.07,new Axon(null));
8207        }
8208      }
8209
8210    }
8211
8212  }
8213
8214  public void populateNeurons(int hostID)
8215    ////////////////////////////////////////////////////////////////////////
8216  {
8217    neurons= new Neuron[numberOfNeurons];
8218    int xTotal=0;
8219    int yTotal=0;
8220    int xstep=0;
8221    int ystep=0;
8222    int xMul,yMul;
8223    String neu;
8224    for(int iter=0;iter<layer_structure.size();iter++)
8225    {
8226      xMul = layer_structure.get(iter).getXmultiplier();
8227      yMul = layer_structure.get(iter).getYmultiplier();
8228
8229      if(xMul < 0 )
8230      {
8231        xTotal=xedgeLength;
8232        xstep=-xMul;
8233      }
8234      else
8235      {
8236        xTotal=xedgeLength*xMul;
8237        xstep=1;
8238      }
8239      if(yMul < 0 )
8240      {
8241        yTotal=yedgeLength;
8242        ystep=-yMul;
8243      }
8244      else
8245      {
8246        yTotal=yedgeLength*yMul;
8247        ystep=1;
8248      }
8249
8250      for(int x = 0 ; x < xTotal; x+=xstep)
8251      {
8252        for(int y = 0 ; y < yTotal; y+=ystep)
8253        {
8254          neu=layer_structure.get(iter).getPrefix()+","+x+","+y+","+layer_structure.get(iter).getSuffix();
8255        //  System.out.println(neu+cellmap.get(neu));
8256          neurons[cellmap.get(neu)] = new SIFNeuron(-0.07,new Axon(null));
8257        }
8258      }
8259
8260    }
8261
8262  }
8263     */
8264
8265    /***********************************************************************
8266    * Given tolayer of neuron and iterx, itery coordinates,
8267    * return the closest point.
8268    * 
8269    * Called from popScaffold().
8270    * 
8271    * @param iterx
8272    * @param itery
8273    * @param tpre
8274    * @param tsuf
8275    * @return
8276    ***********************************************************************/
8277    public int [ ]  closePoint (
8278      final int     iterx,
8279      final int     itery,
8280      final String  tpre,
8281      final String  tsuf )
8282    ////////////////////////////////////////////////////////////////////////
8283    {
8284      final int
8285        txmulti = getXmultiplier ( tpre, tsuf ),
8286        tymulti = getYmultiplier ( tpre, tsuf );
8287      
8288      // fxmulti=getXmultiplier(fpre,fsuf);
8289      // fymulti=getYmultiplier(fpre,fsuf);
8290      
8291      String thisSpot;
8292      
8293      int txstep,tystep;
8294      
8295      int
8296        fxmult,
8297        fymult,
8298        txmult,
8299        tymult;
8300      
8301      if ( txmulti > 0 )
8302      {
8303        txmult = txmulti;
8304      }
8305      else
8306      {
8307        txmult = 1;
8308      }
8309      
8310      if ( tymulti > 0 )
8311      {
8312        tymult = tymulti;
8313      }
8314      else
8315      {
8316        tymult = 1;
8317      }
8318      
8319      /*
8320      if(fxmulti>0)
8321      {
8322        fxmult=fxmulti;
8323      }
8324      else
8325      {
8326        fxmult=1;
8327      }
8328      if(fymulti>0)
8329      {
8330        fymult=fymulti;
8331      }
8332      else
8333      {
8334        fymult=1;
8335      }
8336      */
8337
8338      int
8339        newx = iterx,
8340        newy = itery;    
8341
8342      thisSpot = tpre + "," + newx + "," + newy + "," + tsuf;
8343      
8344      if ( cellmap_slow ( tpre, tsuf, newx, newy ) == -1 )
8345      {
8346        // the neuron is not in the grid
8347        
8348        if ( txmulti > 0 )
8349        {
8350          txstep = 1;
8351        }
8352        else
8353        {
8354          txstep = -txmulti;
8355        }
8356        
8357        if ( tymulti > 0 )
8358        {
8359          tystep = 1;
8360        }
8361        else
8362        {
8363          tystep = -tymulti;
8364        }
8365        
8366        final int
8367          modx = iterx % txstep,
8368          mody = itery % tystep;
8369        
8370        // System.out.println("x"+iterx+" y"+itery+" modx"
8371        //   +modx+" mody"+mody+" stepx"+txstep+" stepy"+tystep);
8372        
8373        if ( txstep > 2 * modx )
8374        {
8375          newx = iterx - modx;
8376        }
8377        else
8378        {
8379          newx = iterx + ( txstep ) - modx;
8380        }
8381        
8382        if ( tystep > 2 * mody )
8383        {
8384          newy = itery - mody;
8385        }
8386        else
8387        {
8388          newy = itery + ( tystep ) - mody;                        
8389        }
8390
8391        /*
8392        newx = newx % (txmult*xedgeLength);
8393
8394        newy = newy % (tymult*yedgeLength); 
8395
8396        if(newx<0) newx+=(txmult*xedgeLength);
8397        if(newy<0) newy+=(tymult*yedgeLength);
8398        */
8399
8400        /*
8401        if(newx>txmult*xedgeLength-1)
8402        {
8403          newx-=txmult*xedgeLength;
8404        }
8405        
8406        if(newx<0)
8407        {
8408          newx+=txmult*xedgeLength;
8409        }
8410
8411        if(newy>tymult*yedgeLength-1)
8412        {
8413          newy-=tymult*yedgeLength;
8414        }
8415        
8416        if(newy<0)
8417        {
8418          newy+=tymult*yedgeLength;
8419        }
8420        */
8421      }
8422      
8423      final int [ ]  answer = new int [ ] { newx, newy }; 
8424
8425      //    thisSpot=tpre + ","+newx + "," + newy + ","+tsuf;
8426      //    if(cellmap.containsKey(thisSpot))
8427      //    {
8428      
8429      return answer;
8430      
8431      //    }
8432      //    else
8433      //    {
8434      //      answer[0]=-1;
8435      //      answer[1]=-1;
8436      //      return answer;
8437      //      throw new RuntimeException("the layers length is not well defined");
8438      //    }
8439    }
8440
8441    /**
8442    * For debugging, pring out the connections connects from neuron with String id .
8443    * The format is Prefix,x,y,Suffix
8444    * 
8445    * @param Neuron string
8446    * @param  print stream p
8447    * @return Information.
8448    ***********************************************************************/
8449    public String connectFrom(String id, PrintStream p)
8450    ////////////////////////////////////////////////////////////////////////
8451    {
8452
8453      p.println("finding connections from"+id);
8454
8455      String [] items = id.split(",");
8456      int index = cellmap_slow(items[0],items[3],Integer.parseInt(items[1]),Integer.parseInt(items[2])) ;
8457
8458      Iterator entryIter = axons.entrySet().iterator();
8459      while(entryIter.hasNext())
8460      {
8461        Map.Entry<Integer, Axon> entry = (Map.Entry<Integer, Axon>)entryIter.next(); 
8462        Integer sourceId = entry.getKey();
8463        Axon axon = entry.getValue();
8464        for(int i =0; i< axon.branches.length; i++)
8465        {
8466          for(int j=0;j<axon.branches[i].synapses.length;j++)
8467          {
8468            if ( axon.branches[i].synapses[j].getTargetNeuronIndex ( ) == index )
8469            {
8470              p.println (
8471                id + " has " + axon.branches[i].synapses[j].getType ( )
8472                + " with strength "
8473                + axon.branches[i].synapses[j].getWeight ( )
8474                + " synapse From: "
8475                + sourceId
8476                + " celltype "
8477                + celltype_slow(sourceId)
8478                +" base:"
8479                +base);
8480            }
8481          }
8482        }
8483      }
8484      p.println("End");
8485
8486      /*
8487    int iter;
8488    int iter1;
8489    int iter2;
8490    String [] items = id.split(",");
8491    int index = cellmap_slow(items[0],items[3],Integer.parseInt(items[1]),Integer.parseInt(items[2])) ;
8492    if(index!=-1)
8493    {
8494      p.println("id"+index);
8495      String synType="";
8496      for(iter=0;iter<numberOfNeurons;iter++)
8497      {
8498
8499        for(iter1=0;iter1<neurons[iter].getAxon().branches.length;iter1++)
8500        {
8501          for(iter2=0;iter2<neurons[iter].getAxon().branches[iter1].synapses.length;iter2++)
8502          {
8503            if(neurons[iter].getAxon().branches[iter1].synapses[iter2].to==index)
8504            {
8505              if(neurons[iter].getAxon().branches[iter1].synapses[iter2].type==0)
8506                synType="Glutamate";
8507              if(neurons[iter].getAxon().branches[iter1].synapses[iter2].type==1)
8508                synType="GABA";
8509              p.println(id + " has " + synType + " with strength " + neurons[iter].getAxon().branches[iter1].synapses[iter2].weight + " synapse From: " + (celltype_slow(iter)));
8510            }
8511          }
8512        }
8513      }
8514      p.println("End");
8515    }
8516    else
8517    {
8518      return "none";
8519    }
8520
8521       */
8522      return "yes";
8523    }
8524    /*
8525  public String connectFrom(String id)
8526    ////////////////////////////////////////////////////////////////////////
8527  {
8528
8529    int iter;
8530    int iter1;
8531    int iter2;
8532    int index;
8533    if(cellmap.containsKey(id))
8534    {       index=cellmap.get(id);
8535      String synType="";
8536      for(iter=0;iter<numberOfNeurons;iter++)
8537      {
8538
8539        for(iter1=0;iter1<neurons[iter].getAxon().branches.length;iter1++)
8540        {
8541          for(iter2=0;iter2<neurons[iter].getAxon().branches[iter1].synapses.length;iter2++)
8542          {
8543            if(neurons[iter].getAxon().branches[iter1].synapses[iter2].to==index)
8544            {
8545              if(neurons[iter].getAxon().branches[iter1].synapses[iter2].type==0)
8546                synType="Glutamate";
8547              if(neurons[iter].getAxon().branches[iter1].synapses[iter2].type==1)
8548                synType="GABA";
8549              System.out.println(id + " has " + synType + " with strength " + neurons[iter].getAxon().branches[iter1].synapses[iter2].weight + " synapse From: " + (celltype[iter]));
8550            }
8551          }
8552        }
8553      }
8554    }
8555    else
8556    {
8557      return "none";
8558    }
8559  return "yes";
8560  }
8561     */
8562    /*
8563  public String connectTo(String id)
8564    ////////////////////////////////////////////////////////////////////////
8565  {
8566
8567    int iter;
8568    int iter1;
8569    int iter2;
8570    int index;
8571    if(cellmap.containsKey(id))
8572    { 
8573      index=cellmap.get(id);
8574      String synType="";
8575      System.out.println( id + " connects to"); 
8576      for(iter1=0;iter1<neurons[index].getAxon().branches.length;iter1++)
8577      {
8578        for(iter2=0;iter2<neurons[index].getAxon().branches[iter1].synapses.length;iter2++)
8579        {
8580          if(neurons[index].getAxon().branches[iter1].synapses[iter2].type==0)
8581            synType="Glutamate";
8582          if(neurons[index].getAxon().branches[iter1].synapses[iter2].type==1)
8583            synType="GABA";
8584          System.out.println("      "+(celltype[neurons[index].getAxon().branches[iter1].synapses[iter2].to])+ "--------"+ synType + " with strength " + neurons[index].getAxon().branches[iter1].synapses[iter2].weight);
8585        }
8586      }
8587    }
8588    else
8589    {
8590      return "none";
8591    }
8592    return "yes";
8593  }
8594     */
8595    /*
8596  public int[] getLayerIndices(String prefix, String suffix)
8597    ////////////////////////////////////////////////////////////////////////
8598  {
8599    int xstep,ystep,xresosize,yresosize;
8600    if(getXmultiplier(prefix,suffix)>=1.0)
8601    {
8602      xstep=1;
8603      xresosize=(int) getXmultiplier(prefix,suffix)*xedgeLength;
8604    }
8605    else
8606    {
8607      xstep=(int)(1.0/getXmultiplier(prefix,suffix));
8608      xresosize=xedgeLength;
8609    }
8610    if(getYmultiplier(prefix,suffix)>=1.0)
8611    {
8612      ystep=1;
8613      yresosize=(int) getYmultiplier(prefix,suffix)*yedgeLength;
8614    }
8615    else
8616    {
8617      ystep=(int)(1.0/getYmultiplier(prefix,suffix));
8618      yresosize=yedgeLength;
8619    }
8620    int[] indices=new int[layerNumNeurons(prefix,suffix)];
8621    int curr=0;
8622    for(int a=0;a<xresosize;a+=xstep)
8623    {
8624      for(int b=0;b<yresosize;b+=ystep)
8625      {
8626        indices[curr]=( cellmap.get(prefix + ","+a + "," + b + ","+suffix)).intValue();
8627        curr++;
8628      }
8629    }
8630    return indices;
8631  }
8632  public int[] namesToIndices(String[] names)
8633    ////////////////////////////////////////////////////////////////////////
8634  {
8635    int[] indices=new int[names.length];
8636    for(int a=0;a<names.length;a++)
8637    {
8638      indices[a]=( cellmap.get(names[a])).intValue();
8639    }
8640    return indices;
8641  }
8642
8643     */
8644    public void killMaps()
8645    ////////////////////////////////////////////////////////////////////////
8646    {
8647      //    cellmap=null;
8648      //    celltype=null;
8649      //    branchmaps=null;
8650    }
8651
8652    public int getXEdgeLength()
8653    ////////////////////////////////////////////////////////////////////////
8654    {
8655
8656      return edgeLengthX;
8657
8658    }
8659
8660    public int getYEdgeLength()
8661    ////////////////////////////////////////////////////////////////////////
8662    {
8663      return edgeLengthY;
8664    }
8665
8666    /***********************************************************************
8667    * Set up the target host (binary long type) information through network (JPVM). 
8668    * @param info
8669    * @param pas
8670    * 
8671    * @throws jpvmException
8672    ***********************************************************************/
8673    public void parseTarget(JpvmInfo info, SimulatorParser pas) throws jpvmException
8674    ////////////////////////////////////////////////////////////////////////
8675    {
8676      TargetID [] targetID = new TargetID[info.numTasks];
8677
8678      for(int i = 0 ; i < info.numTasks; i++)
8679      {
8680        if(i != info.idIndex)
8681        {
8682          targetID[i] = new TargetID(info.idIndex);
8683        }
8684      }
8685
8686      Iterator<Integer> keyIter = pas.layerStructure.axons.keySet().iterator();
8687      long self = (1L<<info.idIndex);
8688      while(keyIter.hasNext())
8689      {
8690        int target = keyIter.next();
8691        int hostDD = FunUtil.hostId(pas.layerStructure.nodeEndIndices,target);
8692        if(hostDD != info.idIndex)
8693        {
8694          targetID[hostDD].target.add(target);
8695        }
8696        else if(hostDD == info.idIndex)
8697        {
8698          if((pas.layerStructure.neurons[target - pas.layerStructure.base].getTHost() & self )==0) // if the neuron doen'st have a target synapse at node then set it.
8699          {
8700            pas.layerStructure.neurons[target - pas.layerStructure.base].setTHost((pas.layerStructure.neurons[target - pas.layerStructure.base].getTHost() | self));
8701          }
8702        }
8703      }
8704
8705      for(int i = 0 ; i < info.numTasks; i++)
8706      {
8707        if(i != info.idIndex)
8708        {
8709          jpvmBuffer buf2 = new jpvmBuffer();
8710
8711          buf2.pack(targetID[i]); //pack the info
8712
8713          info.jpvm.pvm_send(buf2, info.tids[i] ,NetMessageTag.assignTargets);
8714        }
8715      }
8716      //receive all the target info
8717      jpvmMessage m;
8718      for(int i = 0 ; i < info.numTasks-1; i++)
8719      {
8720        m = info.jpvm.pvm_recv(NetMessageTag.assignTargets); //receive info from others
8721        TargetID reTID =  (TargetID)m.buffer.upkcnsobj();                                     
8722        long setID = (1L<<(reTID.target.get(0)));
8723        int neuronID;
8724        for(int ii=1; ii< reTID.target.size(); ii++)
8725        {
8726          neuronID = reTID.target.get(ii);
8727          if((pas.layerStructure.neurons[neuronID - pas.layerStructure.base].getTHost() & setID )==0) // if the neuron doen'st have a target synapse at node then set it.
8728          {
8729            pas.layerStructure.neurons[neuronID - pas.layerStructure.base].setTHost((pas.layerStructure.neurons[neuronID - pas.layerStructure.base].getTHost() | (setID)));
8730
8731          }
8732
8733        }
8734      }
8735    }
8736    
8737    ////////////////////////////////////////////////////////////////////////
8738    ////////////////////////////////////////////////////////////////////////
8739    }