Skip to main content

SynthPopCan

CI Extended correctness Documentation Status PyPI DOI License: MIT

SynthPopCan logo

SynthPopCan is an early-stage project for building Canadian synthetic population tooling.

SynthPopCan is an independent research-software project. It is not affiliated with, endorsed by, or sponsored by Statistics Canada or the Government of Canada.

Near-term goals:

  1. Provide a Python library and CLI that can create synthetic populations through IPF from Statistics Canada margin/control tables.
  2. Maintain explicit 2016 and 2021 Census microdata workflows for household- and person-level synthetic populations using tree-based generation plus calibration, while keeping source adapters and metadata appropriately census-vintage-specific.
  3. Maintain a local web app for configuring runs, inspecting controls, generating from prepared models, validating outputs, and downloading results.

The 0.7.0 release adds explicit geography contracts, national DA/ADA orchestration, verified prepared-display-boundary retrieval, and a reusable external-data enrichment framework for public, locally supplied, licensed, and restricted sources. Can-FED v2 and ODEF v3 are planned as contrasting area-attribute and facility reference adapters for 0.7.1 and 0.7.2; later integrations remain demand-, authority-, and validation-gated.

Detailed documentation is published at https://synthpopcan.readthedocs.io/. The source files live under docs/; start with docs/index.rst for task-based navigation to the web app, IPF from StatCan margin tables, generated-from-model workflows, the beginner Python API, and advanced microdata/model-training material.

Project planning and research notes are tracked separately:

  • PLANS.md: current roadmap, open work, and release sequencing.
  • adr/: accepted architecture decisions, alternatives, and consequences.
  • NOTES.md: research synthesis from local materials and external literature.
  • CHANGELOG.md: public release notes and completed release highlights.
  • CORRECTNESS.md: tested correctness claims, evidence, limitations, and reproducibility commands.

Quick Start

These commands use a Unix-style shell. Windows readers should first complete the WSL setup in the Installation guide, then run the same commands inside the Ubuntu terminal.

Install the published package from PyPI:

Network required for installation.

python3 -m pip install synthpopcan

The base installation is enough to generate from portable frequency or CART models. Starting with 0.7.0, only researchers training new CART models need python3 -m pip install "synthpopcan[model-build]".

Then inspect the command line:

synthpopcan --help

Run a small offline smoke test with the bundled fictional model:

Runnable teaching example. Enter both commands in order.

synthpopcan models generate demo-linked-household-person \
  --households 10 \
  --condition "geo=Demo North" \
  --out synthpopcan-quickstart \
  --random-seed 42
synthpopcan validate linked synthpopcan-quickstart

This verifies linked household/person generation, but it does not create a representative Canadian population. The documentation explains how to choose research sources, controls, and model packages.

For a one-off command without installing the tool into the current environment, use uvx:

Network and uv required. See the Installation guide before using this route if uvx --version is not already available.

uvx synthpopcan --help
uvx synthpopcan guide ipf
uvx synthpopcan guide model
uvx synthpopcan guide small-area

From a source checkout for development:

Source checkout, network, Git, and uv required.

git clone https://github.com/dlq/synthpopcan.git
cd synthpopcan
uv sync
uv run synthpopcan --help

For installation details, see docs/installation.md.

Where To Start

Most readers should start in the Sphinx documentation rather than in this README:

Task Documentation
Choose a first workflow docs/getting-started.md
Start a reproducible command-line workflow docs/command-line.md
Use the local browser app docs/web-app.md
Generate with IPF from margin/control tables docs/ipf.md, docs/controls.md, docs/statcan.md
Assign linked households and people to small areas docs/small-area.md
Fetch verified display-only map boundaries docs/geodata.md
Attach governed external context as a sidecar layer docs/enrichment.md
Use the beginner Python API docs/library-getting-started.md
Work with local data layout and data doctor docs/data.md
Inspect source files safely docs/data.md, docs/statcan.md, docs/microdata.md
Work with census microdata adapters docs/microdata.md
Train, audit, package, or use tree models docs/tree.md
Validate generated outputs docs/validate.md
Understand correctness evidence and limitations CORRECTNESS.md
Check current plans and implementation notes PLANS.md, CHANGELOG.md

Build the documentation locally with:

Source checkout required. Contributor setup is documented in CONTRIBUTING.md.

uv run sphinx-build -W -b html docs docs/_build/html

Developer Benchmarks

Benchmark fixtures are developer tooling, not normal user workflows:

Source checkout required. The province-scale timing run can also require substantial time and memory.

uv run python scripts/benchmarks.py ipf
uv run python scripts/benchmarks.py small-area
uv run python scripts/benchmarks.py small-area --province-scale
uv run python scripts/benchmarks.py ipf-backends

Use --seed-records for smaller or larger IPF runs. The province-scale small-area timing check is opt-in because it depends on the machine. Optional SciPy CSR and Polars comparisons remain benchmark probes rather than runtime backends, and full-data tree-model smoke tests remain outside the default suite. The CLI, beginner Python API, and local web app call the same Python domain implementations; IPF also shares its file-backed workflow orchestration. Browser guidance and durable artifacts do not define a separate computational tier. Scale limits come from the selected workflow, model, output size, and available machine resources.

Data Policy

Large, raw, private, or access-controlled data are not tracked in git.

  • data/raw/ is a local ignored cache for authoritative public inputs, organized by provider, product family, and vintage.
  • data/derived/ is a local ignored cache for reproducible conversions, subsets, and durable model artifacts; it must not be mistaken for an authoritative source.
  • data/work/ is disposable project-local scratch space for model builds, experiments, and other restartable intermediate files.
  • data/private/sources/ is a local ignored cache for access-controlled or sensitive source datasets; generated artifacts do not belong there.
  • references/ is a local ignored cache for copied papers, proposals, and legacy code references.

Public geography, school, healthcare, road, and environmental layers should generally be fetched from authoritative public sources such as Statistics Canada, open.canada.ca, donneesquebec.ca, and municipal/provincial open-data portals rather than stored in this repository.

Local-only manifests may exist inside ignored data directories to document what is present on a development machine.

Model Packages

Reviewed model packages may be distributed with the project when they are explicitly intended as public research artifacts. The installed package should stay small: only the tiny demo model is bundled. Larger published models are downloaded on demand with synthpopcan models fetch MODEL_ID.

The public catalogue includes parallel 2016 and 2021 linked packages for Canada, supported provinces, and the five CMAs identified in the hierarchical PUMF. List the exact IDs with synthpopcan models list; for example:

synthpopcan models fetch quebec-2021-all-fields
synthpopcan models generate quebec-2021-all-fields \
  --households 1000 --out quebec-2021-population/

Release assets are gzip-compressed to keep downloads small. The CLI handles decompression and stores a normal JSON model package in the local cache.

Bundled model packages are not raw Census microdata. They should still be treated as derived research artifacts with provenance, disclosure-risk checks, and limitations. A model package being marked as a publishable candidate means it passed the project's current checks; it is not a claim of official approval, legal privacy certification, or fitness for every research use.

Before publishing a new model package, review docs/data.md, docs/tree.md, PLANS.md, and CONTRIBUTING.md.

How To Cite

Releases and prepared model packages are archived on Zenodo, so cite whichever matches what your work actually depended on.

You used Cite DOI
SynthPopCan generally The concept DOI, which always resolves to the newest release 10.5281/zenodo.21461463
A specific release That release's version DOI e.g. 10.5281/zenodo.21461464 for 0.6.2
A prepared model package That package's own DOI, listed on its Zenodo record one per package

For reproducibility, prefer the version DOI for the release and the model package DOI for each package you generated from: together they pin the exact code and the exact artifact, and every model record publishes the checksums needed to verify the file you downloaded.

Citation metadata lives in CITATION.cff, which GitHub renders as a ready-made citation from the sidebar.

Prepared model packages are derived from Statistics Canada public use microdata files under the Statistics Canada Open Licence. Each package carries the attribution notice that licence requires; keep it with the package and with anything you generate from it. See docs/data.md for the full attribution and licensing terms.

Development Acknowledgement

Development of SynthPopCan has been supplemented by the use of large language models for tasks including code generation, review, testing, documentation, and research assistance. All resulting contributions remain subject to human review and the project's automated correctness and quality checks. Responsibility for the project and its releases rests with its maintainer.

Metadata

Release files for synthpopcan 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for synthpopcan 0.7.0
File Size Uploaded
synthpopcan-0.7.0.tar.gz 7.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for synthpopcan 0.7.0
File Interpreter ABI Platform
synthpopcan-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 7.7 MB

Release files / synthpopcan-0.7.0.tar.gz

Download URL synthpopcan-0.7.0.tar.gz
Size 7.3 MB
Tags Source
SHA-256 checksum
How to use checksums
753f1d587f445e143d528c744f172afd01d7b2ecd73b9f866840791c7a0bd01f
BLAKE2b-256 checksum
How to use checksums
0e780e5a49ec71e4dd29fd5c0bcc8aa5bc857787dc79d2743b178abff0c14391
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release files / synthpopcan-0.7.0-py3-none-any.whl

Download URL synthpopcan-0.7.0-py3-none-any.whl
Size 372.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2691839e13ee3255ebb9177a9076468219247bef60b60d8a1795eb20b1be438a
BLAKE2b-256 checksum
How to use checksums
9d99b10027d8d3b3b2d79459bad49b6cc6b601cc4730f8e2f78d317cebc060ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

This release

0.7.0 This release

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page