mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
370 lines
11 KiB
Text
370 lines
11 KiB
Text
import Semantics.PhysicsScalar
|
|
import Semantics.PhysicsEuclidean
|
|
import Semantics.PhysicsLagrangian
|
|
import Semantics.RegimeCore
|
|
import Semantics.ElectromagneticSpectrum
|
|
import Semantics.ExoticSpacetime
|
|
|
|
namespace Semantics.SpikingDynamics
|
|
|
|
open Semantics.PhysicsScalar
|
|
open Semantics.PhysicsEuclidean
|
|
open Semantics.PhysicsLagrangian
|
|
open Semantics.RegimeCore
|
|
open Semantics.ElectromagneticSpectrum
|
|
open Semantics.ExoticSpacetime
|
|
|
|
abbrev SpikeNodeId := UInt16
|
|
abbrev SpikeEventId := UInt16
|
|
abbrev SynapseId := UInt16
|
|
|
|
inductive SpikePolarity
|
|
| excitatory
|
|
| inhibitory
|
|
| modulatory
|
|
deriving Repr, DecidableEq
|
|
|
|
inductive SpikingRegime
|
|
| quiescent
|
|
| integrating
|
|
| firing
|
|
| refractory
|
|
| oscillatory
|
|
| gated
|
|
deriving Repr, DecidableEq
|
|
|
|
inductive EmHookMode
|
|
| disabled
|
|
| passiveSense
|
|
| activeCoupling
|
|
| carrierDrive
|
|
deriving Repr, DecidableEq
|
|
|
|
inductive TemporalHookMode
|
|
| localOnly
|
|
| dilated
|
|
| causallyGated
|
|
| curveAligned
|
|
deriving Repr, DecidableEq
|
|
|
|
inductive RegionHookMode
|
|
| unrestricted
|
|
| regimeChecked
|
|
| gateChecked
|
|
| partitionChecked
|
|
deriving Repr, DecidableEq
|
|
|
|
inductive EmissionStatus
|
|
| emitted
|
|
| suppressed
|
|
| blocked
|
|
deriving Repr, DecidableEq
|
|
|
|
structure MembraneState where
|
|
potential : Q16_16
|
|
threshold : Q16_16
|
|
leak : Q16_16
|
|
refractoryLevel : Q16_16
|
|
recovery : Q16_16
|
|
coherence : Q16_16
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SpikeEvent where
|
|
eventId : SpikeEventId
|
|
originNodeId : SpikeNodeId
|
|
intensity : Q16_16
|
|
polarity : SpikePolarity
|
|
temporalOrder : TemporalOrder
|
|
carrier? : Option NamedCarrier
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SynapticGate where
|
|
synapseId : SynapseId
|
|
sourceNodeId : SpikeNodeId
|
|
targetNodeId : SpikeNodeId
|
|
gain : Q16_16
|
|
delay : Q16_16
|
|
openThreshold : Q16_16
|
|
polarity : SpikePolarity
|
|
requiresSpectralMatch : Bool
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SpikingNode (n : Nat) where
|
|
nodeId : SpikeNodeId
|
|
kinematics : PhysicsLagrangian n
|
|
membrane : MembraneState
|
|
regionId : RegionId
|
|
regime : SpikingRegime
|
|
deriving Repr, DecidableEq
|
|
|
|
structure ElectromagneticHook where
|
|
mode : EmHookMode
|
|
admittedBands : List SpectrumBand
|
|
minimumIntensity : Q16_16
|
|
minimumCoherence : Q16_16
|
|
requiredRole? : Option CarrierRole
|
|
allowedCarriers : List NamedCarrier
|
|
deriving Repr, DecidableEq
|
|
|
|
structure TemporalHook where
|
|
mode : TemporalHookMode
|
|
minimumCoherence : Q16_16
|
|
admittedTemporalRegimes : List TemporalRegime
|
|
requiresTimelikeAdmissibility : Bool
|
|
deriving Repr, DecidableEq
|
|
|
|
structure RegionHook where
|
|
mode : RegionHookMode
|
|
sourceRegionId : RegionId
|
|
targetRegionId : RegionId
|
|
admittedRegimes : List RegimeClass
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SpikingApiSurface where
|
|
emHook? : Option ElectromagneticHook
|
|
temporalHook? : Option TemporalHook
|
|
regionHook? : Option RegionHook
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SpikingTransitionRequest (n : Nat) where
|
|
node : SpikingNode n
|
|
incomingCharge : Q16_16
|
|
gate : SynapticGate
|
|
event : SpikeEvent
|
|
apiSurface : SpikingApiSurface
|
|
sample? : Option ElectromagneticSample
|
|
sourceTemporalRegime : TemporalRegime
|
|
targetTemporalRegime : TemporalRegime
|
|
sourceRegimeClass : RegimeClass
|
|
targetRegimeClass : RegimeClass
|
|
deriving Repr, DecidableEq
|
|
|
|
structure SpikingTransitionResult (n : Nat) where
|
|
status : EmissionStatus
|
|
updatedNode : SpikingNode n
|
|
emittedEvent? : Option SpikeEvent
|
|
resolvedRegime : SpikingRegime
|
|
deriving Repr, DecidableEq
|
|
|
|
|
|
def defaultMembraneState : MembraneState :=
|
|
{ potential := Q16_16.zero
|
|
, threshold := Q16_16.one
|
|
, leak := Q16_16.quarter
|
|
, refractoryLevel := Q16_16.zero
|
|
, recovery := Q16_16.half
|
|
, coherence := Q16_16.one }
|
|
|
|
|
|
def defaultSpikingApiSurface : SpikingApiSurface :=
|
|
{ emHook? := none
|
|
, temporalHook? := none
|
|
, regionHook? := none }
|
|
|
|
|
|
def isCarrierAllowed (hook : ElectromagneticHook) (event : SpikeEvent) : Bool :=
|
|
match event.carrier? with
|
|
| none => hook.allowedCarriers.isEmpty
|
|
| some carrier => hook.allowedCarriers.isEmpty || carrier ∈ hook.allowedCarriers
|
|
|
|
|
|
def namedCarrierToBand (carrier : NamedCarrier) : SpectrumBand :=
|
|
match carrier with
|
|
| .genericRadio | .cellular | .gps => .radio
|
|
| .wifi | .bluetooth | .radar => .microwave
|
|
| .infraredLink => .infrared
|
|
| .lidar | .visibleLight => .visible
|
|
| .ultravioletSource => .ultraviolet
|
|
| .xrayImaging => .xray
|
|
| .gammaBurst => .gamma
|
|
|
|
|
|
def eventCompatibleWithEm
|
|
(hook : ElectromagneticHook)
|
|
(event : SpikeEvent)
|
|
(sample? : Option ElectromagneticSample) : Bool :=
|
|
match hook.mode with
|
|
| .disabled => true
|
|
| .passiveSense | .activeCoupling | .carrierDrive =>
|
|
let carrierOk := isCarrierAllowed hook event
|
|
let sampleOk :=
|
|
match sample? with
|
|
| none => hook.mode = .carrierDrive && carrierOk
|
|
| some sample =>
|
|
let bandOk := sample.bandProfile.band ∈ hook.admittedBands
|
|
let intensityOk := Q16_16.ge sample.intensity hook.minimumIntensity
|
|
let coherenceOk := Q16_16.ge sample.coherence hook.minimumCoherence
|
|
let roleOk :=
|
|
match hook.requiredRole? with
|
|
| none => true
|
|
| some role => sample.role = role
|
|
bandOk && intensityOk && coherenceOk && roleOk
|
|
carrierOk && sampleOk
|
|
|
|
|
|
def eventCompatibleWithTemporal
|
|
(hook : TemporalHook)
|
|
(sourceTemporalRegime targetTemporalRegime : TemporalRegime) : Bool :=
|
|
match hook.mode with
|
|
| .localOnly => sourceTemporalRegime = targetTemporalRegime
|
|
| .dilated => targetTemporalRegime ∈ hook.admittedTemporalRegimes
|
|
| .causallyGated => sourceTemporalRegime ∈ hook.admittedTemporalRegimes && targetTemporalRegime ∈ hook.admittedTemporalRegimes
|
|
| .curveAligned => targetTemporalRegime = .cyclic || targetTemporalRegime = .branched
|
|
|
|
|
|
def eventCompatibleWithRegion
|
|
(hook : RegionHook)
|
|
(sourceRegionId targetRegionId : RegionId)
|
|
(sourceRegimeClass targetRegimeClass : RegimeClass) : Bool :=
|
|
match hook.mode with
|
|
| .unrestricted => true
|
|
| .regimeChecked => sourceRegimeClass ∈ hook.admittedRegimes && targetRegimeClass ∈ hook.admittedRegimes
|
|
| .gateChecked | .partitionChecked =>
|
|
hook.sourceRegionId = sourceRegionId &&
|
|
hook.targetRegionId = targetRegionId &&
|
|
sourceRegimeClass ∈ hook.admittedRegimes &&
|
|
targetRegimeClass ∈ hook.admittedRegimes
|
|
|
|
|
|
def apiAllowsTransition
|
|
(apiSurface : SpikingApiSurface)
|
|
(event : SpikeEvent)
|
|
(sample? : Option ElectromagneticSample)
|
|
(sourceTemporalRegime targetTemporalRegime : TemporalRegime)
|
|
(sourceRegionId targetRegionId : RegionId)
|
|
(sourceRegimeClass targetRegimeClass : RegimeClass) : Bool :=
|
|
let emOk :=
|
|
match apiSurface.emHook? with
|
|
| none => true
|
|
| some hook => eventCompatibleWithEm hook event sample?
|
|
let temporalOk :=
|
|
match apiSurface.temporalHook? with
|
|
| none => true
|
|
| some hook => eventCompatibleWithTemporal hook sourceTemporalRegime targetTemporalRegime
|
|
let regionOk :=
|
|
match apiSurface.regionHook? with
|
|
| none => true
|
|
| some hook => eventCompatibleWithRegion hook sourceRegionId targetRegionId sourceRegimeClass targetRegimeClass
|
|
emOk && temporalOk && regionOk
|
|
|
|
|
|
def integratePotential (membrane : MembraneState) (incomingCharge gain : Q16_16) : MembraneState :=
|
|
let driven := Q16_16.mulQ16_16 incomingCharge gain
|
|
{ membrane with potential := Q16_16.add membrane.potential driven }
|
|
|
|
|
|
def applyLeak (membrane : MembraneState) : MembraneState :=
|
|
{ membrane with potential := Q16_16.subSaturating membrane.potential membrane.leak }
|
|
|
|
|
|
def applyRefractoryClamp (membrane : MembraneState) : MembraneState :=
|
|
let lowered := Q16_16.subSaturating membrane.refractoryLevel membrane.recovery
|
|
{ membrane with refractoryLevel := lowered }
|
|
|
|
|
|
def membraneReadyToFire (membrane : MembraneState) : Bool :=
|
|
Q16_16.ge membrane.potential membrane.threshold && Q16_16.isZero membrane.refractoryLevel
|
|
|
|
|
|
def classifySpikingRegime (membrane : MembraneState) : SpikingRegime :=
|
|
if membraneReadyToFire membrane then
|
|
.firing
|
|
else if Q16_16.nonZero membrane.refractoryLevel then
|
|
.refractory
|
|
else if Q16_16.ge membrane.potential Q16_16.half then
|
|
.integrating
|
|
else if Q16_16.nonZero membrane.coherence then
|
|
.oscillatory
|
|
else
|
|
.quiescent
|
|
|
|
|
|
def gatedIntensity (event : SpikeEvent) (gate : SynapticGate) : Q16_16 :=
|
|
let driven := Q16_16.mulQ16_16 event.intensity gate.gain
|
|
if Q16_16.ge driven gate.openThreshold then driven else Q16_16.zero
|
|
|
|
|
|
def nextEventFromNode (node : SpikingNode n) (request : SpikingTransitionRequest n) : SpikeEvent :=
|
|
{ request.event with
|
|
originNodeId := node.nodeId
|
|
intensity := node.membrane.potential }
|
|
|
|
|
|
def updateNodeAfterEmission (node : SpikingNode n) : SpikingNode n :=
|
|
let membrane :=
|
|
{ node.membrane with
|
|
potential := Q16_16.zero
|
|
refractoryLevel := node.membrane.threshold }
|
|
{ node with membrane := membrane, regime := .refractory }
|
|
|
|
|
|
def processSpikeTransition
|
|
(request : SpikingTransitionRequest n) : SpikingTransitionResult n :=
|
|
let apiAllowed :=
|
|
apiAllowsTransition
|
|
request.apiSurface
|
|
request.event
|
|
request.sample?
|
|
request.sourceTemporalRegime
|
|
request.targetTemporalRegime
|
|
request.node.regionId
|
|
request.node.regionId
|
|
request.sourceRegimeClass
|
|
request.targetRegimeClass
|
|
if !apiAllowed then
|
|
{ status := .blocked
|
|
, updatedNode := request.node
|
|
, emittedEvent? := none
|
|
, resolvedRegime := request.node.regime }
|
|
else
|
|
let gatedCharge := gatedIntensity request.event request.gate
|
|
let integrated := integratePotential request.node.membrane (Q16_16.add request.incomingCharge gatedCharge) request.gate.gain
|
|
let leaked := applyLeak integrated
|
|
let recovered := applyRefractoryClamp leaked
|
|
let updatedNode := { request.node with membrane := recovered, regime := classifySpikingRegime recovered }
|
|
if membraneReadyToFire recovered then
|
|
let emitted := nextEventFromNode updatedNode request
|
|
let resetNode := updateNodeAfterEmission updatedNode
|
|
{ status := .emitted
|
|
, updatedNode := resetNode
|
|
, emittedEvent? := some emitted
|
|
, resolvedRegime := resetNode.regime }
|
|
else
|
|
{ status := .suppressed
|
|
, updatedNode := updatedNode
|
|
, emittedEvent? := none
|
|
, resolvedRegime := updatedNode.regime }
|
|
|
|
|
|
def wifiSpikeHook : ElectromagneticHook :=
|
|
{ mode := .carrierDrive
|
|
, admittedBands := [.microwave]
|
|
, minimumIntensity := Q16_16.eighth
|
|
, minimumCoherence := Q16_16.quarter
|
|
, requiredRole? := some .communicationLink
|
|
, allowedCarriers := [.wifi, .bluetooth] }
|
|
|
|
|
|
def opticalSpikeHook : ElectromagneticHook :=
|
|
{ mode := .activeCoupling
|
|
, admittedBands := [.infrared, .visible]
|
|
, minimumIntensity := Q16_16.quarter
|
|
, minimumCoherence := Q16_16.quarter
|
|
, requiredRole? := none
|
|
, allowedCarriers := [.lidar, .visibleLight, .infraredLink] }
|
|
|
|
|
|
def defaultTemporalSpikeHook : TemporalHook :=
|
|
{ mode := .causallyGated
|
|
, minimumCoherence := Q16_16.quarter
|
|
, admittedTemporalRegimes := [.monotonic, .dilated, .branched]
|
|
, requiresTimelikeAdmissibility := false }
|
|
|
|
|
|
def flatlandRegionHook (regionId : RegionId) : RegionHook :=
|
|
{ mode := .regimeChecked
|
|
, sourceRegionId := regionId
|
|
, targetRegionId := regionId
|
|
, admittedRegimes := [.free, .boundary, .spectral] }
|
|
|
|
end Semantics.SpikingDynamics
|