# Vector calculus limitations

Openfisca calculation are all **vectorial**. This means that any calculation can be done at the same time for a big number of persons, families, etc.
This enables fast calculations for a big population, but comes with some constraints.

## Vectors

Each computation in OpenFisca returns a **vector**. For instance, for a simulation containing 3 persons whose ages are 45, 42, and 41, executing the following formula:

```
def formula(person, period):
age = person('age', period)
print(age)
```

will print:

```
array([45, 42, 17])
```

Basic operations such as `+`

or `*`

behave the same way on vectors than on numbers, you can thus use them in OpenFisca. However, some operations and structures must be adapted.

## Forbidden operations and alternatives

Some classical control structures such as `if...else`

or `switch`

, and native python logical operators such as `or`

and `not`

**cannot** be used on a openfisca variable.

Here is a summary of the structures and operations you cannot use, and their licit alternatives:

Forbidden | Alternative |
---|---|

`if...else` , `switch` |
`where` , `select` , `*` (See Case disjunction) |

`not` |
`not_(x)` |

`and` |
`x * y` |

`or` |
`x + y` |

`min` |
`min_(x,y)` |

`max` |
`max_(x,y)` |

`round` |
`round_(x,y)` |

`+` (on strings) |
`concat(x,y)` |