nengo / nengo-loihi

Run Nengo models on Intel's Loihi chip
https://www.nengo.ai/nengo-loihi/
Other
35 stars 12 forks source link

Error when adding energy probes inside Simulator context #292

Open drasmuss opened 4 years ago

drasmuss commented 4 years ago

Running this code

import nengo
import nengo_loihi
from nxsdk.graph.monitor.probes import PerformanceProbeCondition
from nxsdk.api.n2a import ProbeParameter

with nengo.Network() as net:
    a = nengo.Ensemble(10, 1)
    p = nengo.Probe(a)

run_time = 0.1
dt = 0.001

with nengo_loihi.Simulator(net, dt=dt) as sim:
    board = sim.sims["loihi"].nxsdk_board
    probe_cond = PerformanceProbeCondition(
        tStart=1, tEnd=int(run_time / dt) * 10, bufferSize=1024 * 5, binSize=4
    )
    e_probe = board.probe(ProbeParameter.ENERGY, probe_cond)
    sim.run(run_time)

gives the error

Traceback (most recent call last):
  File "test.py", line 22, in <module>
    sim.run(run_time)
  File ".../nengo-loihi/nengo_loihi/simulator.py", line 330, in run
    self.run_steps(steps)
  File ".../nengo-loihi/nengo_loihi/simulator.py", line 343, in run_steps
    self._runner.run_steps(steps)
  File ".../nengo-loihi/nengo_loihi/simulator.py", line 518, in loihi_only
    self.loihi.run_steps(steps)
  File ".../nengo-loihi/nengo_loihi/hardware/interface.py", line 253, in run_steps
    d_get(self.nxsdk_board, b"cnVu")(steps, **{d(b"YVN5bmM="): not blocking})
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxboard.py", line 262, in run
    traceDirectory=traceDirectory)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxboard.py", line 233, in _run
    self.executor.start(numSteps, aSync)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/executor.py", line 83, in start
    self.finish()
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/executor.py", line 121, in finish
    self._notifyListeners(ExecutionEventEnum.POST_EXECUTION)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/executor.py", line 147, in _notifyListeners
    listener.postExecution()
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/listeners/composite_monitor.py", line 56, in postExecution
    [m.postExecution() for m in self._collection.values()]
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/listeners/composite_monitor.py", line 56, in <listcomp>
    [m.postExecution() for m in self._collection.values()]
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/driver/listeners/monitors/performance_monitor.py", line 43, in postExecution
    self._energyTimeMonitor.updateProbes()
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxenergy_time.py", line 833, in updateProbes
    prb._updateProbe(probeData)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxenergy_time.py", line 385, in _updateProbe
    tProbeData = super()._updateProbe(rawTimeProbeData)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxenergy_time.py", line 55, in _updateProbe
    etMonitor=self.etMonitor)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxtime.py", line 33, in __init__
    self._postProcessData(data)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxtime.py", line 64, in _postProcessData
    self._processBins()
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxtime.py", line 91, in _processBins
    self._unpackTimeBins(begin, end, tileSize, tStart)
  File ".../miniconda3/envs/drasmuss/lib/python3.5/site-packages/nxsdk/graph/nxtime.py", line 128, in _unpackTimeBins
    return endTimeStamps[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0

This is using NxSDK 0.9.

This issue doesn't occur when using Nengo Loihi 0.10.0, so it is caused by some change in master since then.

drasmuss commented 4 years ago

As pointed out by @hunse, this is caused by the change where we run connect in __enter__ (NxSDK doesn't like it if you try to add energy probes after connect).