NEST Server Engine

This engine allows to use out of the box the nest-server application that comes with NEST 3 together with NRP-core. In this case the Engine server is nest-server itself without modifications. Thus the engine implementation is reduced to the engine client, which translates requests for advancing the simulation and sending or getting datapack data to nest-server using its REST API.

From a user point of view, this engine is very similar to NEST JSON Engine. At initialization time, it loads a NEST simulation model described in a python script. At run time, it takes care of advancing the simulation when requested and of handling datapack data transfer.

The main difference is that in this case datapacks can’t be registered from within the aforementioned Python script, as it is done in the case of NestJsonEngine. Instead, users rely on the mechanism provided by nest-server to access populations and connections status.

In order to access, from TransceiverFunctions, NEST populations defined in the brain python script, they have to be mapped to a datapack name in a dictionary referred to as populations. Afterwards the status of those population will be available as JsonDataPacks; they are updated with the results of calling the NEST GetStatus function. The limitations on the objects that can be used as values in this dictionary will be those imposed by nest-server. Similarly, a dictionary named connections mapping datapack names to “source” and “target” population names (contained in populations) can be defined too. Such datapacks will be updated using the NEST GetConnections function.

DataPacks

This engine supports a unique datapack type: JsonDataPack. It contains the status of a set of NEST objects as a list of dictionaries.

The way to register a JsonDataPack datapack is adding it to the populations dictionary in the initialization Python script. Afterwards, the status of the value to this key in the dictionary can be accessed or set in TransceiverFunctions.

The experiment located in examples/husky_braitenberg_nest_server shows how the NEST Server Engine can be configured in NRP-core. It can be observed that it is almost indistinguishable from its NEST JSON Engine version, which can be found in examples/husky_braitenberg. The only difference is that datapacks are registered through the populations dictionary:


Attribute

Description

Python Type

C type

data

data contained in the datapack as a NlohmannJson object

NlohmannJson

nlohmann::json

Engine Configuration Parameters

This Engine type parameters are defined in the NestServerEngine schema (listed here), which in turn is based on EngineBase thus inherits all parameters from them.

To use the NEST server engine in an experiment, set EngineType to “nest_server”.

Name

Description

Type

Default

Required

Array

EngineName

Name of the engine

string

X

EngineType

Engine type. Used by

string

X

EngineProcCmd

Engine Process Launch command

string

EngineProcStartParams

Engine Process Start Parameters

string

[]

X

EngineEnvParams

Engine Process Environment Parameters

string

[]

X

EngineLaunchCommand

object

{“LaunchType”:”BasicFork”}

EngineTimestep

Engine Timestep in seconds

number

0.01

EngineCommandTimeout

Engine Timeout (in seconds). It tells how long to wait for the completion of the engine runStep. 0 or negative values are interpreted as no timeout

number

0.0

  • Parameters specific to this engine type:

Name

Description

Type

Default

Required

Array

NestInitFileName

Path to the Python script that sets up the neural network for the simulation

string

X

NestRNGSeed

Nest RNG seed

integer

0

NestServerHost

Nest Server Host

string

localhost

NestServerPort

Nest Server

integer

first unbound port starting from 5000

MPIProcs

Number of MPI processes used in the NEST simulation

integer

1

Schema

As explained above, the schema used by the NEST engine inherits from EngineBase schema. A complete schema for the configuration of this engine is given below:

{"engine_nest_base" : {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Nest Base",
    "description": "Nest Base Engine configuration schema. Configuration for all nest engine implementations inherit from this one",
    "$id": "#NestBase",
    "properties" : {
      "NestInitFileName": {
        "type": "string",
        "description": "Path to the python script that sets up the neural network for the simulation"
      },
      "NestRNGSeed": {
        "type": "integer",
        "default": 0,
        "description": "Nest RNG seed"
      }
    },
    "required": ["NestInitFileName"]
  },
  "engine_nest_json" : {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Nest Json Engine",
    "description": "Nest Json Engine",
    "$id": "#NestJSONEngine",
    "allOf": [
      { "$ref": "json://nrp-core/engines/engine_comm_protocols.json#/engine_json" },
      { "$ref": "#/engine_nest_base" },
      {
        "properties": {
          "EngineType": { "enum": ["nest_json"] }
        }
      }
    ]
  },
  "engine_nest_server" : {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Nest Server Engine",
    "description": "Nest Server Engine",
    "$id": "#NestServerEngine",
    "allOf": [
      { "$ref": "json://nrp-core/engines/engine_base.json#EngineBase" },
      { "$ref": "#/engine_nest_base" },
      {
        "properties": {
          "EngineType": { "enum": ["nest_server"] },
          "NestServerHost" : {
            "type": "string",
            "default": "localhost",
            "description": "Nest Server Host"
          },
          "NestServerPort": {
            "type": "integer",
            "description": "Nest Server Port"
          },
          "MPIProcs": {
            "type": "integer",
            "default": 1,
            "description": "Number of MPI processes used in the NEST simulation"
          }
        }
      }
    ]
  }
}