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 }