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
modemay 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.Const(val=1)#
Bases:
SampleUtility function that returns constant value - not a distribution
- class multistar.grid.distributions.Cycle(values=None, cadence=1, maxtab=1024)#
Bases:
SampleUtility 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:
SampleUtility 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:
SequenceRandom 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:
SampleUniform distribution for default bounds [0, 1]
- class multistar.grid.distributions.DegUniform(min=0, max=360, **kwargs)#
Bases:
UniformUniform distribution for default bounds [0, 360]
- class multistar.grid.distributions.RadUniform(min=0, max=6.283185307179586)#
Bases:
UniformUniform distribution for default bounds [0, 2 pi]
- class multistar.grid.distributions.LogUniform(min, max, dim=None, copy=None)#
Bases:
SampleDistribution for 1/x probability density
- class multistar.grid.distributions.ExpUniform(min, max)#
Bases:
SampleDistribution for exp(x) probability density
- class multistar.grid.distributions.PowerUniform(min=0, max=1, power=1, offset=0)#
Bases:
Samplepower-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:
SampleBeta function distribution
- class multistar.grid.distributions.SinUniform(min=-1.5707963267948966, max=1.5707963267948966)#
Bases:
SampleDistribution 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:
SinUniformDistribution 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:
SampleDistribution 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:
CosUniformDistribution 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:
SampleDistribution 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:
SinxUniformDistribution 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:
SampleDistribution 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:
CosxUniformDistribution 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.LonLatUniformDeg(*args, **kwargs)#
Bases:
LonLatUniformTODO - allow limits
- class multistar.grid.distributions.EulerUniformDeg(*args, **kwargs)#
Bases:
EulerUniformTODO - allow limits
- class multistar.grid.distributions.OmegaUniform#
Bases:
QuaternionUniformTODO - allow limits
- class multistar.grid.distributions.OmegaUniformDeg#
Bases:
OmegaUniformTODO - allow limits
- class multistar.grid.distributions.Gaussian(center=0, sigma=1, min=-inf, max=inf)#
Bases:
SampleDistribution for gaussian probability density
- class multistar.grid.distributions.GaussianMixture(parameters, min=-inf, max=inf)#
Bases:
SampleDistribution for gaussian probability density
- class multistar.grid.distributions.Maxwell(min=0, max=inf, parameter=None, peak=None, mean=None, sigma=None, variance=None)#
Bases:
SampleMaxwell-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:
Samplevelocity 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:
Samplereturn 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:
OrbitAnglesUniformreturn 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