ユーザードキュメント

モデルのコンポーネントと構造

ネットワーク モデルを作成するには、以下が必要です。

  • ネットワークパラメータを持つクラス specs.NetParams のオブジェクト netParams

  • シミュレーション構成オプションを備えたクラス specs.SimConfig のオブジェクト simConfig

  • ネットワーク モデルを作成して実行するためのメソッドの呼び出し。引数として上記の辞書を渡します。 createSimulateAnalyze(netParams, simConfig)

これらのコンポーネントは、単一または複数の Python ファイルに含めることができます。このセクションでは、ネットワーク パラメーターとシミュレーション構成オプションを定義する方法、およびネットワーク モデルの作成と実行に使用できる方法について包括的に説明します。

ネットワークパラメータ

クラス NetParamsnetParams オブジェクトには、ネットワークを定義するために必要な情報がすべて含まれています。これは、次の順序付けられた辞書で構成されます。

  • cellParams - セルのタイプとそれに関連するパラメータ (セルの形状など)

  • popParams - ネットワーク内の人口とそのパラメータ

  • synMechParams - シナプス機構とそのパラメータ

  • connParams - ネットワーク接続ルールとそれに関連するパラメータ。

  • subConnParams - ネットワークのセルラー接続ルールとそれに関連するパラメーター。

  • stimSourceParams - 刺激源パラメータ。

  • stimTargetParams - 刺激源と標的細胞間のマッピング。

  • rxdParams - 反応拡散 (RxD) コンポーネントとそのパラメーター。

_images/netparams.png

これらの順序付けされた辞書はそれぞれ、直接入力することも、NetParams オブジェクト メソッドを使用して入力することもできます。どちらの方法も同等ですが、オブジェクト メソッドは追加されるパラメーターの構文をチェックします。以下は、popParams 順序付きディクショナリに項目を追加する 2 つの同等の方法です。

from netpyne import specs
netParams = specs.NetParams()

# Method 1: direct
netParams.popParams['Pop1'] = {'cellType': 'PYR', 'numCells': 20}

# Method 2: using object method
netParams.addPopParams(label='Pop1', params={'cellType': 'PYR', 'numCells': 20})

netParams の構成は、フレームワークが内部で実行する標準的なイベント シーケンスと一致しています。

  • cellParams に基づいてタイプに応じてセルのプロパティを設定します。

  • Network オブジェクトを作成し、その中に popParams に基づく Cell オブジェクトと Population オブジェクトのセットを追加します

  • connParams および subConnParams (どのシナプス前セルとシナプス後セルが接続ルールの条件に一致するかを確認) に基づいて、synMechParams のシナプス パラメーターを使用して一連の接続を作成します。

  • stimSourceParams および stimTargetParams に基づいて細胞に刺激を追加します

さらに、netParams には、次のカスタマイズ可能な単一値属性が含まれています (例: netParams.sizeX = 100)。

  • scale: セル数のスケール係数乗数 (デフォルト: 1)

  • 形状: ネットワークの形状: 「直方体」、「円柱」、または「楕円体」 (デフォルト: 「直方体」)

  • sizeX: x 次元 (水平方向の長さ) ネットワーク サイズ (μm 単位) (デフォルト: 100)

  • sizeY: y 次元 (垂直高さまたは皮質深さ) ネットワーク サイズ (μm 単位) (デフォルト: 100)

  • sizeZ: Z 次元 (水平方向の奥行き) ネットワーク サイズ (μm 単位) (デフォルト: 100)

  • rotateCellsRandomly: y 軸 [min,max] ラジアンを中心にセルをランダムに回転します。 [0, 3.0] (デフォルト: False)

  • defaultWeight: デフォルトの接続の重み (デフォルト: 1)

  • defaultDelay: デフォルトの接続遅延 (ミリ秒単位) (デフォルト: 1)

  • propVelocity: um/ms 単位の伝導速度 (例: 500 um/ms = 0.5 m/s) (デフォルト: 500)

  • scaleConnWeight: 接続重みスケール係数 (NetStims を除く) (デフォルト: 1)

  • scaleConnWeightNetStims: NetStims の接続重みスケール係数 (デフォルト: 1)

  • scaleConnWeightModels: 各セル モデルの接続重量スケール係数 (例: {‘HH’: 0.1、’Izhi’: 0.2} (デフォルト: {})

  • popTagsCopiedToCells: 母集団からセルにコピーされるタグのリスト (デフォルト: [‘pop’, ‘cellModel’, ‘cellType’])

netParams dict への他の任意のエントリを追加し、接続パラメーターのカスタム定義関数で使用できます (文字列としての関数 を参照)。

セルの種類

cellParams 順序付き辞書の各項目は、キーと値で構成されます。キーは、このセルの種類を識別するためのラベルです。値は、次のフィールドを含むセルのプロパティを定義するディクショナリで構成されます。

  • secs - セルのセクションを含むディクショナリ。各セクションには次のフィールドが含まれます (空のフィールドは省略できます)。
  • geom: diamL、または Ra などのジオメトリ プロパティを含むディクショナリ。 オプションで、3D 点のリストを含むフィールド pt3d を含めることができます。各点は (x,y,z,diam) 形式のタプルとして定義されます。 diamL、または Ra の値は関数として定義できます (「 文字列として機能します)。

  • topol: トポロジのプロパティを含むディクショナリ。 parentSec (親セクションのラベル)、parentX (接続を行う親の場所)、および childX (現在のセクション -子- 接続を行う場所) が含まれます。

  • mechs: 密度/分散メカニズムの辞書。 キーにはメカニズムの名前が含まれます (例: 「hh」または「pas」)。 値にはメカニズムのプロパティを含む辞書が含まれます (例: {'g': 0.003, 'e': -70})。これらのプロパティは関数として定義できます (文字列としての関数を参照)。

  • イオン: イオンの辞書。 キーにはイオンの名前 (例: 「na」または「k」) が含まれます。 値には、特定のセクションのイオンのプロパティを含む辞書が含まれます (例: {'e': -70})。利用可能なプロパティは、'e': 逆転電位、'i': そのセクションのイオンの内部濃度、および 'o': そのセクションのイオンの細胞外濃度です。

  • pointps: 点プロセスの辞書 (シナプス機構を除く)。 キーには任意のラベルが含まれます (例: 「Izhi」)。 値にはポイント プロセスのプロパティを含む辞書が含まれます (例: 「Izhi」)。 {'mod':'Izhi2007a', 'a':0.03, 'b':-2, 'c':-50, 'd':100, 'celltype':1})。これらのプロパティは関数として定義できます (文字列としての関数を参照)。

内部ポイント プロセス変数とは別に、次のプロパティを各ポイント プロセスに指定できます。

  • mod、NEURON メカニズムの名前。 'Izhi2007a'

  • loc、シナプス機構を配置するセクションの位置。 1.0、デフォルト=0.5

  • vref (オプション)、細胞膜電圧を含む内部メカニズム変数。 'V'

  • synList (オプション)、内部メカニズムのシナプスメカニズムのラベルのリスト。 [「AMPA」、「NMDA」、「GABAB」]

  • vinit - (オプション) セクションの初期膜電圧 (mV 単位) (デフォルト: -65)

例: cellRule['secs']['soma']['vinit'] = -72

  • spikeGenLoc - (オプション) このセクションが (デフォルトの「soma」の代わりに) スパイクの生成を担当することを示し、スパイクが生成される場所 (セグメント) を提供します。

例: cellRule['secs']['axon']['spikeGenLoc'] = 1.0

  • 閾値 - (オプション) セルのこのセクションで発生するスパイクを検出するために使用される閾値電圧 (mV 単位)。省略した場合、デフォルトは netParams.defaultThreshold = 10.0

例: cellRule['secs']['soma']['threshold'] = 5.0

  • secLists - (オプション) セクション リストの辞書 (例: {‘all’: [‘soma’, ‘dend’]})

  • vars - (オプション) このセル タイプの任意のセクションのプロパティで参照できるユーザー定義変数のディクショナリ。 使用例:

  cellRule['secs']['dend1']['mechs']['pas'] = {'g': 'g_default + 1e-6'}  # cell variable 'g_default' referenced
  cellRule['secs']['dend2']['mechs']['pas'] = {'g': 'g_default + 1.5e-6'}  # cell variable 'g_default' referenced
  cellRule['vars'] = {'g_default': 0.0000357} # cell variable 'g_default' defined

セル変数の値自体も関数として定義できます (文字列としての関数 を参照)。 cellRule['vars'] = {'g_default': 'normal(3.57e-5, 1e-7)}

2 つの異なるセル タイプを追加する例:

## PYR_HH cell properties
soma = {'geom': {}, 'mechs': {}}  # soma properties
soma['geom'] = {'diam': 18.8, 'L': 18.8, 'Ra': 123.0, 'pt3d': []}
soma['geom']['pt3d'].append((0, 0, 0, 20))
soma['geom']['pt3d'].append((0, 0, 20, 20))
soma['mechs']['hh'] = {'gnabar': 0.12, 'gkbar': 0.036, 'gl': 0.003, 'el': -70}

dend = {'geom': {}, 'topol': {}, 'mechs': {}}  # dend properties
dend['geom'] = {'diam': 5.0, 'L': 150.0, 'Ra': 150.0, 'cm': 1}
dend['topol'] = {'parentSec': 'soma', 'parentX': 1.0, 'childX': 0}
dend['mechs']['pas'] = {'g': 0.0000357, 'e': -70}

PYR_HH_dict = {'secs': {'soma': soma, 'dend': dend}}
netParams.cellParams['PYR_HH'] = PYR_HH_dict  # add rule dict to list of cell property rules


## PYR_Izhi cell properties
Izhi_dict = {'secs': {'soma': {} }}
Izhi_dict['secs']['soma'] = {'geom': {}, 'pointps':{}}  # soma properties
Izhi_dict['secs']['soma']['geom'] = {'diam': 18.8, 'L': 18.8, 'Ra': 123.0}
Izhi_dict['secs']['soma']['pointps']['Izhi'] = {'mod':'Izhi2007a', 'vref':'V', 'a':0.03, 'b':-2, 'c':-50, 'd':100, 'celltype':1}

netParams.cellParams['PYR_Izhi'] = Izhi_dict  # add rule to list of cell property rules

注記

上記の例のように、一時的な変数/構造体 (somaIzhi_dict など) を使用して、最終的な辞書 netParams.cellParams の作成を容易にすることができます。

注記

netParams.cellParams を介してセル パラメータを直接作成または変更できます。 netParams.cellParams['PYR_HH']['secs']['soma']['geom']['L']=16

こちらも参照

セルのプロパティは外部ファイルからインポートできます。詳細と例については、外部定義セル モデルのインポートを参照してください。

母集団パラメータ

popParams 順序付き辞書の各項目は、キーと値で構成されます。キーは母集団の任意のラベルであり、タグ pop としてすべてのセルに割り当てられ、特定の接続ルールを適用するための条件として使用できます。

値は母集団のパラメータを含む辞書で構成され、次のフィールドが含まれます。

  • cellType - この集団内のすべての細胞に使用される細胞タイプ。 例えば「Pyr」(錐体ニューロン用)または「FS」(高速スパイク介在ニューロン用)

  • numCellsdensity、または gridSpacing - この集団内の細胞の総数、ニューロン/mm3 単位の密度、または固定グリッド間隔 (3 つのうち 1 つだけが必要です)。 各母集団が占める体積はカスタマイズできます (xRangeyRange、および zRange を参照)。それ以外の場合は、ネットワーク ボリューム全体が使用されます (netParams で定義: sizeXsizeYsizeZ)。

density は、文字列に変数と一般的な Python 算術演算子/関数を指定することで、正規化された位置の関数 (xnormynorm、または znorm) として表現できます。例えば'1e5 * exp(-ynorm/2)'

gridSpacing はセル間の間隔 (μm) です。セルの総数は、間隔と sizeXsizeYsizeZ に基づいて決定されます。例えば10

  • xRange または xnormRange - x 軸のニューロン位置の範囲 (水平方向の長さ)、指定された 2 要素リスト [min, max]。 um 単位の絶対値の場合は xRange (例: [100,200])、または sizeX の小数として 0 から 1 までの正規化された値の場合は xnormRange (例: [0.1,0.2])。

  • yRange または ynormRange - y 軸のニューロン位置の範囲 (垂直高さ = 皮質深さ)、指定された 2 要素リスト [min, max]。 um 単位の絶対値の場合は yRange (例: [100,200])、または sizeY の小数として 0 から 1 までの正規化された値の場合は ynormRange (例: [0.1,0.2])。注: NEURON オブジェクトの 3D ポイント (pt3d) y 座標は、Y 軸を深度座標として正しく使用して表すために、NetPyNE/Python tags.y 値と逆の符号を持ちます。 cell.tags.y = 500の場合、cell.secs.soma.geom.pt3d[0][1] = -500 ([0] は最初の pt3d を指し、[1] は y 座標を指します)

  • zRange または znormRange - Z 軸 (水平方向の深さ) のニューロン位置の範囲、指定された 2 要素リスト [min, max]。 um 単位の絶対値の場合は zRange (例: [100,200])、または sizeZ の小数として 0 から 1 までの正規化された値の場合は znormRange (例: [0.1,0.2])。

母集団を作成する例:

netParams.popParams['Sensory'] = {'cellType': 'PYR', 'ynormRange':[0.2, 0.5], 'density': 50000}

クラス netParamsaddPopParams(label, params) メソッドを使用して、項目を popParams に追加できます。対話的に作業する場合、追加されたパラメーターの構文をチェックできるという利点があります。

netParams.addPopParams('Sensory', {'cellType': 'PYR', 'ynormRange':[0.2, 0.5], 'density': 50000})

また、スパイク イベントを生成するがセクションを持たない人工細胞の集団、つまり点プロセスを作成することも可能です (例: NEURON オブジェクト: NetStimVecStim、または IntFire2)。この場合、cellModel フィールドはポイント プロセス メカニズムの名前を指定し、メカニズムのプロパティは追加フィールドとして指定されます。人工セルはより単純であるため、netParams.cellParams 構造体で個別のセル パラメーターを定義する必要がないことに注意してください。たとえば、以下は NetStims (NEURON の人工スパイク ジェネレーター) の母集団を作成するために必要なフィールドです。

  • pop - すべてのセルに割り当てられるこの集団の任意のラベル (例: 「バックグラウンド」)。特定の接続ルールを適用する条件として使用できます。

  • cellModel - ポイント プロセス人工セルの名前 (例: IntFire2NetStim、または VecStim)。

  • numCells - セルの数

  • 人工セルのパラメータ - 各ポイントプロセス人工セルに固有 (例: IntFire2 には「taum」、「taus」、「ib」が含まれます)

cellModel が「NetStim」または「VecStim」の場合、次のパラメータが許可されます。

  • 間隔 - スパイク間隔(ミリ秒)

  • rate - 発火速度 (Hz) (これは NetStim 間隔プロパティの逆数であることに注意してください)

  • ノイズ - NetStim のノイズの割合 (0 = 決定的; 1 = 完全にランダム)

  • start - 最初のスパイクの時間 (ミリ秒) (デフォルト = 0)

  • 数値 - 生成されるスパイクの最大数 (デフォルト = 1e12)

  • シード - ランダマイザーのシード (オプション; デフォルトは simConfig.seeds['stim'] に設定された値)

  • spkTimes (「VecStim」のみ) - スパイク時間のリスト (例: [1, 10, 40, 50]、range(1,500,10)、または Python リストを含む変数)

  • パルス (「VecStim」のみ) - スパイクパルスのリスト。各項目には、start (ms)、end (ms)、rate (Hz)、および noise (0 ~ 1) のパルス パラメーターが含まれます。以下の例を参照してください。

点プロセス人工細胞集団の例:

netParams.popParams['artif1'] = {'cellModel': 'IntFire2', 'taum': 100, 'noise': 0.5, 'numCells': 100}  # Intfire2

netParams.popParams['artif2'] = {'cellModel': 'NetStim', 'rate': 100, 'noise': 0.5, 'numCells': 100}  # NetsStim

# create custom list of spike times
spkTimes = range(0,1000,20) + [138, 155,270]

# create list of pulses (each item is a dict with pulse params)
pulses = [{'start': 10, 'end': 100, 'rate': 200, 'noise': 0.5},
        {'start': 400, 'end': 500, 'rate': 1, 'noise': 0.0})]

netParams.popParams['artif3'] = {'cellModel': 'VecStim', 'numCells': 100, 'spkTimes': spkTimes, 'pulses': pulses}  # VecStim with spike times

cellModel が「VecStim」の場合、「spikePattern」辞書を作成することでパターン ジェネレーターを使用できます。

netParams.popParams['artif1'] = {'cellModel': 'VecStim'
                                 ...
                                 'spikePattern': {'type': 'rhythmic', # can be 'rhythmic', 'evoked', 'poisson', 'gauss'
                                                  ...                 # see netpyne/cell/inputs.py for argument entries
                                                  }
                                 }

現在、「rhythmic」、「evoked」、「poisson」、および「gauss」スパイク パターン ジェネレーターが利用可能です。それらの引数エントリは次のとおりです。

  • リズミック - 継続的な外部入力を作成します(リズミック)
  • start - 最初のスパイクの時間。 -1 の場合、startMin と startMax 間の均一な分布 (ミリ秒)

  • startMin - 開始時間の一様分布の最小値 (ミリ秒)

  • startMax - 開始時間の一様分布の最大値 (ミリ秒)

  • startStd - 開始時間の正規分布の標準偏差 (ミリ秒);平均値は開始パラメータによって設定されます。 > 0.0の場合にのみ使用されます

  • freq - リズミカルパターンの振動周波数 (Hz)

  • freqStd - 発振周波数の標準偏差 (Hz)

  • 分布 - 発振周波数の分布タイプ。 「普通」か「均一」か

  • eventsPerCycle - サイクルごとのスパイク/バースト。 1 または 2 のいずれかである必要があります

  • repeats - 入力パターンを繰り返す回数 (入力数に相当)

  • 停止 - パターンの最後のスパイクの最大時間 (ミリ秒)

  • 誘発 - 進行中の外部入力(リズミカル)を作成します
  • start - 最初のスパイクの時間

  • inc - 最初のスパイク時間の増加。 cfg.inc_evinput から (ミリ秒)

  • startStd - 開始の標準偏差 (ms)

  • numspikes - 生成するスパイクの総数

  • ポアソン - 外部ポアソン入力を作成します
  • start - 最初のスパイクの時間 (ミリ秒)

  • 停止 - 時間を停止します。 -1 の場合、全期間 (ミリ秒)

  • 周波数 - 開始の標準偏差 (ms)

  • gauss - ガウス入力を作成します
  • mu - ガウス平均

  • シグマ - ガウス分散

最後に、cellsList 辞書フィールドにセルのリストを含めることによって、個別に定義されたセルで構成される集団を定義できます。セルのリストの各要素は、cellLabel や場所 (xynorm など) などのセル プロパティのセットを含む辞書になります。以下に例を示します。

cellsList.append({'cellLabel':'gs15', 'x': 1, 'ynorm': 0.4 , 'z': 2})
cellsList.append({'cellLabel':'gs21', 'x': 2, 'ynorm': 0.5 , 'z': 3})
netParams.popParams['IT_cells'] = {'cellType':'IT', 'cellsList': cellsList} #  IT individual cells

注記

VecStim を使用するには、 vecevent.mod ファイル をダウンロードしてコンパイル (nrnivmodl) する必要があります。

シナプス機構パラメータ

シナプス メカニズムのパラメーターを定義するには、synMechParams 順序付き辞書に項目を追加します。 addSynMechParams(label,params) メソッドを使用できます。各 synMechParams 項目はキーと値で構成されます。キーはこのメカニズムの任意のラベルであり、接続ルールで参照するために使用されます。値は、次のフィールドを含むシナプス メカニズム パラメーターの辞書です。

  • mod - NMODL メカニズム名 (例: 「ExpSyn」)。これは MOD ファイルの名前と必ずしも一致しないことに注意してください。

  • メカニズムパラメータ (tau または e など) - これらは特定の NMODL メカニズムに依存します。これらのパラメーターの値は関数として定義できます (文字列としての関数を参照)。

  • selfNetCon (オプション) - 恒常性シナプス (hsyn) などの一部のシナプス メカニズムで必要な、セル電圧とシナプスの間の NetCon パラメーターを含む辞書。例えば'selfNetCon': {'sec': 'soma' , 'threshold': -15, 'weight': -1, 'delay': 0} (デフォルトでは、ソースセクションはソーマに設定されています。例: 'sec': 'soma')

シナプス機構は、接続フェーズ中に必要に応じて細胞に追加されます。各接続ルールは、適切なラベルを参照することによって、どのシナプス メカニズム パラメーターを使用するかを指定します。

以下は、NMDA というラベルが付いた単純な興奮性シナプス機構のシナプス機構パラメーターの例です。Exp2Syn モデルを使用して実装され、立ち上がり時間 (tau1) が 0.1 ミリ秒、減衰時間 (tau2) が 5 ミリ秒、平衡電位が設定されています。 (e) 0mV:

## Synaptic mechanism parameters
netParams.synMechParams['NMDA'] = {'mod': 'Exp2Syn', 'tau1': 0.1, 'tau2': 5.0, 'e': 0}  # NMDA synaptic mechanism

接続ルール

接続ルールを使用する理論的根拠は、特定の基準に一致するニューロンのサブセット間に接続を作成できることです。特定の細胞型のシナプス前ニューロン、および特定の集団および/または特定の範囲の位置内のシナプス後ニューロンのみ。

connParams 順序付き辞書の各項目は、キーと値で構成されます。キーは、この接続ルールの参照として使用される任意のラベルです。値には、接続ルールのパラメーターを定義するディクショナリが含まれており、次のフィールドが含まれます。

  • preConds - シナプス前細胞の条件セット シナプス前細胞の属性/タグと必要な値を含む辞書として定義されます。 {'cellType': 'PYR'}

値はリストにすることができます。 {'pop': ['Exc1', 'Exc2']}。位置プロパティの場合、リストの値は最小値と最大値に対応します。 {'ynorm': [0.1, 0.6]}

  • postConds - シナプス後細胞の条件セット preConds (上記) と同じ形式。

  • sec (オプション) - シナプス後ニューロンのターゲット セクションの名前 (例: 'soma') 省略した場合、デフォルトで「soma」が存在する場合は「soma」が使用され、存在しない場合はセルセクションリストの最初のセクションが使用されます。

単一のセクションの名前、セクションのリストとして定義できます。 ['soma', 'dend']、またはシナプス後 cellParams の secList 辞書からのキー。

synsPerConn > 1 でセクションのリストが指定されている場合、シナプスは各セクションの長さを考慮して、指定されたセクションに沿って均一に分散されます。これはデフォルトの動作ですが、変更できます。詳細と例については、マルチシナプス接続 を参照してください。

synsPerConn == 1 でセクションのリストが指定されている場合、リストからランダムに選択されたセクションにシナプス (セル間接続ごとに 1 つ) が配置されます。リストの最初のセクションを常に使用するようにするには、connRandomSecFromList を設定します。

  • loc (オプション) - ターゲット シナプス メカニズムの位置 (例: 0.3) 省略した場合、デフォルトは 0.5 になります。

synMechs のリストがある場合は、すべてに対して 1 つの loc を作成するか、または loc のリスト (synMech ごとに 1 つ、たとえば 2 つの synMech の場合: [0.4, 0.7]) を作成できます。

synsPerConn > 1 の場合、すべてに対して 1 つの loc を指定するか、または loc のリスト (シナプスごとに 1 つ、たとえば synsPerConn = 3 の場合) を指定できます。 [0.4, 0.5, 0.7])

synMechssynsPerConn > 1 の両方のリストがある場合、各 synMech の各シナプスの 2D リストを持つことができます (たとえば、2 つの synMech と synsPerConn = 3 の場合)。 [[0.2, 0.3, 0.5], [0.5, 0.6, 0.7]])

これらのマルチシナプス シナリオでは、追加のパラメーターが使用可能になります。詳細については、「マルチシナプス接続」を参照してください。

synsPerConn == 1 で、locsec の両方がリストの場合、シナプス (シナプス前セルごとに 1 つ) は、リストからランダムに選択された位置とセクションに配置されます (ランダムなセクションと位置は密接に関係することに注意してください。つまり、両方に同じランダム インデックスが使用されます)。それぞれのリストの最初のセクションと場所を常に使用するようにするには、connRandomSecFromList を設定するか、loc または sec を単一の値として保持します。

  • synMech (オプション) - シナプス後ニューロン上のターゲット シナプス メカニズムのラベル (またはラベルのリスト) (例: 'AMPA' または ['AMPA', 'NMDA'])

省略した場合、セルのシナプス機構リストの最初のシナプス機構が使用されます。

シナプスメカニズムのリストを使用する場合、メカニズムごとに個別の接続が作成されます。オプションで、重み、遅延、位置の対応するリストを提供できます。詳細については、「マルチシナプス接続」を参照してください。

  • synsPerConn (オプション) - セル間接続 (connection) ごとの個々のシナプス接続 (synapses) の数

関数として定義できます (文字列としての関数を参照)。

省略した場合、デフォルトは 1 になります。

各シナプスの重み、遅延、位置、あるいはその両方をリストとして指定することも、単一の値をすべてに使用することもできます。

synsPerConn > 1 で 単一セクション を指定すると、loc でシナプスの位置をリストとして指定できます。 ターゲット セクションのリスト が指定されている場合は、loc を省略する必要があり、シナプスは各セクションの長さを考慮して、指定されたセクションに沿って均一に分散されます。これはデフォルトの動作ですが、変更できます。詳細については、マルチシナプス接続を参照してください。

synMechs のリストがある場合は、すべてに対して単一の synsPerConn 値を指定することも、リスト内のシナプス メカニズムごとに 1 つの値のリストを指定することもできます。

セル間接続ごとに 2 つの AMPA シナプスと 2 つの GABA シナプス:

netParams.connParams[…] = { ‘synMech’: [‘AMPA’, ‘GABA’], ‘synsPerConn’: 2、

セル間接続ごとに 2 つの AMPA シナプスと 1 つの GABA シナプス:

netParams.connParams[…] = { ‘synMech’: [‘AMPA’, ‘GABA’], ‘synsPerConn’: [2, 1],

  • 重量 (オプション) - シナプス接続の強度 (例: 0.01) コンダクタンスの変化に関連しますが、シナプス機構と細胞モデルに応じて意味と規模が異なります。

関数として定義できます (文字列としての関数を参照)。

省略した場合、デフォルトは netParams.defaultWeight = 1 になります。

synMechs のリストがある場合は、すべての重みを 1 つ持つことも、重みのリスト (synMech ごとに 1 つ、たとえば 2 つの synMech の場合: [0.1, 0.01]) を持つこともできます。

synsPerConn > 1 の場合、すべてに対して単一の重みを指定することも、重みのリストを指定することもできます (シナプスごとに 1 つ、たとえば、synsPerConn = 3 の場合: [0.2, 0.3, 0.4])。

synMechssynsPerConn > 1 の両方のリストがある場合、各 synMech の各シナプスの 2D リストを持つことができます (たとえば、2 つの synMech と synsPerConn = 3 の場合)。 [[0.2, 0.3, 0.4], [0.02, 0.04, 0.03]])

  • 遅延 (オプション) - シナプス前スパイクがシナプス後ニューロンに到達するまでの時間 (ミリ秒) 関数として定義できます (文字列としての関数を参照)

省略した場合、デフォルトは netParams.defaultDelay = 1 になります。

synMechs のリストがある場合は、すべてに対して 1 つの遅延を設定することも、遅延のリスト (synMech ごとに 1 つ、たとえば 2 つの synMech の場合: [5, 7]) を設定することもできます。

synsPerConn > 1 の場合、すべてに対して 1 つの重みを使用することも、重みのリスト (シナプスごとに 1 つ、たとえば synsPerConn = 3 の場合) を使用することもできます。 [4, 5, 6])。

synMechssynsPerConn > 1 の両方のリストがある場合、各 synMech の各シナプスの 2D リストを持つことができます (たとえば、2 つの synMech と synsPerConn = 3 の場合)。 [[4, 6, 5], [9, 10, 11]])。

  • しきい値 (非推奨、使用しないでください)

ソース セルのしきい値 (mV 単位) を設定するには、cellParams のセル ルールのセクション内で threshold パラメータを使用するか、デフォルト値を設定します (例: netParams.defaultThreshold = 10.0)。

  • 確率 (オプション) - 各シナプス前セルと後セル間の接続の確率 (0 ~ 1)

関数として定義できます (文字列としての関数を参照)。

connFuncprobConn に設定します (内部確率的接続関数)。

convergencedivergence、および fromList パラメータをオーバーライドします。

  • 収束 (オプション) - 各シナプス後セルに接続されているシナプス前セルの数

関数として定義できます (文字列としての関数を参照)。

connFuncconvConn に設定します (内部コンバージェンス接続機能)。

divergence および fromList パラメータをオーバーライドします。 probability パラメータが含まれている場合は効果がありません。

  • 発散 (オプション) - 各シナプス前セルに接続されているシナプス後セルの数

関数として定義できます (文字列としての関数を参照)。

connFuncdivConn に設定します (内部分岐接続機能)。

fromList パラメータをオーバーライドします。 probability または convergence パラメーターが含まれている場合、効果はありません。

  • connList (オプション) - 個々のシナプス前セルとシナプス後セル間の接続の明示的なリスト

各接続は、前集団と後集団のセルの相対 ID で示されます。 [[0,1],[3,1]] は、前セル 0 と後セル 1、前セル 3 と後セル 1 の間の接続を作成します。

重み、遅延、および位置は、個々のセル接続ごとにリストとして指定することもできます。これらのリストは、複数の synMech および synsPerConn > 1 と組み合わせると 2D または 3D になります (外側の次元は connList に対応します)。

connFuncfromList に設定します (明示的リスト接続機能)。

probabilityconvergence、または divergence パラメータが含まれている場合は効果がありません。

  • connFunc (オプション) - 使用する内部接続関数

probabilityconvergencedivergence、または connList パラメーターが含まれる場合、それぞれ probConnconvConndivConn、または fromList に自動的に設定されます。それ以外の場合は、デフォルトで fullConn、つまり全対全接続になります。

ユーザー定義の接続機能を追加できます。

  • shape (オプション) - 指定されたパターンに基づいて、シミュレーション中に接続の重みを動的に変更します。

次のフィールドを含む辞書が含まれています。

'switchOnOff' - 体重のオンとオフを切り替える時間

'pulseType' - 生成するパルスのタイプ。 「平方」または「ガウス」のいずれか

'pulsePeriod' - パルスの周期 (ミリ秒単位)

'pulseWidth' - パルスの幅 (ミリ秒単位)

振動や特定の時間にオン/オフする複雑な刺激パターンを生成するために使用できます。

例: 'shape': {'switchOnOff': [200, 800], 'pulseType': 'square', 'pulsePeriod': 100, 'pulseWidth': 50}

  • 可塑性 (オプション) - この接続に使用する可塑性メカニズム

2 つのフィールドが必要です。塑性メカニズムの名前を指定する mech と、メカニズムのパラメーターを含む辞書を含む params です。

例: {'mech': 'STDP', 'params': {'hebbwt': 0.01, 'antiwt':-0.01, 'wmax': 50, 'RLon': 1 'tauhebb': 10}}

接続ルールの例を次に示します。

## Cell connectivity rules
netParams.connParams['S->M'] = {    #  S -> M
        'preConds': {'pop': 'S'},
        'postConds': {'pop': 'M'},
        'sec': 'dend',                  # target postsyn section
        'synMech': 'AMPA',              # target synaptic mechanism
        'weight': 0.01,                 # synaptic weight
        'delay': 5,                     # transmission delay (ms)
        'probability': 0.5}             # probability of connection

netParams.connParams['bg->all'] = {      # background -> S,M in ynorm range
        'preConds': {'pop': 'background'},
        'postConds': {'cellType': ['S','M'],
                                  'ynorm': [0.1, 0.6]},
        'synReceptor': 'AMPA',               # target synaptic mechanism
        'weight': 0.01,                      # synaptic weight
        'delay': 5}                          # transmission delay (ms)

netParams.connParams['yrange->HH'] = {            # cells with y in range 100 to 600 -> HH cells
    'preConds': {'y': [100, 600]},
    'postConds': {'cellType': 'HH'},
    'synMech': ['AMPA', 'NMDA'],                  # target synaptic mechanisms
    'synsPerConn': 3,                             # number of synapses per cell connection (per synMech, ie. total syns = 2 x 3)
    'weight': 0.02,                               # single weight for all synapses
    'delay': [5, 10],                             # different delays for each of 3 synapses per synMech
    'loc': [[0.1, 0.5, 0.7], [0.3, 0.4, 0.5]]}    # different locations for each of the 6 synapses

接続ごとに複数のシナプスを使用する接続ルール

デフォルトでは、セル間接続ごとに作成されるシナプスは 1 つだけです。ただし、接続には複数の個別のシナプス接触が含まれる場合があり、たとえば、シナプス前細胞の軸索が分岐して、シナプス後細胞の樹状突起の異なる位置で複数のシナプス接触を形成することがあります。これは、synsPerConn を 1 より大きい値に設定するか、synMech をリストとして定義するか、あるいはその両方によって実現できます。

  • synsPerConn > 1 を synMech を単一の値として設定 synsPerConn が > 1 の場合、接続ごとにこの数のシナプスが作成されます。重みと遅延はリストとして指定することも、単一の値をすべてに使用することもできます (以下の例を参照)。

  • 単一セクションを指定すると、すべてのシナプスがそのセクション内に作成され、その位置を loc のリストとして指定できます (シナプスごとに 1 つ)。

    netParams.connParams[...] = {
            'synsPerConn': 2,
            'sec': 'soma',
            'synMech': 'AMPA',
            'weight': [0.1, 0.2], # individual weights for each synapse
            'delay': 0.1, # single delay for all synapses
            'loc': [0.5, 1.0] # individual locations for each synapse
    # ...
    
    # This will create 2 synapses: one with weight 0.1, delay 0.1, and loc 0.5
    # and another with weight 0.2, delay 0.1, and loc 1.0.
    

    A single value for loc is not accepted. If it is omitted, synapses are placed at equal distances along the section (e.g. with synsPerConn = 3, synapses will be placed at 0.1666, 0.5 and 0.8333).

  • セクションのリスト (明示的に、または secLists からのキーとして) が指定されている場合、接続ロジックは distributeSynsUniformly および connRandomSecFromList 属性に依存します。これらは、simConfig を通じてグローバルに設定することも、connParams エントリごとに個別に設定することもできます (例: netParams.connParams[...] = {..., 'distributeSynsUniformly': False})、個別の設定が優先されます。次のオプションが利用可能です。

    • distributeSynsUniformly = True (Default) Synapses will be distributed uniformly along the specified section(s), taking into account the length of each section. (E.g., if you specify 'sec': ['soma', 'dend'] with lengths of 10 and 20 respectively, and set synsPerConn = 5, the resulting distribution of synapses will be in the sections and locations illustrated in the figure below). Providing location explicitly is not possible in th is case.

      _images/multisyn_0.png

    • distributeSynsUniformly = False

      • If connRandomSecFromList is True (default), a random section will be picked from the sections list for each synapse. The loc value should also be a list, and the values will be picked from it randomly and independently from section choice. If the length of sections or locations list is greater or equal to synsPerConn, random choice is guaranteed to be without replacement. If loc is omitted, the value for each synapse is randomly sampled from uniform[0, 1].

      • If connRandomSecFromList is False, sections and locations are assigned deterministically: the N-th synapse receives the N-th section and N-th location from their respective lists (or if loc is a single value, it is used for all synapses). Ensure that lists of sections and locations both have the length equal to synsPerConn.

  • synMech をリストとして設定する synMech がリストの場合、リスト内のメカニズムごとにシナプスが作成されます。重み、遅延、および位置は、synMech と同じ長さのリストとして指定することも、単一の値をすべてに使用することもできます。

  netParams.connParams[...] = {
          'synMech': ['AMPA', 'GABA'],
          'weight': [0.1, 0.2], # individual weights for each synapse
          'delay': 0.1, # single delay for all synapses
  # ...

  # This will create 2 synapses: one with AMPA synMech and weight 0.1
  # and another with GABA synMech and weight 0.2. Both will have the same delay of 0.1.

ただし、セクションについては、synMech 要素に対するそのような 1 対 1 の対応は適用されません。代わりに、secs の内容が各 synMech に対して繰り返されます。

  netParams.connParams[...] = {
          'synMech': ['AMPA', 'GABA'],
          'sec': ['soma', 'dend']
  # ...
  # Both AMPA and GABA synapses will span 'soma' and 'dend' sections

異なるセクションが必要な場合は、シナプス メカニズムごとに個別の接続ルール (connParams エントリ) を定義する必要があります。

  • synMech をリストとして設定し、synsPerConn > 1 を設定します。 synMechssynsPerConn > 1 の N 要素リストの両方がある場合でも、重みと遅延をすべてのシナプスの単一の値、長さ N のリスト (各値は synMech リスト インデックスに対応)、または外側の次元 N が synMechs に対応し、内側の次元が に対応する 2D リストとして指定できます。 synsPerConn

_images/multisyn_1.png

  netParams.connParams[...] = {
          'synMech': ['AMPA', 'GABA'],
          'sec': 'dend',
          'synsPerConn': [2, 1],
          'loc': [[0.5, 0.75], [0.3]],
          'distributeSynsUniformly': False,
  # ...

例に示すように、synsPerConn 自体をリストにすることができるため、各 synMech が個別の数のシナプスに対応できることに注意してください。

  • ‘connList’ での使用 さらに、‘connList’ ベースの接続 (個々のシナプス前セルと後セルの間の接続の明示的なリスト) を使用する場合は、重み、遅延、位置、秒を最大 3 次元のリストとして記述することができます。最も外側の次元は、connList の長さ (つまり、セル間接続の数) に対応します。上で説明したのと同じロジックが、この外側のリストの各要素に適用されます。
  netParams.connParams[...] = {
          'connList': [[0,0], [1,0]],
          'synMech': ['AMPA', 'GABA'],
          'synsPerConn': 3,
          'weight': [[[1, 2, 3], [4, 5, 6]], # first conn: AMPA, GABA, 3 synsPerConn each
                          [[7, 8, 9], [10, 11, 12]]],  # second conn: AMPA, GABA (...)

          'delay': [[0.1, 0.2], # first conn: AMPA, GABA, same for all syns in synsPerConn
                          [0.3, 0.4]],  # second conn: AMPA, GABA (...)
  # ...

文字列としての機能

セル、シナプス、および接続ルールのパラメーターの一部は、関数を含む文字列を使用して提供できます。文字列は NetPyNE によって内部的に解釈され、適切な lambda 関数 に変換されます。この文字列には次の要素が含まれる場合があります。

  • 数値、例: 「3.56」

  • すべての Python 数学演算子: +-*/%** (指数) など。

  • Python 数学関数: sincostanexpsqrtmeaninf (詳細については、https://docs.python.org/2/library/math.html を参照)

  • NEURON h.Random() メソッド: binomialdiscuniferlanggeometrichypergeolognormalnegexpnormalpoissonuniformweibull (https://www.neuron.yale.edu/neuron/static/py_doc/programming/math/random.html を参照)

  • netParams ディクショナリで定義された単一値の数値ネットワーク パラメーター。既存のものをカスタマイズしたり、新たに任意のものを追加したりできます。デフォルトでは、次のパラメータが使用可能です。

  • sizeXsizeYsizeZ: ネットワーク サイズ (μm) (デフォルト: 100)

  • defaultWeight: デフォルトの接続重み (デフォルト: 1)

  • defaultDelay: デフォルトの接続遅延 (ミリ秒単位) (デフォルト: 1)

  • propVelocity: 伝導速度 (um/ms) (デフォルト: 500)

  • セルの位置、セル内のセグメントの位置、接続されたセル間の距離などのコンテキスト変数。このような変数の名前は事前に定義されており、関数が使用される場所に固有です (以下を参照)。

文字列としての関数は、次のモデル コンポーネントのエントリのパラメーターとして使用できます (いずれの場合も、上記の要素に加えて、関数に含めることができる特定の変数のセットがあります)。

  • 接続ルールの weightdelayprobabilityconvergence、および divergence。使用可能な変数は次のとおりです。
  • pre_xpre_ypre_z: シナプス前細胞の x、y、または z の位置。

  • pre_ynormpre_ynormpre_znorm: 正規化されたシナプス前細胞の x、y、または z の位置。

  • post_xpost_ypost_z: シナプス後細胞の x、y、または z の位置。

  • post_xnormpost_ynormpost_znorm: 正規化されたシナプス後セルの x、y、または z の位置。

  • dist_xdist_ydist_z: シナプス前細胞とシナプス後細胞の x、y、または z 位置間の絶対ユークリッド距離。

  • dist_xnormdist_ynormdist_znorm: 正規化されたシナプス前細胞とシナプス後細胞の x、y、または z 位置間の絶対ユークリッド距離。

  • dist_2Ddist_3D: シナプス前細胞とシナプス後細胞間の絶対ユークリッド 2D (x および z) または 3D (x、y および z) 距離。

  • dist_norm2Ddist_norm3D: 正規化されたシナプス前細胞とシナプス後細胞間の絶対ユークリッド 2D (x および z) または 3D (x、y および z) 距離。

  • cellParams ディクショナリ内の mechs および pointps、セクションの geom パラメータ (pt3d を除く) のプロパティ。使用可能な変数は次のとおりです。
  • xyz: セル x、y、または z の位置。

  • xnormynormznorm: 正規化されたセル x、y、または z の位置。

  • post_dist_euclidean: ソーマの中心から指定されたセグメントまでのユークリッド距離 (CompartCell のみに意味を持ちます)

  • post_dist_path: 相馬の中心から指定されたセグメントまでの距離。トポロジカル パスに沿った中間セクションの長さの合計として定義されます (CompartCell のみに意味を持ちます)

  • カスタム セル変数。cellParamsvars 辞書でユーザーが定義できます。

  • cellParams 辞書のセル変数 (セルの種類を参照)。上記と同じ意味を持つ変数 xyzxnormynormznorm を含めることができます。

注記

関数として定義されたセルパラメータの mechs または pointps の各プロパティは、セクションまたはセグメントごとに評価されます。一方、セル変数の値は特定のセル インスタンスに対して 1 回取得されるため、特定のセルのすべてのセグメントについて、この変数を参照するすべての関数に同じ値が代入されます。関数にランダム分布が含まれる場合、この区別は不可欠となる可能性があります。次の例を考えてみましょう。

PYRcell['secs']['dend1']['mechs']['pas'] = {'g': 'g_base + uniform(1.1e-5, 1.2e-5) * exp(-dist_path/g_decay_const)', 'e': -70}

PYRcell['vars'] = {'g_base': 'normal(3.57e-5, 1e-8)', 'g_decay_const': 'uniform(100, 110)'}

g の式はセグメントごとに評価されるため、式にランダム関数が明示的に含まれている場合、セグメントごとに新しいランダム値が生成されます (同様に、dist_path などのセグメント依存変数はセグメントごとの値を取得します)。一方、その中のセル変数の値 (ここでは、g_base と g_decay_const) はセルごとに 1 回計算され、このセルのすべてのセグメントにわたって保存されます。つまり、セル変数のすべてのランダム分布はセルごとに 1 回だけ再選択されます)。

  • シナプス機構の特性 (synMechParams 辞書のエントリ)。使用可能な変数は次のとおりです。
  • post_xpost_ypost_z: シナプス後セルの x、y、または z の位置。

  • post_xnormpost_ynormpost_znorm: 正規化されたシナプス後セルの x、y、または z の位置。

  • post_dist_euclidean: 体細胞の中心からシナプス後細胞のシナプス位置までのユークリッド距離

  • post_dist_path: 体細胞の中心からシナプス後細胞のシナプス位置までの距離。トポロジカル パスに沿った中間セクションの長さの合計として定義されます。

文字列ベースの関数は、NetPyNE 接続ルールに優れた柔軟性と機能を追加します。これらにより、ユーザーは、皮質深さに依存する接続確率や距離に依存する接続重みなど、さまざまな接続機能を定義できます。以下にいくつかの具体的な例を示します。

  • 収束 (シナプス後細胞をターゲットとするシナプス前細胞の数) は 1 ~ 15 の間で均一に分布します。

netParams.connParams[…] = { ‘収束’: ‘uniform(1, 15)’,

  • 接続遅延を最小値 0.2 に平均 13.0、分散 1.4 のガウス分布値を加えた値に設定します。

netParams.connParams[…] = { ‘遅延’: ‘0.2 + 通常(13.0, 1.4)’,

  • 上記と同じですが、netParams 辞書で定義された変数を使用します。

netParams[‘遅延最小’] = 0.2 netParams[‘遅延平均’] = 13.0 netParams[‘遅延変数’] = 1.4

netParams.connParams[…] = { ‘遅延’: ‘遅延最小値 + 通常(遅延平均, 遅延変数)’,

  • 接続遅延を defaultDelay の最小値に伝播速度に基づく 3D 距離依存の遅延を加えたものに設定 (propVelocity):

netParams.connParams[…] = { ‘遅延’: ‘defaultDelay + dist_3D/propVelocity’,

  • 接続の確率はシナプス後ニューロンの皮質深さに依存します:

netParams.connParams[…] = { ‘確率’: ‘0.1 + 0.2*post_y’,

  • netParams の属性として定義された長さ定数 (lengthConst) を使用して、2D 距離の関数として指数関数的に減衰する接続の確率:

netParams.lengthConst = 200

netParams.connParams[…] = { ‘確率’: ‘exp(-dist_2D/lengthConst)’,

細胞内接続ルール - シナプスの再分配

connParams 順序付き辞書を介して接続が定義されると、樹状ツリーに沿った特定のプロファイルに従ってシナプスを再分布することが必要になる場合があります。この目的のために、subConnParams 順序付き辞書は、この再配布を管理するルールとパラメータを設定します。このディクショナリ内の各項目は、キーと値で構成されます。キーは、この再配布ルールの参照として使用されるラベルです。値は、このプロセスのパラメータを設定する辞書であり、次のフィールドが含まれます。

  • preConds / postConds - シナプス前セルとシナプス後セルの条件セット

connParams 仕様と同様、これらのフィールドは、シナプス前側とシナプス後側で特定の条件を満たす、すでに確立されている接続を選択するための属性/タグを提供します。これらは、適切な属性/タグと必要な値を含む辞書として定義されます。 {‘cellType’: ‘PYR’}、{‘pop’: [‘Exc1’, ‘Exc2’]}、{‘ynorm’: [0.1, 0.6]}。

  • groupSynMechs (オプション) – シナプスを再分配するときにグループ化されたシナプス メカニズムのリスト

省略した場合、すべての接続のシナプス後の位置 (preConds と postConds を満たす) は、指定されたプロファイル (以下で定義) を使用して独立して再分配されます。リストが提供される場合、共通接続のシナプス (各メカニズムの同じシナプス前およびシナプス後ニューロン) が同じ場所に再配置されます。たとえば、[‘AMPA’,’NMDA’]。

  • sec (オプション) – 再分散シナプスを許可するセクションのリスト

省略した場合、シナプスの再分配に使用されるセクションは体細胞、または存在しない場合はシナプス後細胞の最初に利用可能なセクションです。たとえば、[‘Adend1’,’Adend2’, ‘Adend3’,’Bdend’] のようになります。

  • 密度 - 再配布のタイプ。事前定義されたルールが多数あります。
  • uniform - 条件を満たす各接続は、長さに応じて重み付けされ、指定されたセクションに沿って均一に再配分されます。

  • さまざまなオプションを持つ辞書:

  • type - シナプス再分布のタイプ。利用可能なオプション: 1Dmap、2Dmap、または距離。

[1Dmap, 2Dmap] に type がある場合は、さらに以下を含める必要があります:

  • gridY – y 座標 (深さ) の位置のリスト

  • gridX (2Dmap のみ) - x 座標 (または z) の位置のリスト。

  • fixedSomaY (オプション) - ソーマの絶対位置 y 座標。gridY をシフトするために使用されます (絶対座標でも提供されます)。

  • gridValues – (gridX および) GridY によって定義された座標の (相対) シナプス密度を表す 1 次元または 2 次元のリスト。

たとえば、

netParams.subConnParams[…] = {‘type’:’1Dmap’,’gridY’: [0,-200,-400,-600,-800], ‘fixedSomaY’:-700,’gridValues’:[0,0.2,0.7,1.0,0]}。

一方、この選択のためには、シナプス後細胞が 3D 形態を持つ必要があります。単純なセクションの場合、netParams.defineCellShapes = True を設定することで、これを自動的に生成できます (Y 軸に沿った円柱が上向き)。

typedistance に設定されている場合、シナプスは参照から指定された距離 (許可されたセクション内) に再配置されます。この場合、さらに次のものが含まれる場合があります。

  • ref_sec (オプション) – 文字列

距離を計算する基準となるセクション。省略した場合、距離の参照に使用されるセクションはソーマ、またはソーマが存在しない場合は「som」で始まるもの、それ以外の場合はシナプス後セルで最初に使用可能なセクションになります。

  • ref_seg (オプション) - 数値

距離の参照に使用されるセクション内のセグメント。省略した場合はデフォルト値(0.5)が使用されます。

  • target_distance (オプション) - シナプスが再割り当てされるリファレンスからのターゲット距離

省略した場合、この値は 0 に設定されます。選択された場所は、許可されたセクションの間で、このターゲットに最も近い場所になります。

  • coord (オプション) - 距離の計算に使用される座標系。省略した場合、距離は樹枝状ツリーに沿って計算されます。あるいは、ユークリッド空間内の距離 (デカルト座標系における基準からターゲット セグメントまでの距離) を計算するために「デカルト」を使用することもできます。この場合、シナプス後細胞は 3D 形態を持つ必要があります (または netParams.defineCellShapes = True を設定)。

たとえば、

netParams.subConnParams[…] = {‘type’:’ distance’,’ref_sec’: ‘soma’, ‘ref_seg’: 1,’target_ distance’: 500}。

</div>

刺激パラメータ

2 つのデータ構造を使用して細胞刺激パラメータを指定します。stimSourceParams は刺激源のパラメータを定義します。 stimTargetParams は、どの細胞にどの刺激源を適用するかを指定します (刺激源のセルへのマッピング)。

stimSourceParams 順序付き辞書の各項目はキーと値で構成されます。ここで、キーはこの刺激源を参照するための任意のラベル (例: 「electrode_current」)、値はソース パラメータの辞書です。

  • タイプ - 刺激装置として使用されるポイントプロセス。許可される値: 'IClamp''VClamp''SEClamp''NetStim'、および 'AlphaSynapse'

NetStims は、この方法を使用するか、「cellModel」: 「NetStim」の母集団を作成して適切な接続を追加することによって追加できることに注意してください。

  • stim params (オプション) - これらはスティミュレーターのタイプによって異なります (たとえば、'IClamp' の場合は、'del''dur'、および 'amp' になります)

関数として定義できます (文字列としての関数 を参照)。刺激の場合は、シナプス後細胞のパラメーターを使用することのみが意味があることに注意してください (例: 'post_ynorm')。

stimTargetParams の各項目は、ネットワーク内のセルのサブセットに刺激源をマッピングする方法を指定します。キーはこのマッピングの任意のラベルであり、値は次のパラメータを含む辞書です。

  • ソース - 刺激ソースのラベル (例: 'electrode_current')。

  • 条件 - スティムが適用されるセルの条件を含む辞書。 選択したセルのサブセット内の相対セル インデックスを含むフィールド 'cellList' を含めることができます (例: 'conds': {'cellType':'PYR', 'y':[100, 200], 'cellList': [1, 2, 3]})

  • sec (オプション) - ターゲットセクション (デフォルト: 'soma')

  • loc (オプション) - ターゲットの場所 (デフォルト: 0.5) 関数として定義可能 (文字列としての関数を参照)

  • synMech (オプション; NetStims のみ) - NetStim を接続するシナプス メカニズムのラベル

  • 重み (オプション; NetStims のみ) - NetStim とセル間の接続の重み 関数として定義可能 (文字列としての関数を参照)

  • 遅延 (オプション; NetStims のみ) - NetStim とセル間の接続の遅延 (デフォルト: 1) 関数として定義可能 (文字列としての関数を参照)

  • synsPerConn (オプション; NetStims のみ) - NetStim とセル間の接続のシナプスの数 (デフォルト: 1) 関数として定義可能 (文字列としての関数を参照)

以下のコードは、さまざまなタイプの刺激を作成し、それらをセルのさまざまなサブセットにマッピングする方法の例を示しています。

# Stimulation parameters

## Stimulation sources parameters
netParams.stimSourceParams['Input_1'] =  {'type': 'IClamp', 'del': 10, 'dur': 800, 'amp': 'uniform(0.05, 0.5)'}

netParams.stimSourceParams['Input_2'] = {'type': 'VClamp', 'dur': [0, 1, 1], 'amp':[1, 1, 1],'gain': 1, 'rstim': 0, 'tau1': 1, 'tau2': 1, 'i': 1}

netParams.stimSourceParams(['Input_3'] = {'type': 'AlphaSynapse', 'onset': 'uniform(1, 500)', 'tau': 5, 'gmax': 'post_ynorm', 'e': 0}

netParams.stimSourceParams['Input_4'] = {'type': 'NetStim', 'interval': 'uniform(20, 100)', 'number': 1000, 'start': 5, 'noise': 0.1}

## Stimulation mapping parameters
netParams.stimTargetParams['Input1->PYR'] = {
        'source': 'Input_1',
        'sec': 'soma',
        'loc': 0.5,
        'conds': {'pop':'PYR', 'cellList': range(8)}}

netParams.stimTargetParams['Input3->Basket'] = {
        'source': 'Input_3',
        'sec': 'soma',
        'loc': 0.5,
        'conds': {'cellType': 'Basket'}}

netParams.stimTargetParams['Input4->PYR3'] = {
        'source': 'Input_4',
        'sec': 'soma',
        'loc': 0.5,
        'weight': '0.1 + normal(0.2, 0.05)',
        'delay': 1,
        'conds': {'pop': 'PYR3', 'cellList': [0, 1, 2, 5, 10, 14, 15]}}

細胞外刺激 - これは分散された刺激メカニズムであり、CompartCell のすべてのセクション/セグメントが関係します。この種類の刺激を指定するには、stimSourceParams'type': 'XStim' を設定し、いくつかのパラメーターを指定する必要があります。

  • field: 刺激の特性を指定する辞書。それは以下によって構成されています:
  • class: 刺激の種類。利用可能なオプション: pointSource および uniform、それぞれ電流または均一な電界を注入する単一点電極用。

'class': 'pointSource' については、location (電極先端の位置) および sigma (脳組織の伝導率 (mS/mm)) を指定する必要があります。

'class': 'uniform' の場合、referencePoint (オプション - フィールドが 0 である点) および fieldDirection (2 つの角度のリストとしてのフィールドの方向: 極角 (0 と 180 の間) と方位角) を指定する必要があります。 -0 ~ 360-)。

  • waveform: 時間変調を指定する辞書。それは以下によって構成されています:
  • type: 外部刺激の時間的形状。利用可能なオプション: sinusoidalpulseexternal。指定しない場合、外部刺激は 0 (接地) に設定されます。

  • amp (オプション): 外部刺激の振幅 (点源刺激の場合は mA、均一な電場の場合は V/m)。sinusoidal または pulse に有効です。指定しない場合は0(刺激なし)となります。

  • del (オプション): 刺激の開始時間。sinusoidal または pulse に有効です。指定しない場合はシミュレーションの開始時刻となります。

  • dur (オプション): 刺激の持続時間 (開始時間に続く)。sinusoidal または pulse に有効です。指定しない場合はシミュレーション終了時刻となります。

  • freq (オプション): sinusoidal 刺激の頻度。指定しない場合は0(刺激なし)となります。

  • time (オプション): 刺激が外部にアップロードされる場合 (type: external)、このエントリは時間のリストを含む pickle ファイル、または同じ情報を含む numpy 配列のいずれかを指定します。連続する時点間の(固定)時間間隔は、積分タイムステップと一致している必要があります。

  • signal (オプション): 刺激が外部にアップロードされる場合 (type: external)、このエントリは、time リストとペアになった外部信号の振幅 (点源刺激の場合は mA - 均一電場の場合は V/m) に対応する値のリストを含む pickle ファイル、または同じ情報を持つ numpy 配列。

  • mod_based: ブール値 (デフォルト: False)。 NEURON フォーラムのガイドラインに従って、シミュレーションが外部 MOD ファイル (「ex」と呼ばれる POINTER/RANGE と「is」と呼ばれる GLOBAL を持つ xtra.mod) に基づいているかどうかを指定します。これは大規模なネットワークに適していますが、単一の時間変調に制限されます。 mod_based:False を指定すると、多くのソースの重ね合わせを設定できます。 NetPyNE 互換の xtra.mod は、support モジュールからダウンロードできます。

さらに、stimSourceParams では、ターゲット細胞を満たす必要がある条件を source (細胞外刺激を指定する刺激源のラベル) と conds に設定する必要があります。 'conds': {'cellList': 'all'} は、細胞外 (ユビキタス) ソースによって表される全体的な刺激を提供します。

以下のコードは、外部刺激の重ね合わせ (許可されている) の詳細な例を示しています。

# Stimulation parameters

## Stimulation sources parameters
netParams.stimSourceParams['XStim1'] =  {
        'type': 'XStim',
        'field': {'class': 'pointSource', 'location': [100,-100,0], 'sigma': 0.276},
        'waveform': {'type': 'sinusoidal', 'amp' : 0.020, 'del' : 20, 'dur' : 80, 'freq': 250}
        }

netParams.stimSourceParams['XStim2'] =  {
        'type': 'XStim',
        'field': {'class': 'uniform', 'referencePoint': [0,-netParams.sizeY,0], 'fieldDirection': [180,0]},
        'waveform': {'type': 'pulse', 'amp' : 10.0, 'del' : 50, 'dur' : 20}
        }

## Stimulation target parameters
netParams.stimTargetParams['XStim1->all'] = {
        'source': 'XStim1',
        'conds': {'cellList': 'all'}}

netParams.stimTargetParams['XStim2->all'] = {
        'source': 'XStim2',
        'conds': {'cellList': 'all'}}

反応拡散 (RxD) パラメーター

rxdParams 順序付き辞書を使用して、さまざまな RxD コンポーネントを定義できます。

  • 領域 - RxD 領域の辞書 (「細胞外」領域の定義にも使用できます)

このコンポーネントは必須であり、反応が起こる場所を定義するために必要です。 rxdParams['regions'] の各項目は、キーが領域の名前 (さらなる定義で使用される) を指定し、値が次のフィールドを含む辞書である。

  • cells: 種、反応などを指定する必要がある細胞内ドメインの定義に関連する細胞のリスト。このリストには、セル gid (例: [1] または [0, 3])、集団ラベル (例: ['S'] または ['all'])、または混合 (例: [['S',[0,2]]] または[('S',[0,2])])。

  • secs: 上記のセルに含めるセクションのリスト (有効にするためには、セルの「秒」内にある必要があります)。たとえば、[‘soma’,’Bdend’] などです。

cellssecs は両方とも、(細胞内) RxD が関連コンポーネントである NEURON セクションを指定するために使用されます。

  • nrn_region: 領域が細胞の細胞内/細胞質ドメイン (膜貫通電圧の計算対象) に対応するかどうかを定義するオプション。利用可能なオプションは次のとおりです: 「i」 (細胞膜のすぐ内側)、「o」 (血漿のすぐ外側)、または None (上記のどれでもない、たとえば細胞内小器官)。

  • geometry: このエントリは、領域に関連付けられたジオメトリを定義します。 NEURON のさまざまなオプションに応じて、文字列 (「inside」または「membrane」) または 2 つのエントリを持つ辞書のいずれかになります。ジオメトリの種類を示す「class」 (「DistributedBoundary」、「Fractional Volume」、「FixedCrossSection」、「FixedPerimeter」、「ScalableBorder」、「Shell」) と、構造化された定義に必要な特定の引数を含む「args」です。辞書で。たとえば、

netParams.rxdParams[‘regions’] = {‘membrane_in’:{‘cells’: ‘all’, ‘secs’: ‘all’, ‘geometry’: {‘class’: ‘ScalableBorder’, ‘args’: {‘scale’: 1, ‘on_cell_surface’: False}}}}。

  • dimension: これは整数 (1 または 3) で、シミュレーションが 1D か 3D かを示します。

  • dx: 離散化を指定する float (または int)。

  • extracellular: 領域が細胞外空間を表すかどうかを示すブール オプション (指定されていない場合は False)。 True の場合、以前のすべての extries を指定する必要はありません。代わりに、rxdParams['extracellular'] (次を参照) に対応するエントリを考慮する必要がありますが、これは辞書階層の同じレベルにあります。たとえば、rxdParams['regions']={'ext':{'extracellular':True, 'xlo': -100, ...}} のようになります。

例、

netParams.rxdParams[‘regions’] = {‘cyt’:{‘cells’: [‘all’], ‘secs’: [‘soma’,’Bdend’], ‘nrn_region’: ‘i’}}

  • 細胞外 - RxD 細胞外領域を指定するために必要なパラメータを含む辞書。
  • xloylozlo: 細胞外ドメインを指定するボックスの左下奥の隅を示す値。

  • xhiyhizhi: 細胞外ドメインを指定するボックスの右上隅を示す値。

  • dx: 離散化を指定する値 (int、float)。この場合、細胞外領域は、正方形のボクセル以外が必要な場合、3D タプルになる可能性があります。

前のエントリは必須です。次の値はオプションです (デフォルト値が考慮されます。NEURON を参照)。

  • volume_fraction: 拡散に利用可能なスペースを示す値。

  • tortuosity: 拡散する直進経路がどの程度制限されているかを示す値。

たとえば、

netParams.rxdParams[‘extracular’] = {‘xlo’:-100, ‘ylo’:-100, ‘zlo’:-100, ‘xhi’:100, ‘yhi’:100, ‘zhi’:100, ‘dx’:(0.2,0.2,0.4), ‘volume_fraction’:0.2, 「ねじれ度」: 1.6}。

  • - このコンポーネントも必須であり、関連する種とそれらが関与するドメインを指定するためのすべての定義を含む辞書に対応します。キーは種の名前/ラベルで、値は次のエントリを含む辞書です。
  • regions: 種が存在する地域のリスト (rxdParams['regions'] にリストされている)。単一の地域の場合は、リストせずに指定することもできます。たとえば、'cyt' または ['cyt','er'] です。

  • d: 種の拡散係数。

  • charge: 種の署名済み請求 (存在する場合)。

  • initial: 濃度フィールドの初期状態 (mM 単位)。これは、その定義ドメイン全体に対する単一の値、または文字列ベースの関数であり、変数は (RxD のフレームワーク内の) ノード プロパティです。たとえば、 '1 if (0.4 < node.x < 0.6) else 0'

  • ecs_boundary_conditions: 細胞外領域が定義されている場合は、境界条件を指定する必要があります。オプションは、ゼロ磁束条件 (ノイマン型) または境界での濃度を示す値 (ディリクレ) の None (デフォルト) です。

  • atolscale: この特定の種の濃度の可変ステップ積分における絶対許容誤差のスケール係数を示す数値 (デフォルト = 1)。

  • name: この種にラベルを付ける文字列。この名前は NEURON 範囲変数と同じである必要があるため、RxD が hoc モデルと種を共有する場合に重要です。

例、

netParams.rxdParams[‘species’] = {‘ca’:{‘regions’: ‘cyt’, ‘d’: 0.25, ‘charge’: 2, ‘name’: ‘ca’, ‘initial’: ‘1 if node.sec in [‘Bdend’] else 0’}}

  • states - シミュレーション中に反応以外を通じて変化する状態変数を宣言する辞書。キーはこの変数に割り当てられた名前で、値は次のエントリを含む辞書です。
  • regions: 状態変数が関連する (つまり、そこで展開される) 領域のリスト。単一の地域の場合は、リストせずに指定することもできます。

  • initial: この変数の初期状態。ドメイン全体 (この変数が指定されている場所) で有効な単一値、または独立変数としてノード プロパティを持つ文字列ベースの関数のいずれか。

  • name: この変数を内部的にラベル付けする文字列。

例、

netParams.rxdParams[‘states’] = {‘mgate’:{‘regions’: ‘cyt’, ‘initial’: 0.05, ‘name’: ‘mgate’}}

  • 反応 - 分析中の反応、誰がどこでしたかを指定する辞書。キーは反応にラベルを付け、値は次のエントリを含む辞書です。
  • reactant: 化学反応の左側を、種と適切な化学量論とともに宣言する文字列。たとえば、ca + 2 * cl のようにします。ここで、「ca」と「cl」は「種」エントリーであり、反応が起こる地域で利用可能です (次を参照)。

  • product: 化学反応の右側についても同様です。たとえば、cacl2 の場合、「cacl2」は適切に定義された種です。

  • rate_f: 上で定義したスキームの順反応の速度。これは、数値または文字列ベースの関数のいずれかになります (種などに応じて、たとえば、ヒル方程式を実装するため)。

  • rate_b: 上記と同じ、逆方向の反応の場合。このエントリはオプションです。

  • regions: このエントリは、領域のリスト内でのみ反応が進行するように制限するために使用されます。単一の地域の場合は、リストせずに指定することもできます。指定しない場合、反応はすべての (妥当な) 領域で進行します。

  • custom_dynamics: このブール値エントリは、素反応に対する質量作用の法則が適用されるかどうかを指定します。 「True」の場合、各種の濃度のダイナミクスは質量作用スキームを満たします。

例、

netParams.rxdParams[‘reactions’] = {‘リン酸化’:{‘反応剤’: ‘E’, ‘product’: ‘EP’, ‘rate_f’: ‘kmax1 * E/ (k1 + E)’, ‘rate_b’: ‘kmax2 * EP/ (k2 + EP)’,’custom_dynamics’: True}}

  • multicompartmentReactions - 異なる領域に属する種との反応を指定する辞書。前のケースと同様に、キーは反応にラベルを付け、値は以前とまったく同じエントリとさらに 2 つの (オプションの) エントリを含む辞書になります。
  • membrane: ある領域から別の領域へのイオンの通過に関与する領域 (膜または境界と互換性のある幾何学的形状を持つ)。

  • membrane_flux: このブール値のエントリは、反応によって膜電位に影響を与える細胞膜を横切る電流が生成されるかどうかを示します。

。 注: 「反応物」または「生成物」のエントリに表示される種は、反応スキーム内でそれらが取得された領域とともに指定する必要があることを考慮してください。たとえば、'ca[cyt]' などです。

  • rates - 選択した種または状態のダイナミクスを制御するレートを指定する辞書。キーは動的スキームにラベルを付け、値は次のエントリを含む辞書です。
  • species: どの種または状態が考慮されているかを示す文字列。

  • rate: 種/状態の時間的進化を支配する力学方程式における速度の値。

  • regions: このエントリは、ダイナミクスが領域のリスト内でのみ進行するように制約するために使用されます。単一の地域の場合は、リストせずに指定することもできます。

  • membrane_flux: 前と同様、電流を考慮するかどうかを指定するブール値エントリ。 「True」の場合、「region」エントリは膜状のジオメトリを持つ固有の領域に対応する必要があります。

例、

netParams.rxdParams[‘rates’] = {‘h_evol’:{‘species’: h_gate, ‘rate’: ‘(1. / (1 + 1000. * ca[cyt] / (0.3)) - h_gate) / tau’}}

  • 定数 - 文字列ベースの関数などでユーザーが使用する定数を指定する辞書。

各ディクショナリのパラメータは、RxD パッケージで説明されているものと同じ構造に従います: https://www.neuron.yale.edu/neuron/static/docs/rxd/index.html

使用例を参照してください: RxD バッファリングの例 および RxD ネットワークの例

シミュレーション構成

以下は、カテゴリ別に整理されたすべてのシミュレーション構成オプション (つまり、SimConfig オブジェクトの属性) のリストです。

シミュレーションと NetPyNE フレームワークに関連するもの:

  • duration - シミュレーションの継続時間 (ミリ秒単位) (デフォルト: 1000)

  • dt - 使用する内部積分タイムステップ (デフォルト: 0.025)

  • hParams - h モジュールのパラメータを含む辞書 (デフォルト: {'celsius': 6.3, 'v_init': -65.0, 'clamp_resist': 0.001})

  • cache_efficient - CVodeのcache_efficientオプションを使用して、多数のコアで実行する場合の負荷を最適化します(デフォルト: False)

  • cvode_active - CVode 変数タイム ステップを使用します (デフォルト: False)

  • シード - 接続性、入力刺激、およびセルの位置のランダムなシードを含む辞書 (デフォルト: {'conn': 1, 'stim': 1, 'loc': 1})

  • createNEURONObj - NetPyNE ネットワーク メタデータをインスタンス化するときに、NEURON で実行可能なネットワークを作成します (デフォルト: True)

  • createPyStruct - ネットワークをインスタンス化するときに Python 構造体を作成します (シミュレーターに依存しません) (デフォルト: True)

  • includeParamsLabel - そのセル、conn、または stim を作成した param ルールのラベルを含めます (デフォルト: True)

  • addSynMechs - シナプス機構を追加するかどうか (デフォルト: True)

  • gatherOnlySimData - ネットおよびセル データの収集を省略し、gatherData 時間を短縮します (デフォルト: False)

  • compactConnFormat - dict 形式を conns のコンパクトなリスト形式に置き換えます (含めるキーのリストを提供する必要があります) (デフォルト: False)

  • connRandomSecFromList - synsPerConn=1 (デフォルト: True) の場合でも、リストからランダムなセクション (および場所) を選択します。個々の connParams エントリに対してオーバーライドできます。詳細については、「マルチシナプス接続」を参照してください。

  • distributeSynsUniformly - セクション リスト全体でシナプスを均一に配置します。 false の場合、セクション リストのセクションごとに 1 つの syn を配置します (デフォルト: True)。個々の connParams エントリに対してオーバーライドできます。詳細については、「マルチシナプス接続」を参照してください。

  • pt3dRelativeToCellLocation - True # セルの X、Y、Z 位置を基準にしてセルの 3D 点を作成します (デフォルト: True)

  • invertedYCoord - 視覚化したときに深さを表すように y 軸座標を負にします (上部が 0) (デフォルト: True)

  • allowSelfConns - セルからセル自体への接続を許可します (デフォルト: False)

  • oneSynPerNetcon - NetCon ごとに 1 つの個別のシナプス オブジェクトを作成します (False の場合、同じシナプスを共有できます) (デフォルト: True)

  • saveCellSecs - 各セルのすべてのセクション情報を保存します。時間と空間を削減します (デフォルト: False)

  • saveCellConns - 各セルのすべての conns 情報を保存します。時間と空間を削減します (デフォルト: False)

  • timing - 各プロセスのタイミングを表示および記録します (デフォルト: True)

  • saveTiming - タイミング データを pickle ファイルに保存します (デフォルト: False)

  • printRunTime - ここで指定した間隔 (秒) での印刷実行時間 (例: 0.1) (デフォルト: False)

  • printPopAvgRates - 実行後の母集団の平均発火率を出力します (デフォルト: False)

  • printSynsAfterRule - 各 conn ルールが適用された後の合計接続数を出力します。

  • verbose - 詳細メッセージを表示します (デフォルト: False)

録音に関連するもの:

  • recordCells - トレースを記録するセルのリスト。セル gid (例: 5 または [2, 3])、集団ラベル (例: 「S」集団の 1 つのセルから記録する場合は 'S')、またはすべてのセルから記録する場合は 'all' を含めることができます。注: simConfig.analysis['plotTraces']include 引数で選択されたすべてのセルは、自動的に recordCells に組み込まれます。 (デフォルト: [])

  • recordTraces - 記録するトレースの辞書 (デフォルト: {} ; 例: {‘V_soma’:{‘sec’:’soma’,’loc’:0.5,’var’:’v’}})

  • recordSpikesGids - スパイク時間を記録するセルのリスト (すべてから記録するには -1)。セル gid (例: 5)、集団ラベル (例: 「S」集団の 1 つのセルから記録する場合は「S」)、またはすべてのセルから記録する場合は「all」を含めることができます。 (デフォルト: -1)

  • recordStim - セルスティムのスパイクを記録します (デフォルト: False)

  • recordLFP - 局所電界電位 (LFP) 電極の 3D 位置。 [[50, 100, 50], [50, 200, 50]] (y 座標は深さを表すため、プロットすると負の値として表されることに注意してください)。各電極の LFP 信号は、「線源近似」を使用し、導電率シグマ = 0.3 mS/mm のオーム媒質を想定して計算された、各神経セグメントによって寄与される細胞外電位を合計することによって得られます。 sim.allSimData['LFP'] に格納されます。 (デフォルト: False)。

  • saveLFPCells - 各セルによって個別に生成された LFP を sim.allSimData['LFPCells'] に保存します。保存するセルのサブセットを選択できます。例: [3, ‘PYR’, (‘PV2’, 5)] (デフォルト: False)。

  • saveLFPPops - 各集団によって生成された LFP を sim.allSimData['LFPPops'] に保存します。保存する母集団のサブセットを選択できます。 [‘PYR’, ‘PV2’] (デフォルト: False)。

  • saveIMembrane - 各セルの各セグメントからの LFP に寄与する膜貫通電流を保存します。 sim.allSimData['iMembrane'] に格納されます。保存するセルのサブセットを選択できます。 [3, ‘PYR’, (‘PV2’, 5)] (デフォルト: False)。

  • recordStep - データ記録のステップ サイズ (ミリ秒) (デフォルト: 0.1)

ファイル保存に関連するもの:

  • saveDataInclude - ファイルに保存するデータ構造 (デフォルト: [‘netParams’, ‘netCells’, ‘netPops’, ‘simConfig’, ‘simData’])

  • simLabel - シミュレーションの名前 (何も指定されていない場合はファイル名として使用されます) (デフォルト: ‘’)

  • saveFolder - 出力データを保存するパス (デフォルト: ‘’)

  • filename - モデル出力を保存するファイルの名前 (デフォルト: ‘model_output’)

  • timestampFilename - 上書きを避けるためにファイル名にタイムスタンプを追加します (デフォルト: False)

  • savePickle - データを pickle ファイルに保存します (デフォルト: False)

  • saveJson - dat を json ファイルに保存します (デフォルト: False)

  • saveMat - データをマット ファイルに保存します (デフォルト: False)

  • saveTxt - データを txt ファイルに保存します (デフォルト: False)

  • saveDpk - データを .dpk ピクルス ファイルに保存します (デフォルト: False)

  • saveHDF5 - HDF5 ファイルに保存するデータを保存します (デフォルト: False)

  • backupCfgFile - cfg ファイルをフォルダーにコピーします。 [‘cfg.py’, ‘backupcfg/’] (デフォルト: [])

プロットと分析に関連するもの:

  • 分析 - 各項目が analysis モジュールからの関数の呼び出しを表すディクショナリ。関数のリストは、``sim.analysis.plotData()`` 関数を呼び出した後に実行されます。この関数は、いくつかのラッパー (sim.createSimulateAnalyze() など) の最後にすでに含まれています。

辞書キーは関数名を表し、値は True または関数 kwargs を含む辞書に設定できます。つまり、simConfig.analysis[funcName] = kwargs

例: simConfig.analysis['plotRaster'] = True は、sim.analysis.plotRaster() を呼び出すことと同じです。

例: simConfig.analysis['plotRaster'] = {'include': ['PYR'], 'timeRange': [200,600], 'saveFig': 'PYR_raster.png'} sim.analysis.plotRaster(include=['PYR'], timeRange=[200,600], saveFig='PYR_raster.png') を呼び出すことと同じです

simConfig オブジェクトにはメソッド addAnalysis(func, params) も含まれており、これにはパラメータの構文をチェックする利点があります (例: simConfig.addAnalysis('plotRaster', {'include': ['PYR'], 'timeRage': [200,600]}))

利用可能な分析関数には、plotRasterplotSpikeHistplotTracesplotConn、および plot2Dnet が含まれます。各関数とその引数の詳細な説明は、分析関連関数 で参照できます。

録画構成

任意のまたはすべてのセルからさまざまなトレースを記録できます。セルからのトレースを記録するには、simConfig で 2 つのパラメーター、recordCells および recordTraces を設定する必要があります。

simConfig.recordCells

recordCells リストは、どのセルからトレースを記録するかを指定します。 recordCells には、セル gid および/または集団ラベルを任意の組み合わせで含めることができます。また、['all'] に設定してすべてのセルから記録することもできます。このリストで指定されたセルのみに、そこから記録されるトレースが含まれます。 (便宜上、simConfig.analysis['plotTraces']include パラメータで指定されたセルはすべて recordCells に自動的に追加されることに注意してください。)

# record from all cells
simConfig.recordCells = ['all']

# record from cell 0 and cell 20
simConfig.recordCells = [0, 20]

# record from all cells in the population 'S'
simConfig.recordCells = ['S']

# record from all cells in the population 'M' and cells 0 and 20
simConfig.recordCells = ['M', 0, 20]

# record from the first cell in populations 'M' and 'S'
simConfig.recordCells = [('M', [0]), ('S', [0])]

記録するセルを指定したら、何を記録するかを指定する必要があります。

simConfig.recordTraces

recordTraces 辞書は、どのトレースを記録するかを指定します (また、「条件」を使用する場合は、recordCells 内のどのセルのサブセットからトレースを記録するかも指定します)。 recordTraces の各エントリは辞書でもあり、そのキーはトレースの名前 (選択できる任意の文字列) であり、その値は目的のトレースの仕様を含む辞書です。

recordTraces の各エントリでは、キーがトレースの名前になり、値は記録するトレースの詳細を指定し、オプションでトレースを記録するセルの条件を設定する別の辞書になります。

フォーマットの概要

  • セクション変数 (例: soma(0.5).v):
{"sec": [string], "loc": [float], "var": [string]}
  • 分散メカニズム変数 (例: soma(0.5).hh.gna):
{"sec": [string], "loc": [float], "mech": [string], "var": [string]}
  • シナプスメカニズム変数 (例: dend(1.0).AMPA._ref_g):
{"sec": [string], "loc": [float], "synMech": [string], "var": [string]}
  • 刺激変数 (例: cells[0].stims[0]['hObj'].i):
{"sec": [string], "loc": [float], "stim": [string], "var": [string]}
  • ポイントプロセス変数 (例: soma.myPP.i):
{"sec": [string], "pointp": [string], "var": [string]}

一般に、セクション (「sec」)、そのセクション内の場所 (「loc」)、およびその場所に記録する NEURON 変数 (「var」) を指定する必要があります。たとえば、次のコードは体細胞の中心の電圧 (NEURON の「v」) を記録します。

# record voltage at the center of the 'soma' section
simConfig.recordTraces['soma_voltage'] = { "sec": "soma", "loc": 0.5, "var": "v"}

# record the sodium concentration at the distal end of the 'dend' section
simConfig.recordTraces['dend_Na'] =  { "sec": "dend", "loc": 1.0, "var": "nai"}

# record the potassium current at the proximal end of the first 'branch' section (branch[0])
simConfig.recordTraces['branch0_iK'] = {"sec": "branch_0", "loc": 0.0, "var": "ik"}

上記の例では、recordCells 内のすべてのセルからトレースを記録しようとします。記録されるセルのサブセットのみからトレースを記録する場合は、トレース ディクショナリに 'conds' ディクショナリを含めることによって条件を設定できます。使用可能な条件には、'gid' (セルのグローバル識別番号)、'pop' (集団の名前または名前のリスト)、'cellType' (セルのタイプの文字列名)、および 'cellList' (セル gid のリスト) が含まれます。

条件の例

# only record this trace from cell 0
simConfig.recordTraces['trace_name'] = {'conds': {'gid': [0]}, ... }

# only record this trace from populations 'M' and 'S'
simConfig.recordTraces['trace_name'] = {'conds': {'pop': ['M', 'S']}, ... }

# only record this trace from cells tagged with cellType as 'pyr'
simConfig.recordTraces['trace_name'] = {'conds': {'cellType': ['pyr']}, ... }

特定のセクションと場所から、電圧、電流、濃度などのセクション変数を記録できます。 NEURON メカニズム (「mech」)、シナプス メカニズム (「synMech」)、および刺激 (「stim」) からの変数を記録することもできます。

メカニズムからの記録の例

# record the 'gna' variable (sodium conductance) in the 'hh' (Hodgkin-Huxley) mechanism
# located in the middle of the 'soma' section.  This is equivalent to recording
# soma(0.5).hh._ref_gna in NEURON.
simConfig.recordTraces['gNa'] = {'sec': 'soma', 'loc': 0.5, 'mech': 'hh', 'var': 'gna'}

# record the 'g' variable (conductance) in the 'AMPA' synaptic mechanism located at the
# distal end of the 'dend' section.  This is equivalent to recording
# dend(1.0).AMPA._ref_g in NEURON.
simConfig.recordTraces['gAMPA'] = {'sec': 'dend', 'loc': 1.0, 'synMech': 'AMPA', 'var': 'g'}

# record the 'i' variable (current) from the 'IClamp0' stimulation source located in the
# middle of the 'soma' section in cell 0.  This is equivalent to recording
# cells[0].stims[0]['hObj'].i in NEURON.
simConfig.recordTraces['iStim'] = {'sec': 'soma', 'loc': 0.5, 'stim': 'IClamp0', 'var': 'i', 'conds': {'gid': 0}}

# record the 'V' variable from the 'myPP' point process in the 'soma' section.  This
# is equivalent to recording soma.myPP.V in NEURON.
simConfig.recordTraces['VmyPP'] = {'sec': 'soma', 'pointp': 'myPP', 'var': 'V'}

## Recording from Synaptic Currents Mechanisms

# Example of recording from an excitatory synaptic mechanism
# record the 'i' variable (current) from an excitatory synaptic mechanism located
# in the middle of the 'dend' section. This is equivalent to recording
# dend(0.5).exc._ref_i in NEURON.
simConfig.recordTraces['iExcSyn'] = {'sec': 'dend',  'loc': 0.5, 'synMech': 'exc',  'var': 'i'}

# Example of recording from an inhibitory synaptic mechanism
# record the 'i' variable (current) from an inhibitory synaptic mechanism located
# at 0.3 of the 'soma' section. This is equivalent to recording
# soma(0.3).inh._ref_i in NEURON.
simConfig.recordTraces['iInhSyn'] = {'sec': 'soma', 'loc': 0.3, 'synMech': 'inh',  'var': 'i'}

# Example of recording multiple synaptic currents
# Recording synaptic currents
simConfig.recordSynapticCurrents = True
synaptic_curr = [
        ('AMPA', 'i'),   # Excitatory synaptic current
        ('NMDA', 'i'),   # Excitatory synaptic current
        ('GABA_A', 'i')  # Inhibitory synaptic current
]
if simConfig.recordSynapticCurrents:
for syn_curr in synaptic_curr:
        trace_label = f'i__soma_0__{syn_curr[0]}__{syn_curr[1]}'
        simConfig.recordTraces.update({trace_label: {'sec': 'soma_0', 'loc': 0.5, 'mech': syn_curr[0], 'var': syn_curr[1]}})

名前 'iExcSyn''iInhSyn''AMPA''NMDA''GABA_A' は、 netParams.synMechParams でユーザーによって定義された名前であり、 netParams.synMechParams.keys() を使用して見つけることができます。 synaptic_curr タプル内のシナプス メカニズムと組み合わせることができる変数は、そのシナプス メカニズムの定義に使用される MOD ファイルを調べることで見つけることができ、記録できる変数は MOD ファイル内で RANGE タイプとして定義されます。

例:

  • netParams.synMechParamsasMyExp2SynBB.mod テンプレートを使用する 'AMPA' として定義されたシナプス メカニズム。
  • ユーザーは、ソース /mod フォルダーに移動し、MyExp2SynBB.mod ファイルを開いて、どの変数が RANGE として定義されているかを確認し、それらを記録できます。

  • ユーザーは変数の型を変更して RANGE として定義し、メカニズムを再コンパイルして netpyne で記録できるようにすることもできます。

  • 特定のファイルに記録できる変数の例
  • ユーザーは、'tau1''tau2''e''i''g''Vwt''gmax' を記録できます。
NEURON {
  POINT_PROCESS MyExp2SynBB
  RANGE tau1, tau2, e, i, g, Vwt, gmax
  NONSPECIFIC_CURRENT i
}

これらは synaptic_curr で次のように指定する必要があります。

synaptic_curr = [
('AMPA', 'i'),    # Excitatory synaptic current
('AMPA', 'g'),    # Channel conductance
]

パッケージ関数

simConfig オブジェクトと netParams オブジェクトを作成したら、パッケージ関数を使用してネットワークをインスタンス化し、シミュレートし、分析できます。利用可能な機能の一覧を以下に示します。

ネットワーク クラス メソッド

ネットワークを設定する方法

  • net.setParams()

  • net.createPops()

  • net.createCells()

  • net.connectCells()

ネットワークを変更する方法

  • net.modifyCells(params, updateMasterAllCells=False)

インスタンス化されたネットワーク内のセルのプロパティを変更します。 params 引数は、次の項目を含む辞書です。

例: {'soma': {'geom': {'L': 100}}} は、ソーマの長さを 100 um に設定します。

  • net.modifySynMechs(params, updateMasterAllCells=False)

インスタンス化されたネットワーク内の synMech のプロパティを変更します。 params 引数は、次の 3 つの項目を含む辞書です。

  • ‘conds’: 変更する synMech を選択するための条件の辞書。各項目には synMech タグと必要な値 ([min, max] 範囲形式が許可されます) が含まれます。

例: {'label': 'AMPA', 'sec': 'soma', 'loc': [0, 0.5]}ソーマセクションのラベル「AMPA」を持つ synMech をターゲットにし、位置は 0 ~ 0.5 です。

  • ‘cellConds’: 変更する synMech を含むターゲット セルを選択するための条件の辞書。各項目にはセル タグ (利用可能なタグのリストを参照 セル クラス) と目的の値 ([min, max] 範囲形式が許可されます) が含まれます。

例: {'pop': 'PYR', 'ynorm': [0.1, 0.6]} は、深さが正規化された「PYR」母集団のセルの接続をターゲットとします。 0.1と0.6。

  • ‘[synMech property]’ (例: ‘tau1’ または ‘e’): stim プロパティの新しい値 (プロパティは synMech のタイプに依存することに注意してください)。変更する複数の synMech プロパティを含めることができます。
  • net.modifyConns(params, updateMasterAllCells=False)

インスタンス化されたネットワーク内の接続のプロパティを変更します。 params 引数は、次の 3 つの項目を含む辞書です。

  • ‘conds’: 変更する接続を選択するための条件の辞書。各項目には conn タグ (利用可能な conn タグのリストを参照 Cell class) と、目的の値 ([min, max] 範囲形式が許可されています) が含まれます。

例: {'label': 'M->S'} は、「M->S」というラベルの付いた connParams ルールを使用して作成された接続をターゲットとします。例えば{'weight': [0.4, 0.8], 'sec': 'soma'} は、重みが 0.4 から 0.8 以内の接続をターゲットとします。 「ソーマ」セクションに追加されました。

  • ‘postConds’: 変更する接続を含むシナプス後セルを選択するための条件の辞書。各項目にはセル タグ (使用可能なタグのリストを参照 セル クラス) と目的の値 ([min, max] 範囲形式が許可されます) が含まれます。

例: {'pop': 'PYR', 'ynorm': [0.1, 0.6]} は、深さが正規化された「PYR」集団のセルの接続をターゲットとします。 0.1と0.6。

  • 「重量」 | 「threshold」: 接続の重みまたはしきい値の新しい値。両方を含めることができます。
  • net.modifyStims(params, updateMasterAllCells=False)

インスタンス化されたネットワーク内の stim のプロパティを変更します。 params 引数は、次の 3 つの項目を含む辞書です。

例: {'label': 'VClamp1->S'} は、「VClamp1->S」というラベルの付いた stimTargetParms ルールを使用して作成されたスティムをターゲットとします。例えば{'source': 'IClamp2', 'dur': [100, 300]} は、ソースとして「Netstim2」(で定義されている)を持つスティムをターゲットとします。 stimSourceParams)、期間は 100 ~ 300 ミリ秒です。

  • ‘cellConds’: 変更するスティムを含むターゲット セルを選択するための条件の辞書。各項目にはセル タグ (利用可能なタグのリストを参照 セル クラス) および目的の値 ([min, max] 範囲形式が許可されます) が含まれます。

例: {'pop': 'PYR', 'ynorm': [0.1, 0.6]} は、深さが正規化された「PYR」集団のセルの接続をターゲットとします。 0.1と0.6。

  • ‘[stim property]’ (例: ‘dur’、‘amp’、または ‘lay’): stim プロパティの新しい値 (プロパティは stim のタイプに依存することに注意してください)。変更するいくつかの stim プロパティを含めることができます。

注記

updateMasterAllCells 引数により、マスター ノード内の sim.net.allCells リストも変更されたパラメーターで更新されます。デフォルトでは、これは変更機能の速度を低下させるため False に設定されており、sim.net.allCells はシミュレーションを実行してデータを収集した後に自動的に更新されます。

母集団クラスのメソッド

  • pop.createCells()

  • pop.createCellsFixedNum()

  • pop.createCellsDensity()

  • pop.createCellsList()

セル クラス メソッド

  • cell.create()

  • cell.createPyStruct()

  • cell.createNEURONObj()

  • cell.associateGid()

  • cell.addConn()

  • cell.addNetStim()

  • cell.addIClamp()

  • cell.recordTraces()

  • cell.recordStimSpikes()

NetPyNE データ モデル (インスタンス化されたネットワークと出力データの構造)

NetPyNE によって生成されたインスタンス化されたネットワーク構造の表現を以下に示します。

_images/netstruct.png

NetPyNE データ モデル: インスタンス化されたネットワークの構造

モデルは sim.netNetwork オブジェクトとしてインスタンス化されます。このオブジェクトには多くの組み込み属性があり、その他の属性は特定の実装に応じて存在する場合と存在しない場合があります。 「sim.net」を構成する基本要素は次の 2 つです。

  • pops - ネットワークに実装されたすべての母集団を説明する順序付き辞書。そのエントリは、母集団にラベルを付けるキー (netParams.popParams で定義) と Pop オブジェクトを参照する値です。このオブジェクトにはいくつかの属性があります。
  • タグ: 母集団を定義する宣言ルールに関連する、母集団のさまざまな属性を説明する辞書。たとえば:

sim.net.pops['Exc_L4'].tags = {'cellType': 'PYR', 'numCells': 100, 'pop': 'Exc_L4'}

  • cellGids: 母集団を構成するニューロン識別子 (グローバル ID) のリスト。たとえば:

sim.net.pops['Exc_L4'].cellGids = [0, 1, 2, 3, 4]

  • cellModelClass: どの特定のセル モデル クラスが実装されたかを説明するタイプ (例: compartCell または pointCell)。
  • セル - ローカルでインスタンス化されたセルのリスト (この区別は、並列コンピューティングを実装する場合に重要です)。リスト内の各要素は、(さまざまなセル モデル クラスの中の) Cell オブジェクトです。 Cell オブジェクトとして、いくつかの固有属性があります。
  • gid: セルのグローバル識別番号

  • タグ: セルのさまざまな属性を説明するディクショナリ。これには、セルが属する集団からのいくつかのタグが含まれる場合があります (netParams.popTagsCopiedToCells のタグ リスト、たとえば「cellType」)。これらの属性は次のとおりです。

  • pop: 属する集団のラベル。たとえば:

sim.net.cells[0].tags['pop'] = 'Exc_L4'

  • xyz: セルの x、y、z 座標。たとえば:

sim.net.cells[0].tags['x'] = -2.3535

  • xnormynormznorm: セルの正規化された x、y、z 座標。

  • 特定の状況に応じたその他のタグ (たとえば、netParams.popParams 内の集団を cellsList で宣言する (params を含む))。

  • conns: 接続のリスト (シナプス後側のこのセル)。このリストの各要素 (特定の接続) は、次のエントリを含む辞書です。
  • preGid: シナプス前細胞の ID (Gid)。この接続が接続を必要とする刺激から発生する場合、値は「NetStim」に対応します。

  • 重量: 接続の重量。

  • 遅延: 接続の遅延。

  • synMech: この接続を管理するシナプス メカニズムのラベル。

  • さまざまなシナリオに応じて、他のエントリが表示されます。

・セルモデルクラスが点プロセスでない場合、シナプスを乗せるセクション/場所が存在します。次に、次のエントリが表示されます。

  • sec: シナプスをホストするセクション。

  • loc: シナプスが表示されるこのセクション内の場所。

  • 接続がギャップジャンクション (netParams.connParams['rule']['gapJunction']= True、’compartCell’ セル モデル クラスでのみ利用可能) として指定されている場合、この種類の接続に関連付けられたエントリが表示されます。

  • gapJunction: ルールで指定された接続側 (「pre」または「post」)。

  • preLoc: ルールで指定されたシナプス前側のギャップ結合の位置 (「ポスト」のセルの場合)。

  • gapId: 接続側のセルの ID。

  • preGapId: 接続相手側のセルの ID。

  • shapeplastweightIndex: 特定の接続パターンまたはプロセスを実装するために使用されるエントリ。
  • hObj: ギャップ ジャンクションの場合を除き、他のすべての接続は NEURON NetCon オブジェクトを介して実装されます。オブジェクト自体がこの「hObj」キーに対応する値です。したがって、NEURON オブジェクトには、たとえば次のようにアクセス (および変更) できます。

sim.net.cells[0].conns[0]['hObj']

特に、これらのオブジェクトに対応するメソッドは、(ネットワークがインスタンス化された後) コマンド ラインから呼び出すことができます。たとえば:

sim.net.cells[0].conns[0]['hObj'].syn()

</div>

  • stims: セルに入力される刺激のリスト。このリストの各要素は、次のエントリを含む辞書です。
  • label: ターゲットパラメータを指定するルールのラベル

  • ソース: 受信スティミュラスを定義するソース ルールのラベル。

  • タイプ: 刺激のタイプ。たとえば:

sim.net.cells[0].stims[0]['type'] = 'NetStim' または sim.net.cells[0].stims[0]['type'] = 'IClamp'

  • sec: 刺激がターゲットとしているセクション。

  • loc: 刺激が影響しているセクション内の位置。

  • 入力刺激を定義するプロパティ。たとえば、NetStim の場合は、「rate」、「noise」、「start」、および「number」 (さらに、ランダム ジェネレータを初期化するための「seed」)。

  • hObj: 刺激に関連付けられた NEURON オブジェクト。たとえば:

sim.net.cells[0].stims[0]['hObj']

NEURON オブジェクトに関連付けられたメソッドはすぐに利用できます。たとえば、オブジェクトが「IClamp」の場合、sim.net.cells[0].stims[0]['hObj'].dur を介してその期間を変更できます。

  • セルモデルクラスに応じて、他のエントリが使用可能です。特に、‘compartCell’ セル モデル クラスの場合は、次のとおりです。
  • secs: セルを構成するセクションの辞書。この辞書には次のエントリがあります。
  • geom: セクションを構成する円柱の幾何学的特性を含む辞書。たとえば、

sim.net.cells[0].secs['soma']['geom'] = {diam: 18.8, L: 18.8, Ra: 123.0}

  • topol: トポロジーの仕様 (他のセクションとどのように接続されているか) を含む辞書。

  • mechs: 分散メカニズムを備えた辞書。たとえば、

sim.net.cells[0].secs['soma']['mechs']['hh'] = {gnabar: 0.12, gkbar: 0.036, gl: 0.003, el: -70}

  • イオン: このセクションに含まれるイオン機構を指定する辞書。

  • synMechs: このセクションにあるすべてのシナプスのリスト。このリストの各要素は、それに関連するすべての情報を含む辞書です。

  • ラベル: シナプスダイナミクスを指定するルールを説明するラベル。

  • loc: シナプスが表示されるセクション内の位置

  • シナプス モデルの定義に関連付けられたプロパティ。たとえば、「tau1」、「e」などです。

  • hObj: シナプスに関連付けられた NEURON オブジェクト。例えば> > > >

    sim.net.cells[0].secs['soma']['synMechs'][0]['hObj'] = Exp2Syn[0]

  • pointps: セクションの電圧ダイナミクスを制御するポイント プロセスを指定するディクショナリ。これには、非線形メカニズムが定義されている「mod」の名前とすべての必要なパラメーターが含まれます。

  • その他のスカラー プロパティ: spikeGenLocvinit など。

  • hObj: セクションに関連付けられた NEURON オブジェクト。たとえば、

type(sim.net.cells[0].secs['soma']['hObj']) = nrn.Section

  • これら 2 つの要素 (「ポップ」と「セル」) 以外にも、「sim.net」を定義および構成する多数の要素があります。
  • allPops: ネットワークを構成するすべての人口を含む辞書。各キーは定義された母集団に対応し、その値はそれに関する情報 (「タグ」、「cellGids」など) を含む辞書になります。

  • allCells: すべてのセルに関する情報を含むリスト (グローバル)。各要素/セルは、このセルを定義するすべての情報を含む辞書です。

  • params: ネットワークを指定する netParams。

  • rxd: 反応拡散モデルのすべての仕様を含む辞書 (netParams.rxdParams と同じ形式) に加え、関連する NEURON オブジェクト。

  • recXElectrode: LFP の記録に関連付けられたオブジェクト (存在する場合)。

  • compartCells および popForEachGid: LFP およびダイポール記録中に使用するオブジェクト セルと辞書、{‘gid’: ‘pop’}。

  • cells_dpls および cells_dpl: LFP および双極子の記録中に使用する、経時的および一度に各セルの双極子のベクトルを含む辞書。

  • gid2lid: グローバル ID とローカル ID をマッピングする辞書、{‘gid’: ‘lid’}。

  • lastGid: 定義された最後のセルの Gid。ネットワークの開発中に役立ちます。

  • lastGapId: 最後に定義されたギャップ ジャンクション。ネットワークの開発中に役立ちます。

  • preGapJunctions: ギャップ結合について、接続性ルールに書かれた方向に従ってシナプス前側の情報を格納するリスト。

ドット表記を使用した辞書へのアクセス: Dict クラスと ODict クラス

ドット表記法 (a.b.c) で NetPyNE 構造にアクセスできるようにするために、元の Python dict および OrderedDict クラスから継承するサブクラスである Dict および ODict クラスを追加しました。すべての NetPyNE 内部辞書は、クラス Dict または ODict のいずれかです。以下に、Dict クラスのいくつかの機能を示します。

  • 標準の dict メソッド: a['b']['c']a.iteritems()a.keys()a.update() など)、または属性メソッド/ドット表記: a.b.c=2 のいずれかを使用してアクセスできます。

  • 欠落している要素が自動的に追加されます (間違ったキーを使用すると、望ましくない影響が生じる可能性があることに注意してください): a=Dict(); a.b.c.d.e=1

  • コンストラクターは dict (ネストされた dict を含む) および/または kwargs を許可します: a=Dict(b=1, c=2) または ``a=Dict({‘a’: 1, ‘b’: {‘c’: 2}})`

  • メソッド .todict() は、Dict の dict バージョンを返します: a=Dict({'b':1}); a_dict=a.todict()

  • __getstate__() メソッドによるシリアル化 (ピクル化時など) は、通常の dict を返します (.todict() メソッドを使用)。

netParams を指定するには、標準の dict または Dict() クラスを使用できます。 Dict クラスを使用するには、まず次の方法でインポートする必要があります。

from netpyne.specs import Dict

ドット表記を使用して NetPyNE 構造にアクセスする例:

  • cellRule = Dict(); cellParam.secs.soma.mechs.hh = {'gnabar': 0.12, 'gkbar': 0.036}; cellParam.conds = {'cellType': 'IT'}

  • netParams.cellParams.PYR_rule.secs.soma.mechs.hh.gnabar

  • simConfig.analysis.plotRaster.include = ['all']

  • sim.net.cells[0].secs.soma.mechs.nap.gbar = 0.1

  • sim.net.cells[0].secs.soma.hSec(0.5).gbar_nap = 0.1

  • sim.net.allCells[5].tags.pop

  • sim.net.cells[0].conns[1].weight

  • sim.net.cells[0].conns[1].hNetcon.weight[0]

  • sim.net.cells[0].stims[0].type

  • sim.net.pops.PYRpop.tags

  • sim.net.allPops.Mpop.cellGids

  • sim.allSimData.spkt

  • sim.allSimData.stims.cell_31.Input_4

  • sim.allSimData.V_soma.cell_1

Sim モジュール

  • net (ネットワークオブジェクト)

  • cfg (SimConfig オブジェクト)

  • pc (h.ParallelContext オブジェクト)

  • nhosts (int)

  • ランク (int)

  • タイミングデータ (辞書)

ネットワーク クラス

  • ポップス (ポップオブジェクトの辞書)

  • セル (Cell オブジェクトのリスト)

  • params (NetParams オブジェクト)

ノードから収集した後: - allCells (辞書のリスト) - allPops (辞書のリスト)

人口クラス

  • cellGid (リスト)

  • タグ (辞書)

セルクラス

  • gid (int)

  • タグ (辞書)
    • 「ラベル」
  • 「ポップ」

  • 「セルモデル」

  • 「セルタイプ」

  • 「x」、「y」、「z」

  • 「xnorm」、「ynorm」、「znorm」

  • 秒 (辞書)
    • 「secName」 (例: 「soma」) (辞書)
      • ‘hSec’ (NEURON オブジェクト)

      • ‘geom’ (Dict)
        • ‘L’

        • ‘diam’

        • ‘pt3d’ (list of tuples)

      • ‘topol’ (Dict)
        • ‘parentSec’

        • ‘parentX’

        • ‘childX’

      • ‘mechs’ (Dict)
        • ‘mechName’ (e.g. ‘hh’) (Dict)
          • ‘gnabar’

          • ‘gkbar’

      • ‘pointps’ (Dict)
        • ‘pointpName’ (e.g. ‘Izhi’) (Dict)
          • ‘hPointp’ (NEURON object)

          • ‘mod’

          • ‘a’

          • ‘b’

      • ‘synMechs’ (list)
        • [0] (Dict)
          • ‘hObj’: NEURON object

          • ‘label’

          • ‘loc’

  • secLists (辞書)
    • 「secListName」 (例: 「alldends」) (リスト)
  • 短所 (リスト)
    • [0] (辞書)
      • 「hNetCon」: NEURON オブジェクト

      • ‘label’

      • ‘preGid’

      • ‘preLabel’

      • ‘sec’

      • ‘loc’

      • ‘synMech’

      • ‘weight’

      • ‘threshold’

  • スティム(リスト)
    • [0] (辞書)
      • 「hIClamp」 (NEURON オブジェクト)

      • ‘source’

      • ‘type’

      • ‘label’

      • ‘sec’

      • ‘loc’

      • ‘amp’

      • ‘dur’

      • ‘delay’

シミュレーション出力データ

シミュレーションの出力データは、ディクショナリ sim.simData および sim.allSimData に格納されます。前者は単一プロセス環境で使用する必要がありますが、後者には並列コンテキストのすべてのノードから収集されたデータが含まれます。シミュレーション出力データの内容はsimConfigの設定に依存し、以下の内容が含まれる場合があります。

1.細胞の痕跡

simData のキーは simConfig.recordTraces のキー (例: 「V_soma」) に対応し、各トレースの値には、このトレースが記録されたセルのリストを含む辞書が含まれます。記録されたトレースは、セルごとに h.Vector として保存されます。たとえば、simConfig 設定の場合:

simConfig.recordTraces = {'V_soma':{'sec':'soma','loc':0.5,'var':'v'},
                          'Ina_soma':{'sec':'soma','loc':0.5,'var':'ina'}}
simConfig.recordCells = [1, 3]
simConfig.recordStep = 0.1

simData 辞書には (特に) 以下が含まれます。

{'V_soma': {'cell_1': <h.Vector>, 'cell_3': <h.Vector>},
 'Ina_soma': {'cell_1': <h.Vector>, 'cell_3': <h.Vector>}

ここで、各ベクトルの長さは simConfig.duration および simConfig.recordStep によって決まります。

2.スパイク

spktspkid - スパイク時間と各スパイクのセル gid の順序付きリスト。

simConfig.recordCellsSpikes (デフォルトでは True) は、セルのサブセットからのみ記録するか、スパイク記録をオフにするために使用できます。

3.ネットワークへの刺激

stimsNetStim または VecStim の各集団について、各ターゲット セルのスパイク時間 (h.Vector) のリストが含まれています。 simConfig.recordStimTrue の場合にのみ使用できます。

4. LFP 関連データ

LFPLFPCellsLFPPopssimConfigrecordLFPsaveLFPCellssaveLFPPops オプションに応じて異なります。

  • LFP - 形状 (num timesteps, num electrodes) の LFP 値の np.array です。

  • LFPCells - 各セルから記録された LFP データの辞書 (LFP データは上記の形式です)

  • LFPPops - 各母集団から記録された平均 LFP データの辞書 (LFP データは上記の形式です)

  • iMembrane - 各細胞の膜貫通電流の辞書。 (num timesteps, num segments) の np.array です。ここで、numセグメントはセルのすべてのセクションにわたるセグメントの総数です。

5.双極子関連データ

dipoleSumdipoleCellsdipolePopssimConfigrecordDipolesaveDipoleCellssaveDipolePops オプションに依存します。

  • dipoleSum - 各タイムステップでの電流双極子モーメントの合計 (num timesteps, 3); EEG/MEG計算に使用可能

  • dipoleCells - 各セルについて記録された現在の双極子モーメントの辞書 (双極子データは上記の形式です)

  • dipolePops - 各集団について記録された平均電流双極子モーメントの辞書 (双極子データは上記の形式です)

ファイルに保存されたデータ

  • simConfig

  • netParams

  • ネット

  • simデータ

外部定義されたセル モデルのインポート

NetPyNE は、たとえば 1 つまたは複数のコンパートメントを持つホジキン-ハクスリー型セル、または Izhikevich 型セルのセル プロパティを内部定義するためのサポートを提供します (たとえば、NetPyNE Tutorial を参照)。ただし、以前に定義したセルを外部ファイルにインポートすることも可能です。ホックセルテンプレートまたはセルクラスで、importCellParams() メソッドを使用します。このメソッドは、すべてのセル情報を必要な NetPyNE 形式に変換します。このようにして、個別に実装されたセルを利用することができます。

cellRule = netParams.importCellParams(label, conds, fileName, cellName, cellArgs={}, importSynMechs=False)このメソッドは、新しいセル ルールのラベル、セルが定義されているファイルの名前 (.py または .hoc ファイル)、およびセル テンプレート (hoc) またはクラス (python) の名前を引数として受け取ります。オプションで、一連の引数をセル テンプレート/クラスに渡すことができます (例: {'type': 'RS'})。シナプスメカニズムのパラメータをインポートしたい場合は、importSynMechs=True を設定できます。このメソッドは新しいセル ルールを返し、さらに変更できるようにします。

NetPyNE には、インポートされるセル モデルに関する組み込み情報は含まれません。インポートは、外部セル モデルを一時的にインスタンス化し、必要なすべての情報 (ジオメトリ、トポロジ、分散メカニズム、ポイント プロセスなど) を読み取ることに基づいています。

以下に、外部ファイルから 10 個の異なる細胞モデルをインポートする例を示します。それぞれに必要なファイルと NetPyNE コードが提供されます。必ず nrnivmodl を実行して、各例の MOD ファイルをコンパイルしてください。セルモデルの例のリストは次のとおりです。

さらに、10 個のセル モデルすべてをインポートし、各タイプの母集団を作成し、バックグラウンド入力を提供し、すべてのセルをランダムに接続する NetPyNE ファイルの例 (tut_import.py) を提供します。この例を実行するには、セル モデルが定義されているすべてのファイルと MOD ファイルをダウンロードする必要もあります (下記を参照)。結果のラスタ​​ーを以下に示します。

_images/tut_import_raster.png

ホジキン・ハクスリー モデル

説明: hh および pas メカニズム、およびシナプス メカニズムを備えた 2 コンパートメント (細胞体および樹状突起) 細胞。 Python クラスとして定義されます。

必要なファイル: HHCellFile.py

NetPyNE コード

netParams.importCellParams(
        label='PYR_HH_rule',
        conds={'cellType': 'PYR', 'cellModel': 'HH'},
        fileName='HHCellFile.py',
        cellName='HHCellClass',
        importSynMechs=True)

3D ジオメトリを含む Hodgkin-Huxley モデル (.hoc より)

説明: マルチコンパートメントセル。 HOC セル テンプレートとして定義されます。セルのジオメトリのみが含まれます。 NetPyNE からジオメトリのみをインポートし、生​​物物理学 (hh および pas チャネル) を追加する例。

必要なファイル: geom.hoc

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_HH3D_hoc',
        conds={'cellType': 'PYR', 'cellModel': 'HH3D'},
        fileName='geom.hoc',
        cellName='E21',
        importSynMechs=False)

cellRule['secs']['soma']['mechs']['hh'] = {'gnabar': 0.12, 'gkbar': 0.036, 'gl': 0.003, 'el': -70} # soma hh mechanism

for secName in cellRule['secs']:
        cellRule['secs'][secName]['mechs']['pas'] = {'g': 0.0000357, 'e': -70}
        cellRule['secs'][secName]['geom']['cm'] = 1

3D ジオメトリを含む Hodgkin-Huxley モデル (.swc より)

説明: SWC ファイルからインポートされた形態を持つマルチコンパートメント セル。セルのジオメトリのみが含まれます。 NetPyNE からジオメトリのみをインポートし、生​​物物理学 (hh および pas チャネル) を追加する例。

SWC ファイルから NetPyNE に形態をインポートするのは簡単ですが、NetPyNE は形態のテストや検証を行わないため、NetPyNE で使用する前に形態ファイルが正確で有効であることを確認する必要があります。

必要なファイル: BS0284.swc

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_HH3D_swc',
        conds={'cellType': 'PYR', 'cellModel': 'HH3D'},
        fileName='BS0284.swc',
        cellName='swc_cell')

netParams.renameCellParamsSec('PYR_HH3D_swc_rule', 'soma_0', 'soma')  # rename imported section 'soma_0' to 'soma'

for secName in cellRule['secs']:
        cellRule['secs'][secName]['mechs']['pas'] = {'g': 0.0000357, 'e': -70}
        cellRule['secs'][secName]['geom']['cm'] = 1
        if secName.startswith('soma'):
                cellRule['secs'][secName]['mechs']['hh'] = {'gnabar': 0.12, 'gkbar': 0.036, 'gl': 0.003, 'el': -70}

トラウブモデル

説明: hoc セル テンプレートとして定義された Traub セル モデル。 mod ファイルで定義された複数のメカニズムが必要です。 ModelDB からダウンロードされ、図のプロットなどへの呼び出しを削除するように修正されました。 Traub セル モデルに必要な別の km メカニズムとの衝突を避けるために、km メカニズムは km2 という名前に変更されました。 NetPyNE から追加されたシナプス。

ModelDB リンク: http://senselab.med.yale.edu/ModelDB/showmodel.cshtml?model=20756

必要なファイル: pyr3_traub.hocar.modcad.modcal.modcat.modk2.modka.modkahp.modkc.modkdr.modkm2.modnaf.modnap.mod

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_Traub_rule',
        conds= {'cellType': 'PYR', 'cellModel': 'Traub'},
        fileName='pyr3_traub.hoc',
        cellName='pyr3')

somaSec = cellRule['secLists']['Soma'][0]

cellRule['secs'][somaSec]['spikeGenLoc'] = 0.5

メインモデル

説明: Python クラスとして定義された Mainen セル モデル。 mod ファイルで定義された複数のメカニズムが必要です。 Adapted to python from hoc ModelDB version. NetPyNE から追加されたシナプス。

ModelDB リンク: http://senselab.med.yale.edu/ModelDB/showModel.cshtml?model=2488 (旧バージョン)

必要なファイル: mainen.pycadad.modkca.modkm.modkv.modnaz.modNca.mod

NetPyNE コード:

netParams.importCellParams(
        label='PYR_Mainen_rule',
        conds={'cellType': 'PYR', 'cellModel': 'Mainen'},
        fileName='mainen.py',
        cellName='PYR2')

フリーゼンモデル

必要なファイル: Python クラスとして定義されたフリーゼン セル モデル。 MOD ファイルで定義された複数のメカニズム (ポイント プロセスを含む) が必要です。スパイクの生成は axon セクション (soma ではありません) で発生します。これは、NetPyNE で spikeGenLoc 項目を axon セクション エントリに追加し、セクションの場所 (例: 0.5) を指定することで示されます。

必要なファイル: friesen.pyA.modGABAa.modAMPA.modNMDA.modOFThpo.modOFThresh.modnetcon.incofc.inc

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_Friesen_rule',
        conds={'cellType': 'PYR', 'cellModel': 'Friesen'},
        fileName='friesen.py',
        cellName='MakeRSFCELL')

cellRule['secs']['axon']['spikeGenLoc'] = 0.5  # spike generator location.

Izhikevich 2003a モデル (独立電圧可変)

説明: Izhikevich、2003 年に Python クラスとして定義されたセル モデル。 modファイルで定義されたポイントプロセスが必要です。このバージョンはセクションに追加されますが、セクション電圧またはシナプス メカニズムは使用されません。代わりに、独自の内部電圧変数とシナプス機構を使用します。これは、NetPyNE で vref 項目をポイント プロセス エントリに追加し、内部電圧変数の名前 (V) を指定することで示されます。

Modeldb リンク: https://senselab.med.yale.edu/modeldb/showModel.cshtml?model=39948

必要なファイル: izhi2003Wrapper.pyizhi2003a.mod

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_Izhi03a_rule',
        conds={'cellType': 'PYR', 'cellModel':'Izhi2003a'},
        fileName='izhi2003Wrapper.py',
        cellName='IzhiCell',
        cellArgs={'type':'tonic spiking', 'host':'dummy'})

cellRule['secs']['soma']['pointps']['Izhi2003a_0']['vref'] = 'V' # specify that uses its own voltage V

Izhikevich 2003b モデル (セクション電圧を使用)

説明: Izhikevich、2003 年に Python クラスとして定義されたセル モデル。 modファイルで定義されたポイントプロセスが必要です。このバージョンはセクションに追加され、セクションの電圧とシナプス メカニズムを共有します。シナプス メカニズムは、接続フェーズ中に NetPyNE から追加されます。

Modeldb リンク: https://senselab.med.yale.edu/modeldb/showModel.cshtml?model=39948

必要なファイル: izhi2003Wrapper.pyizhi2003b.mod

NetPyNE コード:

netParams.importCellParams(
        label='PYR_Izhi03b_rule',
        conds={'cellType': 'PYR', 'cellModel':'Izhi2003b'},
        fileName='izhi2003Wrapper.py',
        cellName='IzhiCell',
        cellArgs={'type':'tonic spiking'})

Izhikevich 2007a モデル (独立電圧可変)

説明: Izhikevich、2007 年のセル モデルは Python クラスとして定義されました。 modファイルで定義されたポイントプロセスが必要です。このバージョンはセクションに追加されますが、セクション電圧またはシナプス メカニズムは使用されません。代わりに、独自の内部電圧変数とシナプス機構を使用します。これは、NetPyNE で vref 項目をポイント プロセス エントリに追加し、内部電圧変数の名前 (V) を指定することで示されます。セル モデルにはいくつかの内部シナプス メカニズムが含まれており、synList 項目をポイント プロセス エントリに追加することで NetPyNE のリストとして指定できます。

Modeldb リンク: https://senselab.med.yale.edu/modeldb/showModel.cshtml?model=39948

必要なファイル: izhi2007Wrapper.pyizhi2007a.mod

NetPyNE コード:

cellRule = netParams.importCellParams(
        label='PYR_Izhi07a_rule',
        conds={'cellType': 'PYR', 'cellModel':'Izhi2007a'},
        fileName='izhi2007Wrapper.py',
        cellName='IzhiCell',
        cellArgs={'type':'RS', 'host':'dummy'})

cellRule['secs']['soma']['pointps']['Izhi2007a_0']['vref'] = 'V' # specify that uses its own voltage V

cellRule['secs']['soma']['pointps']['Izhi2007a_0']['synList'] = ['AMPA', 'NMDA', 'GABAA', 'GABAB']  # specify its own synapses

Izhikevich 2007b モデル (セクション電圧を使用)

説明: Izhikevich、2007 年に Python クラスとして定義されたセル モデル。 modファイルで定義されたポイントプロセスが必要です。このバージョンはセクションに追加され、セクションの電圧とシナプス メカニズムを共有します。

Modeldb リンク: https://senselab.med.yale.edu/modeldb/showModel.cshtml?model=39948

必要なファイル: izhi2007Wrapper.pyizhi2007b.mod

NetPyNE コード:

netParams.importCellParams(
        label='PYR_Izhi07b_rule',
        conds={'cellType': 'PYR', 'cellModel':'Izhi2007b'},
        fileName='izhi2007Wrapper.py',
        cellName='IzhiCell',
        cellArgs={'type':'RS'})

上記のすべてのセル モデルをインポートし、それらを使用してネットワークを作成するための完全なコードは、tut_import.py から入手できます。

進化的アルゴリズムを使用した単純なニューラル ネットワークのパラメーター最適化

このチュートリアルでは、進化的アルゴリズム ツールキットである inspyred を使用して、目標の平均発火率を達成できるように、以前の tut2.py** ニューラル ネットワークのパラメーターを最適化して、ネットワーク シミュレーションの開始と出力表示に関連するコードを削除する方法の例を示します。 (~) 17 Hz あたり。

**ネットワーク シミュレーションの開始と出力表示に関連するコードを削除するには、tut2.py コードの終わり近くでいくつかの変更が必要ですが、これらはすべて新しいトップレベル コードで処理されるようになりました。 (tut_optimization.py):

# Create network and run simulation
# sim.createSimulateAnalyze(netParams = netParams, simConfig = simConfig)   # line commented out

# import pylab; pylab.show()  # if figures appear empty   # line commented out

tut2.py からの抜粋

追加の背景情報

アルゴリズムの説明 この例で単純なニューラル ネットワークを最適化するために使用される方法論。

はじめに

inspyred Python パッケージを使用してニューラル ネットワーク パラメーターを見つけ、ネットワークの一部のプロパティ (発射速度など) が目的のターゲットと一致するようにする手順は、3 つのステップに分けることができます。まず、1) 目的のターゲット モデル (この場合は、何らかの測定可能な値) と適合度関数を定義します。ここでの適合度は、指定されたパラメーターを持つニューラル ネットワークがターゲットにどの程度一致するかを表す計算可能な値として定義されます。次に、2) そのモデル/値を達成するために変更する適切なニューラル ネットワーク パラメーターを決定する必要があります。最後に、3) 進化的アルゴリズムの適切なパラメータが定義されます。最終的に、進化的アルゴリズムへの入力が適切であれば、連続的な反復を通じて、進化的アルゴリズムによって決定されたパラメーターによってターゲットに近いモデルが生成されるはずです。

これら 3 つのステップを例に具体化すると、次のようになります。

_images/tut_optimization_diagram.png

  1. 目的のターゲット モデルとフィットネス関数を定義します。

目的のターゲット モデルの定義はほとんど任意ですが、結果が以前よりもターゲット モデルに近づくように(または適合度が向上するように)パラメーターを調整する方法が必要であることや、指定されたパラメーターでモデルの適合性を評価する方法が必要であることなどの制約があります。この場合、ターゲット モデルは、平均発火速度 17 Hz を達成するニューラル ネットワークです。このようなモデルの適合性は、特定のモデルの平均発火率と 17 Hz の目標発火率との差として定義できます。

  1. 最適化するモデルパラメータを選択します。

パラメーターが何らかの方法で最終モデルの適合性を変更できる場合、モデルが何を達成しようとしているかに応じて、そのパラメーターは最適化の適切な候補となる可能性があります。他の多くのパラメーターと同様に、ニューラル ネットワーク内のシナプス接続の確率、重み、遅延を変更すると、平均発火率に影響を与える可能性があります。この例では、感覚集団から運動集団への接続の確率、重み、遅延の値を最適化します。

  1. 進化的アルゴリズムに適切なパラメータを選択します。

inspyred では、次のような進化的アルゴリズムのさまざまなコンポーネントをカスタマイズできます。

  • どのパラメータ値のセットが親になるかを決定するセレクター、つまり、進化の反復において次の世代を形成するためにどのパラメータ値が使用されるかを決定します。

  • パラメータセットの現在の各反復が前の反復からどのように形成されるかを決定するバリエーター、

  • 以前のパラメータ値のセットを次の反復に持ち込むかどうかを決定する置換器、

  • 進化の反復をいつ終了するかを定義するターミネータ、

  • 進化の各反復を通じてパラメータ値の追跡を可能にするオブザーバー。

inspyred の使用

進化的アルゴリズムは、inspyred パッケージの ec モジュールに実装されています。

from inspyred import ec # import evolutionary computation from inspyred

tut_optimization.py からの抜粋

ec には、進化的計算アルゴリズムのクラス ec.EevolutionaryComputation() が含まれており、パラメーターを入力してアルゴリズムをカスタマイズできます。進化アルゴリズムにはランダムなプロセス (遺伝子のランダムな変異など) が含まれるため、乱数発生器が必要です。この場合、Python の Random() メソッドを使用します。これは、将来結果を再現できるように、特定のシード値を使用して初期化します。

# create random seed for evolutionary computation algorithm
rand = Random()
rand.seed(1)

# instantiate evolutionary computation algorithm
my_ec = ec.EvolutionaryComputation(rand)

tut_optimization.py からの抜粋

次に、さまざまなバリエーター、リプレイサー、ターミネーター、オブザーバー要素(基本的にアルゴリズムの特定のコンポーネントを切り替える)を ec.selector、ec.variators、ec.replacers、ec.terminators、ec.observers に割り当てることにより、ec 進化計算インスタンス用に進化アルゴリズムのパラメーターが確立されます。

#toggle variators
my_ec.variator = [ec.variators.uniform_crossover, # implement uniform crossover & gaussian replacement
                ec.variators.gaussian_mutation]
my_ec.replacer = ec.replacers.generational_replacement   # implement generational replacement

my_ec.terminator = ec.terminators.evaluation_termination # termination dictated by no. evaluations

#toggle observers
my_ec.observer = [ec.observers.stats_observer,  # print evolutionary computation statistics
                ec.observers.plot_observer,   # plot output of the evolutionary computation as graph
                ec.observers.best_observer]   # print the best individual in the population to screen

ex_optimization.py からの抜粋

どこ:

     
ec.variators.uniform_crossover コインを投げて「お母さん」要素または「お父さん」要素が子孫に継承されるかどうかを決定するバリエーター  
ec.variators.gaussian_mutation variator は、my_ec.evolve(…,bounder=ec.Bounder(minParamValues, maxParamValues) ,…) で指定されている境界関数を利用するガウス突然変異を実装します。
ec.replacers.generational_replacement replacer はエリート主義による世代置換を実装します ( my_ec.evolve(…,num_elites=1,…) で指定されているように、既存の世代が子孫に置き換えられ、 <num_elites> 既存の個体は子孫よりも適応度が優れている場合に生き残ります。  
ec.terminators.評価_終了 ターミネーターは、発生した評価の数に基づいて実行されます。  
ec.observers.stats_observer 生成された個体 (パラメータ セット) のうち、次の進化反復で選択される個体の数を示します。  
ec.observers.plot_observer は突然変異の割合、つまり前の世代から取得された各パラメータ (確率、重み、遅延) の値が次の世代で変更される割合を示します。  
ec.observers.best_observer 最適化されるパラメータの数を [確率、重み、遅延] の長さに対応する 3 に設定します。  

これらの事前定義されたセレクター、バリエーター、リプレイサー、ターミネーター、およびオブザーバー要素、およびその他のオプションは、inspyred ドキュメント にあります。

最後に、進化的計算アルゴリズムのインスタンスには、メソッド my_ec.evolve() が含まれています。このメソッドは、終了条件が達成されるまで、さまざまなパラメーター セットを評価する連続的な進化的反復を実行します。この関数には複数の引数があり、2 つの重要な引数はジェネレーター関数とエバリュエーター関数です。 my_ec.evolve() の関数呼び出しは次のようになります。

# call evolution iterator

final_pop = my_ec.evolve(generator=generate_netparams, # assign model parameter generator to iterator generator
                      evaluator=evaluate_netparams, # assign fitness function to iterator evaluator
                      pop_size=10,
                      maximize=False,
                      bounder=ec.Bounder(minParamValues, maxParamValues),
                      max_evaluations=50,
                      num_selected=10,
                      mutation_rate=0.2,
                      num_inputs=3,
                      num_elites=1)

tut_optimization.py からの抜粋

どこ:

pop_size=10

パラメータ セットの各世代が 10 人の個人で構成されることを意味します

maximize=False

モデルの発火周波数と 17 Hz の差に関する最小値に対応するためにより高い適合度を採用していることを意味します

bounder=ec.Bounder(minParamValues,

maxParamValues)

各パラメータの境界を定義します。最適化しようとしているパラメーターの最小値と最大値を記述する形式: minParamValues は [確率、重み、遅延] に対応する最小値の配列であり、maxParamValues は最大値の配列です。

max_evaluations=50

進化的反復の終了前に評価されるパラメータ セットの数を示します

num_selected=10

生成された個体 (パラメータ セット) のうち、次の進化反復で選択される個体数を示します。

変異率=0.2

突然変異の割合、つまり前の世代から取得された各パラメータ (確率、重み、遅延) の値が次世代で変更される割合を示します

num_inputs=3

[確率、重み、遅延] の長さに対応して、最適化されるパラメーターの数を 3 に設定します。

num_elites=1

は、エリートの数を 1 に設定します。つまり、子孫から選択された個体よりも適応度が高い場合、既存の世代から 1 つの個体を (完全な世代置換ではなく) 保持することができます。

ジェネレーターとエバリュエーターの引数は入力としてユーザー定義関数を期待します。ジェネレーターは最初の反復の初期パラメーター値セットの母集団を定義するために使用され、エバリュエーターは各モデルがターゲットにどれだけ近いかを評価するために使用される適合度関数です。この例では、ジェネレーターは、パラメーター化された一様分布から描画することによってパラメーター値の初期セット (つまり、 [確率、重み、遅延] ) を作成する非常に単純な関数です。

# return a set of initialParams which contains a [probability, weight, delay]

def generate_netparams(random, args):

    size = args.get('num_inputs')
    initialParams = [random.uniform(minParamValues[i], maxParamValues[i]) for i in range(size)]

return initialParams

tut_optimization.py からの抜粋

適応度関数には、パラメーター値のセットのリスト、つまり [ [ a0, b0, c0], [a1, b1, c1], [a2, b2, c2], … , [an, bn, cn ] ] を取得することが含まれます。ここで、a、b、c はパラメーター値を表し、1 ~ n は母集団内の個々の番号を表し、リストの各要素の適合性スコアを計算して返されます。パラメータ値の初期セットに対応する適応度値のリスト(つまり、 [ f0, f1, f2, … , fn ] )として。これは一般的なテンプレートに従います。

def evaluate_fitness(candidates, args):
   fitness = []
   for candidate in candidates:
       fit = some_fitness_function(candidate)
       fitness.append(fit)
   return fitness

tut_optimization.py からの抜粋

some_fitness_function(candidate) として機能するために使用される実際のコードを以下に説明します。

フィットネス機能の概要

この場合のフィットネス関数には、1) 指定されたパラメーターを使用してニューラル ネットワークを作成し、2) それをシミュレートして平均発火率を見つけ、次に 3) この発火率を目標発火率と比較することが含まれます。

  1. 評価するパラメータを使用してニューラル ネットワークを作成する

tut2.py で NetPyNE 定義のネットワークを使用し、[確率、重み、遅延] パラメータを変更します。これには、S 母集団と M 母集団の間の接続ルール内にある tut2.py 内の特定の値の再定義が含まれます: netParams.connParams[‘S->M’]

## Cell connectivity rules
netParams.connParams['S->M'] = {      #  S -> M label
      'preConds': {'popLabel': 'S'},  # conditions of presyn cells
      'postConds': {'popLabel': 'M'}, # conditions of postsyn cells
      'probability': 0.5,             # probability of connection <-- to be optimized by evolutionary algorithm
      'weight': 0.01,                 # synaptic weight           <-- to be optimized by evolutionary algorithm
      'delay': 5,                     # transmission delay (ms)   <-- to be optimized by evolutionary algorithm
      'synMech': 'exc'}               # synaptic mechanism

tut2.py からの抜粋

これらの値は、適応度関数内で、進化的アルゴリズムによって生成されたパラメーター値に置き換えられます。適応度関数は候補のリストを反復処理する for ループ内に存在するため (for icand,cand in enumerate(candidates): )、個々のパラメーターには cand[0]、cand[1]、cand[2] としてアクセスできます。 tut_optimization.py のパラメータに値を再割り当てするには、次の行を使用します。

tut2.netParams.connParams['S->M']['<parameter>'] = <value>
  1. 作成したニューラルネットワークをシミュレーションし、平均発火率を求める

ネットワーク パラメーターを変更したら、sim.createSimulate() NetPyNE 関数を呼び出してシミュレーションを実行できます。変更したばかりの tut2 netParams オブジェクトと simConfig オブジェクトを引数として渡します。シミュレーションが実行されると、sim.simData を介してシミュレーション出力にアクセスできるようになります。

# create network
sim.createSimulate(netParams=tut2.netParams, simConfig=tut2.simConfig)

tut_optimization.py からの抜粋

  1. 平均発火率と目標平均発火率の比較

ネットワークの平均発火率 (スパイク/秒 = Hz) を計算するには、シミュレーション中に発生したスパイクをニューロンの数と継続時間で除算します。スパイク時間のリストとニューロンのリストには、NetPyNE sim モジュール sim.simData[‘spkt’] および sim.net.cells を介してアクセスできます。これらは、 sim.createSimulate() の実行後に設定されます。これらのリストから、スパイク時間とニューロンの数を取得するには、Python の len() 関数を使用します。シミュレーションの継続時間には、tut_optimization.py コードで tut2.simConfig.duration を介してアクセスできます。  したがって、平均発火率の計算は次のようになります。

# calculate firing rate
numSpikes = float(len(sim.simData['spkt']))
numCells = float(len(sim.net.cells))
duration = tut2.simConfig.duration/1000.0
netFiring = numSpikes/numCells/duration

tut_optimization.py からの抜粋

最後に、モデルの平均発火率が次のように目標発火率と比較されます。

# calculate fitness for this candidate
fitness = abs(targetFiring - netFiring)  # minimize absolute difference in firing rate

tut_optimization.py からの抜粋

結果の表示

進化的アルゴリズムの結果は、標準出力 (端末) に表示されるほか、matplotlib パッケージを使用してプロットされます。次の行は、イテレータ内のさまざまな候補の結果の表示に関連しています。

for icand,cand in enumerate(candidates):
      ...
      print '\n CHILD/CANDIDATE %d: Network with prob:%.2f, weight:%.2f, delay:%.1f \n  firing rate: %.1f, FITNESS = %.2f \n'\
      %(icand, cand[0], cand[1], cand[2], netFiring, fitness)

tut_optimization.py からの抜粋

最初の行: for icand,cand in enumerate(candidates): は、上記の疑似コード例で使用されている反復子 for candidate in candidates: に似ていますが、enumerate() 関数はリスト内の各要素に対して 0 から始まるインデックスも返し、後続の print ステートメントで使用される点が異なります。

この例では、17 Hz に最も近い平均周波数を持つ生成された候補も表示されます。この候補は最終世代に存在し、最高の適合度スコア (最小差に相当) を持ちます。 num_elites=1 なので、前の世代により良い適応度を持つ候補者が存在するリスクはありません。

進化の終了後、最高の適合度スコアを持つ候補にアクセスするために、 my_ec.evolve() 関数によって返される最終世代の候補が逆順に並べ替えられ (最小値から最大値へ)、17 Hz に最も近い平均発火率を達成する (したがって最小の差を持つ) 候補がリストの先頭 (または位置 0) に配置されます。 NetPyNE を使用して、最適化されたパラメーターを設定し、ネットワークをシミュレートし、ラスター プロットをプロットすることにより、このネットワークの出力を視覚化します。このタスクを実行するコードは以下に分離されています。

final_pop = my_ec.evolve(...)
...
# plot raster of top solutions
final_pop.sort(reverse=True)         # sort final population so best fitness (minimum difference) is first in list
bestCand = final_pop[0].candidate   # bestCand <-- candidate in first position of list
tut2.simConfig.analysis['plotRaster'] = True                      # plotting
tut2.netParams.connParams['S->M']['probability'] = bestCand[0]    # set tut2 values to corresponding
tut2.netParams.connParams['S->M']['weight'] = bestCand[1]         # best candidate values
tut2.netParams.connParams['S->M']['delay'] = bestCand[2]
sim.createSimulateAnalyze(netParams=tut2.netParams, simConfig=tut2.simConfig) # run simulation

tut_optimization.py からの抜粋

このチュートリアルで使用される進化的アルゴリズムによるニューラル ネットワーク最適化のコードは、tut_optimization.py にあります。

バッチ ジョブの実行 (ベータ)

NetPyNE batchtools サブパッケージは、ディスパッチャ <-> ランナー通信モデルに基づいて、シミュレーションの送信を自動化し、結果を分析のために結合する新しい方法を提供します。現在、パラメータの最適化とチェックポイント設定に Ray Tune パッケージを使用しています。これにより、幅広い最先端の最適化アルゴリズムと効率的な並列化とスケーラビリティが提供されます。

batchtools オブジェクトとインターフェイスは直接処理できますが、すべてを一般的なユースケースに適用できる単純なラッパー コマンドに統合し、自動化しました。自動パラメーター検索は、netpyne.batchtools.search を通じて検索スペースとアルゴリズムを指定することで実装できます。モデル パラメーターの定義は引き続き netpyne.specs によって処理され、シミュレーション結果の通信は netpyne.sim によって処理されます。

以下は、NetPyNE モデルに必要な 4 つの主要なファイル netParams.py、cfg.py、init.py、search.py​​ (バッチ パラメーターの最適化/検索の定義に使用) 内のラッパー コマンド間の相互作用の図です。

_images/batchtools_netpyne.png

1. バッチツールのセットアップ

NetPyNE と NEURON のインストールに加えて、次の pip インストールが必要です。

pip install -U ray
pip install -U batchtk

batchtk は NetPyNE batchtools サブパッケージ、ray はバッチツールの依存関係である Ray Tune パッケージです。

これらのパッケージの最新の修正を可能にするには、NetPyNE とバッチtk を開発用インストールとしてセットアップする必要があります。

git clone https://github.com/suny-downstate-medical-center/netpyne.git
cd netpyne
pip install -e .

git clone https://github.com/suny-downstate-medical-center/batchtk.git
cd batchtk
pip install -e .

対話型 Python インスタンスで sim.send メソッドと cfg.update メソッドをチェックすることで、正しいパッケージがインストールされていることを検証できます。

In [1]: from netpyne import sim, specs
Warning: no DISPLAY environment variable.
--No graphics will be displayed.
numprocs=1

In [2]: help(sim.send)
Help on method send in module netpyne.batchtools.comm:

send(data) method of netpyne.batchtools.comm.Comm instance


In [3]: cfg = specs.SimConfig()

In [4]: help(cfg.update)
Help on method update in module netpyne.batchtools.runners:
...

インストールに問題がある場合、いずれかの機能のヘルプを呼び出すと、代わりに次のメッセージが表示されます。

In [2]: help(sim.send)
Help on function send in module netpyne.sim:

send(*args, **kwargs)
This method is implemented in batchtools,
which requires the batchtk package to be
installed. If you are seeing this message
when calling help, it indicates there is
an issue with your current batchtools
installation

関連するメソッドは例外を発生させずに呼び出すことができますが、プレースホルダーとしてのみ機能します。

2. 例

NetPyNE バッチツールの使用例は、NetPyNE github</a> の examples ディレクトリ にあります。

基礎となるバッチtk パッケージの例は、batchtk github</a> の examples ディレクトリ にあります。

3. specs オブジェクトを介したバッチ構成値の取得

各シミュレーションは、specs オブジェクトを通じて関連するバッチ構成を取得し、netpyne.sim 内の send 関数を通じてバッチ ディスパッチャーと通信できます。

まず、関連するオブジェクトをインポートします。

from netpyne import specs, sim
cfg = specs.SimConfig()  # create a SimConfig object, can be provided with a dictionary on initial call to set initial values
netParams = specs.NetParams()  # create a netParams object

batchtk モジュールが適切にインストールされている場合、元の specs.SimConfig オブジェクトが、help() または type() を通じてクエリできる開発版 batchtools バージョンに自動的に置き換えられます。

cfg = specs.SimConfig()
help(cfg)

上記のコード ブロックの切り詰められた出力:

# Output
Help on Runner_SimConfig in module netpyne.batchtools.runners object:

class Runner_SimConfig(batchtk.runtk.runners.Runner, netpyne.specs.simConfig.SimConfig)

この更新された cfg インスタンスは、この特定のバッチ ジョブの初期化時に作成された関連構成マッピングを自動的にキャプチャします。これらのマッピングは、cfg.get_mappings() 経由で取得できます。

次のステップでは、cfg.update() を呼び出して、このバッチ ジョブに関連するマッピングで cfg 値を更新します。

from netpyne  import specs           # import the custom batch specs
cfg = specs.SimConfig()              # create a SimConfig object
cfg.update()                         # update the cfg object with any relevant mappings for this particular batch job

以下に示すように、update メソッドは、引数呼び出しで指定された値で 最初に *、次に バッチ ジョブの構成マッピング (つまり、cfg.get_mappings() によって取得された) で SimConfig オブジェクトを更新します。

from netpyne import specs                     # import the custom batch specs
cfg = specs.SimConfig({'foo': 0, 'bar': 1, 'baz': 2})    # create a SimConfig object, initializes it with a dictionary {'foo': 0} such that
assert cfg.foo == 0                                      # cfg.foo == 0
assert cfg.bar == 1                                      # cfg.bar == 1
assert cfg.baz == 2                                      # cfg.baz == 2
cfg.update({'foo': 3})                                   # update the cfg object with any relevant mappings for this particular batch job
assert cfg.foo == 3                                      # cfg.foo == 3
assert cfg.bar == 1                                      # cfg.bar remains unchanged
assert cfg.baz == 2                                      # cfg.baz remains unchanged

これは、バッチ ジョブの送信からのマッピングで SimConfig オブジェクトを更新するための以前の NetPyNE コードを置き換えます。

4. simConfig オブジェクト内の追加機能

メソッド cfg.update() は、オプションの引数 force_match もサポートします。これにより、更新ディクショナリ内の値が SimConfig オブジェクト内の既存の属性と強制的に一致します。実行時に SimConfig オブジェクト内に新しい属性が誤って作成されていないかどうかを確認するために、デバッグ中にこの設定を True に設定することをお勧めします。

from netpyne.batchtools import specs                     # import the custom batch specs
cfg = specs.SimConfig({'type': 0})                       # create a SimConfig object, initializes it with a dictionary {'type': 0} such that
assert cfg.foo == 0                                      # cfg.type == 0
try:
    cfg.update({'typo': 1}, force_match=True)            # cfg.typo is not defined, so this line will raise an AttributeError
except Exception as e:
    print(e)
cfg.update({'typo': 1})                                  # without force_match, the typo attribute is created and set to 1
assert cfg.type == 0                                     # cfg.type remains unchanged due to a typo in the attribute name 'type' -> 'typo'
assert cfg.typo == 1                                     # instead, cfg.typo is created and set to the value 1

specs.SimConfig() を使用した cfg オブジェクトの初期化と、その後の cfg.update() の呼び出しの両方で、ドット表記とネストされたコンテナーの両方が処理されます。

from netpyne.batchtools import specs
cfg = specs.SimConfig({'foo': {'val0': 0, 'arr0': [0, 1, 2]}})
assert cfg.foo['val0'] == 0
assert cfg.foo['arr0'][0] == 0
cfg.update({'foo': {'val0': 10,           # update cfg.foo['val0'] to 10
                    'arr0': {0: 20        # update cfg.arr0[0] to 20
                             1: 30}}})    # update cfg.arr0[1] to 30
assert cfg.foo['val0'] == 10
assert cfg.foo['arr0'][0] == 20
assert cfg.foo['arr0'][1] == 30
assert cfg.foo['arr0'][2] == 2            # cfg.arr0[2] remains unchanged

提供された辞書による cfg オブジェクトの更新は、バッチ検索で指定されたパラメーターで更新する前に行われます。

5. sim.send 関数 を使用して、ソケット経由で検索アルゴリズムに結果を伝達します。

以前のバッチ シミュレーションは、データの通信に .pkl ファイルに依存していました。照合を容易にするために、シミュレーションの終了時に特定のデータ値をソケット経由で直接送信できます。

  • sim.send(<data>): <data> をバッチ dispatcher に送信します

search ジョブの場合、送信されたデータを検索関数で指定されたメトリックと照合することが重要です。たとえば、検索呼び出しでメトリクス「損失」を指定する場合、sim.send はキーと値のペア {'loss': <value>} を指定する必要があります。

6. バッチジョブの指定

バッチ ジョブ処理は netpyne.batchtools.search から実装されます。以下は、search 関数に関連する引数の選択です。引数の完全なリストは、次の呼び出しで入手できます。

from netpyne.batchtools import search
help(search)

検索 API (切り捨て):

def search(
      job_type: Optional[str] = None, # the submission engine to run a single simulation (e.g. 'sge', 'sh')
      comm_type: Optional[str] = None, # the method of communication between host dispatcher and the simulation (e.g. 'socket', 'filesystem')
      run_config: Optional[dict] = None,  # batch configuration, (keyword: string pairs to customize the submit template)
      params: Optional[dict] = None,  # search space (dictionary of parameter keys: tune search spaces)
      algorithm: Optional[str] = "variant_generator", # search algorithm to use, see SEARCH_ALG_IMPORT for available options
      label: Optional[str] = "search",  # label for the search, any files generated will be prefixed with this string
      output_path: Optional[str] = './batch',  # directory for storing generated files, either relative to the current working directory if starting with '.' or an absolute path if starting with '/'
      checkpoint_path: Optional[str] = './checkpoint',  # directory for storing checkpoint files, either relative to the current working directory if starting with '.' or an absolute path if starting with '/'
      max_concurrent: Optional[int] = 1,  # number of concurrent trials to run at one time
      num_samples: Optional[int] = 1,  # number of trials to run; for parameter grids, a value of 1 means that the search will sample the parameter space of each value in the grid
      metric: Optional[str] = None, # metric to optimize (this should match some key: value pair in the returned data)
      mode: Optional[str] = "min",  # either 'min' or 'max' (whether to minimize or maximize the metric)
      sample_interval: Optional[int] = 15,  # interval to poll for new results (in seconds)
      attempt_restore: Optional[bool] = True, # whether to attempt to restore from a checkpoint
      file_cleanup: Optional[bool] = True, # whether to clean up accessory files after the search is completed
      advanced_logging: Optional[bool|str] = True, # advanced logging including generation of a batch .log file and an sqlite .db file (will be created in a timestamped directory by default).
      ) -> study: # results of the search

search 関数で実装されたデフォルトのパラメーター検索は、検索アルゴリズムのバックエンドとして ray.tune を使用し、結果を保存する .csv を作成し、出力を含む study オブジェクトを返します。次の 2 つのパラメータを取ります。

  • job_type: ジョブの送信方法を指定します。 「sge」 は、Sun Grid Engine を通じてバッチ ジョブを送信します。 「sh」 は、ローカル マシン上のシェルを通じてバッチ ジョブを送信します。 「ssh_slurm」 または「ssh_sge」は、SSH 接続を介して Slurm ワークロード マネージャーまたは Sun Grid Engine を通じてバッチ ジョブを送信します。

  • comm_type: ジョブがディスパッチャーと通信する方法を指定します。 「socket」 (INET ソケット)、「sfs」 (共有ファイル システム)、「sftp」 (SSH 経由で実行されるジョブ用の安全なファイル転送プロトコル)、または 「なし」comm_type が「なし」として指定されている場合、検索は次のジョブ送信を実行する前にシミュレーションからのデータを待機したり受信したりしません。これは、「グリッド」、「バリアントジェネレーター」、または「ランダム」アルゴリズムで実行される検索にのみ適用され、結果は後続の検索候補を推測するために使用されません。

現在、job_type および comm_type では次の引数のペアが受け入れられます。

=======================
job_type    , comm_type
=======================
'sge'       , 'socket'    -> job submission through Sun Grid Engine, INET socket based communication
'sge'       , 'sfs'       -> job submission through Sun Grid Engine, communication via shared file system
'sge'       , None        -> job submission through Sun Grid Engine, no communication (only grid or random searches)
'ssh_sge'   , 'sftp'      -> remote SSH onto a gateway, job submission through Sun Grid Engine, communication via Secure FTP
'ssh_slurm' , 'sftp'      -> remote SSH onto a gateway, job submission through Slurm, communication via Secure FTP
'ssh_sge'   , None        -> remote SSH onto a gateway, job submission through Sun Grid Engine, no communication (only grid or random searches)
'ssh_slurm' , None        -> remote SSH onto a gateway, job submission through Slurm, no communication (only grid or random searches)
'sh'        , 'socket'    -> job run directly on local shell, INET socket based communication
'sh'        , 'sfs'       -> job run directly on local shell, communication via shared file system
'sh'        , None        -> job run directly on local shell, no communication (only grid or random searches)
  • run_config: 送信テンプレートをカスタマイズするためのキーワード: 文字列ペアの辞書。予期されるキーワード: 文字列ペアは job_type に依存します。
=======
sge (job_type as sge or ssh_sge)
=======
queue: the queue to submit the job to (#$ -q {queue})
cores: the number of cores to request for the job (#$ -pe smp {cores})
vmem: the amount of memory to request for the job (#$ -l h_vmem={vmem})
realtime: the amount of time to request for the job (#$ -l h_rt={realtime})
command: the command to run for the job

example:
run_config = {
    'queue': 'cpu.q',       # request job to be run on the 'cpu.q' queue
    'cores': 8,             # request 8 cores for the job
    'vmem': '8G',           # request 8GB of memory for the job
    'realtime': '24:00:00', # set timeout of the job to 24 hours
    'command': 'mpiexec -n $NSLOTS -hosts $(hostname) nrniv -python -mpi init.py'
} # set the command to be run to 'mpiexec -n $NSLOTS -hosts $(hostname) nrniv -python -mpi init.py'

=======
sh (job_type is sh)
=======
command: the command to run for the job

example:
run_config = {
    'command': 'mpiexec -n 8 nrniv -python -mpi init.py'
} # set the command to be run

=======
slurm (job_type as ssh_slurm)
=======
allocation:   the allocation for the job (#SBATCH -A {allocation})
partition:    the partition for the job (#SBATCH --partition={partition})
nodes:        the number of nodes to distribute the job (#SBATCH --nodes={nodes})
coresPerNode: the number of cores per node (#SBATCH --ntasks-per-node={coresPerNode})
mem:          the amount of memory to request for the job (#SBATCH --mem={mem})
email:        the user's email for status communication (#SBATCH --mail-user={email})
custom:       any commands to run before the job command
command:      the command to run for the job

example:
run_config = {
    'allocation': 'aaa111',
    'partition': 'cpu.q',
    'nodes': 1,
    'coresPerNode': 4,
    'mem': '8G',
    'email': '[email protected],
    'custom': 'conda activate myenv',
    'command': 'mpiexec -n 4 nrniv -python -mpi init.py'
}
  • params: 検索を実行する構成値の辞書。辞書のキーは、更新する構成オブジェクトのキーと一致する必要があります。リストまたは numpy ジェネレーター > 2 つの値は、値に対してグリッドまたは選択肢の検索を強制します。それ以外の場合、検索アルゴリズムが明示的に「グリッド」に設定されている場合を除き、2 つの値のリストにより一様分布サンプル空間が作成されます。

使用法 1: SimConfig オブジェクトで指定された定数値を更新します。

# take a config object with the following parameter ``foo``
cfg = specs.SimConfig()
cfg.foo = 0
cfg.update()

# specify a search space for ``foo`` such that a simulation will run with:
# cfg.foo = 0
# cfg.foo = 1
# cfg.foo = 2
# ...
# cfg.foo = 9

# using:
params = {
    'foo': range(10)
}

使用法 2: SimConfig オブジェクト内のネストされたオブジェクトを更新します。

# to update a nested object, the package uses the `.` operator to specify reflection into the object.
# take a config object with the following parameter object ``foo``
cfg = specs.SimConfig()
cfg.foo = {'bar': 0, 'baz': 0}
cfg.update()

# specify a search space for ``foo['bar']`` with `foo.bar` such that a simulation will run:
# cfg.foo['bar'] = 0
# cfg.foo['bar'] = 1
# cfg.foo['bar'] = 2
# ...
# cfg.foo['bar'] = 9

# using:
params = {
    'foo.bar': range(10)
}

# this reflection works with nested objects as well...
# i.e.
# cfg.foo = {'bar': {'baz': 0}}
# params = {'foo.bar.baz': range(10)}

使用法 3: SimConfig オブジェクト内のリスト オブジェクトを更新します。

# to update a nested object, the package uses the `.` operator to specify reflection into the object.
# take a config object with the following
cfg = specs.SimConfig()
cfg.foo = [0, 1, 4, 9, 16]
cfg.update()

# specify a search space for ``foo[0]`` with `foo.0` such that a simulation will run:
# cfg.foo[0] = 0
# cfg.foo[0] = 1
# cfg.foo[0] = 2
# ...
# cfg.foo[0] = 9

# using:
params = {
    'foo.0': range(10)
}

# this reflection works with nested objects as well...
  • algorithm : 検索アルゴリズム (ray.tune 内でサポートされています)

サポートされているアルゴリズム

* "grid": forces grid based search over the parameter space, but otherwise functions similar to "variant generator"
* "variant_generator": grid and random based search of the parameter space (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "random": grid and random based search of the parameter space (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "axe": Ax optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "bayesopt": Bayesian optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "hyperopt": Hyper optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "bohb": Bayesian Optimization HyperBand algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "nevergrad": Nevergrad optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "optuna": Optuna hyperparameter optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "hebo": Heteroscedastic Evolutionary Bayesian Optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
* "zoopt": Derivateive-free optimization algorithm (see: https://docs.ray.io/en/latest/tune/api/suggestion.html)
  • label: 検索用のラベル。出力ファイルの名前付けに使用されます。

  • output_path: 生成されたファイルを保存するディレクトリ。相対パスまたは絶対パスを指定できます。

  • checkpoint_path: 検索を復元する必要がある場合に備えて、内部レイ チェックポイント ファイル (ray.tune によって維持される) を保存するディレクトリ。相対パスまたは絶対パスを指定できます。このチェックポイント パスは検索状態を維持し、検索の復元を可能にします。検索が正常に完了すると、検索のデフォルトの動作ではチェックポイント ディレクトリが削除されます。

  • max_concurrent: 一度に実行する同時トライアルの数

  • num_samples: パラメータ グリッドの場合、実行する試行の数。値 1 は、検索がグリッド内の各値のパラメータ空間をサンプリングすることを意味します。

  • metric: 最適化するメトリック (これは、返されたデータ内のキーと値のペアに一致する必要があります)。 "grid""variant_generator"、および "random" アルゴリズムではオプションで、Nonecomm_type として指定されますが、最適化アルゴリズムには必須です

  • モード: 「min」または「max」のいずれか (メトリクスを最小化するか最大化するか)。上記と同様にオプションです。

  • sample_interval: 新しい結果をポーリングする間隔 (秒単位) (ファイル システム ベースの通信方法のポーリング)。

  • attempt_restore: True の場合、検索は最初に checkpoint_path のチェックポイントからの復元を試みます。これは、中断されたバッチ ジョブを復元するのに役立ちます (同じスクリプトを再度実行するだけです)。

7. Rosenbrock 関数でのバッチ検索 (いくつかの簡単な例)

NetPyNE github</a> の examples ディレクトリ には、2 次元 Rosenbrock 関数の自動パラメーター検索を実行する複数の方法が含まれています。これらの例は、詳細な NEURON シミュレーションでパラメーター検索を実行する完全なプロセス (7. パラメーター最適化検索の実行 (CA3 の例) を参照) ではなく、バッチ通信の機能の一部を簡単に示すために使用されます。そのため、パラメーター スペースと検索メソッドの詳細を記述したスクリプトを含む batch.py ファイルと、探索する関数と、バッチ自動化と通信の適切な宣言と呼び出し (従来の cfg.py、netParams.py、および init.py ファイル)。

  1. basic_rosenbrock

これは、新しい batchtools を使用した Rosenbrock 関数の基本的なグリッド検索を示しています。検索空間は、params['x0']params['x1'] のデカルト積として定義されます。

# from batch.py
params = {'x0': [0, 3],
          'x1': [0, 3],
         }

つまり、値 cfg.x0cfg.x1 を繰り返します。 [(0, 0), (0, 3), (3, 0), (3, 3)]リスト

  1. coupled_rosenbrock

これは、基本的なペア グリッド検索を示しています。ここで、x0[0, 1, 2]、x1[n] は x0[n]**2 です。

# from batch.py
x0 = numpy.arange(0, 3)
x1 = x0**2

x0_x1 = [*zip(x0, x1)]
params = {'x0_x1': x0_x1
          }

x0 値と x1 値がペアになって、以下を繰り返す検索スペース x0_x1 が作成されます。 [(0, 0), (1, 1), (2, 4)]リスト

次に、rosenbrock.py ファイル内で、x0_x1 値を取得するために 2 つの値のリスト cfg.x0_x1 が作成され、その後、個別の x0 値と x1 値に解凍されます。

# from rosenbrock.py
cfg.x0_x1 = [1, 1]

cfg.update_cfg()

# -------------- unpacking x0_x1 list  -------------- #
x0, x1 = cfg.x0_x1

次に、Rosenbrock 関数は、アンパックされた x0 および x1 を使用して評価されます。

  1. random_rosenbrock

これは、ネストされたオブジェクトに対するグリッド検索を示しています。xn は、次のデカルト積を検索するために個別に変更される 2 つの値のリストです。 [0, 1, 2, 3, 4] および[0, 1, 2, 3, 4]

# from batch.py
params = {'xn.0': numpy.arange(0, 5),
          'xn.1': numpy.arange(0, 5)
         }

xn.0xn.1 を使用すると、rosenbrock.py で作成および変更されたリストの 0 番目と 1 番目の要素を参照できます。

# from rosenbrock.py
cfg.xn = [1, 1]

cfg.update_cfg()

# ---------------- unpacking x list  ---------------- #
x0, x1 = cfg.xn

8. パラメーター最適化検索の実行 (CA3 の例)

NetPyNE github</a> の examples ディレクトリ には、grid ベースの検索と optuna ベースの最適化の両方が表示されます。

CA3 の例では、PYR->BC NMDA および AMPA のシナプス ウェイトと、BC->PYR GABA のシナプス ウェイトを調整します。

optuna ベースのパラメーター最適化の場合、検索スペースの上限と下限は optuna_search.py で次のように定義されます。

# from optuna_search.py
params = {'nmda.PYR->BC' : [1e-3, 1.8e-3],
          'ampa.PYR->BC' : [0.2e-3, 0.5e-3],
          'gaba.BC->PYR' : [0.4e-3, 1.0e-3],
         }

対照的に、グリッドベースのパラメーター探索の場合、検索対象の 3x3x3 固有の値は、grid_search.py で次のように定義されます。

# from grid_search.py
params = {'nmda.PYR->BC' : numpy.linspace(1e-3, 1.8e-3, 3),
          'ampa.PYR->BC' : numpy.linspace(0.2e-3, 0.5e-3, 3),
          'gaba.BC->PYR' : numpy.linspace(0.4e-3, 1.0e-3, 3),
         }

metric は、レポートと最適化を行う特定の string (loss) を設定することに注意してください。この値は、init.py シミュレーションによって生成および送信されます。

if sim.rank == 0: # after simulation, handle calculations on the host core.
    # from init.py
    results['PYR_loss'] = (results['PYR'] - 3.33875)**2
    results['BC_loss']  = (results['BC']  - 19.725 )**2
    results['OLM_loss'] = (results['OLM'] - 3.470  )**2
    results['loss'] = (results['PYR_loss'] + results['BC_loss'] + results['OLM_loss']) / 3
    out_json = json.dumps({**inputs, **results})

    print(out_json)
    sim.send(out_json))

out_json 出力には、loss メトリック (観測値と期待値の間の MSE として計算) を含むディクショナリが含まれています。

多目的最適化では、関連する PYR_lossBC_loss、および OLM_loss コンポーネントが追加で含まれます (mo_optuna_search.py を参照)。

9. Ray チェックポイントと中断された検索の再開

このベータ リリースの新機能は、ray バックエンドを介したチェックポイント設定と検索進行状況の保存です。このデータは、search 関数で指定された checkpoint_path ディレクトリに保存されます (デフォルトは、ソース ディレクトリ内に新しく作成された checkpoint フォルダです。search のデフォルトの動作では、バッチ ジョブが中断された場合に自動的に復元が試行されます)。

検索が正常に完了すると、デフォルトの動作ではこれらのチェックポイント ファイルが削除されます。ユーザーがコーディング エラーにより検索を手動で終了し、検索を再開したい場合は、最初に checkpoint_path を削除する必要があります。

10. fANOVA を用いたパラメータ重要度評価 (不安定)

このベータ リリースのもう 1 つの新機能は、Optuna および scikit-learn ライブラリを介して関数 ANOVA にヒントを得たアルゴリズムを使用してパラメーターの重要性を評価する機能です。 (ヒッター論文の原文とその引用引用を参照)

現在、単一メトリック スコアに対するペアになっていない単一パラメーターの重要性のみが、NetPyNE.batchtools.analysis Analyzer オブジェクトを通じてサポートされています。その使用例は here です。

この例を実行するには、batch.py を使用して出力 grid.csv を生成し、その grid.csvAnalyzer オブジェクトにロードします。最後に、run_analysis を実行すると、パラメーターの推定 importance を示すパラメーターごとに 1 つのスコアが生成されます。つまり、指定された範囲内のモデルの合計分散に対する推定効果です。

# from analysis.py
from netpyne.batchtools.analysis import Analyzer

analyzer = Analyzer(params = ['x.0', 'x.1', 'x.2', 'x.3'], metrics = ['fx']) # specify the parameter space and metrics of the batch function
analyzer.load_file('grid.csv') # load the grid file generated by the batch run
results = analyzer.run_analysis() # run fANOVA analysis and store the importance values in a results dictionary