001 package cnslab.cnsnetwork; 002 003 import java.io.PrintStream; 004 import java.io.FileOutputStream; 005 import java.util.ArrayList; 006 import java.util.Iterator; 007 import java.util.Map; 008 009 import jpvm.*; 010 011 import cnslab.cnsmath.*; 012 import edu.jhu.mb.ernst.engine.DiscreteEventQueue; 013 import edu.jhu.mb.ernst.model.ModelFactory; 014 import edu.jhu.mb.ernst.model.ModulatedSynapse; 015 import edu.jhu.mb.ernst.util.seq.Seq; 016 017 /*********************************************************************** 018 * Same as Network but Avalanche recorder is added. 019 * 020 * @version 021 * $Date: 2012-08-04 13:43:22 -0500 (Sat, 04 Aug 2012) $ 022 * $Rev: 104 $ 023 * $Author: croft $ 024 * @author 025 * Yi Dong 026 * @author 027 * David Wallace Croft 028 ***********************************************************************/ 029 public class ANetwork 030 extends Network 031 //////////////////////////////////////////////////////////////////////// 032 //////////////////////////////////////////////////////////////////////// 033 { 034 035 public AvalancheCounter aData; 036 037 //////////////////////////////////////////////////////////////////////// 038 //////////////////////////////////////////////////////////////////////// 039 040 public ANetwork ( 041 final ModelFactory modelFactory, 042 final DiscreteEventQueue discreteEventQueue, 043 final Seq<ModulatedSynapse> modulatedSynapseSeq, 044 final Neuron [ ] neurons, 045 final Map<Integer, Axon> axons, 046 final double minDelay, 047 final SimulatorParser pas, 048 final Seed idum ) 049 //////////////////////////////////////////////////////////////////////// 050 { 051 super ( 052 modelFactory, 053 discreteEventQueue, 054 modulatedSynapseSeq, 055 neurons, 056 axons, 057 minDelay, 058 pas, 059 idum ); 060 } 061 062 public ANetwork ( 063 final ModelFactory modelFactory, 064 final DiscreteEventQueue discreteEventQueue, 065 final Seq<ModulatedSynapse> modulatedSynapseSeq, 066 final Neuron [ ] neurons, 067 final Map<Integer, Axon> axons, 068 final JpvmInfo info, 069 final int base, 070 final double minDelay, 071 final SimulatorParser pas, 072 final Seed idum, 073 final Experiment exp ) 074 //////////////////////////////////////////////////////////////////////// 075 { 076 super ( 077 modelFactory, 078 discreteEventQueue, 079 modulatedSynapseSeq, 080 neurons, 081 axons, 082 info, 083 base, 084 minDelay, 085 pas, 086 idum, 087 exp ); 088 089 this.aData = new AvalancheCounter(exp); 090 } 091 092 public ANetwork ( 093 final ModelFactory modelFactory, 094 final DiscreteEventQueue discreteEventQueue, 095 final Seq<ModulatedSynapse> modulatedSynapseSeq, 096 final Experiment exp, 097 final JpvmInfo info, 098 final int base, 099 final double minDelay, 100 final SimulatorParser pas, 101 final Seed idum ) 102 //////////////////////////////////////////////////////////////////////// 103 { 104 super ( 105 modelFactory, 106 discreteEventQueue, 107 modulatedSynapseSeq, 108 exp, 109 info, 110 base, 111 minDelay, 112 pas, 113 idum ); 114 115 this.aData = new AvalancheCounter(exp); 116 } 117 118 //////////////////////////////////////////////////////////////////////// 119 //////////////////////////////////////////////////////////////////////// 120 121 public void initNet() 122 //////////////////////////////////////////////////////////////////////// 123 { 124// subExpId=0; //the first subExp 125// trialId=-1; // the first trial; 126 127 double tmp_time; 128 // minDelay = 0.001; //minimum delay is 1ms 129 // inputQueue = new PriQueue<InputEvent>(); // assign the queue 130 // inputQueue = new FiboQueue<InputEvent>(); // assign the queue 131 // inputQueue = new TreeQueue<InputEvent>(); // assign the queue 132 inputQueue = new MTreeQueue<InputEvent>(); // assign the queue 133 134 // fireQueue = new TreeQueue<FireEvent>(); 135 fireQueue = new MTreeQueue<FireEvent>(); 136 137 // if(bFreq>0.0) 138 // { 139 poissonQueue = new MTreeQueue<PInputEvent>(); // assign the queue 140 // } 141 142 143 stop=false; 144 if( info !=null ) 145 { 146 spikeBuffers = new SpikeBuffer[info.numTasks]; 147 neurons[neurons.length-1]=new SYNNeuron(this);//adding the clock neuron at the end of neuron list 148 for(int i=0; i<info.numTasks;i++) 149 { 150 spikeBuffers[i]=new SpikeBuffer(); 151 } 152 153 recordBuff = new RecordBuffer(); 154 155 received = new int[info.numTasks]; 156 for(int iter=0;iter<info.numTasks;iter++) 157 { 158 received[iter]= 1; //leave mark here 159 } 160 161 intraRecBuffers = new IntraRecBuffer(experiment.recorder.intraNeurons()); 162 163 //send initial input spikes from the sensory neuron to all the neurons in the network 164 /* 165 for(int i= 1; i< neurons.length; i++) 166 { 167 tmp_time=-Math.log(Cnsran.ran2(idum))/5.0; // 5Hz background input 168 inputQueue.insertItem( new InputEvent(0,tmp_time,i,1e-10)); //sensory neuron send spikes to the other neurons 169 } 170 inputQueue.show(); 171 */ 172 /* 173 if(bFreq>0.0) 174 { 175 // poissonQueue = new PriQueue<PInputEvent>(); // assign the queue 176 poissonQueue = new MTreeQueue<PInputEvent>(); // assign the queue 177 // poissonQueue = new TreeQueue<PInputEvent>(); // assign the queue 178 for(int i=0; i<neurons.length; i++) 179 { 180 if(!neurons[i].isSensory()) 181 { 182 poissonQueue.insertItem( new PInputEvent(-Math.log(Cnsran.ran2(idum))/bFreq , new Synapse(base+i,1e-10,0),0)); 183 } 184 } 185 } 186 */ 187 /* 188 189 for(int i=0; i<neurons.length; i++) 190 { 191 if(neurons[i].isSensory()) 192 { 193 fireQueue.insertItem( new FireEvent(i+base,0.0)); //sensory neuron send spikes to the other neurons 194 } 195 } 196 */ 197 198 try { 199 FileOutputStream out = new FileOutputStream("log/"+info.parentJpvmTaskId.getHost()+"_myfile"+info.idIndex+".txt"); 200 p = new PrintStream(out); 201 // p.println(base+neurons[neurons.length-1].toString()); 202 p.println("Logfile start"); 203 } 204 catch(Exception ex) { 205 } 206 207 String curDir = System.getProperty("user.dir"); 208 p.println(curDir); 209 //added 210 /* 211 for(int iter=0;iter<info.numTasks;iter++) 212 { 213 while(!received[iter].empty()) 214 { 215 received[iter].pop(); 216 } 217 received[iter].push(new Object()); 218 } 219 */ 220 //added over 221 222 } 223// init(); 224 225 } 226 227 public void init() 228 //////////////////////////////////////////////////////////////////////// 229 { 230 double tmp_time; 231// minDelay = 0.001; //minimum delay is 1ms 232 stop=false; 233 234// trialDone=false; 235 236 spikeState=true; 237 238 /* this modification make old simulator done's run any more 239 240 trialId++; 241 if(trialId == exp.subExp[subExpId].repetition) 242 { 243 trialId =0; 244 subExpId++; 245 } 246 */ 247// p.println("sub "+subExpId+ "tri: "+trialId); 248 249 250 if(subExpId < experiment.subExp.length) // only initilize when subExp is within the range 251 { 252 /* 253 for(int iter=0;iter<info.numTasks;iter++) 254 { 255 while(!received[iter].empty()) 256 { 257 received[iter].pop(); 258 } 259 received[iter].push(new Object()); 260 } 261 */ 262 263 if(info !=null ) 264 { 265 for(int i=0; i<info.numTasks;i++) 266 { 267 spikeBuffers[i].buff.clear(); 268 } 269 } 270 271 // recordBuff.buff.clear(); 272 273 // intraBuff.init(); //clear intracelluar info; 274 275 if(simulatorParser.backgroundFrequency>0.0) 276 { 277 for(int i=0; i<neurons.length; i++) 278 { 279 if(!neurons[i].isSensory()) 280 { 281 poissonQueue.insertItem ( 282 new PInputEvent ( 283 -Math.log ( Cnsran.ran2 ( seed ) ) 284 / simulatorParser.backgroundFrequency, 285 modelFactory.createSynapse ( 286 base + i, 287 ( byte ) simulatorParser.bChannel, 288 ( float ) simulatorParser.backgroundStrength ), 289 -1 ) ); 290 } 291 } 292 } 293 294 //put the other sources of inputs 295 for(int i = 0 ; i< experiment.subExp[subExpId].stimuli.length; i++) 296 { 297 experiment.subExp[subExpId].stimuli[i].seed = seed; //unify the seed 298 // p.println("input seed:"+exp.subExp[subExpId].sti[i].idum.seed); 299 ArrayList<PInputEvent> tmp = experiment.subExp[subExpId].stimuli[i].init(i); 300 Iterator<PInputEvent> iter = tmp.iterator(); 301 while(iter.hasNext()) 302 { 303 // PInputEvent pin; 304 poissonQueue.insertItem(iter.next()); 305 // p.println(pin); 306 } 307 } 308 309 for(int i=0; i<neurons.length-1; i++) 310 { 311 312 // p.println("init neuron seed:"+idum.seed); 313 neurons[i].init(subExpId,trialId, seed,this,i+base); //all neurons will be initiazed; 314 315 // if(neurons[i].isSensory()) 316 // { 317 // fireQueue.insertItem( new FireEvent(i+base,0.0)); //sensory neuron send spikes to the other neurons 318 // fireQueue.insertItem( new FireEvent(i+base, neurons[i].updateFire() )); //sensory neuron send spikes to the other neurons 319 320 // } 321 // else 322 // { 323 // } 324 } 325 // p.println("neurons number: "+neurons.length); 326 if(info !=null ) 327 { 328 329 if(info.numTasks==1 && experiment.recorder.intraEle.size()==0){ 330 fireQueue.insertItem( new AFireEvent(neurons.length-1+base,experiment.subExp[subExpId].trialLength,-1,-1)); //sensory neuron send spikes to the other neurons 331 } 332 else 333 { 334 fireQueue.insertItem( new AFireEvent(neurons.length-1+base,0.0,-1,-1)); //sensory neuron send spikes to the other neurons 335 } 336 } 337 338 } 339 } 340 341 /** 342 *process the event from fireQueue 343 * 344 * @param pFirstFire 345 */ 346 public void pFireProcess(FireEvent firstFire) throws jpvmException,Exception 347 //////////////////////////////////////////////////////////////////////// 348 { 349 350 double tmp_firetime; 351 if(neurons[firstFire.index-base].realFire()) // only neuron really fires 352 { 353 354 // System.out.println("neuron:"+(firstFire.index-base)+" fire:"+firstFire.time); 355 int host; 356 if(neurons[firstFire.index-base].getRecord()) //if the neuron is recordable 357 { 358 // p.println(firstFire.index+" recorded"); 359 recordBuff.buff.add(new NetRecordSpike(firstFire.time,firstFire.index)); 360 } 361 362 if(((AFireEvent) firstFire).avalancheId>=0 && !neurons[firstFire.index-base].isSensory()) 363 { 364 aData.CountIt(this,((AFireEvent) firstFire).sourceId,((AFireEvent) firstFire).avalancheId); 365 } 366 367 368 long target = neurons[firstFire.index-base].getTHost(); 369 for(int i=0; i < info.numTasks; i++) 370 { 371 if((target & (1L<<i))!=0) // it has target at host i 372 { 373 if(i == info.idIndex) //localhost 374 { 375 for(int iter=0 ; iter< axons.get(firstFire.index).branches.length ; iter++) 376 { 377 inputQueue.insertItem(new AInputEvent(firstFire.time + axons.get(firstFire.index).branches[iter].delay,axons.get(firstFire.index).branches[iter],firstFire.index,((AFireEvent) firstFire).sourceId,((AFireEvent) firstFire).avalancheId)); 378 } 379 } 380 else //remote host 381 { 382 spikeBuffers[i].buff.add( new ANetMessage(firstFire.time, firstFire.index, ((AFireEvent) firstFire).sourceId, ((AFireEvent) firstFire).avalancheId)); 383 } 384 } 385 } 386 } 387 388 double timeOfNextEvent; 389 if( (timeOfNextEvent= neurons[firstFire.index-base].updateFire())>=0) //neuron do fire 390 { 391 392 tmp_firetime=firstFire.time+ timeOfNextEvent; 393 // neurons[firstFire.index-base].timeOfFire(); 394 int aval=((AFireEvent) firstFire).avalancheId; 395 if(neurons[firstFire.index-base].isSensory()) 396 { 397 aval=aData.getId(this); 398 //p.println("sensory start ava: " + aval); 399 } 400 401 fireQueue.insertItem(new AFireEvent(firstFire.index, tmp_firetime, ((AFireEvent) firstFire).sourceId, ((AFireEvent) firstFire).avalancheId)); //insert this into the new firing queue; 402 neurons[firstFire.index-base].setTimeOfNextFire(tmp_firetime); 403 } 404 else 405 { 406 neurons[firstFire.index-base].setTimeOfNextFire(-1); //if the neuron doesn't fire 407 } 408 fireQueue.deleteItem(firstFire); //delete this item 409 } 410 411 412 public void pMainProcess(FireEvent firstFire, double freq, double weight, Seed idum) 413 //////////////////////////////////////////////////////////////////////// 414 { 415 } 416 417 418 /** 419 *process the event from inputQueue 420 * 421 * @param firstInput 422 */ 423 public void inputProcess(InputEvent firstInput) 424 //////////////////////////////////////////////////////////////////////// 425 { 426 427 double tmp_firetime; 428 //System.out.println("input: "+firstInput); 429 // first delete the false prediction 430 //System.out.println("input:"+firstInput); 431 for ( int i = 0; i < firstInput.branch.synapses.length ; i++) 432 { 433 // if(firstInput.branch.synapses[i].to==8300)System.out.println("find trace"+firstInput+" 8300"); 434 if( neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].getTimeOfNextFire() != -1) //if last time predicts the neuron will fire in future 435 { 436 //System.out.println(new FireEvent( firstInput.branch.synapses[i].getTargetNeuronIndex ( ), neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].getTimeOfNextFire())); 437 fireQueue.deleteItem( new AFireEvent( firstInput.branch.synapses[i].getTargetNeuronIndex ( ), neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].getTimeOfNextFire(),((AInputEvent) firstInput).sourceId,((AInputEvent) firstInput).avalancheId)); 438 } 439 440 double timeOfNextEvent; 441 if(( timeOfNextEvent = neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].updateInput(firstInput.time,firstInput.branch.synapses[i])) >=0.0) //neuron do fire 442 { 443 tmp_firetime=firstInput.time+ timeOfNextEvent; 444 //neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].timeOfFire(); 445 neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].setTimeOfNextFire(tmp_firetime); 446 fireQueue.insertItem(new AFireEvent(firstInput.branch.synapses[i].getTargetNeuronIndex ( ) , tmp_firetime, ((AInputEvent) firstInput).sourceId, ((AInputEvent) firstInput).avalancheId)); //insert this into the new firing queue; 447 } 448 else 449 { 450 neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].setTimeOfNextFire(-1); //if the neuron doesn't fire 451 } 452 } 453 inputQueue.deleteItem(firstInput); //delete this item 454 } 455 456 /** 457 *poisson input process 458 * 459 * @param poiInput 460 */ 461 public void poissonProcess(PInputEvent poiInput) 462 //////////////////////////////////////////////////////////////////////// 463 { 464 465 double tmp_firetime; 466 if( neurons[poiInput.synapse.getTargetNeuronIndex ( )].getTimeOfNextFire() != -1) //if last time predicts the neuron will fire in future 467 { 468 //System.out.println(new FireEvent( firstInput.branch.synapses[i].getTargetNeuronIndex ( ), neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )].getTimeOfNextFire())); 469 fireQueue.deleteItem( new AFireEvent( poiInput.synapse.getTargetNeuronIndex ( ), neurons[poiInput.synapse.getTargetNeuronIndex ( )].getTimeOfNextFire(),0,0)); 470 } 471 472 double timeOfNextEvent; 473 if( ( timeOfNextEvent = neurons[poiInput.synapse.getTargetNeuronIndex ( )].updateInput(poiInput.time,poiInput.synapse)) >=0.0 ) //neuron do fire 474 { 475 tmp_firetime=poiInput.time+ timeOfNextEvent; 476 //neurons[poiInput.synapse.getTargetNeuronIndex ( )].timeOfFire(); 477 neurons[poiInput.synapse.getTargetNeuronIndex ( )].setTimeOfNextFire(tmp_firetime); 478 fireQueue.insertItem(new AFireEvent(poiInput.synapse.getTargetNeuronIndex ( ) , tmp_firetime,info.idIndex,aData.getId(this))); //insert this into the new firing queue; 479 } 480 else 481 { 482 neurons[poiInput.synapse.getTargetNeuronIndex ( )].setTimeOfNextFire(-1); //if the neuron doesn't fire 483 } 484 poissonQueue.insertItem( new PInputEvent(poiInput.time+(-Math.log(Cnsran.ran2(seed))/simulatorParser.backgroundFrequency) , poiInput.synapse,-1)); 485 poissonQueue.deleteItem(poiInput); //delete this item 486 } 487 488 489 /** 490 *poisson input process 491 * 492 * @param poiInput 493 */ 494 public void pPoissonProcess(PInputEvent poiInput) 495 //////////////////////////////////////////////////////////////////////// 496 { 497// p.println("t:"+poiInput.time+" sourceID:"+poiInput.sourceId+" id"+poiInput.synapse.getTargetNeuronIndex ( )+" syn:"+poiInput.synapse); 498// p.flush(); 499// fireQueue.show(p); 500// inputQueue.show(p); 501// poissonQueue.show(p); 502 503 504 double tmp_firetime; 505 if( neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].getTimeOfNextFire() != -1) //if last time predicts the neuron will fire in future 506 { 507 fireQueue.deleteItem( new AFireEvent( poiInput.synapse.getTargetNeuronIndex ( ), neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].getTimeOfNextFire(), 0,0)); 508 } 509 510 double timeOfNextEvent; 511 if(( timeOfNextEvent = neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].updateInput(poiInput.time,poiInput.synapse))>=0.0) //neuron do fire 512 { 513// p.println("neuron fire"); 514// p.flush(); 515 516 tmp_firetime=poiInput.time+ timeOfNextEvent; 517 //neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].timeOfFire(); 518 fireQueue.insertItem(new AFireEvent(poiInput.synapse.getTargetNeuronIndex ( ) , tmp_firetime, info.idIndex, aData.getId(this))); //insert this into the new firing queue; 519 neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].setTimeOfNextFire(tmp_firetime); 520// p.println("neuron time caled"); 521// p.flush(); 522 523 } 524 else 525 { 526// p.println("neuron doesn't fire"); 527// p.flush(); 528 neurons[poiInput.synapse.getTargetNeuronIndex ( )-base].setTimeOfNextFire(-1); //if the neuron doesn't fire 529 } 530// p.println("input is updated"); 531// p.flush(); 532 if(poiInput.sourceId==-1) 533 { 534 poissonQueue.insertItem( new PInputEvent(poiInput.time+(-Math.log(Cnsran.ran2(seed))/simulatorParser.backgroundFrequency) , poiInput.synapse,-1)); 535 } 536 else 537 { 538 double timeOfNext = experiment.subExp[subExpId].stimuli[poiInput.sourceId].getNextTime(poiInput.time); 539 if(timeOfNext>=0) 540 { 541 //p.println("t:"+timeOfNext+" sourceID:"+poiInput.sourceId+" id"+poiInput.synapse.getTargetNeuronIndex ( )); 542 poissonQueue.insertItem( new PInputEvent(timeOfNext , poiInput.synapse, poiInput.sourceId)); 543 } 544 } 545 poissonQueue.deleteItem(poiInput); //delete this item 546 } 547 548 /** 549 *process the event from inputQueue 550 * 551 * @param firstInput 552 */ 553 public void pInputProcess(InputEvent firstInput) 554 { 555// p.println("INPUT"); 556// fireQueue.show(p); 557// inputQueue.show(p); 558// poissonQueue.show(p); 559 560 561 double tmp_firetime; 562 for ( int i = 0; i < firstInput.branch.synapses.length ; i++) 563 { 564// if(firstInput.branch.synapses[i].getTargetNeuronIndex ( )==8300)p.println("find trace"+firstInput+" 8300"); 565 if( neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].getTimeOfNextFire() != -1) //if last time predicts the neuron will fire in future 566 { 567 fireQueue.deleteItem( new AFireEvent( firstInput.branch.synapses[i].getTargetNeuronIndex ( ), neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].getTimeOfNextFire(), ((AInputEvent) firstInput).sourceId, ((AInputEvent) firstInput).avalancheId)); 568 } 569 570 double timeOfNextEvent; 571 if( (timeOfNextEvent = neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].updateInput(firstInput.time,firstInput.branch.synapses[i]))>=0.0) //neuron do fire 572 { 573 tmp_firetime=firstInput.time + timeOfNextEvent; 574 // neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].timeOfFire(); 575 fireQueue.insertItem(new AFireEvent(firstInput.branch.synapses[i].getTargetNeuronIndex ( ) , tmp_firetime, ((AInputEvent) firstInput).sourceId, ((AInputEvent) firstInput).avalancheId)); //insert this into the new firing queue; 576 neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].setTimeOfNextFire(tmp_firetime); 577 } 578 else 579 { 580 neurons[firstInput.branch.synapses[i].getTargetNeuronIndex ( )-base].setTimeOfNextFire(-1); //if the neuron doesn't fire 581 } 582 } 583 inputQueue.deleteItem(firstInput); //delete this item 584 } 585/* 586 public void testRun() 587 { 588 FireEvent firstFire; 589 InputEvent firstInput; 590 PInputEvent poiInput; 591 double minTime; 592 double fireTime, inputTime, pInputTime; 593// System.out.println("before running..."); 594 595// inputQueue.show(); 596 597 while(!stop) 598 { 599 firstFire = fireQueue.firstItem(); // take out the first fire element 600 firstInput = inputQueue.firstItem(); // take out the first input element 601 poiInput = poissonQueue.firstItem(); // take out the first poisson input element 602 603// System.out.println("running..."); 604 605 if(firstFire != null) 606 { 607 fireTime=firstFire.time; 608 } 609 else 610 { 611 fireTime=Double.MAX_VALUE; 612 } 613 614 if(firstInput != null) 615 { 616 inputTime=firstInput.time; 617 } 618 else 619 { 620 inputTime=Double.MAX_VALUE; 621 } 622 623 if(poiInput != null) 624 { 625 pInputTime=poiInput.time; 626 } 627 else 628 { 629 pInputTime=Double.MAX_VALUE; 630 } 631 632 minTime = ( fireTime < inputTime? fireTime: inputTime); 633 minTime = (minTime < pInputTime? minTime: pInputTime); 634 635 if( firstFire != null && minTime == firstFire.time) //fire event 636 { 637// System.out.println("fire.."+firstFire); 638 fireProcess(firstFire); 639 640 } 641 else if ( firstInput !=null && minTime == firstInput.time) //input event 642 { 643 // System.out.println("input.."); 644 inputProcess(firstInput); 645 } 646 else if ( poiInput !=null && minTime == poiInput.time) //poissoninput event 647 { 648// System.out.println("background: "+poiInput.synapse.getTargetNeuronIndex ( )); 649 poissonProcess(poiInput); 650 } 651 } 652 } 653 */ 654 655 //////////////////////////////////////////////////////////////////////// 656 //////////////////////////////////////////////////////////////////////// 657 }