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).
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).