Skip to content

Releases: rootcoder007/morie

morie v0.9.4

18 May 07:29

Choose a tag to compare

Fix: CRAN source-package compliance for the vendored C++ core header.

  • src/ header extension — the R package vendors a copy of the
    shared C++ numeric core. R CMD check --as-cran does not recognise
    .hpp as a src/ file extension and emitted a WARNING, which
    blocks CRAN submission. The vendored copy was renamed
    morie_core.hpp to morie_core.h and the #include in
    morie_fast.cpp updated to match. No behaviour change; the
    canonical libmorie/morie_core.hpp is unchanged.

morie v0.9.3 — complete Docker fix + atomic releases

17 May 22:36

Choose a tag to compare

Completes the Docker image fix (the builder now copies LICENSE, required by pyproject.toml's license-files), fixes the Homebrew tap bump to wait for the PyPI sdist, and makes the release pipeline atomic: the version tag is created only after the sdist and Docker image both build, so a half-broken release can no longer ship.

morie v0.9.2 — Docker fix, node24 actions, CodeQL speedup

17 May 22:36

Choose a tag to compare

Fixes the Docker image build for the v0.9.1 C/C++ core (scikit-build-core), bumps all CI actions to node24-native versions, and cuts the CodeQL Python analysis runtime by excluding the generated fn/ primitives.

morie v0.9.1 — C/C++ backend + Hawkes engine

17 May 22:35

Choose a tag to compare

A shared C/C++ computational core (libmorie, bound to Python via nanobind and to R via Rcpp) and a Hawkes self-exciting point-process engine: sum-of-exponentials, complex-pole, matrix-pencil, sub-quadratic truncated Weibull/Lomax/gamma kernels. Also a repo-wide IP/licensing cleanup.

morie v0.9.0 — dataset auditing + open-data sources

17 May 22:35

Choose a tag to compare

Dataset-availability auditing (check_datasets()), new StatCan/CIHI open-data ingest modules, and in-place self-update (morie update). The dataset catalogue went from 33 to 49 reachable datasets.

morie v0.8.0 — fairness & disparity-audit subsystem

16 May 12:51

Choose a tag to compare

morie 0.8.0 — the fairness & disparity-audit subsystem

morie.fairness audits risk-assessment, recidivism, and predictive-policing systems for racial and other group disparities. morie measures whether an existing system encodes disparate treatment — it does not build or deploy one.

What's new

  • Six group-fairness metrics — disparate impact (EEOC four-fifths rule), demographic parity gap, equalized odds, average odds difference, Gini, and the composite Bias Amplification Score. Python + R parity.
  • Predictive-policing calibration audit — rank areas by predicted risk vs. realised outcomes; test whether the disagreement tracks demographics. City-agnostic CityProfile layer. Python + R.
  • Multi-city temporal audit — disparity metrics per (city, period); surfaces temporal instability and cross-city divergence. Python + R.
  • Simulation framework — Noisy-OR detection model, synthetic biased-data generator, JAX spatial GAN, CTGAN-style debiaser (new optional morie[sim] extra).
  • Explainability (XAI) suite — permutation importance, partial dependence, ALE, ceteris paribus, SHAP — model-agnostic; flags when a model leans on a protected attribute.

All methods are clean-room reimplementations from published descriptions (IBM AIF360; the SciencesPo Predictive-policing-Chicago project; Barman & Barman, arXiv:2603.18987; the COMPAS XAI Stories audit) — no third-party code copied.

Install

  • PyPI: pip install morie==0.8.0 (simulation extra: pip install 'morie[sim]')
  • Container: docker pull ghcr.io/hadesllm/morie:0.8.0
  • Homebrew: brew tap hadesllm/morie && brew install morie

morie v0.7.4 — ReDoS security patch

16 May 06:55

Choose a tag to compare

Security patch

morie 0.7.4 fixes a regular-expression denial-of-service (ReDoS) vulnerability in the Ontario SIU scraper (siu_fetch), flagged by CodeQL (py/redos, high severity). A repeated sub-pattern in the index-page link parser carried \s* on both ends and could backtrack catastrophically on a maliciously crafted HTML page. The pattern is now linear-time; parsing of valid SIU index pages is unchanged.

This is the first released version to carry the fix — the 0.7.3 PyPI/container artifacts predate it.

Also in this release

  • Corrected .zenodo.json license metadata, which still declared GPL-2.0-only / MIT-Apache from before the AGPL relicense.
  • Aligned stale User-Agent strings (morie/0.2.00.6.1) across the data-ingestion modules.
  • Version-reference sweep across README, Sphinx docs, INSTALLATION.md, TUTORIAL.md, and packaging docs.

No API changes.

Install

  • PyPI: pip install morie==0.7.4
  • Container: docker pull ghcr.io/hadesllm/morie:0.7.4
  • Homebrew: brew tap hadesllm/morie && brew install morie

morie v0.7.3 — AGPL-3.0-or-later relicense

16 May 05:21

Choose a tag to compare

License change

morie is now licensed under the GNU Affero General Public License v3 or later (AGPL-3.0-or-later), on both the Python and R sides. This supersedes the previous MIT/Apache-2.0 licensing.

The AGPL is a strong copyleft license: any modified morie that is distributed — or offered to users over a network (§13) — must publish its source. Modifications and improvements cannot be taken closed-source.

Changes

  • Relicensed to AGPL-3.0-or-later (Python + R). Papers, data, and documentation are CC BY-NC-SA 4.0.
  • The deprecated moirais alias package has been removed.
  • The optional Linux-kernel adjuncts in kernel-module/ and daemon/ remain GPL-2.0-only (kernel ABI requirement).
  • No other code or API changes.

Install

  • PyPI: pip install morie==0.7.3
  • Container: docker pull ghcr.io/hadesllm/morie:0.7.3
  • Homebrew: brew tap hadesllm/morie && brew install morie

morie v0.7.0

14 May 07:50

Choose a tag to compare

Summary

This is the first GitHub Release cut since v0.1.14 (2026-05-11). The intervening 51 commits across the v0.2.0 → v0.7.0 point releases were shipped to PyPI / GHCR / r-universe via tag-only automation but never given a Release entry; this note consolidates the full work surface. Every prior version is still installable from its tag, but morie 0.7.0 rolls up everything below.

Headline

  • Five-paper publication set is now complete. With the empirical applications paper now public on Zenodo, morie ships alongside MRM (framework), Hawkes (methodology), morie-R (software), morie-Python (software), and the new Solitary Confinement, Self-Excitation, and Institutional Churn applications paper. All five PDFs build clean.
  • Toolkit moved from "researcher only" to "fresh user can run analyses". The v0.5.0 fresh-user release added a no-code CLI, nine-language locales, bundled synthetic datasets, and five end-to-end install channels.
  • Performance ceiling raised opt-in. morie.fast exposes JIT-accelerated kernels (Numba on Python ≤ 3.14, pure-numpy fallback otherwise; numerically identical to ≤ 5.55e-17). R hot kernels gain Rcpp counterparts.
  • MRM grew from a c11 Mandela classifier to a full multilevel-reconciliation methodology with five reusable primitives and three Laniyonu-derived analysis modules.

Five-paper DOI set

Paper DOI
MRM framework 10.5281/zenodo.20096075
Hawkes methodology 10.5281/zenodo.20102198
morie (R) software 10.5281/zenodo.20111233
morie (Python) software 10.5281/zenodo.20096350
Empirical applications (NEW in v0.7.0) 10.5281/zenodo.20175689

v0.1.15 — MRM empirical-paper callables (2026-05-11)

  • mrm_otis_* (5 fns, OTIS), mrm_tps_* (4 fns, TPS), mrm_siu_* (3 fns, SIU), plus mrm_tps_kulldorff_scan space-time scan with MC permutations — all with R + Python parity.
  • ArcGIS REST + on-demand SIU scraper + OTIS CKAN fetchers; morie_load_dataset() registry expanded with a01/b01/b09/c11.
  • 4 bundled reference samples in inst/extdata/ (random 1000-row b01 + b09 + c11 + tps_assault, ~420 KB) so examples run offline.
  • simulate_longitudinal_panel() — VAR(L) panel simulator with structured covariance kernels.
  • GPL-2.0-only signaling layer: SPDX headers, check_plugin_license() runtime guard, optional out-of-tree kernel module (kernel-module/morie.c), optional userspace audit daemon (daemon/morie_lsm.py).
  • python -m morie.demo animated end-to-end showcase on bundled samples.
  • All five companion papers re-verified — Hill α 1.62 → 2.08; SDB 22 % → 57 %; Hawkes Gamma → Weibull abstract typo fixed; KM TTR 210 d flagged as artefact (actual SIU TTR = 120 d); LISA Assault 2024 quadrants 47/5/4/44 → 19/13/17/52.

v0.2.0 — Full R ↔ Python parity (2026-05-11)

  • Python morie.mrm_classify_mandela() shipped as the dual of the R-side morie::mrm_classify_mandela() — full bidirectional parity across the 25 v0.2.0-era callables.
  • tenacitystamina migration across the network layer.
  • Project tracking artefacts: VERSION_INVENTORY.csv (every file carrying a version string), DEPENDENCIES.csv (every Python + R dep with license + GPL-2.0-only compatibility check).
  • SCIENTIFIC_DISCOVERIES.md produced.

v0.3.0 — Per-component licensing + 5 JSS papers drafted (2026-05-11/12)

  • Per-component licensing model finalised: Python — MIT OR Apache-2.0 (Rust-ecosystem convention); R — GPL-2.0-only (CRAN convention); kernel module — GPL-2.0-only; papers + docs — CC-BY-4.0.
  • designexptr callables added with R parity.
  • Five JSS-style companion papers drafted (MRM, Hawkes, morie-Py, morie-R, empirical).
  • 4-color palette applied to Sphinx index banner + README badges.
  • Bug fixes: 11 case-collision ghost files removed from morie.fn; 4 case-mismatch / name-mismatch imports corrected.

v0.4.x — Hardening + CRAN-readiness pass (2026-05-12/13, twelve patch releases)

Patch What landed
v0.4.0 CI fixes; deterministic-seed plumbing; lazy init; SyntaxWarning scrub
v0.4.1 Licensing display fix (GitHub + PyPI both showed "Unknown")
v0.4.2 Rust-convention dual license (canonical LICENSE-APACHE)
v0.4.3 Remove conflicting License classifiers (PEP 639)
v0.4.4 CRAN-readiness — Title case + vignettes/ + version bump
v0.4.5 Regen .Rd files + clean DESCRIPTION Author field
v0.4.6 CRAN-readiness pass 3 — ASCII docstrings + Rd regen + deps
v0.4.7 CRAN polish — clean r-package/morie/ root + .Rbuildignore
v0.4.8 testthatignore_attr for openssl/digest hash class
v0.4.11 CRAN-READY — 0 ERROR, 0 WARNING
v0.4.12 Kill the rmgarch::coef/sigma/likelihood WARNING
v0.4.13 Read __version__ from package metadata, drop stale "0.4.0"
v0.4.14 anova_oneway backwards-compat alias + gibbons_chakraborti rename (Gibbons & Chakraborti 2003 §2.11)

Also: xgbst adopts xgboost 2.x (x, y) API + factor labels; kosorok-parity testthat skip on CI; trfge divergence relaxed; Sphinx MRM expansion documented as Multilevel Reconciliation Methodology; auto-tag-on-merge.yml chain-fires pypi-publish.yml + release-debrpm.yml.

v0.5.0 — Fresh-user release (2026-05-13)

The release that makes the toolkit usable by a non-programmer:

  • No-code CLImorie tutorial (interactive walkthrough), morie pull tps-major --year 2024, morie run-module power-design, morie explain power_summary.csv, morie cheatsheet, morie generate-template.
  • Synthetic CPADS / OTIS / TPS / SIU datasets bundled in-wheel so a first analysis works with no manual file downloads.
  • Open-data ingestorsmorie ingest ckan (open.canada.ca and any CKAN portal), morie ingest tps (ArcGIS layers), morie ingest siu (Director's-report PDFs).
  • Schema-agnostic loadermorie.schema.infer_mapping(your_df, canonical=...); bring your own column names.
  • Nine-language CLI — EN / FR / ES / DE / ZH / PT / JA / AR / HI via MORIE_LOCALE=<code>.
  • Five install channels verified end-to-end on Mac + Raspberry Pi: curl one-liner, pip install morie, brew tap hadesllm/morie && brew install morie, docker run ghcr.io/hadesllm/morie:0.5.0, R via r-universe.
  • First-paper templatemorie generate-template --module <name> --out my-paper.md.
  • AccessibilityNO_COLOR=1 + pipe-detection auto-degrade to plain text for screen readers.
  • INSTALLATION.md + TUTORIAL.md added.
  • papers/ in-tree, allowlisted JSS sources (5 papers; no emails or drafts).

v0.6.0 — Performance experiments (2026-05-13)

Opt-in JIT-compile and C++ paths for the slowest numerical kernels:

  • morie.fast public namespace exposes JIT-decorated kernels (normal_pdf, normal_logpdf, mean_jit, var_jit, std_jit, cor_pearson_jit, euclid_dist_jit) plus a jit_if_available decorator. Numerically identical to scipy/numpy whether or not Numba is installed; verified to ≤ 5.55e-17 max error.
  • pip install morie[fast] pulls Numba on Python ≤ 3.14; on Python ≥ 3.15 the install falls back to pure-numpy and morie.fast.is_jit_available() returns False.
  • ci-numba-bench.yml runs nightly + on-demand, benchmarks the JIT path against scipy / numpy baselines, asserts numerical agreement.

v0.6.1 — Laniyonu methodology + US datasets (2026-05-13)

Three new analysis modules drawn from Laniyonu et al., five new MRM primitives, three US/Canadian crime-data integrations, and a forensics-dataset bundle:

New analysis modules:

  • morie.laniyonu.gentrification_policing(...) — Spatial Durbin Model decomposing direct / indirect / total effects of gentrification on stop-and-frisk rates. Reproduces Laniyonu (2018) Urban Affairs Review 54(5):898–930.
  • morie.laniyonu.smi_force_disparity(...) — Bayesian hierarchical negative-binomial with synthetic small-area-estimated exposure offset. Reproduces Laniyonu & Goff (2021) BMC Psychiatry 21(1):500 — 11.6× relative-risk of force for persons with serious mental illness.
  • morie.laniyonu.actuarial_risk_disparity(...) — Bayesian cumulative-logit with threshold-varying race / gender coefficients. Reproduces O'Connell & Laniyonu (2025) Race & Justice 15(3):428–453.

Five reusable MRM primitives:

  1. mrm.primitive.gentrification_panel — categorical baseline-conditional gentrification coding.
  2. mrm.primitive.spatial_spillover_decomposition — Spatial Durbin / SAR direct / indirect / total decomposition with the Moran's I + Robust LM diagnostic ladder.
  3. mrm.primitive.synthetic_area_exposure — Small-area estimation as exposure offset; generalises beyond SMI.
  4. mrm.primitive.threshold_specific_ordinal — Bayesian cumulative-logit with race / gender coefficients varying by ordinal threshold.
  5. mrm.primitive.score_net_residual — Two-stage score-then-audit; residual race effect on downstream outcome net of the assessment score.

New datasets: morie.datasets.chicago_crime(), nyc_stop_and_frisk(), la_crime(), morie ingest bigquery (generic BigQuery public-data via ADC), nist_rds(), nibrs(), namus_missing_persons(), icitap_*(). Three toy bundles for offline replication.

Rcpp hot kernels (#231 / #241 / #242): the slowest pure-R kernels translated to Rcpp via LinkingTo: Rcpp; separate ci-rcpp-bench.yml for nightly perf check; main R CMD check stays pure-R.

New citations across all four refs.bib files: Laniyonu2018CoffeeShops, LaniyonuGoff2021BMCPsych, OConnellLaniyonu2025RaceJustice.

v0.7.0 — Five-paper completion + DOI propagation (2026-05-14, this release)

Read more

v0.1.14 — Citation alignment + r-universe shim fix

11 May 11:25

Choose a tag to compare

Bug-fix release that refreshes all citation surfaces (PyPI, r-universe, CRAN, Zenodo, README, CITATION.cff, inst/CITATION) with the canonical MORIE titles and dual R/Python software-paper structure.

What changed

  • README.md, CITATION.cff, inst/CITATION: rewritten with the four canonical bibitem titles and DOIs:
    • morie R → DOI 10.5281/zenodo.20111233
    • morie Python → DOI 10.5281/zenodo.20096350
    • MRM Framework → DOI 10.5281/zenodo.20096075
    • Hawkes paper → DOI 10.5281/zenodo.20102198
  • r-package/moirais shim: switched Depends: morieSuggests: morie + lazy .onAttach to fix r-universe parallel-build chicken-and-egg failure
  • Version bump: 0.1.3 → 0.1.14 across pyproject.toml, R DESCRIPTION, R shim DESCRIPTION, Python init, CITATION.cff, Dockerfile, inst/CITATION
  • Paper PDF overflow fix: added \sloppy + \emergencystretch=4em + \hfuzz=20pt to all 4 JSS-formatted papers; zero overflows >10pt remaining
  • Documentation index title: corrected backronym (matches the JSS paper titles)

Compatibility

  • import morie / library(morie) — canonical
  • import moirais / library(moirais) — deprecation alias, emits warning
  • Existing 0.1.3 installs unaffected; upgrade with pip install --upgrade morie or install.packages("morie") once CRAN review completes