Skip to content

API Cheatsheet

One-liner reference for the most common SC-NeuroCore operations.


Bitstream Encoding

from sc_neurocore import BitstreamEncoder, bitstream_to_probability

enc = BitstreamEncoder(x_min=0.0, x_max=1.0, length=1024, seed=42)
bits = enc.encode(0.7)                          # → uint8 array
p = bitstream_to_probability(bits)              # → ~0.7

from sc_neurocore import generate_bernoulli_bitstream, generate_sobol_bitstream
bits = generate_bernoulli_bitstream(0.5, 1024)  # Bernoulli (O(1/√L))
bits = generate_sobol_bitstream(0.5, 1024)      # Sobol (O(1/L), tighter)

SC Arithmetic

from sc_neurocore import BitstreamSynapse, BitstreamDotProduct

syn = BitstreamSynapse(w_min=0.0, w_max=1.0, w=0.8, length=1024, seed=42)
out = syn.apply(input_bits)                     # AND gate multiplication

dp = BitstreamDotProduct([syn1, syn2, syn3])
_, current = dp.apply(pre_matrix)               # dot product via popcount

from sc_neurocore.utils.bitstreams import sc_divide
z = sc_divide(numerator_bits, denominator_bits) # CORDIV division

Neurons

from sc_neurocore import StochasticLIFNeuron

neuron = StochasticLIFNeuron(v_threshold=1.0, tau_mem=20.0, dt=1.0)
spike = neuron.step(input_current)              # → 0 or 1

from sc_neurocore.neurons.equation_builder import from_equations
neuron = from_equations("dv/dt = -(v-E_L)/tau + I/C",
                        threshold="v > -50", reset="v = -65",
                        params=dict(E_L=-65, tau=10, C=1), init=dict(v=-65))

Network Simulation

from sc_neurocore.network.population import Population
from sc_neurocore.network.projection import Projection
from sc_neurocore.network.network import Network
from sc_neurocore.network.monitor import SpikeMonitor
from sc_neurocore.network.stimulus import PoissonInput

pop_e = Population(StochasticLIFNeuron, n=800, label="exc")
pop_i = Population(StochasticLIFNeuron, n=200, label="inh")
proj = Projection(pop_e, pop_i, weight=0.1, probability=0.1, seed=42)
drive = PoissonInput(n=800, rate_hz=100.0, weight=2.0, dt=0.001, seed=42)
mon = SpikeMonitor(pop_e)

net = Network(pop_e, pop_i, proj, drive, mon, fim_lambda=0.0)
net.run(duration=1.0, dt=0.001)                 # 1 second simulation
print(mon.count, mon.spike_trains)

Topology Generators

from sc_neurocore.network.topology import (
    random_connectivity,    # Erdos-Renyi
    small_world,            # Watts-Strogatz
    scale_free,             # Barabasi-Albert
    ring_topology,          # nearest-neighbour ring
    grid_topology,          # 2D lattice
    all_to_all,             # full connectivity
)
indptr, indices, data = random_connectivity(100, 100, p=0.1, weight=0.5)

Equation → Verilog

from sc_neurocore.compiler.equation_compiler import compile_to_verilog, equation_to_fpga

neuron, verilog = equation_to_fpga(
    "dv/dt = -(v-E_L)/tau + I/C",
    threshold="v > -50", reset="v = -65",
    params=dict(E_L=-65, tau=10, C=1), init=dict(v=-65),
    module_name="my_lif",
)
# verilog is synthesisable Q8.8 SystemVerilog string

Surrogate Gradient Training (PyTorch)

from sc_neurocore.training import LIFCell, train_epoch, evaluate, auto_device

model = SpikingNet(...)
device = auto_device()
loss, acc = train_epoch(model, train_loader, optimizer, n_timesteps=25, device=device)
loss, acc = evaluate(model, test_loader, n_timesteps=25, device=device)

Analysis

from sc_neurocore.analysis.spike_stats.basic import spike_times, isi, firing_rate
from sc_neurocore.analysis.spike_stats.variability import cv_isi, fano_factor
from sc_neurocore.analysis.spike_stats.correlation import cross_correlation
from sc_neurocore.analysis.spike_stats.distance import van_rossum_distance

rate = firing_rate(binary_train, dt=0.001)      # Hz
cv = cv_isi(binary_train, dt=0.001)             # coefficient of variation
lags, ccg = cross_correlation(a, b, max_lag_ms=50.0)
d = van_rossum_distance(train_a, train_b, tau_ms=10.0)

Domain Bridge

from sc_neurocore.core.tensor_stream import TensorStream

ts = TensorStream.from_prob(np.array([0.3, 0.7]))
bits = ts.to_bitstream(length=1024)             # prob → bitstream
q = ts.to_quantum()                             # prob → quantum amplitudes
p = TensorStream(data=q, domain="quantum").to_prob()  # quantum → prob (Born rule)

Quantisation

from sc_neurocore.compiler.quantizer import quantize_weights, dequantize_weights

w_q = quantize_weights(float_weights, fmt="Q8.8")
w_f = dequantize_weights(w_q, fmt="Q8.8")      # roundtrip error < 1/512

Identity / Checkpoint

from sc_neurocore.identity.substrate import IdentitySubstrate
from sc_neurocore.identity.checkpoint import Checkpoint

sub = IdentitySubstrate(n_cortical=500, n_inhibitory=200, n_memory=100)
sub.inject_experience("reasoning trace text")
sub.run(duration=1.0)
Checkpoint.save(sub, "session.npz")
restored = Checkpoint.load("session.npz")