Grid#

The only practical way to set up and configure extended is to write a set of classes in your own project module, using classes derived from base classes of the multistar.grid framework.

Grid framework#

The basic setup is done in a class derived from

class multistar.grid.base.SystemBase(toml=None)#

Bases: Task

process_model(model, dtx, **kwargs)#

return modified model (or original), whether finished or outcome (implies finished)

loop(**kwargs)#
dt: (rund)

total time to run loop for defaults to self.dt, m.toml.tend, (infty if tmax > 0 or 1000, otherwise)

dt: (runs)

step size (requied), defaults to m.dt

tx: (rund)

loop over total execution time in units of tx defaults to dt

nstep:

total number of steps to run

nstepx: (runs)

loop over total execution steps (nstep) in units of nstepx

nstepx: (rund)

to limit data size of rund, add limit on number of steps per cycle

that we will refer to as class System.

from multistar.grid import SystemBase

class System(SystemBase):
    ...

Simulation template#

_toml = '/path/to/my/template.toml'

Simulation parameters#

The setup is configured in the setup method.

def setup(
        self, *,
        P=1, Q=1, ...,
        **kwargs,
        ):

    super().setup(**kwargs)

    ...

Outcomes of simulations#

Usually, we are interested ion the fate of a system. To encode the specific fates of a project, along with some properties for labelling and colouring them, we define a Fate class

class Fate(FateBase):
    ANY       = FateBase.ANY
    FAIL      = FateBase.FAIL
    STABLE    = FateBase.STABLE
    UNKNOWN   = FateBase.UNKNOWN
    MYOUTCOME = 10
    ...

    labels = {
        FAIL:      'fail',
        STABLE:    'stable',
        UNKNOWN:   'unknown',
        MYOUTCOME: 'my outcome',
        ...
        }

# generate keys

keys = {v:k for k,v in labels.items()}

colors = {
    FAIL :     rgb([1.0, 1.0, 1.0]),
    STABLE:    rgb([0.0, 0.0, 0.0]),
    UNKNOWN:   rgb([0.7, 0.7, 0.7]),
    MYOUTCOME: rgb([1.0, 0.0, 0.0]),
    ...
    }

# some checks

assert np.all(np.array(list(colors.keys())) >= 0)

# an array for easy indexing

colarr = np.zeros((np.max(list(colors.keys()))+1, 3))
for i,v in colors.items():
    colarr[i,:] = v

TODO - why are these transforms not part of an __init__ or metaclass?

The results are analyzed in the analyze method.

def analyze(self, m, dt, fail=True):
    ...

The analyze method should return an Outcome object derived from multistar.grid.base.DataOutcome that set the Fate class for the project, usually all you need is

class Outcome(DataOutcome):
    fate = Fate

Cartesian grids#

In order to run multiple “systems” (class System) we define a Study class derived from

class multistar.grid.base.StudyBase(**kwargs)#

Bases: QueueProcessor

VERSION = 10200#

Interface for parallel execution of runs

config(index: int) Config#

configuration of result at a given index in results array

Parameters:

index – 0-based index of run

Returns:

(generated) configuration that was used by the run

model(index: int) SetupBase#

multistar model with configuration of result at a given index in results array

Parameters:

index – 0-based index of run

Returns:

multistar model with (generated) configuration that was used by the run

Note

This is the same as M(s.config(i))

hist(vars=None, data=None, parm=Ellipsis, filter=None, xlog=None, ylog=None, zlog=None, bins=None, cmap=None, mode='hex', xlim=None, ylim=None, zlim=None, barfrac=1, dlog=None, dsig=True, dgam=2.2, dfac=1, dlim=None, select=None, exclude=None, percentage=False, stat='pie', stat_num=False, stat_order=None, label=Ellipsis, weighted=None, weights_select=None, weights_exclude=None)#
Parameters:

vars"fate" makes pie chart

M(index=0, **kwargs)#

return multistar run setup from result with that (filtered) index

See _filtered_results documentaion for filter options.

from multistar.grid import StudyBase

class Study(StudyBase):
    task = System
    fate = Fate

Grid parallelisation#

The grids are run in parallel using the multistar.parallel framework.

To set the method use, set the parallelisation method before importing the grid routines or derived classes:

parallel.set_parallel()#

Set parallel mode

Currently mode may be one of

queue, process

individual processes connected by queues (default)

pool

parallelisation using process pools

serial, single, debug

serial execution, good for development and debugging

db

cline/server mode using a database (sqlite3)

This is a bit of a patchwork, depending on this setting, the grid routines will be derived from different ‘backend’ classes.

Parallelisation models#

Processes#

Process pools#

Serial#

for debugging

Client/server (database)#

TODO - one could also use database for parallel/serial mode. This could replace current framework for “batches.”

General parameters#

timeout

maximum time (s) for individual results

endtime

maximum runtime (s) for grid

This can be useful for running in job queues on clusters or HPC machines to terminate a run (and save results) before the maximum (requested or mandated) job runtime is exceeded and all results would be lost.

You may also consider to use fragments.

nparallel

number of parallel jobs

Monte Carlo#

Distribution functions#

Distribution functions library, with emphasis on rotations

The functions use require passing of a (pseudo-)randim number generator, rng. This can be generated using

rng = np.random.default_rng(SEED)

Where SEED is a seed value for the generator to allow reproducible results. SEED may be omitted.

class multistar.grid.distributions.Sample#

Bases: object

Base class for sampling

class multistar.grid.distributions.Const(val=1)#

Bases: Sample

Utility function that returns constant value - not a distribution

class multistar.grid.distributions.Cycle(values=None, cadence=1, maxtab=1024)#

Bases: Sample

Utility function that cycles through values - not a distribution

for multi-D, the cycle values are the last dimension, allowing correlated returns

values:

list of vales to replicate

cadence:
  • int : cycle length for each element

  • float : fracton of sequence of each element

  • int array : repetitions for each individual element (requires same shape as values)

  • float array : fracton of sequence of each individual element (requires same shape as values)

maxtab:

maximun table size for int arrays

class multistar.grid.distributions.Sequence(values=(0, 1), fractions=None)#

Bases: Sample

Utility function that returns a sequence of values - not a distribution

for multi-D, the sequence values are the last dimension, allowing correlated returns

class multistar.grid.distributions.Choice(choices=(0, 1), p=None)#

Bases: Sequence

Random choices of specific values

for multi-D, the choices are the last dimension, allowing correlated returns

class multistar.grid.distributions.Uniform(min=0, max=1)#

Bases: Sample

Uniform distribution for default bounds [0, 1]

class multistar.grid.distributions.DegUniform(min=0, max=360, **kwargs)#

Bases: Uniform

Uniform distribution for default bounds [0, 360]

class multistar.grid.distributions.RadUniform(min=0, max=6.283185307179586)#

Bases: Uniform

Uniform distribution for default bounds [0, 2 pi]

class multistar.grid.distributions.LogUniform(min, max, dim=None, copy=None)#

Bases: Sample

Distribution for 1/x probability density

class multistar.grid.distributions.ExpUniform(min, max)#

Bases: Sample

Distribution for exp(x) probability density

class multistar.grid.distributions.PowerUniform(min=0, max=1, power=1, offset=0)#

Bases: Sample

power-law cummulative distribuion function (CDF)

power

power of CDF (not of probability density)

offset

shift of distribution (to left)

probability density is \(\sim \left(x-\mathrm{offset}\right)^{\mathrm{power}-1}\)

class multistar.grid.distributions.BetaUniform(a, b, min=0, max=1)#

Bases: Sample

Beta function distribution

class multistar.grid.distributions.SinUniform(min=-1.5707963267948966, max=1.5707963267948966)#

Bases: Sample

Distribution for cos(x) probability density (x in rad)

sin(x) is uniformly distributed

Domain is -pi/2 <= x <= pi/2.

class multistar.grid.distributions.SinUniformDeg(min=-90, max=90)#

Bases: SinUniform

Distribution for cos(x) probability density (x in deg)

Domain is -90 <= x <= 90.

sin(x) is uniformly distributed

class multistar.grid.distributions.CosUniform(min=0, max=3.141592653589793)#

Bases: Sample

Distribution for sin(x) probability density (x in rad)

Domain is 0 <= x <= pi.

cos(x) is uniformly distributed

class multistar.grid.distributions.CosUniformDeg(min=0, max=180)#

Bases: CosUniform

Distribution for sin(x) probability density (x in deg)

Domain is 0 <= x <= 180.

cos(x) is uniformly distributed

class multistar.grid.distributions.SinxUniform(min=0, max=3.141592653589793)#

Bases: Sample

Distribution for abs(cos(x)) probability density (x in rad)

Default domain is 0 <= x <= pi (actual domain is unlimited).

sinx(x) is the monotonuous continuations of sin from x == 0

See multistar.grid.distributions.sinx() for definition of sinx.

class multistar.grid.distributions.SinxUniformDeg(min=0, max=180)#

Bases: SinxUniform

Distribution for abs(cos(x)) probability density (x in deg)

Default domain is 0 <= x <= 180, actual domain is unlimited.

sinx(x) is the monotonuous continuations of sin from x == 0

See multistar.grid.distributions.sinxdeg() for definition of sinx.

class multistar.grid.distributions.CosxUniform(min=0, max=3.141592653589793)#

Bases: Sample

Distribution for abs(sin(x)) probability density (x in rad)

Default domain is 0 <= x <= pi, actual domain is unlimited.

cosx(x) is the monotonuous continuations of cos from x == 0

See multistar.grid.distributions.cosx() for definition of cosx.

class multistar.grid.distributions.CosxUniformDeg(min=0, max=180)#

Bases: CosxUniform

Distribution for abs(sin(x)) probability density (x in deg)

Default domain is 0 <= x <= 180, actual domain is unlimited.

cosx(x) is the monotonuous continuations of cos from x == 0

See multistar.grid.distributions.cosxdeg() for definition of cosx.

class multistar.grid.distributions.LonLatUniform#

Bases: Sample

TODO - allow limits

class multistar.grid.distributions.LonLatUniformDeg(*args, **kwargs)#

Bases: LonLatUniform

TODO - allow limits

class multistar.grid.distributions.EulerUniform#

Bases: Sample

TODO - allow limits

class multistar.grid.distributions.EulerUniformDeg(*args, **kwargs)#

Bases: EulerUniform

TODO - allow limits

class multistar.grid.distributions.QuaternionUniform#

Bases: Sample

TODO - allow limits

class multistar.grid.distributions.OmegaUniform#

Bases: QuaternionUniform

TODO - allow limits

class multistar.grid.distributions.OmegaUniformDeg#

Bases: OmegaUniform

TODO - allow limits

class multistar.grid.distributions.Gaussian(center=0, sigma=1, min=-inf, max=inf)#

Bases: Sample

Distribution for gaussian probability density

class multistar.grid.distributions.GaussianMixture(parameters, min=-inf, max=inf)#

Bases: Sample

Distribution for gaussian probability density

class multistar.grid.distributions.Maxwell(min=0, max=inf, parameter=None, peak=None, mean=None, sigma=None, variance=None)#

Bases: Sample

Maxwell-Bolzmann distribution function

parameter = sqrt(k_B T / m)

f(x) = sqrt(2 / pi) * (x**2 / parameter**3) * exp(- x**2 / (2 * parameter**2)

peak = sqrt(2) * parameter

mean = 2 * sqrt(2 / pi) * parameter

variance = sigma**2 = (3 * pi - 8 / pi) * parameter**2

c1 = np.float64(0.7071067811865476)#
c2 = np.float64(1.1283791670955126)#
c3 = np.float64(0.6266570686577501)#
c4 = np.float64(1.484914137379752)#
class multistar.grid.distributions.VelocityMaxwell(min=0, max=inf, parameter=None, peak=None, mean=None, sigma=None, variance=None)#

Bases: Sample

velocity times MB distribution function

The parameter, mean and peak refer to those of the MB distribution, not to those of v*MB

parameter = sqrt(k_B T / m)

peak = sqrt(2) * parameter

mean = 2 * sqrt(2 / pi) * parameter

variance = sigma**2 = (3 * pi - 8 / pi) * parameter**2

c1 = np.float64(0.7071067811865476)#
c3 = np.float64(0.6266570686577501)#
c4 = np.float64(1.484914137379752)#
class multistar.grid.distributions.OrbitAnglesUniform#

Bases: Sample

return uniform dstribution in orbit angles i - inclination w - argument of periapsis (omega) o - longitude of ascending node (Omega) n - mean anomaly (mu)

Usage, e.g., in MC simulations

(‘i’, ‘w’, ‘o’, ‘n’) : (‘orbitanglesuniform’,)

class multistar.grid.distributions.OrbitAnglesUniformDeg#

Bases: OrbitAnglesUniform

return uniform dstribution in orbit angles (in deg) i - inclination w - argument of periapsis (omega) o - longitude of ascending node (Omega) n - mean anomaly (mu)

Usage, e.g., in MC simulations

(‘i’, ‘w’, ‘o’, ‘n’) : (‘orbitanglesuniformdeg’,)

multistar.grid.distributions.sinlin(*args, **kwargs)#

cos density function distribution

call ([min, max,] [size,] **kwargs)

range is [0..pi]

multistar.grid.distributions.sinlindeg(*args, **kwargs)#

cos density function distribution

call ([min, max,] [size,] **kwargs)

range is [0..180]

multistar.grid.distributions.sinxlin(*args, **kwargs)#

\(|\cos|\) density function distribution

call ([min, max,] [size,] **kwargs)

default range is [0..pi], actual range is unlimited

multistar.grid.distributions.sinxlindeg(*args, **kwargs)#

\(|\cos|\) density function distribution

call ([min, max,] [size,] **kwargs)

default range is [0..180], actual range is unlimited

multistar.grid.distributions.coslin(*args, **kwargs)#

sin density function distribution

call ([min, max,] [size,] **kwargs)

range is [-pi/2..pi/2]

multistar.grid.distributions.coslindeg(*args, **kwargs)#

sin density function distribution

call ([min, max,] [size,] **kwargs)

range is [-90..90]

multistar.grid.distributions.cosxlin(*args, **kwargs)#

\(|\sin|\) density function distribution

call ([min, max,] [size,] **kwargs)

default range is [-pi/2..pi/2], actual range is unlimited

multistar.grid.distributions.cosxlindeg(*args, **kwargs)#

\(|\sin|\) density function distribution

call ([min, max,] [size,] **kwargs)

default range is [-90..90], actual range is unlimited

multistar.grid.distributions.lonlatlin(size=None, center=False, full=False, sparse=False)#

grid of equally spaced longitude/lattitude

corresponds to o, i for orientation of circular orbits

Use ‘center=True’ for adequate distributions in statistical weights

Usage, e.g., in grid simulations

o, i = lonlatlin(N, center=True)

multistar.grid.distributions.eulerlin(size=None, center=False, full=False, sparse=False)#

grid of equally spaced euler angles e1, e2, e3

corresponds to n, i, o for elements of circular orbits

Use ‘center=True’ for adequate distributions in statistical weights

Usage, e.g., in grid simulations

n, i, o = eulerlin(N, center=True)

multistar.grid.distributions.orbitangleslin(size=None, center=False, full=False, sparse=False)#

return grid of uniform dstribution in orbit angles i - inclination w - argument of periapsis (omega) o - longitude of ascending node (Omega) n - mean anomaly (mu)

Use ‘center=True’ for adequate distributions in statistical weights

Usage, e.g., in grid simulations

i, w, o, n = orbitangleslin(N, center=True)

multistar.grid.distributions.sinx(x)#

monotonuous extension of the sin function

This is the integral \(\int_0^x |\cos(x)|\, \mathrm{d}x\).

multistar.grid.distributions.sinxdeg(x)#

monotonuous extension of the sin function (deg)

This is the integral \(\int_0^x |\cos(x)|\, \mathrm{d}x\).

multistar.grid.distributions.cosx(x)#

monotonuous extension of the cos function

This is the integral \(1 + \int_0^x |\sin(x)|\, \mathrm{d}x\).

multistar.grid.distributions.cosxdeg(x)#

monotonuous extension of the cos function (deg)

This is the integral \(1 + \int_0^x |\sin(x)|\, \mathrm{d}x\).

multistar.grid.distributions.asinx(x)#

inverse of monotonuous extension of the sin function sinx

multistar.grid.distributions.asinxdeg(x)#

inverse of monotonuous extension of the sin function sinx (deg)

multistar.grid.distributions.acosx(x)#

inverse of monotonuous extension of the cos function cosx

multistar.grid.distributions.acosxdeg(x)#

inverse of monotonuous extension of the cos function cosx (deg)

Standard plots#

Slices (regular grids)#

StudyBase.plot(data='fate', vars=None, mode=None, parm=Ellipsis, swap=False, cut=None, label=Ellipsis, xlog=False, ylog=False, zlog=False)#

Projections (irregular samples)#

StudyBase.project(data=None, vars=None, parm=Ellipsis, filter=None, dlog=None, xlog=None, ylog=None, zlog=None, select=None, exclude=None, dlim=None, label=Ellipsis, plotly=False)#

Statistical information (all grids)#

StudyBase.hist(vars=None, data=None, parm=Ellipsis, filter=None, xlog=None, ylog=None, zlog=None, bins=None, cmap=None, mode='hex', xlim=None, ylim=None, zlim=None, barfrac=1, dlog=None, dsig=True, dgam=2.2, dfac=1, dlim=None, select=None, exclude=None, percentage=False, stat='pie', stat_num=False, stat_order=None, label=Ellipsis, weighted=None, weights_select=None, weights_exclude=None)
Parameters:

vars"fate" makes pie chart