# Frequently Asked Questions

Below are answers to some common questions asked about ELFI.

*Q: My uniform prior* `elfi.Prior('uniform', 1, 2)`

*does not seem to be right as it
produces outputs from the interval (1, 3).*

**A**: The distributions defined by strings are those from `scipy.stats`

and follow
their definitions. There the uniform distribution uses the location/scale definition, so
the first argument defines the starting point of the interval and the second its length.

*Q: What is vectorization in ELFI?*

**A**: Looping is relatively inefficient in Python, and so whenever possible, you should *vectorize*
your operations. This means that repetitive computations are performed on a batch of data using
precompiled libraries (typically NumPy), which effectively runs the loops in faster, compiled C-code.
ELFI supports vectorized operations, and due to the potentially huge saving in CPU-time it is
recommended to vectorize all user-code whenever possible.

For example, imagine you have a simulator that depends on a scalar parameter and produces a vector of 5
values. When this is used in ELFI with `batch_size`

set to 1000, ELFI draws 1000 values from the
parameter’s prior distribution and gives this *vector* to the simulator. Ideally, the simulator should
efficiently process all 1000 parameter cases in one go and output an array of shape (1000, 5). When using
vectorized operations in ELFI, the length (i.e. the first dimension) of all output arrays should equal
`batch_size`

. Note that because of this the evaluation of summary statistics, distances etc. should
bypass the first dimension (e.g. with NumPy functions using `axis=1`

in this case).

See `elfi.examples`

for tips on how to vectorize simulators and work with ELFI. In case you are
unable to vectorize your simulator, you can use elfi.tools.vectorize to mimic
vectorized behaviour, though without the performance benefits. Finally, for simplicity vectorization
is not assumed (`batch_size=1`

by default).