# How to normalize the nengo_spa.State?

Hi.
I want to ask you the way to normalize the norm of the vector which `nengo_spa.State` represents.

``````import nengo_spa as spa

def agent_input(t):
return 'Dog'

def verb_input(t):
return 'Chase'

def obj_input(t):
return 'Boy'

d = 16
model = spa.Network()

with model:
agent_inp = spa.Transcode(agent_input, output_vocab=d)
verb_inp = spa.Transcode(verb_input, output_vocab=d)
object_inp = spa.Transcode(object_input, output_vocab=d)
sentence = spa.State(d)
agent = spa.State(d)
verb = spa.State(d)
object = spa.State(d)
agent_inp >> agent
verb_inp >> verb
object_inp >> object
spa.sym.Agent*agent + spa.sym.Verb*verb + spa.sym.Object * object >> sentence
``````

In this case, the norm of the vector in `sentence` represents exceeds 1.
What is the way to normalize this?

In SPA models we generally rely on the neuron saturation behaviour to provide a soft normalization. Because LIF neurons “flatten out” for higher and higher input values, trying to represent vectors with magnitude significantly greater than 1 will all tend to result in the same representation (with magnitude ~1). You can change where that saturation happens by playing with the Ensemble’s `radius` parameter.

If you want an exact normalization you can use `nengo.Node` (e.g. `nengo.Node(lambda t, x: x / np.linalg.norm(x))`). The output of that node will always be exactly normalized (but it’s not being done in a biologically plausible way, if that is important to you).

A quick addendum: the semantic pointer (SP) class has a normalize method and a unitary method. It’s also useful to know that any unitary vector bound with another unitary vector will maintain unit length after binding; this property can be leveraged to help control the lengths of vectors.