# Core components The core kernel components run the calculation as a stream: events → ground-up loss → insured loss → summary. They are implemented in **pytools** (the `oasislmf.pytools` package); the binary stream formats between stages are unchanged from the original ktools design. | Stage | pytools tool | Replaces (deprecated ktools binary) | |-------|--------------|-------------------------------------| | Event partitioning | `evepy` | `eve` | | Effective-damageability CDFs | `modelpy` | `getmodel` | | Ground-up loss | `gulpy` / `gulmc` | `gulcalc` | | Financial module (insured loss) | `fmpy` | `fmcalc` | | Summary aggregation | `summarypy` | `summarycalc` | `gulpy` is the standard ground-up engine (it consumes `modelpy`'s effective-damage CDF stream). `gulmc` is the full Monte-Carlo engine: it reads the model data directly (doing the `modelpy` step internally) and is the **default** in generated runs. ## evepy `evepy` reads a list of event ids and emits a partition of them as a binary stream. Events are "shuffled" — assigned to processes cyclically rather than in contiguous blocks — so the workload is evened out when large events are clustered in the id range. **Output stream** — a simple list of `event_id`s (4-byte integers). **Parameters** - `process_number` `total_processes` (positional, required) — this process's partition and the total number of partitions. - `-i, --input_file` — input events file (default `input/events.bin`). - `-o, --output_file` — output file (default stdout). - `-n, --no_shuffle` — keep input ordering (distribute in blocks). - `-r, --randomise` — randomise with a Fisher-Yates shuffle. **Usage** ```bash evepy

-o events.bin evepy

| modelpy | gulpy -S100 -a1 ``` **Example** ```bash evepy 1 2 -o events1_2.bin # partition 1 of 2, shuffled evepy 1 2 -n -o events1_2.bin # unshuffled evepy 1 1 | gulmc -S100 -a0 # full Monte-Carlo pipeline ``` **Internal data** — `input/events.bin` (a list of 4-byte event ids). ## modelpy `modelpy` (the `getmodel` step) generates a stream of **effective damageability** distributions (CDFs). It combines the model's `footprint` (hazard intensity distributions) and `vulnerability` (conditional damage distributions) for the exposures in `items`, convolving them into an effective damage CDF per areaperil/vulnerability. **Output stream** — a CDF stream (stream type `0/1`). **Parameters** - `-i, --file-in` / `-o, --file-out` — input event stream / output CDF stream. - `-r, --run-dir` — run directory (default `.`). - `--peril-filter` — restrict to specific perils. - `--data-server` — share model data over TCP sockets (for multi-process runs). **Usage** ```bash evepy 1 1 | modelpy | gulpy -S100 -a1 -o gul.bin modelpy --run-dir . -i events.bin -o cdf.bin ``` **Internal data** (relative to the run directory) - `static/footprint.bin`, `static/footprint.idx` - `static/vulnerability.bin` - `static/damage_bin_dict.bin` - `input/items.bin` **Calculation** — `modelpy` filters the footprint for areaperils and the vulnerability for vulnerability ids that appear in `items`, convolves the intensity and conditional- damage distributions per event/areaperil/vulnerability, and outputs the resulting cumulative distributions (with the damage-bin mean used for interpolation downstream). ## gulpy / gulmc Both compute **ground-up loss** by Monte-Carlo sampling; they assign the special statistics below to negative sample indices. - **`gulpy`** samples from the effective-damage CDF stream produced by `modelpy` (the classic `getmodel → gulcalc` split). - **`gulmc`** is the full Monte-Carlo engine: it reads the model data directly, samples the hazard intensity and then the damage (so it does not need a separate `modelpy` step), and supports coverage dependency and separate hazard/damage correlation. It is the default engine in generated runs. **Output stream** — a loss stream (stream type `2/1`). **Parameters** (common) - `-S SAMPLE_SIZE` — number of samples. - `-a ALLOC_RULE` — back-allocation rule (see below; default `0`). - `-L LOSS_THRESHOLD` — drop losses below the threshold (default `1e-6`). - `-i, --file-in` / `-o, --file-out` — input / output. - `--run-dir` — run directory (default `.`). - `--random-generator` — `0` Mersenne-Twister, `1` Latin Hypercube, `2` Latin Hypercube on Philox4x32-7 (**default `2`**). See {doc}`RandomNumbers`. - `--ignore-correlation` (and `--ignore-haz-correlation` for `gulmc`) — ignore the peril correlation groups. - `gulmc` also: `--effective-damageability` (draw from the effective-damage distribution instead of full MC). **Usage** ```bash # full Monte-Carlo (default engine) evepy 1 1 | gulmc -S100 -a1 | fmpy -a2 > il.bin # standard engine via modelpy CDFs evepy 1 1 | modelpy | gulpy -S100 -a1 -o gul.bin ``` **Internal data** — `static/damage_bin_dict.bin`, `input/items.bin`, `input/coverages.bin` (plus the model data read via `modelpy`/directly). **Random sampling** — for each item CDF and each sample, a uniform random number is drawn and used to sample a damage factor by interpolation (linear, quadratic, or point- value depending on the damage-bin definitions), which is multiplied by the item TIV. Random numbers are reproducible; the generator is selected with `--random-generator` (see {doc}`RandomNumbers`), replacing the ktools `-R`/`-r`/`-s` flags. **Special samples** — negative sample indices carry statistics rather than samples: | sidx | description | |------|-------------| | -1 | numerical integration mean | | -2 | numerical integration standard deviation | | -3 | impacted exposure | | -4 | chance of loss | | -5 | maximum loss | **Allocation rule** (`-a`) — how item losses are adjusted when a coverage is hit by multiple perils (total loss to a coverage cannot exceed its TIV): | `-a` | description | |------|-------------| | 0 | pass losses through unadjusted (single-peril models) | | 1 | sum losses, cap to TIV, back-allocate to items in proportion to unadjusted losses | | 2 | keep the maximum sub-peril loss, others zero; back-allocate equally on ties | ## fmpy `fmpy` is the Oasis **Financial Module**: it applies policy terms and conditions to the ground-up losses, producing insured-loss samples. It reads a loss stream from `gulpy`/ `gulmc` (or from another `fmpy`) and can be chained to apply successive sets of terms (e.g. direct insurance then reinsurance). **Output stream** — a loss stream (stream type `2/1`). **Parameters** - `-a, --allocation-rule` — back-allocation rule: `0` none, `1` ground-up basis, `2` prior-level basis (default `0`). - `-n, --net-loss` — output net losses (input minus calculated) instead of gross. - `-p, --static-path` — location of the FM input files (default `input/`). - `-i, --files-in` / `-o, --files-out`. - `--create-financial-structure-files` — pre-build the shared FM structure. **Usage** ```bash evepy 1 1 | gulmc -S100 -a1 | fmpy -a2 | summarypy -t il -1 il_summary.bin fmpy -p ri1 -a2 -n -i gul.bin -o ri1_net.bin # reinsurance, net losses ``` **Internal data** — `input/items.bin`, `input/coverages.bin`, `input/fm_programme.bin`, `input/fm_policytc.bin`, `input/fm_profile.bin` (or `fm_profile_step.bin`), `input/fm_xref.bin`. For a loss-stream input only the four `fm_*` files are needed. Use `-p` to point at a different set (e.g. `-p ri1`). **Calculation** — `fmpy` passes the loss samples (including the mean, sidx -1, and impacted exposure, sidx -3) through the financial calculation defined by the input files; special samples -2, -4, -5 are dropped. See {doc}`../../explanation/financial-module`. ## summarypy `summarypy` aggregates loss samples to a reporting **summary level** — reducing stream volume, unifying the `gulpy`/`gulmc` and `fmpy` stream shapes for downstream outputs, and producing one or more summary sets in a single pass. **Output stream** — a summary stream (stream type `3/1`). **Parameters** - `-t, --run-type {gul,il,ri}` — the input stream type (replaces the ktools `-i`/`-f` distinction). - `-i, --files-in` — input stream. - `-p, --static-path` — location of the summary-xref files. - `-m, --low-memory` — reduce downstream memory with index files. **Usage** ```bash evepy 1 1 | gulmc -S100 -a1 | summarypy -t gul -1 gul_summary.bin fmpy -a2 -i gul.bin | summarypy -t il -1 il_summary.bin ``` **Internal data** — `input/gulsummaryxref.bin` (for `-t gul`) or `input/fmsummaryxref.bin` (for `-t il`/`-t ri`), which map the input identifier to a user-defined `summary_id`. **Calculation** — losses are summed to each `summary_id`. The mean (sidx -1), impacted exposure (sidx -3) and maximum loss (sidx -5) are summed as normal; the standard deviation (sidx -2) is dropped; the chance of loss (sidx -4, gul input only) is combined by the law of total probability, `1 − Π(1 − Cᵢ)` over the items in each summary. --- See also: {doc}`OutputComponents` · {doc}`Specification` (stream formats). A worked, pytools-correct pipeline walkthrough lives with the example models (OasisModels) and is linked from the aggregated Oasis documentation.