diff --git a/.ai-instructions b/.ai-instructions
index f2744aab..68dc3f48 160000
--- a/.ai-instructions
+++ b/.ai-instructions
@@ -1 +1 @@
-Subproject commit f2744aabcc974fd101240c2e4393de232f45b061
+Subproject commit 68dc3f4867cb075b0e0d8eadf383800ea33f5995
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index ca658f18..9e344a72 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -28,7 +28,7 @@ jobs:
- uses: actions/checkout@v6
- uses: prefix-dev/setup-pixi@v0.9.4
with:
- pixi-version: v0.66.0
+ pixi-version: v0.70.2
cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
environments: tests-cpu
@@ -54,7 +54,7 @@ jobs:
- uses: actions/checkout@v6
- uses: prefix-dev/setup-pixi@v0.9.4
with:
- pixi-version: v0.66.0
+ pixi-version: v0.70.2
cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
frozen: true
diff --git a/.gitmodules b/.gitmodules
index 10e09e46..66ab1130 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
[submodule ".ai-instructions"]
path = .ai-instructions
- url = git@github.com:OpenSourceEconomics/ai-instructions.git
+ url = https://github.com/OpenSourceEconomics/ai-instructions.git
branch = make-submodule
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 2877891b..680b6cc0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,7 +5,7 @@ repos:
- id: check-hooks-apply
- id: check-useless-excludes
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: v2.19.0
+ rev: v2.25.0
hooks:
- id: pyproject-fmt
- repo: https://github.com/lyz-code/yamlfix
@@ -47,7 +47,7 @@ repos:
hooks:
- id: yamllint
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.15.6
+ rev: v0.15.18
hooks:
- id: ruff-check
args:
@@ -65,6 +65,9 @@ repos:
rev: 0.9.1
hooks:
- id: nbstripout
+ # The getting-started tutorial ships pre-rendered (`execute: false` in
+ # myst.yml); stripping its outputs would leave the docs site empty.
+ exclude: ^docs/getting_started/tutorial\.ipynb$
args:
- --extra-keys
- metadata.kernelspec metadata.language_info.version metadata.vscode
diff --git a/CLAUDE.md b/CLAUDE.md
index 5b6d3709..79fb7af3 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -259,6 +259,10 @@ When writing new public-facing code, always accept and return `period`. Convert
## Testing
-- pytest with markers: `wip`, `unit`, `integration`, `end_to_end`
+- pytest with markers: `wip`, `unit`, `integration`, `end_to_end`, `long_running`
- Test files mirror source structure in `tests/`
- Memory profiling available via pytest-memray (Unix only)
+- MATLAB AF CES / translog reproduction tests live in the parent workspace at
+ `../matlab_ces_repro/` (alongside `sim_repro/`), not in this library. They depend on
+ reference data at `/home/hmg/sciebo/Skill estimation/` and the CNLSY xls bundled
+ beside them. Run from the workspace root.
diff --git a/GEMINI.md b/GEMINI.md
new file mode 100644
index 00000000..7dc4841d
--- /dev/null
+++ b/GEMINI.md
@@ -0,0 +1,2 @@
+@.ai-instructions/profiles/tier-a.md @.ai-instructions/modules/jax.md
+@.ai-instructions/modules/optimagic.md
diff --git a/docs/explanations/architecture.md b/docs/explanations/architecture.md
new file mode 100644
index 00000000..7ef049be
--- /dev/null
+++ b/docs/explanations/architecture.md
@@ -0,0 +1,105 @@
+# Package Architecture
+
+Skillmodels hosts three estimators under one model specification. The package
+layout reflects that:
+
+```
+src/skillmodels/
+├── common/ Estimator-agnostic machinery
+│ ├── model_spec.py ModelSpec, FactorSpec, AnchoringSpec, Normalizations
+│ ├── types.py ProcessedModel, Dimensions, Labels,
+│ │ EndogenousFactorsInfo, ParsingInfo, ...
+│ ├── process_model.py process_model(spec) -> ProcessedModel
+│ ├── process_data.py long-format data -> internal arrays
+│ ├── params_index.py 4-level MultiIndex used by all estimators
+│ ├── parse_params.py flat vector <-> structured params
+│ ├── constraints.py get_constraints, FixedConstraintWithValue,
+│ │ collect_fixed_locs, project_to_probability_constraints
+│ ├── selector.py select_by_loc, align_index_names
+│ ├── transition_functions.py linear / translog / log_ces / translog_af /
+│ │ log_ces_af / ...
+│ ├── transitions.py apply_anchored_transition (sigma-points-agnostic)
+│ ├── anchoring.py anchor / unanchor states
+│ ├── state_ranges.py create_state_ranges
+│ ├── simulate_data.py simulate_dataset, simulate_policy_effect
+│ ├── variance_decomposition.py signal/noise decomposition
+│ └── diagnostic_plots.py plot_residual_boxplots, plot_likelihood_contributions
+├── chs/ Cunha-Heckman-Schennach Kalman MLE
+│ ├── options.py CHSEstimationOptions
+│ ├── kalman_filters.py square-root unscented Kalman filter
+│ ├── likelihood.py jitted log-likelihood
+│ ├── likelihood_debug.py non-jitted variant with debug arrays
+│ ├── maximization_inputs.py get_maximization_inputs(...)
+│ ├── filtered_states.py get_filtered_states(...)
+│ └── process_debug_data.py post-process Kalman debug arrays
+├── af/ Antweiler-Freyberger sequential Halton MLE
+│ ├── types.py AFEstimationOptions, AFEstimationResult, ...
+│ ├── estimate.py estimate_af(...) -- top-level orchestration
+│ ├── validate.py validate_af_model, kappa-scope / leakage checks
+│ ├── params.py per-period optimagic params + constraints
+│ ├── initial_period.py period-0 mixture + measurement system MLE
+│ ├── transition_period.py period-t transition + measurement-system MLE
+│ ├── likelihood.py jitted period-specific log-likelihoods
+│ ├── halton.py quadrature nodes / weights
+│ ├── batching.py obs-batching for the autodiff chunking
+│ ├── posterior_states.py posterior means from the chained sample
+│ └── inference.py compute_af_standard_errors (propagated
+│ influence-function score bootstrap)
+└── amn/ Attanasio-Meghir-Nix 2020 (three-stage)
+ ├── types.py AMNEstimationOptions, ...
+ ├── estimate.py estimate_amn(...) -- top-level orchestration
+ ├── mixture_em.py Stage 1: EM on the augmented mixture
+ ├── minimum_distance.py Stage 2: structural recovery
+ ├── simulate_and_regress.py Stage 3: synthetic-panel regression
+ │ (optional endogenous-investment control function)
+ ├── moments.py Spearman + Bartlett start-values
+ ├── start_values.py get_spearman_start_params, pool_equality_groups
+ ├── posterior_states.py simulate factor paths from fitted mixture
+ └── inference.py compute_amn_standard_errors (cluster bootstrap,
+ per-replicate seeds + nonconvergence filtering)
+```
+
+## How the layers interact
+
+Every estimator reads the same `ModelSpec` and produces the same canonical
+params DataFrame (4-level MultiIndex
+`(category, period, name1, name2)`). The differences live entirely below the
+spec:
+
+- **CHS** consumes `process_model(spec) -> ProcessedModel`, then plugs that
+ into the Kalman recursion. `CHSEstimationOptions` is passed at call time
+ to `get_maximization_inputs(spec, data, chs_options=...)`.
+- **AF** also calls `process_model`, but uses `ProcessedModel` only for the
+ parameter index, labels, and transition info. The Kalman filter is not
+ invoked; period-specific Halton designs replace the predict step.
+- **AMN** likewise calls `process_model` for the index/labels, then runs its
+ three-stage pipeline. The result re-uses the same params DataFrame format
+ so the AMN output can seed CHS or AF estimation when desired.
+
+`process_model` itself is structural: it takes only the spec and produces
+shapes, labels, transition info, and an `EndogenousFactorsInfo`. It does not
+carry any estimator-specific tuning. Each estimator's options class
+(`CHSEstimationOptions`, `AFEstimationOptions`, `AMNEstimationOptions`) is
+passed in at call time.
+
+## Why this split
+
+The package grew organically: CHS was the original codebase; AF and AMN were
+later additions. Earlier iterations stored CHS-only options on `ModelSpec`,
+which made the spec leak CHS assumptions into a notionally agnostic container.
+The split into `common/`, `chs/`, `af/`, `amn/` makes the scope of each piece
+explicit at the import site:
+
+- `from skillmodels import ModelSpec` — pure structural description.
+- `from skillmodels.chs import CHSEstimationOptions, get_maximization_inputs`
+ — CHS-specific.
+- `from skillmodels.af import estimate_af, AFEstimationOptions` — AF-specific.
+- `from skillmodels.common.variance_decomposition import decompose_measurement_variance`
+ — works for any estimator, given pre-computed filtered states.
+
+The architectural principle: a function lives in `common/` iff it does not
+import from `chs/`, `af/`, or `amn/`. Anything that does belongs in the
+relevant subpackage. There is one practical exception:
+`CHSEstimationOptions` is defined in `chs/options.py` but the
+`process_model` orchestration in `common/` doesn't read it (it reads the
+structural `ModelSpec.n_mixtures` field instead), so the layering is clean.
diff --git a/docs/explanations/names_and_concepts.md b/docs/explanations/names_and_concepts.md
index 69e9e2d5..6db976a3 100644
--- a/docs/explanations/names_and_concepts.md
+++ b/docs/explanations/names_and_concepts.md
@@ -76,12 +76,57 @@ of factors are arbitrary).
## Estimation Options
-The `EstimationOptions` dataclass controls numerical aspects:
+Each estimator has its own options dataclass, passed at call time rather than
+embedded in `ModelSpec`. The three classes share no fields — what counts as a
+tuning knob differs between estimators.
+
+`CHSEstimationOptions` (from `skillmodels.chs`) controls the Kalman MLE:
- **robust_bounds**: Tightens parameter bounds to avoid numerical issues
- **bounds_distance**: How much stricter to make bounds (zeroed if robust_bounds is
false)
-- **n_mixtures**: Number of mixture components in the distribution
- **sigma_points_scale**: Controls spread of sigma points in unscented Kalman filter
- **clipping_\***: Parameters for soft-clipping the log-likelihood to prevent
infinities
+- **start_params_strategy**: How to seed the `params_template`. `"amn"` (default)
+ runs the full AMN three-stage estimator and uses its parameters as the start;
+ `"spearman"` uses moment-based start values; `"none"` leaves entries as NaN
+ for the caller to fill in.
+
+`AFEstimationOptions` (from `skillmodels.af`) controls the sequential MLE:
+
+- **n_halton_points**, **n_halton_points_shock**: quadrature counts.
+- **n_mixture_components**: number of components in the latent-factor mixture.
+- **optimizer_algorithm**: the optimagic algorithm name passed to
+ `optimagic.minimize(algorithm=...)` (default `"fides"`; use
+ `"scipy_lbfgsb"` for MC sweeps).
+- **initialization_strategy**: `"amn"`, `"spearman"`, or `"constant"`. Same
+ meaning as in CHS.
+
+`AMNEstimationOptions` (from `skillmodels.amn`) controls the three-stage
+pipeline:
+
+- **n_mixture_components**: Stage-1 EM components.
+- **em_max_iter**, **em_tol**, **em_n_init**, **em_reg_covar**: Stage-1 EM
+ numerical knobs.
+- **n_simulation_draws**: Stage-3 synthetic-panel size.
+- **minimum_distance_weighting**: Stage-2 weighting. `"identity"` (default) is
+ the paper's unweighted identity-metric criterion over per-component means and
+ full covariance matrices, and is currently the only implemented option.
+ `"optimal"` is reserved for a future Avar-weighted criterion and raises
+ `NotImplementedError`.
+- **investment_endogeneity**: apply the AMN (2020) eq. 7-8 / AF Sec. 3.5
+ investment control-function correction in Stage 3. Defaults to `False`. When
+ `True` and the model has an endogenous (investment) factor, a first-stage
+ investment equation is OLS-fit per period and its residual is added as an
+ additive `cf` covariate (coefficient `kappa_t`) to each state factor's
+ production regression; observed factors are then excluded from the production
+ function and act as instruments (at least one observed instrument is
+ required). The default stays `False` because `estimate_af` calls
+ `estimate_amn` for start values and the AF likelihood implements only
+ `kappa=0`; opt into the correction at the application call site. A no-op for
+ models without endogenous factors.
+
+The shared structural field — number of mixture components in the latent
+distribution — lives directly on `ModelSpec.n_mixtures`, since it changes the
+model itself rather than the optimizer.
diff --git a/docs/explanations/notes_on_factor_scales.md b/docs/explanations/notes_on_factor_scales.md
index e938faf4..8bec8dcb 100644
--- a/docs/explanations/notes_on_factor_scales.md
+++ b/docs/explanations/notes_on_factor_scales.md
@@ -8,10 +8,16 @@ Wiswall and Agostinelli define a class of transition functions with Known Locati
Scale (KLS) that require fewer normalizations. Their critique potentially invalidates
certain empirical estimates from CHS, but not the general estimation approach.
-To get estimates that avoid renormalization issues, you can either:
+To reduce the risk of renormalization issues, you can either:
1. Use fewer normalizations with KLS transition functions, or
2. Use non-KLS transition functions with one normalization per period and factor
+skillmodels supports both schemes, but supporting a scheme is not the same as
+guaranteeing identification: the model checker performs syntactic checks on the
+normalizations, not a transition-specific rank or scale-invariance analysis.
+Whether a given scheme identifies the model still depends on the transition
+functions and data; see the cautions below.
+
As there is no natural scale for skills, neither approach is inherently better.
However, we prefer using flexible non-KLS transition functions with explicit
normalizations because:
diff --git a/docs/getting_started/tutorial.ipynb b/docs/getting_started/tutorial.ipynb
index b123b437..269397c2 100644
--- a/docs/getting_started/tutorial.ipynb
+++ b/docs/getting_started/tutorial.ipynb
@@ -5,63 +5,183 @@
"id": "0",
"metadata": {},
"source": [
- "# Skillmodels Quickstart\n",
+ "# skillmodels three-estimator tutorial\n",
"\n",
- "This tutorial demonstrates the basic workflow for estimating a latent factor model\n",
- "using skillmodels. We'll use Example 2 from the Cunha, Heckman, and Schennach (2010)\n",
- "replication files."
+ "skillmodels ships three estimators that share the same `ModelSpec` and the same parameter index:\n",
+ "\n",
+ "- **CHS** (Cunha-Heckman-Schennach 2010): square-root unscented Kalman MLE.\n",
+ "- **AF** (Antweiler-Freyberger 2025): sequential MLE with Halton quadrature over the latent posterior, period by period.\n",
+ "- **AMN** (Attanasio-Meghir-Nix 2020): three-stage estimator (EM on a mixture-of-normals → minimum distance → simulate-and-regress).\n",
+ "\n",
+ "This tutorial walks all three on the **CNLSY** dataset from the AF 2025 application: three waves (ages 7 / 9 / 11), a CES production function for the latent skill, and an endogenous investment factor.\n",
+ "\n",
+ "The notebook is committed with pre-rendered outputs (`execute: false`); rerun it to refresh the numbers if the API drifts. Single-machine wallclock at the time of writing: ~10–15 minutes total."
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"id": "1",
"metadata": {},
- "outputs": [],
"source": [
- "import pandas as pd\n",
+ "## Setup\n",
"\n",
- "from skillmodels import get_maximization_inputs\n",
- "from skillmodels.config import TEST_DATA_DIR\n",
- "from skillmodels.test_data.model2 import MODEL2"
+ "Load the long-format CNLSY measurements bundled with the package and build the CES `ModelSpec`. The model has four latent factors (`skills`, `MC`, `MN`, `investment`) plus one observed factor (`log_income`). Cognitive (`MC`) and non-cognitive (`MN`) skills are pinned to identity transitions: they enter the skills CES as additional inputs but evolve as constants over time. All factor weights inside the skills CES are estimated freely, subject to the simplex constraint (gammas non-negative, sum to one)."
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"id": "2",
- "metadata": {},
- "source": [
- ""
- ]
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:13:11.517683Z",
+ "iopub.status.busy": "2026-05-14T07:13:11.517454Z",
+ "iopub.status.idle": "2026-05-14T07:13:13.015271Z",
+ "shell.execute_reply": "2026-05-14T07:13:13.014780Z"
+ }
+ },
+ "outputs": [],
+ "source": "import warnings\n\nimport optimagic as om\nimport pandas as pd\nimport plotly.graph_objects as go\n\nfrom skillmodels import FactorSpec, ModelSpec, Normalizations\nfrom skillmodels.af import AFEstimationOptions, estimate_af\nfrom skillmodels.af.posterior_states import get_af_posterior_states\nfrom skillmodels.amn import AMNEstimationOptions, estimate_amn\nfrom skillmodels.amn.posterior_states import get_amn_posterior_states\nfrom skillmodels.chs import (\n CHSEstimationOptions,\n get_maximization_inputs,\n)\nfrom skillmodels.common.config import CNLSY_DATA_PATH\nfrom skillmodels.common.individual_states import get_individual_states_from_params\nfrom skillmodels.common.variance_decomposition import (\n decompose_measurement_variance,\n summarize_measurement_reliability,\n)\n\nwarnings.filterwarnings(\"ignore\", category=DeprecationWarning)\npd.options.display.float_format = \"{:.3f}\".format"
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "3",
- "metadata": {},
- "outputs": [],
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:13:13.016446Z",
+ "iopub.status.busy": "2026-05-14T07:13:13.016229Z",
+ "iopub.status.idle": "2026-05-14T07:13:13.027837Z",
+ "shell.execute_reply": "2026-05-14T07:13:13.027469Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "individuals: 1403\n",
+ "periods: [0, 1, 2]\n",
+ "columns: ['skill_math', 'skill_recog', 'skill_comp', 'mc_1', 'mc_2', 'mc_3', 'mc_4', 'mc_5', 'mc_6', 'mn_neg', 'mn_pos', 'mn_rotter', 'inv_reads', 'inv_museum', 'inv_praised', 'log_income_observed']\n"
+ ]
+ }
+ ],
"source": [
- "model = MODEL2\n",
- "\n",
- "# Show the structure\n",
- "print(\"Factors:\", list(model.factors.keys()))"
+ "data = pd.read_csv(CNLSY_DATA_PATH).set_index([\"caseid\", \"period\"])\n",
+ "print(f\"individuals: {data.index.get_level_values(0).nunique()}\")\n",
+ "print(f\"periods: {sorted(data.index.get_level_values(1).unique())}\")\n",
+ "print(f\"columns: {list(data.columns)}\")"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "4",
- "metadata": {},
- "outputs": [],
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:13:13.029013Z",
+ "iopub.status.busy": "2026-05-14T07:13:13.028919Z",
+ "iopub.status.idle": "2026-05-14T07:13:13.036687Z",
+ "shell.execute_reply": "2026-05-14T07:13:13.036255Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "latent factors: ('skills', 'MC', 'MN', 'investment')\n",
+ "observed factors: ('log_income_observed',)\n",
+ "n_mixtures: 2\n"
+ ]
+ }
+ ],
"source": [
- "data = pd.read_stata(TEST_DATA_DIR / \"model2_simulated_data.dta\")\n",
- "data = data.set_index([\"caseid\", \"period\"])\n",
- "data.head()"
+ "_N_PERIODS = 3\n",
+ "MC_MEASURES = tuple(f\"mc_{i + 1}\" for i in range(6))\n",
+ "MN_MEASURES = (\"mn_neg\", \"mn_pos\", \"mn_rotter\")\n",
+ "SKILL_MEASURES = (\"skill_math\", \"skill_recog\", \"skill_comp\")\n",
+ "INV_MEASURES = (\"inv_reads\", \"inv_museum\", \"inv_praised\")\n",
+ "INCOME_MEASURE = \"log_income_observed\"\n",
+ "\n",
+ "\n",
+ "def _measurements(meas, active_periods=None):\n",
+ " active = tuple(range(_N_PERIODS)) if active_periods is None else active_periods\n",
+ " return tuple(meas if t in active else () for t in range(_N_PERIODS))\n",
+ "\n",
+ "\n",
+ "def _normalizations(\n",
+ " meas, *, normalize_periods=None, active_periods=None, pin_first_intercept=True\n",
+ "):\n",
+ " active = tuple(range(_N_PERIODS)) if active_periods is None else active_periods\n",
+ " norm = tuple(range(_N_PERIODS)) if normalize_periods is None else normalize_periods\n",
+ " loadings, intercepts = [], []\n",
+ " for t in range(_N_PERIODS):\n",
+ " if t in active and t in norm:\n",
+ " loadings.append({meas[0]: 1.0})\n",
+ " intercepts.append({meas[0]: 0.0} if pin_first_intercept else {})\n",
+ " else:\n",
+ " loadings.append({})\n",
+ " intercepts.append({})\n",
+ " return Normalizations(loadings=tuple(loadings), intercepts=tuple(intercepts))\n",
+ "\n",
+ "\n",
+ "factors = {\n",
+ " \"skills\": FactorSpec(\n",
+ " measurements=_measurements(SKILL_MEASURES),\n",
+ " normalizations=_normalizations(SKILL_MEASURES, normalize_periods=(0,)),\n",
+ " transition_function=\"log_ces\",\n",
+ " ),\n",
+ " \"MC\": FactorSpec(\n",
+ " measurements=_measurements(MC_MEASURES, active_periods=(0,)),\n",
+ " normalizations=_normalizations(\n",
+ " MC_MEASURES, active_periods=(0,), normalize_periods=(0,)\n",
+ " ),\n",
+ " transition_function=\"linear\",\n",
+ " has_production_shock=False,\n",
+ " ),\n",
+ " \"MN\": FactorSpec(\n",
+ " measurements=_measurements(MN_MEASURES, active_periods=(0,)),\n",
+ " normalizations=_normalizations(\n",
+ " MN_MEASURES, active_periods=(0,), normalize_periods=(0,)\n",
+ " ),\n",
+ " transition_function=\"linear\",\n",
+ " has_production_shock=False,\n",
+ " ),\n",
+ " \"investment\": FactorSpec(\n",
+ " measurements=_measurements(INV_MEASURES, active_periods=(0, 1)),\n",
+ " normalizations=_normalizations(\n",
+ " INV_MEASURES, active_periods=(0, 1), normalize_periods=(0,)\n",
+ " ),\n",
+ " transition_function=\"linear\",\n",
+ " ),\n",
+ "}\n",
+ "\n",
+ "# Pin the time-invariant MC and MN transitions to identity: self-coefficient 1,\n",
+ "# cross-factor 0, constant 0. The skills CES gammas stay free so the optimizer\n",
+ "# discovers which factors actually feed skill growth.\n",
+ "fixed_rows = []\n",
+ "for t in range(_N_PERIODS - 1):\n",
+ " for factor in (\"MC\", \"MN\"):\n",
+ " fixed_rows.append(((\"transition\", t, factor, factor), 1.0))\n",
+ " for other in (\"skills\", \"MC\", \"MN\", \"investment\"):\n",
+ " if other != factor:\n",
+ " fixed_rows.append(((\"transition\", t, factor, other), 0.0))\n",
+ " fixed_rows.append(((\"transition\", t, factor, \"constant\"), 0.0))\n",
+ "\n",
+ "fixed_idx = pd.MultiIndex.from_tuples(\n",
+ " [r[0] for r in fixed_rows], names=[\"category\", \"period\", \"name1\", \"name2\"]\n",
+ ")\n",
+ "fixed_params = pd.DataFrame({\"value\": [r[1] for r in fixed_rows]}, index=fixed_idx)\n",
+ "\n",
+ "model = ModelSpec(\n",
+ " factors=factors,\n",
+ " observed_factors=(INCOME_MEASURE,),\n",
+ " n_mixtures=2,\n",
+ ")\n",
+ "print(f\"latent factors: {tuple(model.factors)}\")\n",
+ "print(f\"observed factors: {model.observed_factors}\")\n",
+ "print(f\"n_mixtures: {model.n_mixtures}\")"
]
},
{
@@ -69,202 +189,2140 @@
"id": "5",
"metadata": {},
"source": [
- "## Getting Maximization Inputs\n",
- "\n",
- "The main entry point is `get_maximization_inputs()`. It takes a model specification\n",
- "and dataset, and returns everything needed to maximize the likelihood using optimagic:\n",
+ "## CHS: square-root unscented Kalman MLE\n",
"\n",
- "- `loglike`: The compiled log-likelihood function\n",
- "- `gradient`: The gradient of the log-likelihood\n",
- "- `loglike_and_gradient`: Combined function (more efficient)\n",
- "- `debug_loglike`: Uncompiled version for debugging\n",
- "- `params_template`: Parameter DataFrame with bounds and starting values\n",
- "- `constraints`: Parameter constraints for optimization"
+ "CHS estimation runs in two steps: `get_maximization_inputs(...)` compiles the jitted likelihood, gradients, and constraints from the spec + data; then we hand the bundle to `optimagic.maximize`. Defaults are CHS's `start_params_strategy=\"amn\"` (runs AMN first under the hood to seed the param template), `robust_bounds=True`, and `bounds_distance=1e-3`."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"id": "6",
- "metadata": {},
- "outputs": [],
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:13:13.038140Z",
+ "iopub.status.busy": "2026-05-14T07:13:13.037984Z",
+ "iopub.status.idle": "2026-05-14T07:13:39.788024Z",
+ "shell.execute_reply": "2026-05-14T07:13:39.787579Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "params_template shape: (158, 3)\n",
+ "n_constraints: 32\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:336: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_load, \"value\"] = float(result.loadings[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:339: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = float(result.meas_sds[local_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:363: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"value\"] = sd_factor\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:559: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"value\"] = float(beta[col_idx])\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/amn/start_values.py:579: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc_sd, \"value\"] = shock_sd\n"
+ ]
+ }
+ ],
"source": [
- "max_inputs = get_maximization_inputs(model, data)\n",
- "print(\"Available keys:\", list(max_inputs.keys()))"
+ "chs_options = CHSEstimationOptions(\n",
+ " robust_bounds=True,\n",
+ " bounds_distance=1e-3,\n",
+ ")\n",
+ "max_inputs = get_maximization_inputs(\n",
+ " model_spec=model,\n",
+ " data=data,\n",
+ " chs_options=chs_options,\n",
+ " fixed_params=fixed_params,\n",
+ ")\n",
+ "print(f\"params_template shape: {max_inputs['params_template'].shape}\")\n",
+ "print(f\"n_constraints: {len(max_inputs['constraints'])}\")"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": 5,
"id": "7",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:13:39.789235Z",
+ "iopub.status.busy": "2026-05-14T07:13:39.789034Z",
+ "iopub.status.idle": "2026-05-14T07:19:28.096303Z",
+ "shell.execute_reply": "2026-05-14T07:19:28.095804Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CHS success: True, loglike: -39620.92\n"
+ ]
+ }
+ ],
"source": [
- "## Parameter Template\n",
- "\n",
- "The `params_template` is a pandas DataFrame with:\n",
- "- A MultiIndex identifying each parameter (category, period, name1, name2)\n",
- "- Columns for `value` (to be filled with starting values), `lower_bound`, `upper_bound`"
+ "chs_result = om.maximize(\n",
+ " fun=max_inputs[\"loglike\"],\n",
+ " params=max_inputs[\"params_template\"],\n",
+ " algorithm=\"scipy_lbfgsb\",\n",
+ " fun_and_jac=max_inputs[\"loglike_and_gradient\"],\n",
+ " constraints=max_inputs[\"constraints\"],\n",
+ ")\n",
+ "chs_params = chs_result.params\n",
+ "print(f\"CHS success: {chs_result.success}, loglike: {chs_result.fun:.2f}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:19:28.097610Z",
+ "iopub.status.busy": "2026-05-14T07:19:28.097505Z",
+ "iopub.status.idle": "2026-05-14T07:19:57.433481Z",
+ "shell.execute_reply": "2026-05-14T07:19:57.432980Z"
+ }
+ },
"outputs": [],
- "source": [
- "params_template = max_inputs[\"params_template\"]\n",
- "params_template.head(10)"
- ]
+ "source": "chs_filtered = get_individual_states_from_params(\n model_spec=model, data=data, params=chs_params\n)\nchs_states = chs_filtered[\"unanchored_states\"][\"states\"]\nchs_decomp = decompose_measurement_variance(\n model_spec=model, params=chs_params, filtered_states=chs_states\n)\nchs_reliability = summarize_measurement_reliability(chs_decomp)\nchs_reliability"
},
{
"cell_type": "markdown",
"id": "9",
"metadata": {},
- "source": [
- "## Choosing Starting Values\n",
- "\n",
- "Good starting values are important for optimization. As a rule of thumb:\n",
- "\n",
- "- If measurements are standardized, use 1.0 for free loadings and 0.0 for free intercepts\n",
- "- Start measurement and shock standard deviations slightly larger than expected\n",
- "- Initial state means can often start at 0\n",
- "\n",
- "Here we set reasonable defaults:"
- ]
+ "source": "## AF: sequential Halton-quadrature MLE\n\nAF estimates each period in turn: period 0 fits the joint mixture-of-normals + period-0 measurement system; each subsequent period takes the previous period's posterior and runs a period-specific MLE via `optimagic.minimize` with the algorithm in `AFEstimationOptions.optimizer_algorithm` (default `\"fides\"`; pass `\"scipy_lbfgsb\"` for Monte Carlo sweeps where a deterministic stopping rule matters).\n\nDefault `start_params_strategy=\"amn\"` runs the full AMN three-stage estimator upfront and uses its parameters to seed each AF period. The number of mixture components is read from `ModelSpec.n_mixtures` (set to 2 above), shared across all three estimators."
},
{
"cell_type": "code",
"execution_count": null,
"id": "10",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:19:57.434856Z",
+ "iopub.status.busy": "2026-05-14T07:19:57.434760Z",
+ "iopub.status.idle": "2026-05-14T07:20:56.673081Z",
+ "shell.execute_reply": "2026-05-14T07:20:56.672613Z"
+ }
+ },
"outputs": [],
- "source": [
- "params = params_template.copy()\n",
- "\n",
- "# Set starting values by category\n",
- "for category in params.index.get_level_values(\"category\").unique():\n",
- " if category == \"loadings\":\n",
- " params.loc[category, \"value\"] = 1.0\n",
- " elif category == \"controls\":\n",
- " params.loc[category, \"value\"] = 0.0\n",
- " elif category in (\"meas_sds\", \"shock_sds\") or category == \"initial_cholcovs\":\n",
- " params.loc[category, \"value\"] = 0.5\n",
- " elif category == \"initial_states\":\n",
- " params.loc[category, \"value\"] = 0.0\n",
- " elif category == \"mixture_weights\":\n",
- " params.loc[category, \"value\"] = 1.0\n",
- " elif category == \"transition\":\n",
- " # Set transition parameters to reasonable defaults\n",
- " params.loc[category, \"value\"] = 0.5\n",
- "\n",
- "params.head(10)"
- ]
+ "source": "af_options = AFEstimationOptions(\n n_halton_points=100,\n n_halton_points_shock=50,\n optimizer_algorithm=\"scipy_lbfgsb\",\n)\naf_result = estimate_af(\n model_spec=model,\n data=data,\n options=af_options,\n fixed_params=fixed_params,\n)\naf_lls = [pr.loglikelihood for pr in af_result.period_results]\nprint(\n f\"AF per-period success: {[bool(pr.success) for pr in af_result.period_results]}, \"\n f\"per-period log-likelihoods: {[f'{ll:.2f}' for ll in af_lls]}\"\n)"
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"id": "11",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:20:56.674410Z",
+ "iopub.status.busy": "2026-05-14T07:20:56.674311Z",
+ "iopub.status.idle": "2026-05-14T07:21:01.658274Z",
+ "shell.execute_reply": "2026-05-14T07:21:01.657922Z"
+ }
+ },
+ "outputs": [],
+ "source": "af_posterior = get_af_posterior_states(\n af_result=af_result,\n model_spec=model,\n data=data,\n n_halton_points=200,\n)\naf_states = af_posterior[\"unanchored_states\"][\"states\"]\naf_decomp = decompose_measurement_variance(\n model_spec=model, params=af_result.params, filtered_states=af_states\n)\naf_reliability = summarize_measurement_reliability(af_decomp)\naf_reliability"
+ },
+ {
+ "cell_type": "markdown",
+ "id": "12",
"metadata": {},
- "source": [
- "## JAX Compilation\n",
- "\n",
- "Skillmodels uses JAX for just-in-time compilation and automatic differentiation.\n",
- "The first call to `loglike` or `gradient` triggers compilation, which takes a few\n",
- "seconds. Subsequent calls are very fast."
- ]
+ "source": "## AMN: three-stage mixture-of-normals\n\nAMN's three stages are EM on the augmented measurement vector (mixture-of-normals), minimum-distance recovery of the structural parameters, and a simulate-and-regress step on the fitted mixture for the production function. With `ModelSpec.n_mixtures=2` the Stage-1 EM fits a 2-component Gaussian mixture on the joint $(M, X)$ vector — the kind of non-Gaussian latent structure AMN is designed for."
},
{
"cell_type": "code",
"execution_count": null,
- "id": "12",
- "metadata": {},
+ "id": "13",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:01.659567Z",
+ "iopub.status.busy": "2026-05-14T07:21:01.659466Z",
+ "iopub.status.idle": "2026-05-14T07:21:26.698296Z",
+ "shell.execute_reply": "2026-05-14T07:21:26.695286Z"
+ }
+ },
"outputs": [],
- "source": [
- "loglike = max_inputs[\"loglike\"]\n",
- "gradient = max_inputs[\"gradient\"]\n",
- "loglike_and_gradient = max_inputs[\"loglike_and_gradient\"]"
- ]
+ "source": "amn_options = AMNEstimationOptions(\n em_max_iter=500,\n n_simulation_draws=50_000,\n seed=0,\n)\namn_result = estimate_amn(\n model_spec=model,\n data=data,\n options=amn_options,\n fixed_params=fixed_params,\n)\nprint(f\"AMN success: {amn_result.success}\")"
},
{
"cell_type": "code",
"execution_count": null,
- "id": "13",
- "metadata": {},
+ "id": "14",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:26.699696Z",
+ "iopub.status.busy": "2026-05-14T07:21:26.699564Z",
+ "iopub.status.idle": "2026-05-14T07:21:26.794622Z",
+ "shell.execute_reply": "2026-05-14T07:21:26.793933Z"
+ }
+ },
"outputs": [],
- "source": [
- "# First call includes compilation time\n",
- "loglike_value = loglike(params)\n",
- "print(f\"Log-likelihood at starting values: {loglike_value:.2f}\")"
- ]
+ "source": "amn_posterior = get_amn_posterior_states(amn_result=amn_result, data=data)\namn_states = amn_posterior[\"unanchored_states\"][\"states\"]\namn_decomp = decompose_measurement_variance(\n model_spec=model, params=amn_result.params, filtered_states=amn_states\n)\namn_reliability = summarize_measurement_reliability(amn_decomp)\namn_reliability"
},
{
"cell_type": "markdown",
- "id": "14",
+ "id": "15",
"metadata": {},
"source": [
- "## Constraints\n",
+ "## Cross-estimator comparison\n",
"\n",
- "Skillmodels automatically generates constraints from the model specification:\n",
- "- Fixed parameters (normalized loadings and intercepts)\n",
- "- Stagemap equality constraints\n",
- "- Bound constraints\n",
+ "The three estimators target the same likelihood under different approximations / objectives. Below we line up:\n",
"\n",
- "You can add additional constraints for your specific model."
+ "1. Period-0 measurement loadings for the `skill_*` indicators.\n",
+ "2. CES production-function gammas + φ for the period-0 → period-1 skills transition.\n",
+ "3. Signal-share scatter: do they agree on which measurements are high-noise?"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "15",
- "metadata": {},
+ "id": "16",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:26.795949Z",
+ "iopub.status.busy": "2026-05-14T07:21:26.795823Z",
+ "iopub.status.idle": "2026-05-14T07:21:26.809737Z",
+ "shell.execute_reply": "2026-05-14T07:21:26.809254Z"
+ }
+ },
"outputs": [],
+ "source": "estimators = {\n \"CHS\": chs_params,\n \"AF\": af_result.params,\n \"AMN\": amn_result.params,\n}\n\n\ndef _free_loading(params, period, meas):\n loc = (\"loadings\", period, meas, \"skills\")\n if loc not in params.index:\n return None\n return float(params.loc[loc, \"value\"])\n\n\nloading_rows = []\nfor est, params in estimators.items():\n for meas in SKILL_MEASURES:\n value = _free_loading(params, period=0, meas=meas)\n if value is None:\n continue\n loading_rows.append({\"estimator\": est, \"measurement\": meas, \"loading\": value})\nloadings_df = pd.DataFrame(loading_rows)\nloadings_pivot = loadings_df.pivot(\n index=\"measurement\", columns=\"estimator\", values=\"loading\"\n)\nloadings_pivot"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "17",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:26.810916Z",
+ "iopub.status.busy": "2026-05-14T07:21:26.810787Z",
+ "iopub.status.idle": "2026-05-14T07:21:29.003649Z",
+ "shell.execute_reply": "2026-05-14T07:21:29.003242Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "name": "CHS",
+ "type": "bar",
+ "x": [
+ "skill_math",
+ "skill_recog",
+ "skill_comp"
+ ],
+ "y": {
+ "bdata": "AAAAAAAA8D/DIYazpav2Pyn68owbpfU/",
+ "dtype": "f8"
+ }
+ },
+ {
+ "name": "AF",
+ "type": "bar",
+ "x": [
+ "skill_math",
+ "skill_recog",
+ "skill_comp"
+ ],
+ "y": {
+ "bdata": "AAAAAAAA8D9fbAPZXff1P7wQMLJ+EvY/",
+ "dtype": "f8"
+ }
+ },
+ {
+ "name": "AMN",
+ "type": "bar",
+ "x": [
+ "skill_math",
+ "skill_recog",
+ "skill_comp"
+ ],
+ "y": {
+ "bdata": "AAAAAAAA8D+wS/CPTL/yP0IjsiJDuvI/",
+ "dtype": "f8"
+ }
+ }
+ ],
+ "layout": {
+ "barmode": "group",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermap": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermap"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "white",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#C8D4E3"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "white",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "radialaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "yaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "zaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "caxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Period-0 skill loadings across estimators"
+ },
+ "yaxis": {
+ "title": {
+ "text": "loading"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "constraints = max_inputs[\"constraints\"]\n",
- "print(f\"Number of auto-generated constraints: {len(constraints)}\")"
+ "fig = go.Figure()\n",
+ "for est in (\"CHS\", \"AF\", \"AMN\"):\n",
+ " sub = loadings_df[loadings_df[\"estimator\"] == est]\n",
+ " fig.add_trace(go.Bar(name=est, x=sub[\"measurement\"], y=sub[\"loading\"]))\n",
+ "fig.update_layout(\n",
+ " title=\"Period-0 skill loadings across estimators\",\n",
+ " barmode=\"group\",\n",
+ " template=\"plotly_white\",\n",
+ " yaxis_title=\"loading\",\n",
+ ")\n",
+ "fig"
]
},
{
- "cell_type": "markdown",
- "id": "16",
- "metadata": {},
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "18",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:29.004727Z",
+ "iopub.status.busy": "2026-05-14T07:21:29.004623Z",
+ "iopub.status.idle": "2026-05-14T07:21:29.011824Z",
+ "shell.execute_reply": "2026-05-14T07:21:29.011388Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " gamma_skills | \n",
+ " gamma_investment | \n",
+ " phi | \n",
+ "
\n",
+ " \n",
+ " | estimator | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | CHS | \n",
+ " 0.893 | \n",
+ " 0.000 | \n",
+ " 1.337 | \n",
+ "
\n",
+ " \n",
+ " | AF | \n",
+ " 0.683 | \n",
+ " 0.271 | \n",
+ " -1.178 | \n",
+ "
\n",
+ " \n",
+ " | AMN | \n",
+ " 0.894 | \n",
+ " 0.000 | \n",
+ " 0.457 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " gamma_skills gamma_investment phi\n",
+ "estimator \n",
+ "CHS 0.893 0.000 1.337\n",
+ "AF 0.683 0.271 -1.178\n",
+ "AMN 0.894 0.000 0.457"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "## Estimation with optimagic\n",
- "\n",
- "To estimate the model, use optimagic's `maximize` function:\n",
+ "def _safe_float(params, loc):\n",
+ " if loc not in params.index:\n",
+ " return float(\"nan\")\n",
+ " return float(params.loc[loc, \"value\"])\n",
"\n",
- "```python\n",
- "import optimagic as om\n",
"\n",
- "result = om.maximize(\n",
- " fun=loglike,\n",
- " params=params,\n",
- " algorithm=\"scipy_lbfgsb\",\n",
- " fun_and_jac=loglike_and_gradient,\n",
- " constraints=constraints,\n",
+ "ces_rows: list[dict[str, float | str]] = []\n",
+ "for est, params in estimators.items():\n",
+ " row: dict[str, float | str] = {\"estimator\": est}\n",
+ " for col in (\"skills\", \"investment\"):\n",
+ " row[f\"gamma_{col}\"] = _safe_float(params, (\"transition\", 0, \"skills\", col))\n",
+ " row[\"phi\"] = _safe_float(params, (\"transition\", 0, \"skills\", \"phi\"))\n",
+ " ces_rows.append(row)\n",
+ "ces_df = pd.DataFrame(ces_rows).set_index(\"estimator\")\n",
+ "ces_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "19",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-14T07:21:29.012809Z",
+ "iopub.status.busy": "2026-05-14T07:21:29.012715Z",
+ "iopub.status.idle": "2026-05-14T07:21:29.034918Z",
+ "shell.execute_reply": "2026-05-14T07:21:29.034535Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "size": 8
+ },
+ "mode": "markers",
+ "name": "AF vs CHS",
+ "type": "scatter",
+ "x": {
+ "bdata": "VYuwyapJwj8gz+Pl1hDFP6FHVF1E08E/fOy9wklt5j8ek2zX6YPmP/tmS6+3d+U/0w3gSUi94D+c1rhUBG/bP1kVmZ0hnuU/HTrXCtZl3D+X/WuijgXbP1v1EI2/YLY/LhzMiSiK6T9F2GxXZFHbPwqj62I8KOw/ZpAJHzRtvz9bFq9nRbjCP0pk1hjuxsA/CRuL2MRi5D9u3Qm/mOfdP+1zpbocEek/Vr3pBiag4z9RXCjpI9HdPxyn66by8uc/",
+ "dtype": "f8"
+ },
+ "y": {
+ "bdata": "/kmPhxceuz+FzaYg15+3PwI8WSPocLY/4ioSrKlH5T+eTVdFpKrmP5IR6kvQ6+U/vLiFAlCX4D9OiwwoQFXbP5PK4PeP1OQ/7RECqMrj1j93mPTaN/bVP+xFKBFmQLI/4xH0KIZK6j/SNCKMT8raP7uJ2SXqBeo/PBHp2xAptz8YwU9Xy7m0PwXhcSSVW7I/chUV98084j+Yx0VYEKLcP3HOoulxzuU/eRyhAt3X5D84zKh3/3vlP3ja63vySeg/",
+ "dtype": "f8"
+ }
+ },
+ {
+ "marker": {
+ "size": 8,
+ "symbol": "diamond"
+ },
+ "mode": "markers",
+ "name": "AMN vs CHS",
+ "type": "scatter",
+ "x": {
+ "bdata": "VYuwyapJwj8gz+Pl1hDFP6FHVF1E08E/fOy9wklt5j8ek2zX6YPmP/tmS6+3d+U/0w3gSUi94D+c1rhUBG/bP1kVmZ0hnuU/HTrXCtZl3D+X/WuijgXbP1v1EI2/YLY/LhzMiSiK6T9F2GxXZFHbPwqj62I8KOw/ZpAJHzRtvz9bFq9nRbjCP0pk1hjuxsA/CRuL2MRi5D9u3Qm/mOfdP+1zpbocEek/Vr3pBiag4z9RXCjpI9HdPxyn66by8uc/",
+ "dtype": "f8"
+ },
+ "y": {
+ "bdata": "ID4Z1si/zT8tg8+KHOS+P0xKjbQvCcw/AIgHCYvx4z+0QdDWLtDnP/GDYl+yL+Y/anh/+Bbj4j/5y1gmMmvfP8FGlWE7muM/HfVRvmhm3j97iD20ELnUP8R5Sw5wfbs/xNGfp2iU5z+p23XHJUzhP7X8nQPNJug/B1DCbD5bwT/yRhQLpM++PzzYqbveNcU/zG1Y9vFc5D8N4y3kTYXiP9EGbUQFC+Y/TOPLhSZj5D95JK2X26ThP5WinuhjnOU/",
+ "dtype": "f8"
+ }
+ },
+ {
+ "line": {
+ "color": "gray",
+ "dash": "dash"
+ },
+ "mode": "lines",
+ "showlegend": false,
+ "type": "scatter",
+ "x": [
+ 0.07129514616851623,
+ 0.8799116069832007
+ ],
+ "y": [
+ 0.07129514616851623,
+ 0.8799116069832007
+ ]
+ }
+ ],
+ "layout": {
+ "height": 520,
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermap": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermap"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "white",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#C8D4E3"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "white",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "radialaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "yaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "zaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "caxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Signal share by measurement (CHS reference vs AF/AMN)"
+ },
+ "xaxis": {
+ "title": {
+ "text": "signal share (CHS)"
+ }
+ },
+ "yaxis": {
+ "title": {
+ "text": "signal share (AF / AMN)"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "decomp_by_est = {\"CHS\": chs_decomp, \"AF\": af_decomp, \"AMN\": amn_decomp}\n",
+ "signal_share = pd.DataFrame(\n",
+ " {est: d[\"fraction_signal\"] for est, d in decomp_by_est.items()}\n",
")\n",
- "```\n",
- "\n",
- "The `fun_and_jac` argument is important: it uses the combined function that\n",
- "computes both the likelihood and gradient efficiently."
+ "signal_share = signal_share.dropna()\n",
+ "fig = go.Figure()\n",
+ "fig.add_trace(\n",
+ " go.Scatter(\n",
+ " x=signal_share[\"CHS\"],\n",
+ " y=signal_share[\"AF\"],\n",
+ " mode=\"markers\",\n",
+ " name=\"AF vs CHS\",\n",
+ " marker={\"size\": 8},\n",
+ " )\n",
+ ")\n",
+ "fig.add_trace(\n",
+ " go.Scatter(\n",
+ " x=signal_share[\"CHS\"],\n",
+ " y=signal_share[\"AMN\"],\n",
+ " mode=\"markers\",\n",
+ " name=\"AMN vs CHS\",\n",
+ " marker={\"size\": 8, \"symbol\": \"diamond\"},\n",
+ " )\n",
+ ")\n",
+ "lo = float(signal_share.min().min())\n",
+ "hi = float(signal_share.max().max())\n",
+ "fig.add_trace(\n",
+ " go.Scatter(\n",
+ " x=[lo, hi],\n",
+ " y=[lo, hi],\n",
+ " mode=\"lines\",\n",
+ " line={\"dash\": \"dash\", \"color\": \"gray\"},\n",
+ " showlegend=False,\n",
+ " )\n",
+ ")\n",
+ "fig.update_layout(\n",
+ " title=\"Signal share by measurement (CHS reference vs AF/AMN)\",\n",
+ " template=\"plotly_white\",\n",
+ " xaxis_title=\"signal share (CHS)\",\n",
+ " yaxis_title=\"signal share (AF / AMN)\",\n",
+ " height=520,\n",
+ ")\n",
+ "fig"
]
},
{
"cell_type": "markdown",
- "id": "17",
+ "id": "20",
"metadata": {},
- "source": [
- "## Next Steps\n",
- "\n",
- "- See the [Model Specifications](../how_to_guides/model_specs.md) guide for details\n",
- " on writing model specifications\n",
- "- See the [Simulation](../how_to_guides/how_to_simulate_dataset.ipynb) guide for\n",
- " generating synthetic data\n",
- "- After estimation, use `get_filtered_states()` to extract latent factor estimates"
- ]
+ "source": "## Next steps\n\n- [How to estimate AF](../how_to_guides/how_to_estimate_af.md) covers the AF API in depth.\n- [How to estimate AMN](../how_to_guides/how_to_estimate_amn.md) shows AMN on its native ground (a synthetic 2-mixture DGP where the mixture-of-normals advantage is visible).\n- [How to compare estimators](../how_to_guides/how_to_compare_estimators.md) extends this tutorial with 95% confidence intervals (CHS analytic sandwich; AF and AMN cluster bootstrap) and overlaid posterior-factor trajectories.\n- [Architecture](../explanations/architecture.md) maps the `common/chs/af/amn` subpackage layout."
}
],
"metadata": {
+ "execution": {
+ "enabled": false
+ },
"language_info": {
- "name": "python"
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.3"
}
},
"nbformat": 4,
diff --git a/docs/how_to_guides/how_to_compare_estimators.md b/docs/how_to_guides/how_to_compare_estimators.md
new file mode 100644
index 00000000..b79b829b
--- /dev/null
+++ b/docs/how_to_guides/how_to_compare_estimators.md
@@ -0,0 +1,230 @@
+# Compare CHS, AF, and AMN with Confidence Intervals
+
+The getting-started tutorial shows the same `ModelSpec` estimated by all three
+estimators on CNLSY data. This guide picks up where the tutorial leaves off and
+quantifies the uncertainty around each estimator's point estimates:
+
+1. **CHS**: analytic OPG / inverse-score standard errors from
+ `estimagic.estimate_ml`.
+2. **AF**: propagated influence-function score bootstrap
+ (`compute_af_standard_errors`).
+3. **AMN**: nonparametric cluster bootstrap (`compute_amn_standard_errors`).
+
+The end of the guide overlays the three posterior factor trajectories on a
+single panel so you can read off whether the estimators agree on the latent
+factor path, not just on the parameter estimates.
+
+The guide assumes the three estimation results from the tutorial are in scope:
+`chs_result`, `af_result`, and `amn_result`. The corresponding model and data
+fixtures (`model`, `data`) are the same across all three.
+
+## Why each estimator gets a different inference
+
+Each estimator computes the same point estimate of the same model, but the
+sampling-distribution machinery differs:
+
+| Estimator | Inference | Why this and not bootstrap (CHS) / not OPG (AF, AMN) |
+| --------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| CHS | Analytic OPG / inverse-score (information equality) | Closed-form is valid under correct likelihood specification; bootstrap is just slower. |
+| AF | Propagated influence-function score bootstrap | The closed-form variance ignores estimation error in period-$t-1$ nuisance params, biasing every period-$t \geq 1$ SE down. The influence-function score bootstrap propagates that earlier-period uncertainty, so cross-period covariances are non-zero. |
+| AMN | Full re-estimation cluster bootstrap | The three-stage estimator has no clean sandwich form; each stage's residual variance compounds. |
+
+## CHS: analytic standard errors
+
+`estimate_chs` runs CHS through `estimagic.estimate_ml`, so its result carries
+ML inference directly. By default `estimate_chs` sets `hessian=False` (the
+numerical Hessian costs $O(\text{n\_params}^2)$ Kalman passes), so the reported
+covariance is the **OPG / inverse-score** form — the inverse of the
+outer-product-of-gradients information. This is valid under correct likelihood
+specification (the information-equality assumption) but is **not** the
+misspecification-robust sandwich, which would also need the Hessian.
+
+```python
+chs_result.likelihood_result.summary() # CHS via estimate_chs
+chs_result.likelihood_result.se()
+chs_result.likelihood_result.cov()
+```
+
+To get the Hessian-based sandwich covariance instead, override the estimagic
+keyword arguments via `CHSEstimationOptions.estimate_ml_options`:
+
+```python
+from skillmodels import CHSEstimationOptions, estimate_chs
+
+chs_result = estimate_chs(
+ model,
+ data,
+ CHSEstimationOptions(estimate_ml_options={"hessian": True}),
+)
+```
+
+If you drive the optimiser yourself via `get_maximization_inputs`, you can call
+`estimagic.estimate_ml` directly on `max_inputs["loglikeobs"]` and the
+`max_inputs["constraints"]`, choosing `hessian=True`/`False` to pick the
+sandwich or the OPG/inverse-score covariance.
+
+## AF: propagated influence-function score bootstrap
+
+`compute_af_standard_errors` implements the Antweiler & Freyberger (2025)
+§4.2 score bootstrap (after Armstrong, Bertanha & Hong 2014) in its
+sequential-estimator influence-function form. It builds a single
+per-observation influence matrix once at the optimum: each period block is a
+one-step Newton update of that period's full-chain score that also carries
+the earlier periods' influence via the cross-period (Hessian) blocks. For
+each of `n_boot` replicates it draws *one shared* caseid index, resamples the
+rows of the influence matrix with it, and shifts the estimate by the negated
+resample mean. The shared index propagates earlier-period estimation
+uncertainty, so the $t \geq 1$ standard errors are consistent and the
+cross-period covariances are non-zero (unlike an own-block, independent-period
+resample). No per-replicate re-estimation, so 10 000 replicates run in
+seconds.
+
+```python
+from skillmodels.af import compute_af_standard_errors
+
+af_inference = compute_af_standard_errors(
+ af_result,
+ data,
+ af_options,
+ n_boot=10_000,
+ seed=0,
+)
+af_inference.standard_errors.head()
+af_inference.vcov # (n_params, n_params) DataFrame indexed by the params MultiIndex
+af_inference.replicate_params # (n_boot, n_params)
+```
+
+The `replicate_params` DataFrame is the right object for plotting 95%
+intervals: take the 2.5%/97.5% empirical quantiles per parameter rather than
+$\hat{\theta} \pm 1.96 \cdot \mathrm{SE}$, since the one-step shifts can be
+visibly skewed.
+
+## AMN: cluster bootstrap
+
+AMN's three-stage pipeline (EM → minimum distance → simulate-and-regress) has
+no analytic sandwich, so inference is a full cluster bootstrap: resample
+caseids with replacement, re-run all three stages, repeat. Per-replicate cost
+is dominated by the Stage 1 EM (~seconds for $n \approx 2000$, $K = 2$,
+$\approx 40$ augmented measures). Each replicate draws a fresh per-replicate
+seed (so the Stage-1 EM initialisation and the Stage-3 simulation vary across
+replicates), and any replicate that fails to converge is excluded from the
+bootstrap distribution and reported via a `RuntimeWarning`; its row in
+`replicate_params` is `NaN`.
+
+```python
+from skillmodels.amn import compute_amn_standard_errors
+
+amn_inference = compute_amn_standard_errors(
+ amn_result,
+ data,
+ amn_options,
+ n_boot=200,
+ seed=0,
+)
+amn_inference.standard_errors.head()
+amn_inference.replicate_params # (n_boot, n_params) -- includes failed replicates as NaN rows
+```
+
+Bumping `n_boot` to 1000 is reasonable on a multi-core machine; the paper's
+original AMN application uses 100.
+
+## Overlaying CES production-function CIs
+
+Side-by-side $\phi$ estimates with 95% CIs:
+
+```python
+import pandas as pd
+
+def _ci(replicate_params, param_loc, q=0.025):
+ samples = replicate_params[param_loc].dropna()
+ return samples.quantile(q), samples.quantile(1 - q)
+
+rows = []
+for period in (0, 1):
+ phi_loc = ("transition", period, "skills", "phi")
+ rows.append({
+ "period": period,
+ "estimator": "CHS",
+ "estimate": chs_result.params.loc[phi_loc, "value"],
+ "lower": chs_result.likelihood_result.summary().loc[phi_loc, "ci_lower"],
+ "upper": chs_result.likelihood_result.summary().loc[phi_loc, "ci_upper"],
+ })
+ rows.append({
+ "period": period,
+ "estimator": "AF",
+ "estimate": af_result.params.loc[phi_loc, "value"],
+ "lower": _ci(af_inference.replicate_params, phi_loc)[0],
+ "upper": _ci(af_inference.replicate_params, phi_loc)[1],
+ })
+ rows.append({
+ "period": period,
+ "estimator": "AMN",
+ "estimate": amn_result.params.loc[phi_loc, "value"],
+ "lower": _ci(amn_inference.replicate_params, phi_loc)[0],
+ "upper": _ci(amn_inference.replicate_params, phi_loc)[1],
+ })
+
+phi_comparison = pd.DataFrame(rows)
+```
+
+## Posterior factor trajectories
+
+The three estimators produce different posterior beliefs about the latent
+factor paths. `chs_states`, `af_states`, `amn_states` (built in the tutorial
+via `get_individual_states`, `get_af_posterior_states`,
+`get_amn_posterior_states`) all share a `period` column and one column per
+factor, so a single melt + facet plot covers the comparison:
+
+```python
+import plotly.express as px
+
+states = pd.concat(
+ [
+ chs_states.assign(estimator="CHS"),
+ af_states.assign(estimator="AF"),
+ amn_states.assign(estimator="AMN"),
+ ]
+)
+trajectories = states.groupby(["estimator", "period"])["skills"].mean().reset_index()
+
+fig = px.line(
+ trajectories,
+ x="period",
+ y="skills",
+ color="estimator",
+ title="Mean posterior skill across estimators",
+ template="plotly_white",
+)
+fig.show()
+```
+
+For a stronger visual comparison, plot the cross-individual variance band
+($q_{0.1}$, $q_{0.5}$, $q_{0.9}$) per estimator side-by-side; agreement on the
+median path with disagreement on the band is a useful diagnostic about how
+the estimator treats the tail of the latent distribution.
+
+## When the estimators disagree
+
+If CHS, AF, and AMN disagree by more than the bootstrap CIs predict, the
+candidate explanations are:
+
+- **Non-Gaussian latent factors.** CHS assumes Gaussian-mixture latents; AF and
+ AMN are more flexible about the mixture. Run `decompose_measurement_variance`
+ on each (the tutorial does this) and check whether the signal fractions
+ diverge — that's the leading indicator.
+- **Misspecified transition function.** `log_ces` enforces a CES form via the
+ simplex constraint on the $\gamma$ weights; if the data prefers a linear
+ technology with a free constant, the CHS optimum can land in a different
+ basin than the AF/AMN sequential estimates that escape the constraint via
+ their integration weights.
+- **Endogenous investment misalignment.** If `investment` is meant to be
+ endogenous (`is_endogenous=True`), CHS uses augmented periods internally
+ while AF treats it as a regular state per calendar period. The two answers
+ should still agree, but the augmented-period plumbing has historically been
+ the source of subtle bugs — start the diagnosis here if the disagreement is
+ concentrated around investment.
+
+See [How to estimate AF](how_to_estimate_af.md) and
+[How to estimate AMN](how_to_estimate_amn.md) for the estimator-specific tuning
+that matters when the headline disagreement turns out to be numerical, not
+substantive.
diff --git a/docs/how_to_guides/how_to_estimate_af.md b/docs/how_to_guides/how_to_estimate_af.md
new file mode 100644
index 00000000..c7a3b003
--- /dev/null
+++ b/docs/how_to_guides/how_to_estimate_af.md
@@ -0,0 +1,159 @@
+# Estimate a Model with AF (sequential Halton MLE)
+
+The Antweiler & Freyberger (2025) estimator (`skillmodels.af.estimate_af`) fits
+each period in sequence: period 0 jointly estimates the initial-period
+measurement system and the latent mixture; each subsequent period takes the
+estimated conditional state distribution and runs a period-specific MLE over a
+joint Halton design.
+
+## Minimal example
+
+```python
+import pandas as pd
+
+from skillmodels import ModelSpec, FactorSpec, Normalizations
+from skillmodels.af import AFEstimationOptions, estimate_af
+
+model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 3,
+ intercepts=({"y1": 0},) * 3,
+ ),
+ transition_function="linear",
+ ),
+ },
+)
+data: pd.DataFrame # long-format, indexed by (caseid, period)
+
+af_options = AFEstimationOptions(
+ n_halton_points=200, # main quadrature
+ n_halton_points_shock=50, # production-shock integration
+)
+result = estimate_af(model, data, af_options)
+
+result.params # canonical skillmodels params DataFrame
+result.period_results[0] # per-period AFPeriodResult
+```
+
+For score-bootstrap standard errors, pass the same `data` and
+`af_options` to `compute_af_standard_errors`:
+
+```python
+from skillmodels.af import compute_af_standard_errors
+
+inference = compute_af_standard_errors(
+ result, data, af_options, n_boot=10_000, seed=0
+)
+inference.standard_errors
+```
+
+`compute_af_standard_errors` implements the propagated influence-function
+score bootstrap of Antweiler & Freyberger (2025) §4.2 (after Armstrong,
+Bertanha & Hong 2014). It builds a single per-observation influence matrix
+once at the optimum — each period block carries the earlier periods'
+estimation uncertainty through the cross-period blocks of the full-chain
+Hessian — then resamples its caseid rows with one shared index per
+replicate. Because the same index is used across periods, the resulting
+$t \geq 1$ standard errors are consistent and the cross-period covariances
+are non-zero. No per-replicate re-estimation is involved, so 10 000
+replicates run in seconds. The result exposes `standard_errors`, `vcov`,
+and `replicate_params`.
+
+## Optimizer
+
+Each period's MLE runs through `optimagic.minimize` with the algorithm in
+`AFEstimationOptions.optimizer_algorithm` (default `"fides"`; pass
+`"scipy_lbfgsb"` for Monte Carlo sweeps where a deterministic stopping
+rule matters). The parameter vector crosses host↔device once per
+iteration:
+
+1. optimagic hands a pandas DataFrame to the user-supplied `fun` / `fun_and_jac`.
+1. The wrapper extracts the `"value"` column, pushes it to device, runs the
+ jitted log-likelihood, and copies the scalar + gradient back to numpy.
+
+Pass scipy_lbfgsb stopping options through `optimizer_options`:
+
+```python
+af_options = AFEstimationOptions(
+ n_halton_points=200,
+ n_halton_points_shock=50,
+ optimizer_algorithm="scipy_lbfgsb",
+ optimizer_options={
+ "algo_options": {
+ "convergence_gtol_abs": 1e-5,
+ "convergence_ftol_rel": 2.22e-9,
+ "stopping_maxiter": 15_000,
+ },
+ },
+)
+```
+
+All optimagic constraint kinds are supported: `FixedConstraintWithValue`
+(from normalisations / `fixed_params`), `ProbabilityConstraint` (from
+`log_ces` `gamma` simplex), and `EqualityConstraint` (within-step and
+cross-period equalities passed through `estimate_af(constraints=...)`).
+
+## Start-values strategy
+
+`AFEstimationOptions.start_params_strategy` controls how the per-period
+parameter templates are seeded:
+
+- `"amn"` (default) — run the full AMN three-stage estimator upfront and use
+ its parameter estimates as start values. Most accurate, slowest.
+- `"spearman"` — moment-based seeds from Spearman cross-covariances and
+ Bartlett-style residual variances. Fast; good enough for most diagnostics.
+- `"constant"` — legacy 0.5 / data-scaled defaults; useful for regression
+ testing and reproducing pre-fix results.
+- `"none"` — accepted for cross-estimator symmetry; behaves identically to
+ `"constant"` (AF always needs concrete per-period starts).
+
+`compute_af_standard_errors` does not re-run the optimizer per replicate, so
+the choice of `start_params_strategy` does not enter the inference path:
+the score bootstrap reuses the point estimate and only resamples the
+precomputed influence matrix.
+
+## Production transition functions
+
+For an AF production function, use the AF-specific transition functions
+`translog_af` (eq. 6: linear terms + pairwise interactions, NO square terms)
+or `log_ces_af` (eq. 7: CES over the production factors only). They enumerate
+parameters over the production factors (skill + investment) so observed
+factors such as income do not leak in as free production coefficients.
+
+The general-library transitions (`linear`, `translog`, `robust_translog`,
+`linear_and_squares`, `log_ces`, `log_ces_with_constant`, `log_ces_general`)
+enumerate parameters over *all* factors, including observed ones. Using one of
+these for a (non-endogenous) production factor while observed factors are
+present makes income enter the production function with its own free
+coefficients, which changes the AF estimand (income should affect skills only
+through the investment equation). `validate_af_model` emits a `UserWarning` in
+that case; either switch to `translog_af` / `log_ces_af`, or pin every
+observed-factor transition coefficient to 0 via `fixed_params`.
+
+## Anchoring and endogenous factors
+
+Anchoring is currently only supported by the CHS path
+(`get_maximization_inputs`). The AF path estimates the latent-factor scale
+implied by the measurement-system normalisations; anchoring outcomes can be
+added back into the model spec for downstream visualisation but do not enter
+the AF likelihood.
+
+Endogenous factors (investment in period $t$ measured by inv-measures in
+period $t$) are supported. See `tests/test_af_estimate.py` for a worked
+example with `is_endogenous=True`.
+
+The AF likelihood implements only the exogenous-investment case
+($\kappa_t = 0$): production and investment shocks are integrated as
+independent draws. The endogenous-investment control function is not part of
+the AF estimator. If the model declares a `CorrectionSpec` (via
+`FactorSpec.correction`), `validate_af_model` raises `NotImplementedError`;
+strip it with `ModelSpec.without_correction()` to run AF, or use
+`estimate_chs` to estimate the correction. (Supplying `kappa` / `kappa_t`
+parameters directly via `start_params` / `fixed_params` likewise raises
+`NotImplementedError`.) See
+[Endogeneity Corrections](../reference_guides/endogeneity_corrections.md) for
+the full control-function interface and
+[How to estimate AMN](how_to_estimate_amn.md) for the AMN route.
diff --git a/docs/how_to_guides/how_to_estimate_amn.md b/docs/how_to_guides/how_to_estimate_amn.md
new file mode 100644
index 00000000..4cb22f25
--- /dev/null
+++ b/docs/how_to_guides/how_to_estimate_amn.md
@@ -0,0 +1,259 @@
+# Estimate a Model with AMN (three-stage mixture-of-normals)
+
+The Attanasio-Meghir-Nix 2020 estimator (`skillmodels.amn.estimate_amn`) runs
+three stages:
+
+1. **Mixture EM.** Fit a Gaussian mixture
+ $F_{M, X} = \sum_k \tau_k \, \mathcal{N}(\Pi_k, \Psi_k)$ to the augmented
+ measure vector $[M_{1:T}, X]$ (controls / instruments stacked alongside
+ measurements as zero-error rows).
+2. **Minimum distance.** Recover structural parameters
+ $(\Lambda, A, \Sigma, \mu, \Omega)$ from the reduced-form
+ $(\Pi_k, \Psi_k)$ subject to factor-measurement assignment, scale
+ normalisations, and the mean-zero mixture restriction.
+3. **Simulate and regress.** Draw a large synthetic latent-factor panel
+ from the fitted mixture and estimate the production function by
+ regression on the synthetic data.
+
+AMN shines when the data are non-Gaussian in the latent factor distribution.
+CHS assumes Gaussian latent factors (one mixture component); AF supports
+multiple mixture components but fits them jointly with the period-specific
+optimizer; AMN cleanly separates the mixture from the structural recovery and
+explicitly models the non-Gaussianity through the EM step.
+
+## Minimal example
+
+```python
+import pandas as pd
+
+from skillmodels import ModelSpec, FactorSpec, Normalizations
+from skillmodels.amn import AMNEstimationOptions, estimate_amn
+
+model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 3,
+ intercepts=({"y1": 0},) * 3,
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+)
+data: pd.DataFrame # long-format, indexed by (caseid, period)
+
+amn_options = AMNEstimationOptions(
+ em_max_iter=500,
+ n_simulation_draws=100_000,
+ seed=0,
+)
+result = estimate_amn(model, data, amn_options)
+
+result.params # canonical skillmodels params DataFrame
+result.stages.mixture # Stage 1: reduced-form Pi, Psi, tau
+result.stages.structural # Stage 2: Lambda, A, Sigma, mu, Omega
+result.stages.production # Stage 3: production-function regression
+result.success # AND across stage convergence flags
+```
+
+## When AMN beats CHS: a synthetic 2-mixture DGP
+
+The smallest example that lets AMN's non-Gaussian fit show its advantage is a
+1-factor / 3-period model where the latent skill is drawn from a non-trivial
+mixture-of-normals. CHS, restricted to Gaussian latents, produces biased
+production-function estimates on this DGP; AMN's Stage 1 EM recovers the
+mixture and the structural step undoes the bias.
+
+```python
+import numpy as np
+import pandas as pd
+
+rng = np.random.default_rng(0)
+n = 4000
+n_periods = 3
+
+# Two-mixture latent factor: 60% drawn from N(-0.8, 0.7^2), 40% from N(1.2, 0.4^2).
+mixture_component = rng.choice([0, 1], size=n, p=[0.6, 0.4])
+f0 = np.where(
+ mixture_component == 0,
+ rng.normal(-0.8, 0.7, size=n),
+ rng.normal(1.2, 0.4, size=n),
+)
+
+# Linear transition with a known slope and small shock.
+factors = [f0]
+slope = 0.7
+shock_sd = 0.15
+for _ in range(n_periods - 1):
+ factors.append(slope * factors[-1] + rng.normal(0, shock_sd, size=n))
+
+# Three noisy measurements per period; "y1" is the reference (loading = 1).
+rows = []
+for caseid in range(n):
+ for period in range(n_periods):
+ f = factors[period][caseid]
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.30, size=1)[0],
+ "y2": 0.9 * f + rng.normal(0, 0.35, size=1)[0],
+ "y3": 1.1 * f + rng.normal(0, 0.40, size=1)[0],
+ }
+ )
+data = pd.DataFrame(rows).set_index(["caseid", "period"])
+```
+
+Estimate AMN with two mixture components on this DGP:
+
+```python
+model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 3,
+ intercepts=({"y1": 0},) * 3,
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+)
+
+result = estimate_amn(
+ model,
+ data,
+ AMNEstimationOptions(
+ em_max_iter=500,
+ n_simulation_draws=50_000,
+ seed=0,
+ ),
+)
+
+result.params.loc[("transition", 0, "skill", "skill"), "value"]
+# Should be close to 0.7 (the true slope).
+
+result.stages.mixture.weights # tau, should be near (0.6, 0.4) up to label switching
+result.stages.mixture.means # Pi_k for the augmented measure vector
+```
+
+Compare against a CHS fit of the same model (1 mixture component, since CHS
+assumes Gaussian latents) and verify that the slope estimate from CHS is
+biased downward — that's the signal AMN was designed to capture.
+
+## Tuning knobs
+
+### Number of mixture components
+
+`ModelSpec.n_mixtures` (not an `AMNEstimationOptions` field) controls the
+flexibility of the Stage-1 EM fit; AMN reads it as the number of mixture
+components $K$. The paper fixes $K = 2$; in practice values from 2 to 4 are
+reasonable. Higher $K$ adds free parameters to the reduced-form fit but does
+not change the structural model — the minimum-distance step constrains them.
+
+### Stage-1 EM stability
+
+Stage 1 uses `sklearn.mixture.GaussianMixture` under the hood. The defaults
+(`em_n_init=5`, `em_reg_covar=1e-6`) reliably converge on well-identified
+models; if the EM warns about degenerate covariances, bump `em_reg_covar` to
+`1e-4` first. The fit is initialised from a Spearman-moment guess for the
+loadings, then projected back to the augmented-measure space; that
+data-driven start beats random init by a wide margin.
+
+### Stage-2 weighting
+
+`minimum_distance_weighting="identity"` (the paper's default, and currently the
+only implemented option) is fast and robust: it is an unweighted identity-metric
+criterion over per-component means and the full covariance matrices. The
+`"optimal"` value is reserved for a future Avar-weighted criterion and currently
+raises `NotImplementedError`.
+
+### Stage-3 simulation size
+
+`n_simulation_draws` controls Monte-Carlo error in the production-function
+regression. The paper notes "the larger the data we draw the lower the
+simulation error" (p. 2522); 100 000 is overkill for $n \approx 2000$. Drop
+to 50 000 for iterating, then bump back to 100 000 for the final fit. The
+RNG is fully reproducible via `seed`.
+
+## Inference
+
+Inference is a cluster bootstrap that re-runs all three stages on each
+replicate. Each replicate draws a fresh seed, so the Stage-1 EM initialisation
+and Stage-3 simulation vary across replicates; replicates that fail to converge
+are excluded from the distribution and reported via a warning. Wall-clock is
+dominated by Stage 1 EM ($\approx$ seconds for $n \approx 2000$), so 1000
+replicates run in $\approx$ 10-30 minutes on a single machine.
+
+```python
+from skillmodels.amn import compute_amn_standard_errors
+
+inference = compute_amn_standard_errors(
+ result, data, amn_options, n_boot=1000, seed=0
+)
+inference.standard_errors
+inference.replicate_params # (n_boot, n_params); failed replicates are NaN
+```
+
+The paper itself uses 100 replicates (Tables 5-6); 1000 gives smoother CIs
+without changing the qualitative picture.
+
+## Endogenous investment (control-function correction)
+
+The AMN (2020) eq. 7-8 / AF Sec. 3.5 control-function correction is configured
+declaratively, not via an estimation option: attach a `CorrectionSpec` to the
+endogenous investment `FactorSpec` (which must set `is_endogenous=True`). Its
+mere presence triggers the correction in Stage 3 — there is no
+`investment_endogeneity` flag. See
+[Endogeneity Corrections](../reference_guides/endogeneity_corrections.md) for
+the full interface; the same `CorrectionSpec` is also read by `estimate_chs`.
+
+```python
+from skillmodels import CorrectionSpec
+
+model = base_model.with_correction(
+ "investment",
+ CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
+)
+result = estimate_amn(model, data, amn_options)
+```
+
+Per period, a first-stage investment equation `ln I_t ~ theta_t (+ observed
+instruments Y_t)` is OLS-fit on the simulated panel; its residual
+`eta_{I,t} = ln I_t - E[ln I_t | theta_t, Y_t]` is added as an additive `cf`
+covariate (coefficient `kappa_t`, period- and output-specific) to each target
+factor's production regression. Under the correction:
+
+- the instruments act as excluded regressors: they enter the first-stage
+ equation only, never a target's production function;
+- at least one instrument is REQUIRED — `CorrectionSpec.__post_init__` raises
+ `ValueError` otherwise, because the residual would be collinear with the
+ production inputs and `kappa` would be unidentified;
+- the first-stage coefficients and shock SD are returned under the
+ `investment_eq` / `investment_sds` categories on
+ `result.stages.production.investment_params`, and the production shock SD
+ (`shock_sds`) is the corrected SD(eps_C);
+- AMN implements only the **linear** `cf` term. A higher-order `kappa_terms`
+ request (anything other than `("cf",)` per target, e.g. a `kappa_degree=2`
+ translog basis) raises `NotImplementedError` in `simulate_and_regress`; use
+ `estimate_chs` for the full polynomial basis.
+
+## What AMN does not (yet) do
+
+- **Anchoring** is not wired through the AMN stages. The model spec's
+ `AnchoringSpec` is accepted (so the spec stays compatible with CHS), but
+ the AMN result reports unanchored factor scales.
+- **Within-stage user constraints.** `estimate_amn(constraints=...)` is a
+ pass-through hook for forward compatibility; the AMN stages do not yet
+ honour `om.EqualityConstraint`. User `fixed_params` are applied
+ post-hoc to the combined params DataFrame.
+
+See [How to compare estimators](how_to_compare_estimators.md) for an
+overlay of CHS, AF, and AMN on the same data with confidence intervals.
diff --git a/docs/how_to_guides/how_to_simulate_dataset.ipynb b/docs/how_to_guides/how_to_simulate_dataset.ipynb
index e15340fa..47dfe2ab 100644
--- a/docs/how_to_guides/how_to_simulate_dataset.ipynb
+++ b/docs/how_to_guides/how_to_simulate_dataset.ipynb
@@ -8,8 +8,8 @@
"source": [
"import pandas as pd\n",
"\n",
- "from skillmodels.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
- "from skillmodels.simulate_data import simulate_dataset\n",
+ "from skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
+ "from skillmodels.common.simulate_data import simulate_dataset\n",
"from skillmodels.test_data.model2 import MODEL2"
]
},
diff --git a/docs/how_to_guides/how_to_visualize_correlations.ipynb b/docs/how_to_guides/how_to_visualize_correlations.ipynb
index 57e2c484..62efd7b5 100644
--- a/docs/how_to_guides/how_to_visualize_correlations.ipynb
+++ b/docs/how_to_guides/how_to_visualize_correlations.ipynb
@@ -15,8 +15,8 @@
"source": [
"import pandas as pd\n",
"\n",
- "from skillmodels.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
- "from skillmodels.correlation_heatmap import (\n",
+ "from skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
+ "from skillmodels.common.correlation_heatmap import (\n",
" get_measurements_corr,\n",
" get_quasi_scores_corr,\n",
" get_scores_corr,\n",
@@ -167,7 +167,7 @@
"metadata": {},
"outputs": [],
"source": [
- "from skillmodels.visualize_transition_equations import (\n",
+ "from skillmodels.common.visualize_transition_equations import (\n",
" _get_parsed_params,\n",
" _set_index_params,\n",
")"
@@ -179,7 +179,7 @@
"metadata": {},
"outputs": [],
"source": [
- "from skillmodels.process_model import process_model"
+ "from skillmodels.common.process_model import process_model"
]
},
{
diff --git a/docs/how_to_guides/how_to_visualize_pairwise_factor_distribution.ipynb b/docs/how_to_guides/how_to_visualize_pairwise_factor_distribution.ipynb
index 73831c95..56fc9a95 100644
--- a/docs/how_to_guides/how_to_visualize_pairwise_factor_distribution.ipynb
+++ b/docs/how_to_guides/how_to_visualize_pairwise_factor_distribution.ipynb
@@ -6,21 +6,7 @@
"id": "0",
"metadata": {},
"outputs": [],
- "source": [
- "import numpy as np\n",
- "import pandas as pd\n",
- "\n",
- "from skillmodels.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
- "from skillmodels.maximization_inputs import get_maximization_inputs\n",
- "from skillmodels.simulate_data import simulate_dataset\n",
- "from skillmodels.test_data.model2 import MODEL2\n",
- "from skillmodels.visualize_factor_distributions import (\n",
- " bivariate_density_contours,\n",
- " bivariate_density_surfaces,\n",
- " combine_distribution_plots,\n",
- " univariate_densities,\n",
- ")"
- ]
+ "source": "import numpy as np\nimport pandas as pd\n\nfrom skillmodels.chs.maximization_inputs import get_maximization_inputs\nfrom skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\nfrom skillmodels.common.individual_states import get_individual_states_from_params\nfrom skillmodels.common.simulate_data import simulate_dataset\nfrom skillmodels.common.visualize_factor_distributions import (\n bivariate_density_contours,\n bivariate_density_surfaces,\n combine_distribution_plots,\n univariate_densities,\n)\nfrom skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS"
},
{
"cell_type": "markdown",
@@ -29,15 +15,16 @@
"source": [
"# How to visualize the distribution of latent factors\n",
"\n",
- "We show how to create Kernel density plots for pairs of latent factors in two or three dimensions. As illustration we use the same example as in the [introductory tutorial](../getting_started/tutorial.ipynb). For more details of how to obtain the filtered states, also see that tutorial.\n",
+ "We show how to create kernel density plots for pairs of latent factors in two or three dimensions. As illustration we use the same example as in the [introductory tutorial](../getting_started/tutorial.ipynb). For more details on how to obtain filtered states, see that tutorial.\n",
+ "\n",
+ "There are two kinds of data that the plotting functions consume:\n",
"\n",
- "There are two kinds of data that can be visualized with the function described below:\n",
- "1. Filtered states, i.e. the estimates of the latent factors in an empirical dataset\n",
- "2. Simulated states, i.e. a synthetic dataset of latent factors that is generated for a parametrized model. \n",
+ "1. Filtered states — point estimates of the latent factors for an empirical dataset.\n",
+ "2. Simulated states — a synthetic latent-factor panel from a parameterised model.\n",
"\n",
- "Below, we show how to get both kinds of datasets, how to visualize the distribution of latent factors given one dataset and how to visualize the difference in distributions between two datasets.\n",
+ "Below, we show how to produce both, how to visualise the distribution of latent factors given one dataset, and how to overlay two datasets (e.g. baseline vs. policy).\n",
"\n",
- "## Getting filtered states "
+ "## Getting filtered states"
]
},
{
@@ -46,14 +33,7 @@
"id": "2",
"metadata": {},
"outputs": [],
- "source": [
- "model = MODEL2\n",
- "params = pd.read_csv(REGRESSION_VAULT / \"one_stage_anchoring.csv\")\n",
- "params = params.set_index([\"category\", \"period\", \"name1\", \"name2\"])\n",
- "\n",
- "data = pd.read_stata(TEST_DATA_DIR / \"model2_simulated_data.dta\")\n",
- "data = data.set_index([\"caseid\", \"period\"])"
- ]
+ "source": "model = MODEL2\nparams = pd.read_csv(REGRESSION_VAULT / \"one_stage_anchoring.csv\")\nparams = params.set_index([\"category\", \"period\", \"name1\", \"name2\"])\n\ndata = pd.read_stata(TEST_DATA_DIR / \"model2_simulated_data.dta\")\ndata = data.set_index([\"caseid\", \"period\"])\n\nfiltered = get_individual_states_from_params(model_spec=model, data=data, params=params)\nstates = filtered[\"anchored_states\"][\"states\"]"
},
{
"cell_type": "markdown",
@@ -73,14 +53,14 @@
"kde_plots = univariate_densities(\n",
" model_spec=model,\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states=states,\n",
")\n",
"contour_plots = bivariate_density_contours(\n",
" model_spec=model,\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states=states,\n",
")"
]
},
@@ -94,8 +74,8 @@
"surface_plots = bivariate_density_surfaces(\n",
" model_spec=model,\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states=states,\n",
")"
]
},
@@ -128,15 +108,12 @@
"id": "8",
"metadata": {},
"source": [
- "## (Outdated) Optional arguments of the plotting function\n",
+ "## Optional arguments of the plotting function\n",
"\n",
- "- You can omit the 3d Plots in the upper triangle by leaving out `add_3d_plots=True`. \n",
- "- You can modify the trade-off between runtime and plot quality by setting `n_points`, i.e. the number of points per dimension to different values. Default is 50.\n",
- "- You can return the individual plots instead of a grid by setting `combine_plots_in_grid=False`. In that case the function returns a dictionary with figures that you can save for later use. \n",
- "- You can manually tweek the ranges over which the distributions are plotted. For that, you need to specify the argument `state_ranges`. This is a dictionary. The keys are the names of the latent factors. The values are DataFrames with the columns \"period\", \"minimum\", \"maximum\". The state_ranges are used to define the axis limits of the plots.\n",
- "- lower_kde_kws (dict): Keyword arguments for kdeplot, used to generate the plots in the lower triangle of the grid, i.e. the two dimensional kdeplot for each factor pair.\n",
- "- diag_kde_kws (dict): Keyword arguments for kdeplot, used to generate the plots on the diagonal of the grid, i.e. the one dimensional kdeplot for each factor. \n",
- "- surface_kws (dict): Keyword arguments for Axes.plot_surface, used to generate the plots in the upper triangle of the grid, i.e. the surface plot of the kernel density estimates for each factor pair."
+ "- You can omit the 3D plots by passing `surface_plots=None` to `combine_distribution_plots`.\n",
+ "- `n_points` controls the runtime/quality trade-off (grid points per dimension; default 50).\n",
+ "- `state_ranges` (dict keyed by factor name, values are DataFrames with columns `period`, `minimum`, `maximum`) lets you set axis limits manually.\n",
+ "- `layout_kwargs` is forwarded to Plotly `update_layout` for every subplot; `distplot_kwargs` / `contour_kwargs` go to the underlying traces."
]
},
{
@@ -144,9 +121,9 @@
"id": "9",
"metadata": {},
"source": [
- "## Getting simulated datasets (with and without policy)\n",
+ "## Simulated states with and without policy\n",
"\n",
- "One of the main application of skill formation models is to simulate the effect of counterfactual policies. To visualize the effect of a policy on factor distributions, we first need to simulate a dataset in which a policy has been active. "
+ "A common application of skill-formation models is to simulate the effect of counterfactual policies. To visualise the effect of a policy on factor distributions, simulate one dataset with the policy and one without, then overlay them."
]
},
{
@@ -194,7 +171,9 @@
"id": "13",
"metadata": {},
"source": [
- "## Plotting differences in distributions"
+ "## Plotting differences in distributions\n",
+ "\n",
+ "Pass the simulated states as a dict (or list) of DataFrames; the plot helpers overlay one trace per scenario. 3D surface plots require a single DataFrame and don't support multi-scenario overlays."
]
},
{
@@ -206,17 +185,15 @@
"source": [
"kde_plots = univariate_densities(\n",
" model_spec=model,\n",
- " states={\"baseline\": sim_states, \"subsidy\": sim_states_policy},\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states={\"baseline\": sim_states, \"subsidy\": sim_states_policy},\n",
")\n",
"contour_plots = bivariate_density_contours(\n",
" model_spec=model,\n",
- " states={\"baseline\": sim_states, \"subsidy\": sim_states_policy},\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states={\"baseline\": sim_states, \"subsidy\": sim_states_policy},\n",
")"
]
},
@@ -245,21 +222,15 @@
"id": "17",
"metadata": {},
"source": [
- "All the optional arguments stay the same. The only difference ist that 3d plots do not work for several datasets."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "18",
- "metadata": {},
- "source": [
- "# Plotting with observed factors"
+ "# Plotting with observed factors\n",
+ "\n",
+ "Observed factors are columns in your dataset; pass `observed_factors=True` to include them. The filtered-states extraction is the same; the only change is which factor names you ask the plotter for."
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "19",
+ "id": "18",
"metadata": {},
"outputs": [],
"source": [
@@ -269,7 +240,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "20",
+ "id": "19",
"metadata": {},
"outputs": [],
"source": [
@@ -280,33 +251,30 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "21",
+ "id": "20",
"metadata": {},
"outputs": [],
- "source": [
- "params = get_maximization_inputs(model_spec=model, data=data)[\"params_template\"]\n",
- "params[\"value\"] = 0.1"
- ]
+ "source": "params = get_maximization_inputs(\n model_spec=model, data=data, chs_options=MODEL2_CHS_OPTIONS\n)[\"params_template\"]\nparams[\"value\"] = 0.1\nfiltered = get_individual_states_from_params(model_spec=model, data=data, params=params)\nstates = filtered[\"anchored_states\"][\"states\"]"
},
{
"cell_type": "code",
"execution_count": null,
- "id": "22",
+ "id": "21",
"metadata": {},
"outputs": [],
"source": [
"kde_plots = univariate_densities(\n",
" model_spec=model,\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states=states,\n",
" observed_factors=True,\n",
")\n",
"contour_plots = bivariate_density_contours(\n",
" model_spec=model,\n",
" data=data,\n",
- " params=params,\n",
" period=1,\n",
+ " filtered_states=states,\n",
" observed_factors=True,\n",
")"
]
@@ -314,7 +282,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "23",
+ "id": "22",
"metadata": {},
"outputs": [],
"source": [
diff --git a/docs/how_to_guides/how_to_visualize_transition_equations.ipynb b/docs/how_to_guides/how_to_visualize_transition_equations.ipynb
index d4581df2..1225f49c 100644
--- a/docs/how_to_guides/how_to_visualize_transition_equations.ipynb
+++ b/docs/how_to_guides/how_to_visualize_transition_equations.ipynb
@@ -6,16 +6,7 @@
"id": "0",
"metadata": {},
"outputs": [],
- "source": [
- "import pandas as pd\n",
- "\n",
- "from skillmodels.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
- "from skillmodels.test_data.model2 import MODEL2\n",
- "from skillmodels.visualize_transition_equations import (\n",
- " combine_transition_plots,\n",
- " get_transition_plots,\n",
- ")"
- ]
+ "source": "import pandas as pd\n\nfrom skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\nfrom skillmodels.common.individual_states import get_individual_states_from_params\nfrom skillmodels.common.visualize_transition_equations import (\n combine_transition_plots,\n get_transition_plots,\n)\nfrom skillmodels.test_data.model2 import MODEL2"
},
{
"cell_type": "markdown",
@@ -46,15 +37,7 @@
"id": "2",
"metadata": {},
"outputs": [],
- "source": [
- "model = MODEL2\n",
- "\n",
- "params = pd.read_csv(REGRESSION_VAULT / \"one_stage_anchoring.csv\")\n",
- "params = params.set_index([\"category\", \"period\", \"name1\", \"name2\"])\n",
- "\n",
- "data = pd.read_stata(TEST_DATA_DIR / \"model2_simulated_data.dta\")\n",
- "data = data.set_index([\"caseid\", \"period\"])"
- ]
+ "source": "model = MODEL2\n\nparams = pd.read_csv(REGRESSION_VAULT / \"one_stage_anchoring.csv\")\nparams = params.set_index([\"category\", \"period\", \"name1\", \"name2\"])\n\ndata = pd.read_stata(TEST_DATA_DIR / \"model2_simulated_data.dta\")\ndata = data.set_index([\"caseid\", \"period\"])\n\nfiltered = get_individual_states_from_params(model_spec=model, data=data, params=params)\nstates = filtered[\"anchored_states\"][\"states\"]"
},
{
"cell_type": "markdown",
@@ -75,6 +58,7 @@
" model_spec=model,\n",
" params=params,\n",
" data=data,\n",
+ " filtered_states=states,\n",
" period=0,\n",
")"
]
@@ -112,6 +96,7 @@
" params=params,\n",
" data=data,\n",
" period=0,\n",
+ " filtered_states=states,\n",
" quantiles_of_other_factors=None,\n",
")"
]
@@ -147,6 +132,7 @@
" model_spec=model,\n",
" params=params,\n",
" data=data,\n",
+ " filtered_states=states,\n",
" period=1,\n",
")"
]
diff --git a/docs/how_to_guides/model_specs.md b/docs/how_to_guides/model_specs.md
index e0f848b2..f6d7ef70 100644
--- a/docs/how_to_guides/model_specs.md
+++ b/docs/how_to_guides/model_specs.md
@@ -7,7 +7,6 @@ Models are specified using Python dataclasses.
```python
from skillmodels import (
AnchoringSpec,
- EstimationOptions,
FactorSpec,
ModelSpec,
Normalizations,
@@ -39,10 +38,28 @@ model = ModelSpec(
),
controls=("x1", "x2"),
stagemap=(0, 0, 1, 1, 2, 2, 3),
- estimation_options=EstimationOptions(),
+ n_mixtures=2,
)
```
+The `ModelSpec` is purely structural -- it describes the model, not how to
+estimate it. Estimator-specific tuning (number of Halton draws, mixture
+components in CHS Kalman, sigma-point scale, ...) lives on the relevant
+options class and is passed at the call site:
+
+```python
+from skillmodels.chs import CHSEstimationOptions, get_maximization_inputs
+
+max_inputs = get_maximization_inputs(
+ model_spec=model,
+ data=data,
+ chs_options=CHSEstimationOptions(bounds_distance=1e-4),
+)
+```
+
+See the [AF how-to](how_to_estimate_af.md) for the corresponding pattern with
+`estimate_af(model, data, af_options=...)`.
+
## Factor Specification
Each factor requires:
@@ -50,7 +67,16 @@ Each factor requires:
- **measurements**: A nested tuple with measurement variable names for each period.
Empty tuples indicate no measurements in that period.
- **transition_function**: Name of a transition function (`linear`, `log_ces`,
- `constant`, `translog`) or a custom function.
+ `constant`, `translog`, ...) or a custom function. See
+ [Transition Functions](../reference_guides/transition_functions.md) for the full
+ list. For an **AF production function**, prefer the production-factors-only
+ variants `translog_af` (AF eq. 6: linear + pairwise interactions, no squares)
+ and `log_ces_af` (AF eq. 7: CES over production factors only). The general
+ built-in transitions (`translog`, `log_ces`, ...) enumerate parameters over
+ **all** factors, including observed ones, so income and other observed factors
+ would receive free production coefficients — which changes the AF estimand.
+ `estimate_af` emits a `UserWarning` if you use a general built-in transition on
+ a production factor while observed factors are present.
- **normalizations** (optional): Fixed values for loadings and intercepts to identify
the model.
- **is_endogenous** (optional): Whether this factor is endogenous (default: false).
@@ -114,7 +140,7 @@ Fine-tune the estimation:
Define custom transition equations using the `@register_params` decorator:
```python
-from skillmodels.decorators import register_params
+from skillmodels.common.decorators import register_params
@register_params(params=["lincoeff"])
def my_linear(fac, params):
diff --git a/docs/index.md b/docs/index.md
index 1d297e02..5ba41a65 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,52 +1,114 @@
# skillmodels
-Welcome to skillmodels, a Python implementation of estimators for nonlinear dynamic
-latent factor models. The package implements the Kalman filter-based maximum likelihood
-estimator proposed by Cunha, Heckman and Schennach
-([Econometrica 2010](http://onlinelibrary.wiley.com/doi/10.3982/ECTA6551/abstract)).
+Skillmodels is a Python toolbox for estimating nonlinear dynamic latent factor
+models. It started as a Kalman-filter implementation of Cunha, Heckman & Schennach
+([Econometrica 2010](http://onlinelibrary.wiley.com/doi/10.3982/ECTA6551/abstract))
+and has since grown to host three estimators side by side, all sharing the same
+`ModelSpec` and the same parameter index.
## Overview
-Skillmodels was developed for skill formation models but can be applied to any dynamic
-nonlinear latent factor model. Key features:
+Skillmodels was developed for skill-formation research but works for any dynamic
+nonlinear latent-factor model. Key features:
-- **Kalman filter estimation**: Uses square-root implementations for numerical stability
-- **Flexible model specification**: Define models using Python dataclasses or dictionaries
-- **JAX-powered**: Automatic differentiation and JIT compilation for fast optimization
-- **GPU support**: Optional CUDA acceleration
+- **Three estimators with one model spec**:
+ - `chs` — Kalman MLE (CHS 2010), the historical core.
+ - `af` — sequential Halton-quadrature MLE (Antweiler & Freyberger 2025),
+ period-by-period.
+ - `amn` — three-stage mixture-of-normals (Attanasio, Meghir & Nix 2020):
+ EM, minimum distance, simulated regression.
+- **Strongly-typed, immutable model spec**: frozen dataclasses with
+ `MappingProxyType` containers throughout.
+- **JAX everywhere**: jitted likelihoods, autodiff gradients, optional GPU.
## Public API
-The main package exports three functions:
-
-- `get_maximization_inputs()`: Prepare optimization problem for parameter estimation
-- `get_filtered_states()`: Extract filtered latent factor estimates
-- `simulate_dataset()`: Generate synthetic data from model specification
-
-And dataclasses for model specification:
-
-- `ModelSpec`: Main model specification container
-- `FactorSpec`: Specification for individual factors
-- `AnchoringSpec`: Anchoring settings
-- `EstimationOptions`: Options for estimation
-- `Normalizations`: Normalization settings for loadings and intercepts
+The top-level `skillmodels` package re-exports the model-spec dataclasses that
+every estimator consumes:
+
+- `ModelSpec`
+- `FactorSpec`
+- `AnchoringSpec`
+- `Normalizations`
+- `CorrectionSpec` — control-function correction for an endogenous investment
+ factor, read by both CHS and AMN (see
+ [Endogeneity Corrections](reference_guides/endogeneity_corrections.md)).
+
+The helper `generate_kappa_terms` (also top-level) builds the `cf`-interaction
+monomial basis you pass as a `CorrectionSpec` target's `kappa_terms`.
+
+Estimator-specific entry points live in their own subpackages so the scope of
+each call is explicit at the import site:
+
+```python
+from skillmodels.chs import (
+ CHSEstimationOptions,
+ estimate_chs, # one-call CHS estimator with ML inference
+ get_maximization_inputs, # likelihood + gradients + constraints for optimagic
+)
+from skillmodels.af import (
+ AFEstimationOptions,
+ estimate_af,
+ compute_af_standard_errors,
+)
+from skillmodels.amn import (
+ AMNEstimationOptions,
+ estimate_amn,
+ compute_amn_standard_errors,
+)
+```
+
+`estimate_chs` is the turnkey CHS driver: it wraps `get_maximization_inputs`
+and `estimagic.estimate_ml`, so the returned `CHSEstimationResult` carries ML
+inference (via `result.likelihood_result`). `get_maximization_inputs` remains
+the power-user escape hatch for callers who want to drive the optimiser
+themselves. The estimator entry points (`estimate_chs`, `estimate_af`,
+`estimate_amn`) and the `CorrectionSpec` / `generate_kappa_terms` helpers are
+also importable directly from the top-level `skillmodels` package.
+
+Estimator-agnostic helpers live under `skillmodels.common`:
+
+```python
+from skillmodels.common.simulate_data import simulate_dataset, simulate_policy_effect
+from skillmodels.common.variance_decomposition import (
+ decompose_measurement_variance,
+ summarize_measurement_reliability,
+)
+from skillmodels.common.diagnostic_plots import (
+ plot_likelihood_contributions,
+ plot_residual_boxplots,
+)
+from skillmodels.common.state_ranges import create_state_ranges
+```
+
+The estimator-agnostic diagnostic and variance-decomposition helpers take
+pre-computed DataFrames (`residuals`, `contributions`, `filtered_states`); the
+caller produces them via the estimator they ran. See the how-to guides for
+worked examples.
## Implementation Notes
-The CHS estimator implemented here differs from the original
+The CHS estimator differs from the original
[replication files](https://tinyurl.com/yyuq2sa4) in two ways:
-1. Uses different normalizations that account for the
- [critique](https://tinyurl.com/y3wl43kz) of Wiswall and Agostinelli
-2. Uses robust square-root implementations of the Kalman filters
+1. Supports normalization schemes designed to address the
+ [critique](https://tinyurl.com/y3wl43kz) of Wiswall and Agostinelli. The
+ model checker performs only syntactic checks on the supplied normalizations;
+ it does not run a transition-specific rank/invariance analysis, so it does
+ not by itself guarantee identification of an arbitrary scheme.
+2. Uses robust square-root implementations of the Kalman filters.
+
+The AF and AMN estimators are independent rewrites of the algorithms in their
+respective papers and share only the `ModelSpec` and parameter-index machinery
+with CHS; they do not call the Kalman filter.
## Citation
If you find skillmodels helpful for research, please cite it. See the
-[GitHub repository](https://github.com/OpenSourceEconomics/skillmodels) for citation
-information.
+[GitHub repository](https://github.com/OpenSourceEconomics/skillmodels) for
+citation information.
## Feedback
-If you encounter any problems or have suggestions, please open an issue on
+If you hit a problem or have a suggestion, please open an issue on
[GitHub](https://github.com/OpenSourceEconomics/skillmodels/issues).
diff --git a/docs/myst.yml b/docs/myst.yml
index 0f443a46..34ff08a8 100644
--- a/docs/myst.yml
+++ b/docs/myst.yml
@@ -32,12 +32,16 @@ project:
- title: How-to Guides
children:
- file: how_to_guides/model_specs.md
+ - file: how_to_guides/how_to_estimate_af.md
+ - file: how_to_guides/how_to_estimate_amn.md
+ - file: how_to_guides/how_to_compare_estimators.md
- file: how_to_guides/how_to_simulate_dataset.ipynb
- file: how_to_guides/how_to_visualize_transition_equations.ipynb
- file: how_to_guides/how_to_visualize_pairwise_factor_distribution.ipynb
- file: how_to_guides/how_to_visualize_correlations.ipynb
- title: Explanations
children:
+ - file: explanations/architecture.md
- file: explanations/names_and_concepts.md
- file: explanations/notes_on_factor_scales.md
- file: explanations/linear_predict.md
diff --git a/docs/reference_guides/endogeneity_corrections.md b/docs/reference_guides/endogeneity_corrections.md
index 15f7e5ba..c5899bd0 100644
--- a/docs/reference_guides/endogeneity_corrections.md
+++ b/docs/reference_guides/endogeneity_corrections.md
@@ -1,107 +1,225 @@
# Endogeneity Corrections
-When investment decisions depend on concurrent latent factor values, investments are
-endogenous. skillmodels implements an endogeneity correction via the control function
-approach, using period augmentation in the Kalman filter.
+When investment decisions depend on the concurrent latent state, investment is
+endogenous: its shock is correlated with the production shock of the factors it
+feeds. The **control-function** approach corrects for this by adding the
+unobserved component of investment — a first-stage residual `cf` — to the
+production equations of the affected factors.
-## Using Endogenous Factors
+skillmodels exposes this as a single, declarative object: a `CorrectionSpec`
+attached to the endogenous investment factor. The same specification is read by
+both estimators that implement the correction (CHS and AMN), so the control
+function is configured in exactly one place regardless of which estimator runs.
-Mark a factor as endogenous by setting `is_endogenous=True` on its `FactorSpec`:
+## The `CorrectionSpec` interface
+
+`CorrectionSpec` lives in `skillmodels.common.model_spec` and is re-exported
+from the top-level package (`from skillmodels import CorrectionSpec`). You
+declare it via the `correction=` field of the endogenous investment `FactorSpec`
+(the factor must still set `is_endogenous=True`):
```python
-from skillmodels import FactorSpec, ModelSpec
+from skillmodels import CorrectionSpec, FactorSpec, ModelSpec, Normalizations
model = ModelSpec(
factors={
- "cognitive": FactorSpec(
+ "skills": FactorSpec(
measurements=(("y1", "y2"), ("y1", "y2")),
- # ... normalizations ...
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
transition_function="linear",
),
"investment": FactorSpec(
- measurements=(("inv1", "inv2"), ("inv1", "inv2")),
- # ... normalizations ...
- is_endogenous=True,
+ measurements=(("i1", "i2"), ("i1", "i2")),
+ normalizations=Normalizations(
+ loadings=({"i1": 1}, {"i1": 1}),
+ intercepts=({"i1": 0}, {}),
+ ),
transition_function="linear",
+ is_endogenous=True,
+ correction=CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
),
},
+ observed_factors=("income",),
)
```
-## How It Works: Period Augmentation
+This is the model used in `tests/test_amn_simulate_and_regress.py`
+(`_cf_model`); see also `tests/test_cf_recovery.py` for the end-to-end CHS
+recovery test.
-When the model contains endogenous factors, skillmodels internally doubles the number of
-periods. Each original period is split into two augmented periods:
+### Fields
-1. **Even augmented periods** (0, 2, 4, ...): State factor measurements are updated.
-2. **Odd augmented periods** (1, 3, 5, ...): Endogenous factor measurements are updated
- using the predicted state values.
+`CorrectionSpec` has the following fields (see
+`src/skillmodels/common/model_spec.py`):
-This sequential updating ensures that endogenous factors are measured conditional on
-current state information, which is essential for the control function approach.
+- `instruments: tuple[str, ...]` — **required**, at least one. Excluded observed
+ factors that enter the first-stage investment equation **only** (never a
+ production equation), and so identify the correction coefficient `kappa`. With
+ no excluded instrument the residual would be collinear with the production
+ inputs and `kappa` would be unidentified (the `__post_init__` raises
+ `ValueError`). Instruments must be observed factors on the `ModelSpec`;
+ `ModelSpec.with_correction` registers them for you (see below).
+- `state_predictors: tuple[str, ...] = ()` — state factors entering the
+ first-stage equation. Empty means **all** state factors.
+- `targets: tuple[str, ...] = ()` — state factors whose production equation
+ receives the additive `kappa * cf` term. Empty means **all** state factors.
+- `kappa_degree: int | None = None` — degree of the `cf`-interaction polynomial
+ applied to every target. `1` is a linear `cf` term; `2` is the translog basis.
+ `None` resolves to degree `1`. Mutually exclusive with `kappa_terms`.
+- `kappa_terms: Mapping[str, tuple[str, ...]] | None = None` — per-target
+ override of the `cf` regressor names, e.g.
+ `{"skills": ("cf", "cf ** 2", "cf * skills")}`. Mutually exclusive with
+ `kappa_degree`. A target omitted from the mapping defaults to `("cf",)`.
-## Correction Factors
+`kappa_degree` and `kappa_terms` are mutually exclusive; supplying both raises
+`ValueError`.
-For a full control function correction, add a correction factor with
-`is_correction=True`. A correction factor must also be endogenous:
+### How the `cf` regressors are resolved
-```python
-model = ModelSpec(
- factors={
- "cognitive": FactorSpec(
- measurements=(("y1", "y2"), ("y1", "y2")),
- # ...
- ),
- "investment": FactorSpec(
- measurements=(("inv1", "inv2"), ("inv1", "inv2")),
- is_endogenous=True,
- # ...
- ),
- "investment_pred": FactorSpec(
- measurements=(("inv1", "inv2"), ("inv1", "inv2")),
- is_endogenous=True,
- is_correction=True,
- # ...
- ),
- },
-)
-```
+Internally (in `process_model._resolve_control_function`) each target's
+regressor list is resolved as follows:
-The correction factor typically shares the same measurements as the endogenous factor it
-corrects. In the transition function, the difference between the actual and predicted
-values (the control function residual) captures the endogeneity:
+- if `kappa_terms` is set, target `t` uses `kappa_terms.get(t, ("cf",))`;
+- otherwise the degree (defaulting to `1`) is expanded over the state factors
+ via `generate_kappa_terms`, and every target shares that basis.
+
+## Building the basis with `generate_kappa_terms`
+
+`generate_kappa_terms` (top-level: `from skillmodels import
+generate_kappa_terms`) builds the `cf`-interaction monomial basis you can pass
+as a target's `kappa_terms`:
```python
-@register_params(params=["investment", "investment_pred", "cf", "constant"])
-def f_cognitive(investment, investment_pred, params):
- cf = investment - investment_pred
- return (
- params["constant"]
- + params["investment"] * investment
- + params["cf"] * cf
- )
+from skillmodels import generate_kappa_terms
+
+generate_kappa_terms(("skills", "health"), max_degree=1)
+# ("cf",)
+
+generate_kappa_terms(("skills", "health"), max_degree=2)
+# ("cf", "cf * skills", "cf * health", "cf ** 2")
```
-The estimated `cf` coefficient captures the effect of the unobserved component of
-investment on the outcome.
+Its signature is
+`generate_kappa_terms(factors, max_degree, max_cf_power=None) -> tuple[str, ...]`:
+every monomial `cf ** a * prod_i factor_i ** b_i` with `a >= 1` and total degree
+`a + sum_i b_i <= max_degree` (optionally capping the `cf` power at
+`max_cf_power`). Pass the result as a target's `kappa_terms` and pin any unwanted
+coefficients to zero with an optimagic constraint.
+
+## Builder methods on `ModelSpec`
+
+Two fluent builders make it easy to add or remove the correction without
+rewriting the factor dict:
+
+- `ModelSpec.with_correction(factor_name, correction)` — attach `correction` to
+ `factor_name` **and** auto-register its instruments as observed factors
+ (deduped against existing ones), so instruments are declared exactly once:
+
+ ```python
+ model = base_model.with_correction(
+ "investment",
+ CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
+ )
+ # "income" is now in model.observed_factors automatically.
+ ```
+
+- `ModelSpec.without_correction()` — return a copy with every
+ `FactorSpec.correction` stripped. Useful for running an estimator that does not
+ implement the correction (AF) on a spec authored for CHS.
+
+You can equivalently set `correction=` directly on the `FactorSpec` (as in the
+first example), but then you must list the instruments in `observed_factors`
+yourself.
+
+## Estimator support
+
+The correction is read from the model spec by all three estimators, but only two
+implement it:
+
+| Estimator | Control-function support |
+| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **CHS** (`estimate_chs` / `get_maximization_inputs`) | Full polynomial `kappa` basis. Any `kappa_degree` / `kappa_terms` is honoured; the `cf` nodes are grafted into the per-period transition DAG. |
+| **AMN** (`estimate_amn`) | **Linear `cf` term only.** A higher-order `kappa_terms` request (anything other than `("cf",)` per target) raises `NotImplementedError` in Stage 3. |
+| **AF** (`estimate_af`) | **Not implemented.** If any `FactorSpec.correction` is set, `validate_af_model` raises `NotImplementedError`, directing you to `estimate_chs` or `ModelSpec.without_correction()`. |
+
+The AMN gate lives in `src/skillmodels/amn/simulate_and_regress.py`: if any
+target's `kappa_terms` is not exactly `("cf",)`, it raises `NotImplementedError`
+("AMN implements only a linear control function (kappa \* cf) ... use
+estimate_chs for the full polynomial basis").
+
+The AF gate lives in `src/skillmodels/af/validate.py`: AF covers only the
+`kappa = 0` (exogenous-investment) special case, so any declared correction
+raises `NotImplementedError`. Strip it with `ModelSpec.without_correction()` to
+run AF.
+
+## How it works internally
+
+The CHS estimator does not require you to write a custom transition function for
+the correction. `process_model` injects three kinds of synthetic node into the
+per-period transition DAG (see `src/skillmodels/common/control_function.py`):
+
+1. a deterministic, contemporaneous first-stage prediction
+ `E[ln I_t | theta_t, Y_t]` for the endogenous investment factor, fitted over
+ the `state_predictors` and `instruments`;
+2. the residual `cf_t = ln I_t - E[ln I_t | theta_t, Y_t]`; and
+3. for each target factor, the additive `sum_k kappa_k * cf_term_k` grafted onto
+ the factor's base transition output.
+
+The first-stage coefficients appear in the params DataFrame under the
+`investment_eq` category and the correction coefficients under the `kappa`
+category. The corrected production-shock SD is recovered in `shock_sds`.
+
+Models with endogenous factors split each calendar period into augmented periods
+internally (`aug_period`); this is what lets the investment residual be measured
+conditional on the current state before it enters the next factor's production
+equation. Augmented periods are strictly internal — every public function
+accepts and returns the user-facing `period`.
## Background: CHS Methods
-Cunha, Heckman, and Schennach (2010) propose two alternative endogeneity correction
-methods that rely on stronger assumptions about factor scales:
+Cunha, Heckman, and Schennach (2010) propose two alternative endogeneity
+correction methods that rely on stronger assumptions about factor scales:
### Time-Invariant Heterogeneity (Section 4.2.4)
-Adds a time-invariant individual fixed effect. Requires constant factor scales across
-all periods (highly unlikely with KLS transition functions), age-invariant normalization
-measurements, and three adult outcomes.
+Adds a time-invariant individual fixed effect. Requires constant factor scales
+across all periods (highly unlikely with KLS transition functions),
+age-invariant normalization measurements, and three adult outcomes.
### Time-Varying Heterogeneity (Section 4.2.5)
Uses heterogeneity following an AR(1) process. Requires constant factor scales, a
-time-invariant investment equation, and exclusion restrictions (e.g., income affects
-investment but not skill transitions).
+time-invariant investment equation, and exclusion restrictions (e.g., income
+affects investment but not skill transitions).
These methods are not implemented in skillmodels. If your dataset meets their
requirements, consider the original
[CHS Fortran code](https://tinyurl.com/yyuq2sa4).
+
+## Legacy / migration
+
+Earlier versions of skillmodels exposed the control function through a much more
+manual interface. If you are migrating an old model spec, note:
+
+- There is **no separate correction factor.** A dedicated `is_correction=True`
+ factor paired with the endogenous factor is gone; `is_correction` is no longer
+ a `FactorSpec` field. Replace the pair with a single endogenous investment
+ factor carrying a `CorrectionSpec`.
+- You no longer write the control function by hand. The old pattern — a custom
+ transition decorated with `@register_params` that computed
+ `cf = investment - investment_pred` inside the function body — is obsolete. The
+ library now forms `cf` and injects `kappa * cf` for you from the
+ `CorrectionSpec`.
+- Period augmentation is unchanged but is now an internal detail (see "How it
+ works internally" above); you do not configure it directly.
diff --git a/docs/reference_guides/transition_functions.md b/docs/reference_guides/transition_functions.md
index caee530f..b8b67ec5 100644
--- a/docs/reference_guides/transition_functions.md
+++ b/docs/reference_guides/transition_functions.md
@@ -3,6 +3,11 @@
Transition functions describe how latent factors evolve over time. skillmodels provides
several pre-built functions and supports custom functions.
+The same transition functions work for all three estimators (CHS, AF, AMN) — they live
+in `skillmodels.common.transition_functions` and are dispatched by name through each
+estimator's pipeline. AMN's Stage 3 currently supports the pre-built set listed below;
+custom `@register_params` transitions work with CHS and AF but not yet with AMN.
+
## Pre-built Transition Functions
### linear
@@ -30,6 +35,34 @@ translog function.
**Parameters**: Linear terms, squared terms, interaction terms, and constant.
+This is the general-library specification: parameters are enumerated over **all**
+factors (latent and observed). An observed factor (e.g. income) therefore enters
+the production function with its own free linear, square and interaction
+coefficients. This is by design for the CHS estimator. In an AF production
+function, observed factors must affect skills only through the investment
+equation, so use `translog_af` (below) instead.
+
+### translog_af
+
+The AF (2020) production translog from equation (6): linear terms plus pairwise
+interactions only, with **no** squared-factor terms:
+
+$$
+f_{t+1} = \sum_j \beta_j s_j + \sum_{j < k} \delta_{jk} s_j s_k + c
+$$
+
+For the canonical (skill, investment) pair this matches AF eq. (6),
+$a_t + g_1 \ln\theta + g_2 \ln I + g_3 \ln\theta \ln I$.
+
+Unlike the general `translog`, this function enumerates parameters over only the
+production factors you pass to it. Use it for AF production so that observed
+factors (e.g. income) cannot leak in as free production coefficients — pass only
+the production factors (skill + investment) and keep observed factors out of the
+production function. See [When to use the AF variants](#when-to-use-the-af-variants)
+below.
+
+**Parameters**: Linear terms, interaction terms, and constant (no squares).
+
### robust_translog
Same as `translog` but clips state values at ±10^12 before computation. Use this when
@@ -56,6 +89,30 @@ for implications.
**Parameters**: One weight $\gamma_j$ per factor (constrained to sum to 1) plus $\phi$.
+This is the general-library specification: the CES weights $\gamma_j$ are
+enumerated over **all** factors (latent and observed), so an observed factor
+(e.g. income) receives a share of the probability simplex and enters the
+production aggregate. This is by design for the CHS estimator. In an AF
+production function, use `log_ces_af` (below) so the CES runs over the production
+factors only.
+
+### log_ces_af
+
+The AF (2020) production CES from equation (7): a log CES over the production
+factors only. The math is identical to `log_ces`,
+
+$$
+f_{t+1} = \frac{1}{\phi} \ln\left(\sum_j \gamma_j e^{\phi \cdot s_j}\right)
+$$
+
+but parameters are enumerated over only the production factors you pass to it,
+not over observed factors. Use it for AF production (skill + investment) so that
+observed factors cannot leak in as free CES weights — pass only the production
+factors. See [When to use the AF variants](#when-to-use-the-af-variants) below.
+
+**Parameters**: One weight $\gamma_j$ per production factor (constrained to sum
+to 1) plus $\phi$ — the same set as `log_ces`.
+
### log_ces_general
Generalized log CES without known location and scale:
@@ -77,12 +134,39 @@ $$
**Parameters**: None.
+## When to use the AF variants
+
+The general `translog` and `log_ces` (and the other built-in production
+functions: `linear`, `robust_translog`, `linear_and_squares`,
+`log_ces_with_constant`, `log_ces_general`) enumerate parameters over **all**
+factors, including observed factors. For the CHS estimator this is the intended
+behaviour: observed factors are allowed to enter the production function with
+free coefficients.
+
+For an AF production function this is usually wrong. The AF model assumes that
+observed factors (e.g. income) affect skills **only** through the investment
+equation, not directly through production. Using a general built-in production
+transition would give income its own free production coefficients, silently
+changing the AF estimand. The `translog_af` and `log_ces_af` variants exist for
+exactly this case: they take only the production factors (skill + investment) and
+match AF equations (6) and (7) respectively.
+
+To make the leakage visible, `validate_af_model` emits a loud `UserWarning` when a
+built-in production transition (`linear`, `linear_and_squares`, `translog`,
+`robust_translog`, `log_ces`, `log_ces_with_constant`, `log_ces_general`) is used
+on a non-endogenous production factor while observed factors are present. The
+warning is not an error — intentionally-leaky models still run — but it flags the
+wrong-estimand risk. Switch to `translog_af` / `log_ces_af`, or pin every
+observed-factor transition coefficient to `0.0` via `fixed_params`, to remove the
+leakage. (The endogenous investment equation legitimately uses observed factors,
+so endogenous factors do not trigger the warning.)
+
## Custom Transition Functions
Define custom functions using the `@register_params` decorator:
```python
-from skillmodels.decorators import register_params
+from skillmodels.common.decorators import register_params
@register_params(params=["alpha", "beta"])
def my_transition(fac1, fac2, params):
diff --git a/environment-cuda.yml b/environment-cuda.yml
new file mode 100644
index 00000000..9be30e14
--- /dev/null
+++ b/environment-cuda.yml
@@ -0,0 +1,67 @@
+---
+# Conda/mamba environment for the skillmodels `af-estimator` branch
+# **with CUDA 12 GPU support**.
+#
+# Same package set as `environment.yml`, except JAX is pulled in via the
+# `jax[cuda12]` PyPI extra and `cuda-nvcc` is added on the conda side.
+# Requires the host system to provide a CUDA 12 toolkit; see
+# https://jax.readthedocs.io/en/latest/installation.html for details.
+#
+# Usage:
+# mamba env create -f environment-cuda.yml
+# mamba activate skillmodels-af-cuda
+name: skillmodels-af-cuda
+channels:
+ - conda-forge
+ - nodefaults
+dependencies:
+ # CUDA toolchain (required for the cuda12 JAX wheel below)
+ - cuda-nvcc >=12
+ # Python + core scientific stack
+ - python ~=3.14.0
+ - scipy >=1.16.0
+ - h5py >=3.16.0,<4
+ # Skillmodels conda deps
+ - filterpy *
+ - ipykernel >=6.29.5
+ - jupyterlab *
+ - nbformat >=5.10.4
+ - networkx *
+ - pybaum >=0.1.3
+ - scikit-learn >=1.5 # AMN Stage 1 (mixture EM)
+ # Test / profiling tooling
+ - pytest >=8.4.1
+ - pytest-cov >=6.2.1
+ - pytest-xdist >=3.8.0
+ - pytest-memray *
+ - snakeviz *
+ - xlrd >=2
+ - prek *
+ # Downstream-only conda deps (skane-struct-bw / health-cognition):
+ - deepdiff >=8.5.0
+ - memray >=1.17.2
+ - statsmodels >=0.14.5
+ - tabulate >=0.9.0
+ - seaborn *
+ - pip
+ - pip:
+ # Skillmodels project deps (PyPI), with CUDA-12 JAX wheel
+ - dags>=0.5.1
+ - jax[cuda12]>=0.9
+ - jupyter-book>=2
+ - kaleido>=1.2
+ - numpy>=2.4
+ - pandas>=3
+ - plotly>=6.6
+ - pytask>=0.5.8
+ - pytask-parallel>=0.5.2
+ - pdbp
+ # Pinned to the optimagic branch the AF estimator relies on.
+ # yamllint disable-line rule:line-length
+ - optimagic @ git+https://github.com/optimagic-dev/optimagic.git@probability-allow-fixed-entries
+ # Downstream-only PyPI deps:
+ - fides>=0.7.8
+ - statadict>=1.1.0
+ # Skillmodels itself, from the af-estimator branch.
+ # yamllint disable-line rule:line-length
+ - skillmodels @ git+https://github.com/OpenSourceEconomics/skillmodels.git@af-estimator
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 00000000..684f5b34
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,70 @@
+---
+# Conda/mamba environment for the skillmodels `af-estimator` branch.
+#
+# Installs every package needed to run the skillmodels test suite **and**
+# the two downstream research applications (`skane-struct-bw`,
+# `health-cognition`) -- minus the two applications themselves, which
+# are supplied separately by their respective project teams.
+#
+# CPU-only JAX. For an environment with CUDA-12 support use
+# `environment-cuda.yml` instead.
+#
+# Usage:
+# mamba env create -f environment.yml
+# mamba activate skillmodels-af
+name: skillmodels-af
+channels:
+ - conda-forge
+ - nodefaults
+dependencies:
+ # Python + core scientific stack
+ - python ~=3.14.0
+ - scipy >=1.16.0
+ - h5py >=3.16.0,<4
+ # Skillmodels conda deps
+ - filterpy *
+ - ipykernel >=6.29.5
+ - jupyterlab *
+ - nbformat >=5.10.4
+ - networkx *
+ - pybaum >=0.1.3
+ - scikit-learn >=1.5 # AMN Stage 1 (mixture EM)
+ # Test / profiling tooling (skillmodels' tests-cpu feature)
+ - pytest >=8.4.1
+ - pytest-cov >=6.2.1
+ - pytest-xdist >=3.8.0
+ - pytest-memray *
+ - snakeviz *
+ - xlrd >=2
+ - prek *
+ # Downstream-only conda deps (not used by skillmodels itself; required
+ # to run skane-struct-bw / health-cognition pipelines):
+ - deepdiff >=8.5.0 # health-cognition + skane: snapshot / diff utilities
+ - memray >=1.17.2 # health-cognition + skane: memory profiling
+ - statsmodels >=0.14.5 # health-cognition + skane: regression diagnostics
+ - tabulate >=0.9.0 # health-cognition + skane: table formatting in reports
+ - seaborn * # health-cognition: figure styling
+ - pip
+ - pip:
+ # Skillmodels project deps (PyPI)
+ - dags>=0.5.1
+ - jax>=0.9
+ - jupyter-book>=2
+ - kaleido>=1.2
+ - numpy>=2.4
+ - pandas>=3
+ - plotly>=6.6
+ - pytask>=0.5.8
+ - pytask-parallel>=0.5.2
+ - pdbp
+ # Pinned to the optimagic branch the AF estimator relies on
+ # (`probability-allow-fixed-entries`). The PyPI release does not
+ # yet carry the required `FixedConstraintWithValue` semantics.
+ # yamllint disable-line rule:line-length
+ - optimagic @ git+https://github.com/optimagic-dev/optimagic.git@probability-allow-fixed-entries
+ # Downstream-only PyPI deps (not used by skillmodels itself):
+ - fides>=0.7.8 # health-cognition + skane: optimagic algorithm
+ - statadict>=1.1.0 # health-cognition + skane: Stata variable labels
+ # The library itself, from the af-estimator branch.
+ # yamllint disable-line rule:line-length
+ - skillmodels @ git+https://github.com/OpenSourceEconomics/skillmodels.git@af-estimator
diff --git a/pixi.lock b/pixi.lock
index 60360ab9..2651697b 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -1,128 +1,76 @@
-version: 6
+version: 7
+platforms:
+- name: linux-64
+- name: osx-arm64
+- name: win-64
environments:
cuda:
channels:
- url: https://conda.anaconda.org/conda-forge/
indexes:
- https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
packages:
linux-64:
- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
@@ -131,173 +79,52 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- default:
- channels:
- - url: https://conda.anaconda.org/conda-forge/
- indexes:
- - https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
- packages:
- linux-64:
- - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -307,21 +134,24 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -329,22 +159,22 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -359,71 +189,31 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
@@ -431,102 +221,197 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ default:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -536,21 +421,14 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -558,22 +436,21 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -588,169 +465,112 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- win-64:
- - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ osx-arm64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -760,22 +580,14 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -783,7 +595,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
@@ -792,12 +603,13 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -805,52 +617,16 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
@@ -858,138 +634,189 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- docs:
- channels:
- - url: https://conda.anaconda.org/conda-forge/
- indexes:
- - https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
- packages:
- linux-64:
- - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ win-64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -999,22 +826,15 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -1022,23 +842,21 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -1046,180 +864,308 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ docs:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -1229,22 +1175,15 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -1252,23 +1191,22 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -1283,42 +1221,8 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
@@ -1326,125 +1230,102 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- win-64:
- - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ osx-arm64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -1454,22 +1335,15 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -1477,7 +1351,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
@@ -1487,12 +1360,13 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -1500,52 +1374,18 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
@@ -1553,137 +1393,186 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- tests-cpu:
- channels:
- - url: https://conda.anaconda.org/conda-forge/
- indexes:
- - https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
- packages:
- linux-64:
- - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ win-64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -1693,52 +1582,38 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -1746,371 +1621,428 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ tests-cpu:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/memray-1.19.2-py314h44d60dd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
@@ -2119,70 +2051,64 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- win-64:
- - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ osx-arm64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -2192,23 +2118,15 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
@@ -2217,7 +2135,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
@@ -2227,12 +2144,13 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -2240,52 +2158,20 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
@@ -2293,140 +2179,195 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/memray-1.19.2-py314h44d60dd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- tests-cuda:
- channels:
- - url: https://conda.anaconda.org/conda-forge/
- indexes:
- - https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
- packages:
- linux-64:
- - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ win-64:
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -2434,79 +2375,41 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -2514,292 +2417,248 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- tests-cuda12:
+ tests-cuda:
channels:
- url: https://conda.anaconda.org/conda-forge/
indexes:
- https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
packages:
linux-64:
- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
@@ -2807,44 +2666,16 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
@@ -2860,7 +2691,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
@@ -2874,7 +2704,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
@@ -2882,7 +2711,6 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
@@ -2893,172 +2721,43 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- type-checking:
- channels:
- - url: https://conda.anaconda.org/conda-forge/
- indexes:
- - https://pypi.org/simple
- options:
- pypi-prerelease-mode: if-necessary-or-explicit
- packages:
- linux-64:
- - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -3068,37 +2767,38 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
@@ -3108,6 +2808,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -3122,74 +2823,33 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
@@ -3198,100 +2858,238 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/18/14/69a25a0cad493fb6a947302471b579a03516a3b00e7bece77fdc6b4afb9b/ty-0.0.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ tests-cuda12:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
@@ -3301,46 +3099,48 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
@@ -3355,5470 +3155,7569 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
- - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/0f/01/3f25909b02fac29bb0a62b2251f8d62e65d697781ffa4cf6b47a4c075c85/ty-0.0.23-py3-none-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
- win-64:
- - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ tests-cuda13:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.2.78-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.2.75-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.2.75-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.2.75-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-13.2.78-hcdd1206_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-13.2.78-h85509e4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.2.78-he02047a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-13.2.78-hb2fc203_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.2.78-h4bc722e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.2.78-h4bc722e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_24.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-he30e93d_24.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_100.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.2.78-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py314hef15ded_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.13-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.4.0-py314h680f03e_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.2.75-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.2.78-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.2.75-h376f20c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.2.75-h376f20c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.2.75-h376f20c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-13.2.75-h376f20c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-13.2.78-he91c749_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.2.78-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.2-he2cc418_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.14.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.2.78-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.5-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
- - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/1e/b5/dae67f0c45516cfaff2d7fba873c7425c2866d4c9ede5c14a269d89ed79b/nvidia_nvjitlink-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/21/98/77f15d81fd0637da454e453c8456d4a2b5c8b2e66823b4237ee8689152cf/jax_cuda13_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/25/1f/cca084ca2572810fff12ea9dbdcbe39eac048f40daf4a9077b49fcbe8cee/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2e/84/efc7c0bf3a1c5eef81d397f6fddac855becdbb11cb38ff957888603014a7/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/3e/93/6d020a69fc37e57fae8a96ab0c53102d96538db256e933e914d100e5a430/nvidia_nccl_cu13-2.30.4-py3-none-manylinux_2_18_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/5b/f2/44a7dd795a52d34d033b1cb1a6b1162eada650079e557e236fb6b88943be/pytask_parallel-0.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/5d/7b/2ab033584a3339552472ac8d79543c503a0e06dd0d082448b06697e7f716/nvidia_nvshmem_cu13-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/0f/c7c7d538c61794130e759ad74710ab5aa8cab1f700ee1754381f8c665605/nvidia_cuda_nvcc-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/91/3635cdb13318cb0a328abaa69e2b91251caad39d6779aa308098f341f6cb/simplejson-4.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/8f/2b/5c63c29d155afdf1d7827f8c04efe8cac47fc6783d8c53959e43de879dcc/jax_cuda13_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/92/87/d23db8276b76b4a7e4a702eebdc0a70e3b56c17b4dcd980ecb0f68b022e1/nvidia_cuda_cccl-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/9c/1a/4834b1f2fb1847412353d7342eb7a1d001a4f3bd9d24155e057135a4aa44/optree-0.19.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/9e/b9/a6d8bb7d228940f01885bd9f327ab7f9d366a9be775c4bf366bf9d9477ae/kaleido-1.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- - pypi: https://files.pythonhosted.org/packages/31/2e/eaed4ff5c85e857a02415084c394e02c30476b65e158eec1938fdaa9a205/ty-0.0.23-py3-none-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b5/83/205e7af4153d9690c3cb94fa9cea670c0d26ce7f022aaa589a9e136f1491/jupyter_book-2.1.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ba/6c/ff8bf52315064dbeb55cb5067e191120a5b2e58bb648d0d34cf7969dc2c2/choreographer-1.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c7/e1/68c2256b69a314eba133673377ba9118c356f6342a0c02b61de449cf2bf2/narwhals-2.21.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d7/54/c30cb1d08258612ece1dfa72c6918998bebecb916c54fca6d806bc780f2b/pytask-0.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- - pypi: ./
-packages:
-- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- build_number: 20
- sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9
- md5: a9f577daf3de00bca7c3c76c0ecbd1de
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgomp >=7.5.0
- constrains:
- - openmp_impl <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 28948
- timestamp: 1770939786096
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- build_number: 7
- sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd
- md5: a44032f282e7d2acdeb1c240308052dd
- depends:
- - llvm-openmp >=9.0.1
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 8325
- timestamp: 1764092507920
-- conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
- build_number: 20
- sha256: 8a1cee28bd0ee7451ada1cd50b64720e57e17ff994fc62dd8329bef570d382e4
- md5: 1626967b574d1784b578b52eaeb071e7
- depends:
- - libgomp >=7.5.0
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- constrains:
- - openmp_impl <0.0a0
- - msys2-conda-epoch <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 52252
- timestamp: 1770943776666
-- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661
- md5: aaa2a381ccc56eac91d63b6c1240312f
- depends:
- - cpython
- - python-gil
- license: MIT
- license_family: MIT
- purls: []
- size: 8191
- timestamp: 1744137672556
-- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
- name: annotated-types
- version: 0.7.0
- sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53
- requires_dist:
- - typing-extensions>=4.0.0 ; python_full_version < '3.9'
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
- sha256: eb0c4e2b24f1fbefaf96ce6c992c6bd64340bc3c06add4d7415ab69222b201da
- md5: 11a2b8c732d215d977998ccd69a9d5e8
- depends:
- - exceptiongroup >=1.0.2
- - idna >=2.8
- - python >=3.10
- - typing_extensions >=4.5
- - python
- constrains:
- - trio >=0.32.0
- - uvloop >=0.21
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/anyio?source=compressed-mapping
- size: 145175
- timestamp: 1767719033569
-- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
- sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf
- md5: 54898d0f524c9dee622d44bbb081a8ab
- depends:
- - python >=3.9
- license: BSD-2-Clause
- license_family: BSD
- purls:
- - pkg:pypi/appnope?source=hash-mapping
- size: 10076
- timestamp: 1733332433806
-- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
- sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad
- md5: 8ac12aff0860280ee0cff7fa2cf63f3b
- depends:
- - argon2-cffi-bindings
- - python >=3.9
- - typing-extensions
- constrains:
- - argon2_cffi ==999
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/argon2-cffi?source=hash-mapping
- size: 18715
- timestamp: 1749017288144
-- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
- sha256: 39234a99df3d2e3065383808ed8bfda36760de5ef590c54c3692bb53571ef02b
- md5: 3cca1b74b2752917b5b65b81f61f0553
- depends:
- - __glibc >=2.17,<3.0.a0
- - cffi >=2.0.0b1
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
- size: 35598
- timestamp: 1762509505285
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
- sha256: aab60bbaea5cc49dff37438d1ad469d64025cda2ce58103cf68da61701ed2075
- md5: a240a79a49a95b388ef81ccda27a5e51
- depends:
- - __osx >=11.0
- - cffi >=2.0.0b1
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
- size: 34218
- timestamp: 1762509977830
-- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
- sha256: a742e7cd0d5534bfff3fd550a0c1e430411fad60a24f88930d261056ab08096f
- md5: ffa247e46f47e157851dc547f4c513e4
- depends:
- - cffi >=2.0.0b1
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
- size: 38653
- timestamp: 1762509771011
-- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
- sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141
- md5: 85c4f19f377424eafc4ed7911b291642
- depends:
- - python >=3.10
- - python-dateutil >=2.7.0
- - python-tzdata
- - python
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/arrow?source=hash-mapping
- size: 113854
- timestamp: 1760831179410
-- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010
- md5: 9673a61a297b00016442e022d689faa6
- depends:
- - python >=3.10
- constrains:
- - astroid >=2,<5
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/asttokens?source=hash-mapping
- size: 28797
- timestamp: 1763410017955
-- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
- sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948
- md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803
- depends:
- - python >=3.10
- - typing_extensions >=4.0.0
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/async-lru?source=hash-mapping
- size: 21470
- timestamp: 1771623881915
-- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
- sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f
- md5: 537296d57ea995666c68c821b00e360b
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/attrs?source=compressed-mapping
- size: 64759
- timestamp: 1764875182184
-- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770
- md5: f1976ce927373500cc19d3c0b2c85177
- depends:
- - python >=3.10
- - python
- constrains:
- - pytz >=2015.7
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/babel?source=compressed-mapping
- size: 7684321
- timestamp: 1772555330347
-- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
- noarch: generic
- sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29
- md5: a2ac7763a9ac75055b68f325d3255265
- depends:
- - python >=3.14
- license: BSD-3-Clause AND MIT AND EPL-2.0
- purls: []
- size: 7514
- timestamp: 1767044983590
-- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
- sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6
- md5: 5267bef8efea4127aacd1f4e1f149b6e
- depends:
- - python >=3.10
- - soupsieve >=1.2
- - typing-extensions
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/beautifulsoup4?source=hash-mapping
- size: 90399
- timestamp: 1764520638652
-- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
- sha256: 74341b26a2b9475dc14ba3cf12432fcd10a23af285101883e720216d81d44676
- md5: 83aa53cb3f5fc849851a84d777a60551
- depends:
- - ld_impl_linux-64 2.45.1 default_hbd61a6d_101
- - sysroot_linux-64
- - zstd >=1.5.7,<1.6.0a0
- license: GPL-3.0-only
- license_family: GPL
- purls: []
- size: 3744895
- timestamp: 1770267152681
-- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
- sha256: 4826f97d33cbe54459970a1e84500dbe0cccf8326aaf370e707372ae20ec5a47
- md5: dec96579f9a7035a59492bf6ee613b53
- depends:
- - binutils_impl_linux-64 2.45.1 default_hfdba357_101
- license: GPL-3.0-only
- license_family: GPL
- purls: []
- size: 36060
- timestamp: 1770267177798
-- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
- sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46
- md5: 7c5ebdc286220e8021bf55e6384acd67
- depends:
- - python >=3.10
- - webencodings
- - python
- constrains:
- - tinycss2 >=1.1.0,<1.5
- license: Apache-2.0 AND MIT
- purls:
- - pkg:pypi/bleach?source=compressed-mapping
- size: 142008
- timestamp: 1770719370680
-- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
- sha256: 7c07a865e5e4cca233cc4e0eb3f0f5ff6c90776461687b4fb0b1764133e1fd61
- md5: f11a319b9700b203aa14c295858782b6
- depends:
- - bleach ==6.3.0 pyhcf101f3_1
- - tinycss2
- license: Apache-2.0 AND MIT
- purls: []
- size: 4409
- timestamp: 1770719370682
-- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
- sha256: e511644d691f05eb12ebe1e971fd6dc3ae55a4df5c253b4e1788b789bdf2dfa6
- md5: 8ccf913aaba749a5496c17629d859ed1
- depends:
- - __glibc >=2.17,<3.0.a0
- - brotli-bin 1.2.0 hb03c661_1
- - libbrotlidec 1.2.0 hb03c661_1
- - libbrotlienc 1.2.0 hb03c661_1
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 20103
- timestamp: 1764017231353
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
- sha256: 422ac5c91f8ef07017c594d9135b7ae068157393d2a119b1908c7e350938579d
- md5: 48ece20aa479be6ac9a284772827d00c
- depends:
- - __osx >=11.0
- - brotli-bin 1.2.0 hc919400_1
- - libbrotlidec 1.2.0 hc919400_1
- - libbrotlienc 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- purls: []
- size: 20237
- timestamp: 1764018058424
-- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
- sha256: a4fffdf1c9b9d3d0d787e20c724cff3a284dfa3773f9ce609c93b1cfd0ce8933
- md5: bc58fdbced45bb096364de0fba1637af
- depends:
- - brotli-bin 1.2.0 hfd05255_1
- - libbrotlidec 1.2.0 hfd05255_1
- - libbrotlienc 1.2.0 hfd05255_1
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 20342
- timestamp: 1764017988883
-- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
- sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94
- md5: af39b9a8711d4a8d437b52c1d78eb6a1
- depends:
- - __glibc >=2.17,<3.0.a0
- - libbrotlidec 1.2.0 hb03c661_1
- - libbrotlienc 1.2.0 hb03c661_1
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 21021
- timestamp: 1764017221344
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
- sha256: e2d142052a83ff2e8eab3fe68b9079cad80d109696dc063a3f92275802341640
- md5: 377d015c103ad7f3371be1777f8b584c
- depends:
- - __osx >=11.0
- - libbrotlidec 1.2.0 hc919400_1
- - libbrotlienc 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- purls: []
- size: 18628
- timestamp: 1764018033635
-- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
- sha256: e76966232ef9612de33c2087e3c92c2dc42ea5f300050735a3c646f33bce0429
- md5: 6abd7089eb3f0c790235fe469558d190
- depends:
- - libbrotlidec 1.2.0 hfd05255_1
- - libbrotlienc 1.2.0 hfd05255_1
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 22714
- timestamp: 1764017952449
-- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0
- md5: 8910d2c46f7e7b519129f486e0fe927a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - libbrotlicommon 1.2.0 hb03c661_1
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/brotli?source=hash-mapping
- size: 367376
- timestamp: 1764017265553
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99
- md5: f9501812fe7c66b6548c7fcaa1c1f252
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- constrains:
- - libbrotlicommon 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/brotli?source=hash-mapping
- size: 359854
- timestamp: 1764018178608
-- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b
- md5: 1302b74b93c44791403cbeee6a0f62a3
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libbrotlicommon 1.2.0 hfd05255_1
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/brotli?source=hash-mapping
- size: 335782
- timestamp: 1764018443683
-- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6
- md5: d2ffd7602c02f2b316fd921d39876885
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: bzip2-1.0.6
- license_family: BSD
- purls: []
- size: 260182
- timestamp: 1771350215188
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df
- md5: 620b85a3f45526a8bc4d23fd78fc22f0
- depends:
- - __osx >=11.0
- license: bzip2-1.0.6
- license_family: BSD
- purls: []
- size: 124834
- timestamp: 1771350416561
-- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902
- md5: 4cb8e6b48f67de0b018719cdf1136306
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: bzip2-1.0.6
- license_family: BSD
- purls: []
- size: 56115
- timestamp: 1771350256444
-- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e
- md5: 920bb03579f15389b9e512095ad995b7
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 207882
- timestamp: 1765214722852
-- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
- sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6
- md5: f001e6e220355b7f87403a4d0e5bf1ca
- depends:
- - __win
- license: ISC
- purls: []
- size: 147734
- timestamp: 1772006322223
-- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
- sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc
- md5: 4492fd26db29495f0ba23f146cd5638d
- depends:
- - __unix
- license: ISC
- purls: []
- size: 147413
- timestamp: 1772006283803
-- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
- noarch: python
- sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17
- md5: 9b347a7ec10940d3f7941ff6c460b551
- depends:
- - cached_property >=1.5.2,<1.5.3.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 4134
- timestamp: 1615209571450
-- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
- sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7
- md5: 576d629e47797577ab0f1b351297ef4a
- depends:
- - python >=3.6
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/cached-property?source=hash-mapping
- size: 11065
- timestamp: 1615209567874
-- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
- sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656
- md5: 765c4d97e877cdbbb88ff33152b86125
- depends:
- - python >=3.10
- license: ISC
- purls:
- - pkg:pypi/certifi?source=compressed-mapping
- size: 151445
- timestamp: 1772001170301
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
- sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e
- md5: cf45f4278afd6f4e6d03eda0f435d527
- depends:
- - __glibc >=2.17,<3.0.a0
- - libffi >=3.5.2,<3.6.0a0
- - libgcc >=14
- - pycparser
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/cffi?source=hash-mapping
- size: 300271
- timestamp: 1761203085220
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
- sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98
- md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7
- depends:
- - __osx >=11.0
- - libffi >=3.5.2,<3.6.0a0
- - pycparser
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/cffi?source=hash-mapping
- size: 292983
- timestamp: 1761203354051
-- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
- sha256: 924f2f01fa7a62401145ef35ab6fc95f323b7418b2644a87fea0ea68048880ed
- md5: c360170be1c9183654a240aadbedad94
- depends:
- - pycparser
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/cffi?source=hash-mapping
- size: 294731
- timestamp: 1761203441365
-- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
- sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5
- md5: 49ee13eb9b8f44d63879c69b8a40a74b
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/charset-normalizer?source=compressed-mapping
- size: 58510
- timestamp: 1773660086450
-- pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
- name: choreographer
- version: 1.2.1
- sha256: 9af5385effa3c204dbc337abf7ac74fd8908ced326a15645dc31dde75718c77e
- requires_dist:
- - logistro>=2.0.1
- - simplejson>=3.19.3
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
- name: click
- version: 8.3.1
- sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6
- requires_dist:
- - colorama ; sys_platform == 'win32'
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
- name: click-default-group
- version: 1.2.4
- sha256: 9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f
- requires_dist:
- - click
- - pytest ; extra == 'test'
- requires_python: '>=2.7'
-- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
- name: cloudpickle
- version: 3.1.2
- sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287
- md5: 962b9857ee8e7018c22f2776ffa0b2d7
- depends:
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/colorama?source=hash-mapping
- size: 27011
- timestamp: 1733218222191
-- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
- sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212
- md5: 2da13f2b299d8e1995bafbbe9689a2f7
- depends:
- - python >=3.9
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/comm?source=hash-mapping
- size: 14690
- timestamp: 1753453984907
-- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
- sha256: b0314a7f1fb4a294b1a8bcf5481d4a8d9412a9fee23b7e3f93fb10e4d504f2cc
- md5: 95bede9cdb7a30a4b611223d52a01aa4
- depends:
- - numpy >=1.25
- - python
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/contourpy?source=hash-mapping
- size: 324013
- timestamp: 1769155968691
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
- sha256: 754ab72f1c1ae99ef7c57995f59224dc9632cbd6731fe7e6277437fd01d43156
- md5: cddc851000ce131d757678c2f329eaad
- depends:
- - numpy >=1.25
- - python
- - python 3.14.* *_cp314
- - __osx >=11.0
- - libcxx >=19
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/contourpy?source=hash-mapping
- size: 290405
- timestamp: 1769156069514
-- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
- sha256: f141bcbf8e490b49b2f53f517173d13a64d75e43cfae170e0d931cb0b66f4bce
- md5: c26934035616f7d578f9da0491aed3d8
- depends:
- - numpy >=1.25
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/contourpy?source=hash-mapping
- size: 247437
- timestamp: 1769155978556
-- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
- sha256: cf5f98a291c3a5489cb299bae38711d5dc21b88a00df981f3b1528781e18c909
- md5: 78f547b78ace7541c4f54c4268ac9d2e
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - tomli
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/coverage?source=compressed-mapping
- size: 411308
- timestamp: 1773761119353
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda
- sha256: 808ebcb57027251f379f84e53a3755d2851918f78bdd512d131afe40ca64a041
- md5: cdbafe4a3e605024e7372c9580f9d734
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - tomli
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/coverage?source=compressed-mapping
- size: 412458
- timestamp: 1773761280047
-- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda
- sha256: 80a6a7be7eef784b8314a4cb563563c654e2180a0b2b31b232f79b2e7334aaf2
- md5: 849f0bd5b83d4fd59b41202b21bb3ca2
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - tomli
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/coverage?source=compressed-mapping
- size: 438927
- timestamp: 1773760993379
-- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
- noarch: generic
- sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c
- md5: 3bb89e4f795e5414addaa531d6b1500a
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi * *_cp314
- license: Python-2.0
- purls: []
- size: 50078
- timestamp: 1770674447292
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- sha256: 2ee3b9564ca326226e5cda41d11b251482df8e7c757e333d28ec75213c75d126
- md5: 87ff6381e33b76e5b9b179a2cdd005ec
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 1150650
- timestamp: 1746189825236
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304
- md5: 79d280de61e18010df5997daea4743df
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 94239
- timestamp: 1753975242354
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45
- md5: 503a94e20d2690d534d676a764a1852c
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 29138
- timestamp: 1753975252445
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- sha256: 57d1294ecfaf9dc8cdb5fc4be3e63ebc7614538bddb5de53cfd9b1b7de43aed5
- md5: cb15315d19b58bd9cd424084e58ad081
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-cudart_linux-64 12.9.79 h3f2d84a_0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=13
- - libstdcxx >=13
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 23242
- timestamp: 1749218416505
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
- sha256: 04d8235cb3cb3510c0492c3515a9d1a6053b50ef39be42b60cafb05044b5f4c6
- md5: ba38a7c3b4c14625de45784b773f0c71
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-cudart 12.9.79 h5888daf_0
- - cuda-cudart-dev_linux-64 12.9.79 h3f2d84a_0
- - cuda-cudart-static 12.9.79 h5888daf_0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=13
- - libstdcxx >=13
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 23687
- timestamp: 1749218464010
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5
- md5: 86e40eb67d83f1a58bdafdd44e5a77c6
- depends:
- - cuda-cccl_linux-64
- - cuda-cudart-static_linux-64
- - cuda-cudart_linux-64
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 389140
- timestamp: 1749218427266
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
- sha256: 6261e1d9af80e1ec308e3e5e2ff825d189ef922d24093beaf6efca12e67ce060
- md5: d3c4ac48f4967f09dd910d9c15d40c81
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-cudart-static_linux-64 12.9.79 h3f2d84a_0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=13
- - libstdcxx >=13
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 23283
- timestamp: 1749218442382
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032
- md5: b87bf315d81218dd63eb46cc1eaef775
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 1148889
- timestamp: 1749218381225
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: 6cde0ace2b995b49d0db2eefb7bc30bf00ffc06bb98ef7113632dec8f8907475
- md5: 64508631775fbbf9eca83c84b1df0cae
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 197249
- timestamp: 1749218394213
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: a15574d966e73135a79d5e6570c87e13accdb44bd432449b5deea71644ad442c
- md5: d411828daa36ac84eab210ba3bbe5a64
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 37714
- timestamp: 1749218405324
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
- sha256: f7c5de6b1f0f463f73c78cc73439027cdd5cb94fb4ce099116969812973cabcb
- md5: 02289b10ac97bac35ad1add086c5072a
- depends:
- - cuda-nvcc_linux-64 12.9.86.*
- - gcc_linux-64
- - gxx_linux-64
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 25472
- timestamp: 1771619493470
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
- sha256: a1672a34439a72869de9e011e935d41b62fc8dfb1a2700e85ed8a7a129b79981
- md5: 19d4e090217f0ea89d30bedb7461c048
- depends:
- - cuda-crt-dev_linux-64 12.9.86 ha770c72_2
- - cuda-nvvm-dev_linux-64 12.9.86 ha770c72_2
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=6
- - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2
- constrains:
- - gcc_impl_linux-64 >=6,<15.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 28121
- timestamp: 1753975535813
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
- sha256: 961cf20d411b7685cd744e6c6ed35efea547d095c62151d6f3053d9931bb994d
- md5: 67458d2685e7503933efa550f3ee40f3
- depends:
- - cuda-cudart >=12.9.79,<13.0a0
- - cuda-cudart-dev
- - cuda-nvcc-dev_linux-64 12.9.86 he91c749_2
- - cuda-nvcc-tools 12.9.86 he02047a_2
- - cuda-nvvm-impl 12.9.86 h4bc722e_2
- - cuda-version >=12.9,<12.10.0a0
- - libnvptxcompiler-dev 12.9.86 ha770c72_2
- constrains:
- - gcc_impl_linux-64 >=6,<15.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 27215
- timestamp: 1753975546846
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- sha256: 0e849be7b5e4832ca218ec2c48a9ba3a15a984f629e2e54f38a53f4f57220341
- md5: dc256c9864c2e8e9c817fbca1c84a4bc
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-crt-tools 12.9.86 ha770c72_2
- - cuda-nvvm-tools 12.9.86 h4bc722e_2
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=12
- - libstdcxx >=12
- constrains:
- - gcc_impl_linux-64 >=6,<15.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 27380012
- timestamp: 1753975454194
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
- sha256: c506221dafb7cfd081f7d12d01d8e8ab9b29adfcc7d69d61fedd3232174e4016
- md5: 359d05bc3ec5d3a467eb558e3844aea2
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-cudart-dev_linux-64 12.9.*
- - cuda-driver-dev_linux-64 12.9.*
- - cuda-nvcc-dev_linux-64 12.9.86.*
- - cuda-nvcc-impl 12.9.86.*
- - cuda-nvcc-tools 12.9.86.*
- - sysroot_linux-64 >=2.17,<3.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 27575
- timestamp: 1771619492974
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
- sha256: 522722dcaffd133e0c7500c69dc70e21ac34d6762dcbaabfe847439f944028f0
- md5: 7b386291414c7eea113d25ac28a33772
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 27096
- timestamp: 1753975261562
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
- sha256: f4d34556174e4faa9d374ba2244707082870e1bbc1bb441ad3d9d2cea37da6af
- md5: 82125dd3c0c4aa009faa00e2829b93d8
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=12
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 21425520
- timestamp: 1753975283188
-- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- sha256: 45f5e881ed0d973132a5475a0b5c066db6e748ef3a831a14dba8374b252e0067
- md5: f9af26e4079adcd72688a8e8dbecb229
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=12
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 24246736
- timestamp: 1753975332907
-- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656
- md5: b6d5d7f1c171cbd228ea06b556cfa859
- constrains:
- - cudatoolkit 12.9|12.9.*
- - __cuda >=12
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 21578
- timestamp: 1746134436166
-- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
- sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1
- md5: 4c2a8fef270f6c69591889b93f9f55c1
- depends:
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/cycler?source=hash-mapping
- size: 14778
- timestamp: 1764466758386
-- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
- name: dags
- version: 0.5.1
- sha256: e9fd9fbe0536784fe8b8ce58ea194801b1de39d7364941d4a1f2d8240c14123d
- requires_dist:
- - flatten-dict
- - networkx>=3.6
- requires_python: '>=3.11'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
- sha256: d9e89e351d7189c41615cfceca76b3bcacaa9c81d9945ac1caa6fb9e5184f610
- md5: 57e6fad901c05754d5256fe3ab9f277b
- depends:
- - python
- - libgcc >=14
- - libstdcxx >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/debugpy?source=hash-mapping
- size: 2886804
- timestamp: 1769744977998
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
- sha256: 7736a82ebe75c0f3ea6991298363d1f2edb34291f8616c1d3719862881c3a167
- md5: 407c74dc27356ba6bf3a0191070e3ac0
- depends:
- - python
- - python 3.14.* *_cp314
- - __osx >=11.0
- - libcxx >=19
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/debugpy?source=hash-mapping
- size: 2778080
- timestamp: 1769745040206
-- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
- sha256: ece1d8299ad081edaf1e5279f2a900bdedddb2c795ac029a06401543cd7610ad
- md5: 48ae8370a4562f7049d587d017792a3a
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/debugpy?source=hash-mapping
- size: 4026404
- timestamp: 1769745008861
-- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
- sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017
- md5: 9ce473d1d1be1cc3810856a48b3fab32
- depends:
- - python >=3.9
- license: BSD-2-Clause
- license_family: BSD
- purls:
- - pkg:pypi/decorator?source=hash-mapping
- size: 14129
- timestamp: 1740385067843
-- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
- sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be
- md5: 961b3a227b437d82ad7054484cfa71b2
- depends:
- - python >=3.6
- license: PSF-2.0
- license_family: PSF
- purls:
- - pkg:pypi/defusedxml?source=hash-mapping
- size: 24062
- timestamp: 1615232388757
-- conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
- sha256: f71eae7dc8ff9392d225d2d529691b2db16289b7d8009646eeb1adf0caf3937b
- md5: 6da1f998c8ea85ba7692afbb5db72fb9
- depends:
- - libgcc >=14
- - libstdcxx >=14
- - __glibc >=2.17,<3.0.a0
- - libzlib >=1.3.1,<2.0a0
- - libsqlite >=3.51.1,<4.0a0
- - libmicrohttpd >=1.0.2,<1.1.0a0
- - libarchive >=3.8.2,<3.9.0a0
- - liblzma >=5.8.1,<6.0a0
- - bzip2 >=1.0.8,<2.0a0
- - zstd >=1.5.7,<1.6.0a0
- - libcurl >=8.17.0,<9.0a0
- license: LGPL-3.0-only
- license_family: LGPL
- purls: []
- size: 1289929
- timestamp: 1765447425767
-- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144
- md5: 8e662bd460bda79b1ea39194e3c4c9ab
- depends:
- - python >=3.10
- - typing_extensions >=4.6.0
- license: MIT and PSF-2.0
- purls:
- - pkg:pypi/exceptiongroup?source=hash-mapping
- size: 21333
- timestamp: 1763918099466
-- conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
- sha256: 1acc6a420efc5b64c384c1f35f49129966f8a12c93b4bb2bdc30079e5dc9d8a8
- md5: a57b4be42619213a94f31d2c69c5dda7
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/execnet?source=hash-mapping
- size: 39499
- timestamp: 1762974150770
-- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad
- md5: ff9efb7f7469aed3c4a8106ffa29593c
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/executing?source=hash-mapping
- size: 30753
- timestamp: 1756729456476
-- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
- sha256: dc81e6283bd2cdc5e8a3e5c88527870b2992a8f71f25ddec9dd995223c08aed8
- md5: 261bd75b03d09c5eeea5aedf7365e811
- depends:
- - matplotlib-base
- - numpy
- - python >=3.9
- - scipy
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/filterpy?source=hash-mapping
- size: 72868
- timestamp: 1739826907157
-- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
- name: flatten-dict
- version: 0.4.2
- sha256: 7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad
- requires_dist:
- - importlib-metadata ; python_full_version < '3.8'
- - pathlib2>=2.3,<3.0 ; python_full_version < '3.4'
- - six>=1.12,<2.0
- requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*'
-- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
- sha256: ed4462f6e49b8dea4e45f7294cca576a38cf4fc41e04bbcd95f9cf55be7776b9
- md5: 049f68f9c90f00069c748cd6fb7bfb55
- depends:
- - brotli
- - munkres
- - python >=3.10
- - unicodedata2 >=15.1.0
- track_features:
- - fonttools_no_compile
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/fonttools?source=compressed-mapping
- size: 837910
- timestamp: 1773137210630
-- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
- sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276
- md5: d3549fd50d450b6d9e7dddff25dd2110
- depends:
- - cached-property >=1.3.0
- - python >=3.9,<4
- license: MPL-2.0
- license_family: MOZILLA
- purls:
- - pkg:pypi/fqdn?source=hash-mapping
- size: 16705
- timestamp: 1733327494780
-- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
- sha256: 36857701b46828b6760c3c1652414ee504e7fc12740261ac6fcff3959b72bd7a
- md5: eeec961fec28e747e1e1dc0446277452
- depends:
- - libfreetype 2.14.2 ha770c72_0
- - libfreetype6 2.14.2 h73754d4_0
- license: GPL-2.0-only OR FTL
- purls: []
- size: 174292
- timestamp: 1772757205296
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
- sha256: 3c02ecdbfd94d25721811f51d0f400bf705005a728011e19db9975a8985e1021
- md5: ca730d8e7d1de1f71013edfef0e08f13
- depends:
- - libfreetype 2.14.2 hce30654_0
- - libfreetype6 2.14.2 hdfa99f5_0
- license: GPL-2.0-only OR FTL
- purls: []
- size: 173786
- timestamp: 1772756361577
-- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
- sha256: 6dd4bb3862ea3d07015331059504cf3b6af1a11a6909e7a9b6e04a20e253da28
- md5: c360b467564b875a9f5dc481b8726cee
- depends:
- - libfreetype 2.14.2 h57928b3_0
- - libfreetype6 2.14.2 hdbac1cb_0
- license: GPL-2.0-only OR FTL
- purls: []
- size: 185633
- timestamp: 1772756186241
-- pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
- name: fsspec
- version: 2026.2.0
- sha256: 98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437
- requires_dist:
- - adlfs ; extra == 'abfs'
- - adlfs ; extra == 'adl'
- - pyarrow>=1 ; extra == 'arrow'
- - dask ; extra == 'dask'
- - distributed ; extra == 'dask'
- - pre-commit ; extra == 'dev'
- - ruff>=0.5 ; extra == 'dev'
- - numpydoc ; extra == 'doc'
- - sphinx ; extra == 'doc'
- - sphinx-design ; extra == 'doc'
- - sphinx-rtd-theme ; extra == 'doc'
- - yarl ; extra == 'doc'
- - dropbox ; extra == 'dropbox'
- - dropboxdrivefs ; extra == 'dropbox'
- - requests ; extra == 'dropbox'
- - adlfs ; extra == 'full'
- - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full'
- - dask ; extra == 'full'
- - distributed ; extra == 'full'
- - dropbox ; extra == 'full'
- - dropboxdrivefs ; extra == 'full'
- - fusepy ; extra == 'full'
- - gcsfs>2024.2.0 ; extra == 'full'
- - libarchive-c ; extra == 'full'
- - ocifs ; extra == 'full'
- - panel ; extra == 'full'
- - paramiko ; extra == 'full'
- - pyarrow>=1 ; extra == 'full'
- - pygit2 ; extra == 'full'
- - requests ; extra == 'full'
- - s3fs>2024.2.0 ; extra == 'full'
- - smbprotocol ; extra == 'full'
- - tqdm ; extra == 'full'
- - fusepy ; extra == 'fuse'
- - gcsfs>2024.2.0 ; extra == 'gcs'
- - pygit2 ; extra == 'git'
- - requests ; extra == 'github'
- - gcsfs ; extra == 'gs'
- - panel ; extra == 'gui'
- - pyarrow>=1 ; extra == 'hdfs'
- - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http'
- - libarchive-c ; extra == 'libarchive'
- - ocifs ; extra == 'oci'
- - s3fs>2024.2.0 ; extra == 's3'
- - paramiko ; extra == 'sftp'
- - smbprotocol ; extra == 'smb'
- - paramiko ; extra == 'ssh'
- - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test'
- - numpy ; extra == 'test'
- - pytest ; extra == 'test'
- - pytest-asyncio!=0.22.0 ; extra == 'test'
- - pytest-benchmark ; extra == 'test'
- - pytest-cov ; extra == 'test'
- - pytest-mock ; extra == 'test'
- - pytest-recording ; extra == 'test'
- - pytest-rerunfailures ; extra == 'test'
- - requests ; extra == 'test'
- - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream'
- - dask[dataframe,test] ; extra == 'test-downstream'
- - moto[server]>4,<5 ; extra == 'test-downstream'
- - pytest-timeout ; extra == 'test-downstream'
- - xarray ; extra == 'test-downstream'
- - adlfs ; extra == 'test-full'
- - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full'
- - backports-zstd ; python_full_version < '3.14' and extra == 'test-full'
- - cloudpickle ; extra == 'test-full'
- - dask ; extra == 'test-full'
- - distributed ; extra == 'test-full'
- - dropbox ; extra == 'test-full'
- - dropboxdrivefs ; extra == 'test-full'
- - fastparquet ; extra == 'test-full'
- - fusepy ; extra == 'test-full'
- - gcsfs ; extra == 'test-full'
- - jinja2 ; extra == 'test-full'
- - kerchunk ; extra == 'test-full'
- - libarchive-c ; extra == 'test-full'
- - lz4 ; extra == 'test-full'
- - notebook ; extra == 'test-full'
- - numpy ; extra == 'test-full'
- - ocifs ; extra == 'test-full'
- - pandas<3.0.0 ; extra == 'test-full'
- - panel ; extra == 'test-full'
- - paramiko ; extra == 'test-full'
- - pyarrow ; extra == 'test-full'
- - pyarrow>=1 ; extra == 'test-full'
- - pyftpdlib ; extra == 'test-full'
- - pygit2 ; extra == 'test-full'
- - pytest ; extra == 'test-full'
- - pytest-asyncio!=0.22.0 ; extra == 'test-full'
- - pytest-benchmark ; extra == 'test-full'
- - pytest-cov ; extra == 'test-full'
- - pytest-mock ; extra == 'test-full'
- - pytest-recording ; extra == 'test-full'
- - pytest-rerunfailures ; extra == 'test-full'
- - python-snappy ; extra == 'test-full'
- - requests ; extra == 'test-full'
- - smbprotocol ; extra == 'test-full'
- - tqdm ; extra == 'test-full'
- - urllib3 ; extra == 'test-full'
- - zarr ; extra == 'test-full'
- - zstandard ; python_full_version < '3.14' and extra == 'test-full'
- - tqdm ; extra == 'tqdm'
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
- sha256: 3b31a273b806c6851e16e9cf63ef87cae28d19be0df148433f3948e7da795592
- md5: 30bb690150536f622873758b0e8d6712
- depends:
- - binutils_impl_linux-64 >=2.45
- - libgcc >=14.3.0
- - libgcc-devel_linux-64 14.3.0 hf649bbc_118
- - libgomp >=14.3.0
- - libsanitizer 14.3.0 h8f1669f_18
- - libstdcxx >=14.3.0
- - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118
- - sysroot_linux-64
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 76302378
- timestamp: 1771378056505
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
- sha256: 27ad0cd10dccffca74e20fb38c9f8643ff8fce56eee260bf89fa257d5ab0c90a
- md5: 1403ed5fe091bd7442e4e8a229d14030
- depends:
- - gcc_impl_linux-64 14.3.0.*
- - binutils_linux-64
- - sysroot_linux-64
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 28946
- timestamp: 1770908213807
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c
- md5: c94a5994ef49749880a8139cf9afcbe1
- depends:
- - libgcc-ng >=12
- - libstdcxx-ng >=12
- license: GPL-2.0-or-later OR LGPL-3.0-or-later
- purls: []
- size: 460055
- timestamp: 1718980856608
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
- sha256: c1e0ec25221c132fcee81098a23f956f3c26302739086d99e9119ab5546b05fe
- md5: 334367662a82dfe67945438e373a1d3b
- depends:
- - __glibc >=2.17,<3.0.a0
- - gmp >=6.3.0,<7.0a0
- - libgcc >=14
- - libidn2 >=2,<3.0a0
- - libstdcxx >=14
- - libtasn1 >=4.21.0,<5.0a0
- - nettle >=3.10.1,<3.11.0a0
- - p11-kit >=0.26.0,<0.27.0a0
- license: LGPL-2.1-or-later
- license_family: LGPL
- purls: []
- size: 2030992
- timestamp: 1768686277371
-- pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- name: greenlet
- version: 3.3.2
- sha256: 63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506
- requires_dist:
- - sphinx ; extra == 'docs'
- - furo ; extra == 'docs'
- - objgraph ; extra == 'test'
- - psutil ; extra == 'test'
- - setuptools ; extra == 'test'
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
- name: greenlet
- version: 3.3.2
- sha256: 8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492
- requires_dist:
- - sphinx ; extra == 'docs'
- - furo ; extra == 'docs'
- - objgraph ; extra == 'test'
- - psutil ; extra == 'test'
- - setuptools ; extra == 'test'
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
- sha256: 38ffca57cc9c264d461ac2ce9464a9d605e0f606d92d831de9075cb0d95fc68a
- md5: 6514b3a10e84b6a849e1b15d3753eb22
- depends:
- - gcc_impl_linux-64 14.3.0 hbdf3cc3_18
- - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118
- - sysroot_linux-64
- - tzdata
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 14566100
- timestamp: 1771378271421
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
- sha256: 1e07c197e0779fa9105e59cd55a835ded96bfde59eb169439736a89b27b48e5d
- md5: 7b51f4ff82eeb1f386bfee20a7bed3ed
- depends:
- - gxx_impl_linux-64 14.3.0.*
- - gcc_linux-64 ==14.3.0 h298d278_21
- - binutils_linux-64
- - sysroot_linux-64
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 27503
- timestamp: 1770908213813
-- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
- sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb
- md5: b8993c19b0c32a2f7b66cbb58ca27069
- depends:
- - python >=3.10
- - typing_extensions
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/h11?source=compressed-mapping
- size: 39069
- timestamp: 1767729720872
-- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3
- md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9
- depends:
- - python >=3.10
- - hyperframe >=6.1,<7
- - hpack >=4.1,<5
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/h2?source=hash-mapping
- size: 95967
- timestamp: 1756364871835
-- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba
- md5: 0a802cb9888dd14eeefc611f05c40b6e
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/hpack?source=hash-mapping
- size: 30731
- timestamp: 1737618390337
-- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
- sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b
- md5: 4f14640d58e2cc0aa0819d9d8ba125bb
- depends:
- - python >=3.9
- - h11 >=0.16
- - h2 >=3,<5
- - sniffio 1.*
- - anyio >=4.0,<5.0
- - certifi
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/httpcore?source=hash-mapping
- size: 49483
- timestamp: 1745602916758
-- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
- sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950
- md5: d6989ead454181f4f9bc987d3dc4e285
- depends:
- - anyio
- - certifi
- - httpcore 1.*
- - idna
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/httpx?source=hash-mapping
- size: 63082
- timestamp: 1733663449209
-- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8
- md5: 8e6923fc12f1fe8f8c4e5c9f343256ac
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/hyperframe?source=hash-mapping
- size: 17397
- timestamp: 1737618427549
-- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a
- md5: c80d8a3b84358cb967fa81e7075fbc8a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- license: MIT
- purls: []
- size: 12723451
- timestamp: 1773822285671
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5
- md5: f1182c91c0de31a7abd40cedf6a5ebef
- depends:
- - __osx >=11.0
- license: MIT
- purls: []
- size: 12361647
- timestamp: 1773822915649
-- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
- sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0
- md5: 53abe63df7e10a6ba605dc5f9f961d36
- depends:
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/idna?source=hash-mapping
- size: 50721
- timestamp: 1760286526795
-- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
- sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745
- md5: 63ccfdc3a3ce25b027b8767eb722fca8
- depends:
- - python >=3.9
- - zipp >=3.20
- - python
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/importlib-metadata?source=hash-mapping
- size: 34641
- timestamp: 1747934053147
-- pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
- name: iniconfig
- version: 2.3.0
- sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19
- md5: 9614359868482abba1bd15ce465e3c42
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/iniconfig?source=compressed-mapping
- size: 13387
- timestamp: 1760831448842
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
- sha256: 5c1f3e874adaf603449f2b135d48f168c5d510088c78c229bda0431268b43b27
- md5: 4b53d436f3fbc02ce3eeaf8ae9bebe01
- depends:
- - appnope
- - __osx
- - comm >=0.1.1
- - debugpy >=1.6.5
- - ipython >=7.23.1
- - jupyter_client >=8.8.0
- - jupyter_core >=5.1,!=6.0.*
- - matplotlib-inline >=0.1
- - nest-asyncio >=1.4
- - packaging >=22
- - psutil >=5.7
- - python >=3.10
- - pyzmq >=25
- - tornado >=6.4.1
- - traitlets >=5.4.0
- - python
- constrains:
- - appnope >=0.1.2
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipykernel?source=hash-mapping
- size: 132260
- timestamp: 1770566135697
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
- sha256: 9cdadaeef5abadca4113f92f5589db19f8b7df5e1b81cb0225f7024a3aedefa3
- md5: b3a7d5842f857414d9ae831a799444dd
- depends:
- - __win
- - comm >=0.1.1
- - debugpy >=1.6.5
- - ipython >=7.23.1
- - jupyter_client >=8.8.0
- - jupyter_core >=5.1,!=6.0.*
- - matplotlib-inline >=0.1
- - nest-asyncio >=1.4
- - packaging >=22
- - psutil >=5.7
- - python >=3.10
- - pyzmq >=25
- - tornado >=6.4.1
- - traitlets >=5.4.0
- - python
- constrains:
- - appnope >=0.1.2
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipykernel?source=compressed-mapping
- size: 132382
- timestamp: 1770566174387
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
- sha256: b77ed58eb235e5ad80e742b03caeed4bbc2a2ef064cb9a2deee3b75dfae91b2a
- md5: 8b267f517b81c13594ed68d646fd5dcb
- depends:
- - __linux
- - comm >=0.1.1
- - debugpy >=1.6.5
- - ipython >=7.23.1
- - jupyter_client >=8.8.0
- - jupyter_core >=5.1,!=6.0.*
- - matplotlib-inline >=0.1
- - nest-asyncio >=1.4
- - packaging >=22
- - psutil >=5.7
- - python >=3.10
- - pyzmq >=25
- - tornado >=6.4.1
- - traitlets >=5.4.0
- - python
- constrains:
- - appnope >=0.1.2
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipykernel?source=compressed-mapping
- size: 133644
- timestamp: 1770566133040
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
- sha256: 558073f3ceba49ab67d9e698ff2b49ddf1d1d3259de46b50795be1b6d8ec9de4
- md5: a522444721669fe6bb482f8814b969f4
- depends:
- - __win
- - decorator >=5.1.0
- - ipython_pygments_lexers >=1.0.0
- - jedi >=0.18.2
- - matplotlib-inline >=0.1.6
- - prompt-toolkit >=3.0.41,<3.1.0
- - pygments >=2.14.0
- - python >=3.12
- - stack_data >=0.6.0
- - traitlets >=5.13.0
- - colorama >=0.4.4
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipython?source=compressed-mapping
- size: 647253
- timestamp: 1772790189384
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
- sha256: 1f90e346baab7926bc52d7b60c0625087e96b4fab1bdb9a7fe83ac842312c930
- md5: 326c46b8ec2a1b4964927c7ea55ebf49
- depends:
- - __unix
- - decorator >=5.1.0
- - ipython_pygments_lexers >=1.0.0
- - jedi >=0.18.2
- - matplotlib-inline >=0.1.6
- - prompt-toolkit >=3.0.41,<3.1.0
- - pygments >=2.14.0
- - python >=3.12
- - stack_data >=0.6.0
- - traitlets >=5.13.0
- - pexpect >4.6
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipython?source=compressed-mapping
- size: 648197
- timestamp: 1772790149194
-- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104
- md5: bd80ba060603cc228d9d81c257093119
- depends:
- - pygments
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/ipython-pygments-lexers?source=hash-mapping
- size: 13993
- timestamp: 1737123723464
-- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
- sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed
- md5: 0b0154421989637d424ccf0f104be51a
- depends:
- - arrow >=0.15.0
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/isoduration?source=hash-mapping
- size: 19832
- timestamp: 1733493720346
-- pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
- name: jax
- version: 0.9.1
- sha256: d11cb53d362912253013e8c4d6926cb9f3a4b59ab5b25a7dc08123567067d088
- requires_dist:
- - jaxlib<=0.9.1,>=0.9.1
- - ml-dtypes>=0.5.0
- - numpy>=2.0
- - opt-einsum
- - scipy>=1.13
- - jaxlib==0.9.1 ; extra == 'minimum-jaxlib'
- - jaxlib==0.9.0 ; extra == 'ci'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'tpu'
- - libtpu==0.0.35.* ; extra == 'tpu'
- - requests ; extra == 'tpu'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda'
- - jax-cuda12-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda12'
- - jax-cuda12-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda12'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda13'
- - jax-cuda13-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda13'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda12-local'
- - jax-cuda12-plugin<=0.9.1,>=0.9.1 ; extra == 'cuda12-local'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda13-local'
- - jax-cuda13-plugin<=0.9.1,>=0.9.1 ; extra == 'cuda13-local'
- - jaxlib<=0.9.1,>=0.9.1 ; extra == 'rocm'
- - jax-rocm7-plugin<=0.9.1,>=0.9.1 ; extra == 'rocm'
- - kubernetes ; extra == 'k8s'
- - xprof ; extra == 'xprof'
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
- name: jax-cuda12-pjrt
- version: 0.9.1
- sha256: 6447fe3d661b1d824ae7329914c4ac05fe54aeab68c7a7ca23c4f5306dec2e1f
-- pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- name: jax-cuda12-plugin
- version: 0.9.1
- sha256: 55888255c325f98af961cf5f665ca8223d0e36363eb544fc0286277be2324e8f
- requires_dist:
- - jax-cuda12-pjrt==0.9.1
- - nvidia-cublas-cu12>=12.1.3.1 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cuda-cupti-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cuda-nvcc-cu12>=12.6.85 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cuda-runtime-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cudnn-cu12>=9.8,<10.0 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cufft-cu12>=11.0.2.54 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cusolver-cu12>=11.4.5.107 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cusparse-cu12>=12.1.0.106 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-nccl-cu12>=2.18.1 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-nvjitlink-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-cuda-nvrtc-cu12>=12.1.55 ; sys_platform == 'linux' and extra == 'with-cuda'
- - nvidia-nvshmem-cu12>=3.2.5 ; sys_platform == 'linux' and extra == 'with-cuda'
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
- name: jaxlib
- version: 0.9.1
- sha256: 61160d686e6a4703ef30a6a3aa199c934e6359f42d0aa1c0f9c475d3953b9459
- requires_dist:
- - scipy>=1.13
- - numpy>=2.0
- - ml-dtypes>=0.5.0
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
- name: jaxlib
- version: 0.9.1
- sha256: 2287a1c891b152c52eb9b73925f57cde01be35d2bab4dad9673d3c83c5982ca8
- requires_dist:
- - scipy>=1.13
- - numpy>=2.0
- - ml-dtypes>=0.5.0
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
- name: jaxlib
- version: 0.9.1
- sha256: 3071bf493f6f48207c56b1e9a5bf895e2acebc5bd40f6f35458e76eb8bf210c7
- requires_dist:
- - scipy>=1.13
- - numpy>=2.0
- - ml-dtypes>=0.5.0
- requires_python: '>=3.11'
-- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8
- md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9
- depends:
- - parso >=0.8.3,<0.9.0
- - python >=3.9
- license: Apache-2.0 AND MIT
- purls:
- - pkg:pypi/jedi?source=hash-mapping
- size: 843646
- timestamp: 1733300981994
-- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b
- md5: 04558c96691bed63104678757beb4f8d
- depends:
- - markupsafe >=2.0
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jinja2?source=compressed-mapping
- size: 120685
- timestamp: 1764517220861
-- pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl
- name: joblib
- version: 1.5.3
- sha256: 5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
- sha256: ba03ca5a6db38d9f48bd30172e8c512dea7a686a5c7701c6fcdb7b3023dae2ad
- md5: 8d5f66ebf832c4ce28d5c37a0e76605c
- depends:
- - python >=3.10
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/json5?source=hash-mapping
- size: 34017
- timestamp: 1767325114901
-- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
- sha256: 1a1328476d14dfa8b84dbacb7f7cd7051c175498406dc513ca6c679dc44f3981
- md5: cd2214824e36b0180141d422aba01938
- depends:
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jsonpointer?source=hash-mapping
- size: 13967
- timestamp: 1765026384757
-- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
- sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7
- md5: ada41c863af263cc4c5fcbaff7c3e4dc
- depends:
- - attrs >=22.2.0
- - jsonschema-specifications >=2023.3.6
- - python >=3.10
- - referencing >=0.28.4
- - rpds-py >=0.25.0
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/jsonschema?source=compressed-mapping
- size: 82356
- timestamp: 1767839954256
-- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
- sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04
- md5: 439cd0f567d697b20a8f45cb70a1005a
- depends:
- - python >=3.10
- - referencing >=0.31.0
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/jsonschema-specifications?source=hash-mapping
- size: 19236
- timestamp: 1757335715225
-- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
- sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1
- md5: 8368d58342d0825f0843dc6acdd0c483
- depends:
- - jsonschema >=4.26.0,<4.26.1.0a0
- - fqdn
- - idna
- - isoduration
- - jsonpointer >1.13
- - rfc3339-validator
- - rfc3986-validator >0.1.0
- - rfc3987-syntax >=1.1.0
- - uri-template
- - webcolors >=24.6.0
- license: MIT
- license_family: MIT
- purls: []
- size: 4740
- timestamp: 1767839954258
-- pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
- name: jupyter-book
- version: 2.1.2
- sha256: 1e92850680782ca777452780f9dee0550b52af338e6fe8c115961142ebf30a0e
- requires_dist:
- - ipykernel
- - jupyter-core
- - jupyter-server
- - platformdirs>=4.2.2
- - nodeenv>=1.9.1
- - markdown ; extra == 'docs'
- - pandas ; extra == 'docs'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
- sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2
- md5: 62b7c96c6cd77f8173cc5cada6a9acaa
- depends:
- - importlib-metadata >=4.8.3
- - jupyter_server >=1.1.2
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-lsp?source=hash-mapping
- size: 60377
- timestamp: 1756388269267
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
- sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3
- md5: 8a3d6d0523f66cf004e563a50d9392b3
- depends:
- - jupyter_core >=5.1
- - python >=3.10
- - python-dateutil >=2.8.2
- - pyzmq >=25.0
- - tornado >=6.4.1
- - traitlets >=5.3
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-client?source=compressed-mapping
- size: 112785
- timestamp: 1767954655912
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
- sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc
- md5: a8db462b01221e9f5135be466faeb3e0
- depends:
- - __win
- - pywin32
- - platformdirs >=2.5
- - python >=3.10
- - traitlets >=5.3
- - python
- constrains:
- - pywin32 >=300
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-core?source=hash-mapping
- size: 64679
- timestamp: 1760643889625
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
- sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a
- md5: b38fe4e78ee75def7e599843ef4c1ab0
- depends:
- - __unix
- - python
- - platformdirs >=2.5
- - python >=3.10
- - traitlets >=5.3
- - python
- constrains:
- - pywin32 >=300
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-core?source=hash-mapping
- size: 65503
- timestamp: 1760643864586
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
- sha256: e9964aaaf6d24a685cd5ce9d75731b643ed7f010fb979574a6580cd2f974c6cd
- md5: 31e11c30bbee1682a55627f953c6725a
- depends:
- - jsonschema-with-format-nongpl >=4.18.0
- - packaging
- - python >=3.9
- - python-json-logger >=2.0.4
- - pyyaml >=5.3
- - referencing
- - rfc3339-validator
- - rfc3986-validator >=0.1.1
- - traitlets >=5.3
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-events?source=hash-mapping
- size: 24306
- timestamp: 1770937604863
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
- sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a
- md5: d79a87dcfa726bcea8e61275feed6f83
- depends:
- - anyio >=3.1.0
- - argon2-cffi >=21.1
- - jinja2 >=3.0.3
- - jupyter_client >=7.4.4
- - jupyter_core >=4.12,!=5.0.*
- - jupyter_events >=0.11.0
- - jupyter_server_terminals >=0.4.4
- - nbconvert-core >=6.4.4
- - nbformat >=5.3.0
- - overrides >=5.0
- - packaging >=22.0
- - prometheus_client >=0.9
- - python >=3.10
- - pyzmq >=24
- - send2trash >=1.8.2
- - terminado >=0.8.3
- - tornado >=6.2.0
- - traitlets >=5.6.0
- - websocket-client >=1.7
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-server?source=hash-mapping
- size: 347094
- timestamp: 1755870522134
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
- sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654
- md5: 7b8bace4943e0dc345fc45938826f2b8
- depends:
- - python >=3.10
- - terminado >=0.8.3
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyter-server-terminals?source=hash-mapping
- size: 22052
- timestamp: 1768574057200
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
- sha256: 436a70259a9b4e13ce8b15faa8b37342835954d77a0a74d21dd24547e0871088
- md5: bcbb401d6fa84e0cee34d4926b0e9e93
- depends:
- - async-lru >=1.0.0
- - httpx >=0.25.0,<1
- - ipykernel >=6.5.0,!=6.30.0
- - jinja2 >=3.0.3
- - jupyter-lsp >=2.0.0
- - jupyter_core
- - jupyter_server >=2.4.0,<3
- - jupyterlab_server >=2.28.0,<3
- - notebook-shim >=0.2
- - packaging
- - python >=3.10
- - setuptools >=41.1.0
- - tomli >=1.2.2
- - tornado >=6.2.0
- - traitlets
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyterlab?source=compressed-mapping
- size: 8245973
- timestamp: 1773240966438
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
- sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0
- md5: fd312693df06da3578383232528c468d
- depends:
- - pygments >=2.4.1,<3
- - python >=3.9
- constrains:
- - jupyterlab >=4.0.8,<5.0.0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyterlab-pygments?source=hash-mapping
- size: 18711
- timestamp: 1733328194037
-- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
- sha256: 381d2d6a259a3be5f38a69463e0f6c5dcf1844ae113058007b51c3bef13a7cee
- md5: a63877cb23de826b1620d3adfccc4014
- depends:
- - babel >=2.10
- - jinja2 >=3.0.3
- - json5 >=0.9.0
- - jsonschema >=4.18
- - jupyter_server >=1.21,<3
- - packaging >=21.3
- - python >=3.10
- - requests >=2.31
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/jupyterlab-server?source=hash-mapping
- size: 51621
- timestamp: 1761145478692
-- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
- name: kaleido
- version: 1.2.0
- sha256: c27ed82b51df6b923d0e656feac221343a0dbcd2fb9bc7e6b1db97f61e9a1513
- requires_dist:
- - choreographer>=1.1.1
- - logistro>=1.0.8
- - orjson>=3.10.15
- - packaging
- - pytest-timeout>=2.4.0
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
- sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a
- md5: 86d9cba083cd041bfbf242a01a7a1999
- constrains:
- - sysroot_linux-64 ==2.28
- license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later
- license_family: GPL
- purls: []
- size: 1278712
- timestamp: 1765578681495
-- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
- sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4
- md5: b38117a3c920364aff79f870c984b4a3
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- license: LGPL-2.1-or-later
- purls: []
- size: 134088
- timestamp: 1754905959823
-- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
- sha256: e3488ea4a336f29e57de8f282bf40c0505cfc482e03004615e694b48e7d9c79f
- md5: 7397e418cab519b8d789936cf2dde6f6
- depends:
- - python
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/kiwisolver?source=compressed-mapping
- size: 77363
- timestamp: 1773067048780
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
- sha256: 840de1b0ba2fa646475bc53ba0f723c8a13e66139633a070831b8279deaa7c64
- md5: eb1465d8a644ef290d18fb86af6e9bc4
- depends:
- - python
- - python 3.14.* *_cp314
- - libcxx >=19
- - __osx >=11.0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/kiwisolver?source=compressed-mapping
- size: 69284
- timestamp: 1773067285911
-- conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
- sha256: 37cbc49fd7255532d09fb3bc9cc699554693e632fa90678a9b3d0ed12557d0d7
- md5: 0508c8dabeab91311e5c59b5e3f6d278
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/kiwisolver?source=compressed-mapping
- size: 73330
- timestamp: 1773067062280
-- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
- sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25
- md5: fb53fb07ce46a575c5d004bbc96032c2
- depends:
- - __glibc >=2.17,<3.0.a0
- - keyutils >=1.6.3,<2.0a0
- - libedit >=3.1.20250104,<3.2.0a0
- - libedit >=3.1.20250104,<4.0a0
- - libgcc >=14
- - libstdcxx >=14
- - openssl >=3.5.5,<4.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 1386730
- timestamp: 1769769569681
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
- sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed
- md5: e446e1822f4da8e5080a9de93474184d
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libedit >=3.1.20250104,<3.2.0a0
- - libedit >=3.1.20250104,<4.0a0
- - openssl >=3.5.5,<4.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 1160828
- timestamp: 1769770119811
-- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
- sha256: eb60f1ad8b597bcf95dee11bc11fe71a8325bc1204cf51d2bb1f2120ffd77761
- md5: 4432f52dc0c8eb6a7a6abc00a037d93c
- depends:
- - openssl >=3.5.5,<4.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 751055
- timestamp: 1769769688841
-- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
- sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699
- md5: 9b965c999135d43a3d0f7bd7d024e26a
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/lark?source=compressed-mapping
- size: 94312
- timestamp: 1761596921009
-- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
- sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a
- md5: 6f2e2c8f58160147c4d1c6f4c14cbac4
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libjpeg-turbo >=3.1.2,<4.0a0
- - libtiff >=4.7.1,<4.8.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 249959
- timestamp: 1768184673131
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
- sha256: d768da024ab74a4b30642401877fa914a68bdc238667f16b1ec2e0e98b2451a6
- md5: 6631a7bd2335bb9699b1dbc234b19784
- depends:
- - __osx >=11.0
- - libjpeg-turbo >=3.1.2,<4.0a0
- - libtiff >=4.7.1,<4.8.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 211756
- timestamp: 1768184994800
-- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
- sha256: 7eeb18c5c86db146b62da66d9e8b0e753a52987f9134a494309588bbeceddf28
- md5: b6c68d6b829b044cd17a41e0a8a23ca1
- depends:
- - libjpeg-turbo >=3.1.2,<4.0a0
- - libtiff >=4.7.1,<4.8.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 522238
- timestamp: 1768184858107
-- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
- sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3
- md5: 12bd9a3f089ee6c9266a37dab82afabd
- depends:
- - __glibc >=2.17,<3.0.a0
- - zstd >=1.5.7,<1.6.0a0
- constrains:
- - binutils_impl_linux-64 2.45.1
- license: GPL-3.0-only
- license_family: GPL
- purls: []
- size: 725507
- timestamp: 1770267139900
-- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
- sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1
- md5: a752488c68f2e7c456bcbd8f16eec275
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 261513
- timestamp: 1773113328888
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
- sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51
- md5: 095e5749868adab9cae42d4b460e5443
- depends:
- - __osx >=11.0
- - libcxx >=19
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 164222
- timestamp: 1773114244984
-- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
- sha256: 45df58fca800b552b17c3914cc9ab0d55a82c5172d72b5c44a59c710c06c5473
- md5: 54b231d595bc1ff9bff668dd443ee012
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 172395
- timestamp: 1773113455582
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
- sha256: 69ea8da58658ad26cb64fb0bfccd8a3250339811f0b57c6b8a742e5e51bacf70
- md5: 981d372c31a23e1aa9965d4e74d085d5
- depends:
- - __glibc >=2.17,<3.0.a0
- - bzip2 >=1.0.8,<2.0a0
- - libgcc >=14
- - liblzma >=5.8.2,<6.0a0
- - libxml2
- - libxml2-16 >=2.14.6
- - libzlib >=1.3.1,<2.0a0
- - lz4-c >=1.10.0,<1.11.0a0
- - lzo >=2.10,<3.0a0
- - openssl >=3.5.5,<4.0a0
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 887139
- timestamp: 1773243188979
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- build_number: 5
- sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c
- md5: c160954f7418d7b6e87eaf05a8913fa9
- depends:
- - libopenblas >=0.3.30,<0.3.31.0a0
- - libopenblas >=0.3.30,<1.0a0
- constrains:
- - mkl <2026
- - liblapack 3.11.0 5*_openblas
- - libcblas 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapacke 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18213
- timestamp: 1765818813880
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- build_number: 5
- sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d
- md5: bcc025e2bbaf8a92982d20863fe1fb69
- depends:
- - libopenblas >=0.3.30,<0.3.31.0a0
- - libopenblas >=0.3.30,<1.0a0
- constrains:
- - libcblas 3.11.0 5*_openblas
- - liblapack 3.11.0 5*_openblas
- - liblapacke 3.11.0 5*_openblas
- - blas 2.305 openblas
- - mkl <2026
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18546
- timestamp: 1765819094137
-- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- build_number: 5
- sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b
- md5: f9decf88743af85c9c9e05556a4c47c0
- depends:
- - mkl >=2025.3.0,<2026.0a0
- constrains:
- - liblapack 3.11.0 5*_mkl
- - libcblas 3.11.0 5*_mkl
- - blas 2.305 mkl
- - liblapacke 3.11.0 5*_mkl
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 67438
- timestamp: 1765819100043
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e
- md5: 72c8fd1af66bd67bf580645b426513ed
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 79965
- timestamp: 1764017188531
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229
- md5: 006e7ddd8a110771134fcc4e1e3a6ffa
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 79443
- timestamp: 1764017945924
-- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
- sha256: 5097303c2fc8ebf9f9ea9731520aa5ce4847d0be41764edd7f6dee2100b82986
- md5: 444b0a45bbd1cb24f82eedb56721b9c4
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 82042
- timestamp: 1764017799966
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b
- md5: 366b40a69f0ad6072561c1d09301c886
- depends:
- - __glibc >=2.17,<3.0.a0
- - libbrotlicommon 1.2.0 hb03c661_1
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 34632
- timestamp: 1764017199083
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- sha256: 2eae444039826db0454b19b52a3390f63bfe24f6b3e63089778dd5a5bf48b6bf
- md5: 079e88933963f3f149054eec2c487bc2
- depends:
- - __osx >=11.0
- - libbrotlicommon 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- purls: []
- size: 29452
- timestamp: 1764017979099
-- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
- sha256: 3239ce545cf1c32af6fffb7fc7c75cb1ef5b6ea8221c66c85416bb2d46f5cccb
- md5: 450e3ae947fc46b60f1d8f8f318b40d4
- depends:
- - libbrotlicommon 1.2.0 hfd05255_1
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 34449
- timestamp: 1764017851337
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d
- md5: 4ffbb341c8b616aa2494b6afb26a0c5f
- depends:
- - __glibc >=2.17,<3.0.a0
- - libbrotlicommon 1.2.0 hb03c661_1
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 298378
- timestamp: 1764017210931
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- sha256: 01436c32bb41f9cb4bcf07dda647ce4e5deb8307abfc3abdc8da5317db8189d1
- md5: b2b7c8288ca1a2d71ff97a8e6a1e8883
- depends:
- - __osx >=11.0
- - libbrotlicommon 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- purls: []
- size: 290754
- timestamp: 1764018009077
-- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
- sha256: 3226df6b7df98734440739f75527d585d42ca2bfe912fbe8d1954c512f75341a
- md5: ccd93cfa8e54fd9df4e83dbe55ff6e8c
- depends:
- - libbrotlicommon 1.2.0 hfd05255_1
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 252903
- timestamp: 1764017901735
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- build_number: 5
- sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8
- md5: 6636a2b6f1a87572df2970d3ebc87cc0
- depends:
- - libblas 3.11.0 5_h4a7cf45_openblas
- constrains:
- - liblapacke 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapack 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18194
- timestamp: 1765818837135
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- build_number: 5
- sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0
- md5: efd8bd15ca56e9d01748a3beab8404eb
- depends:
- - libblas 3.11.0 5_h51639a9_openblas
- constrains:
- - liblapacke 3.11.0 5*_openblas
- - liblapack 3.11.0 5*_openblas
- - blas 2.305 openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18548
- timestamp: 1765819108956
-- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- build_number: 5
- sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d
- md5: b3fa8e8b55310ba8ef0060103afb02b5
- depends:
- - libblas 3.11.0 5_hf2e6a31_mkl
- constrains:
- - liblapack 3.11.0 5*_mkl
- - liblapacke 3.11.0 5*_mkl
- - blas 2.305 mkl
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 68079
- timestamp: 1765819124349
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
- sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4
- md5: d50608c443a30c341c24277d28290f76
- depends:
- - __glibc >=2.17,<3.0.a0
- - krb5 >=1.22.2,<1.23.0a0
- - libgcc >=14
- - libnghttp2 >=1.67.0,<2.0a0
- - libssh2 >=1.11.1,<2.0a0
- - libzlib >=1.3.1,<2.0a0
- - openssl >=3.5.5,<4.0a0
- - zstd >=1.5.7,<1.6.0a0
- license: curl
- license_family: MIT
- purls: []
- size: 466704
- timestamp: 1773218522665
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
- sha256: 3c8142cdd3109c250a926c492ec45bc954697b288e5d1154ada95272ffa21be8
- md5: 7a290d944bc0c481a55baf33fa289deb
- depends:
- - __osx >=11.0
- license: Apache-2.0 WITH LLVM-exception
- license_family: Apache
- purls: []
- size: 570281
- timestamp: 1773203613980
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
- sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680
- md5: 6c77a605a7a689d17d4819c0f8ac9a00
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 73490
- timestamp: 1761979956660
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
- sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c
- md5: a6130c709305cd9828b4e1bd9ba0000c
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 55420
- timestamp: 1761980066242
-- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
- sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee
- md5: e77030e67343e28b084fabd7db0ce43e
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 156818
- timestamp: 1761979842440
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
- sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724
- md5: c277e0a4d549b03ac1e9d6cbbe3d017b
- depends:
- - ncurses
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- - ncurses >=6.5,<7.0a0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 134676
- timestamp: 1738479519902
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
- sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631
- md5: 44083d2d2c2025afca315c7a172eab2b
- depends:
- - ncurses
- - __osx >=11.0
- - ncurses >=6.5,<7.0a0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 107691
- timestamp: 1738479560845
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4
- md5: 172bf1cd1ff8629f2b1179945ed45055
- depends:
- - libgcc-ng >=12
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 112766
- timestamp: 1702146165126
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
- sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5
- md5: e7f7ce06ec24cfcfb9e36d28cf82ba57
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - expat 2.7.4.*
- license: MIT
- license_family: MIT
- purls: []
- size: 76798
- timestamp: 1771259418166
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
- sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf
- md5: a92e310ae8dfc206ff449f362fc4217f
- depends:
- - __osx >=11.0
- constrains:
- - expat 2.7.4.*
- license: MIT
- license_family: MIT
- purls: []
- size: 68199
- timestamp: 1771260020767
-- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
- sha256: b31f6fb629c4e17885aaf2082fb30384156d16b48b264e454de4a06a313b533d
- md5: 1c1ced969021592407f16ada4573586d
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - expat 2.7.4.*
- license: MIT
- license_family: MIT
- purls: []
- size: 70323
- timestamp: 1771259521393
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6
- md5: a360c33a5abe61c07959e449fa1453eb
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 58592
- timestamp: 1769456073053
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7
- md5: 43c04d9cb46ef176bb2a4c77e324d599
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 40979
- timestamp: 1769456747661
-- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190
- md5: 720b39f5ec0610457b725eb3f396219a
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 45831
- timestamp: 1769456418774
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
- sha256: 2e1bfe1e856eb707d258f669ef6851af583ceaffab5e64821b503b0f7cd09e9e
- md5: 26c746d14402a3b6c684d045b23b9437
- depends:
- - libfreetype6 >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 8035
- timestamp: 1772757210108
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
- sha256: 6061ef5321b8e697d5577d8dfe7a4c75bfe3e706c956d0d84bfec6bea3ed9f77
- md5: a3a53232936b55ffea76806aefe19e8b
- depends:
- - libfreetype6 >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 8076
- timestamp: 1772756349852
-- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
- sha256: 427c3072b311e65bd3eae3fcb78f6847b15b2dbb173a8546424de56550b2abfb
- md5: 153d52fd0e4ba2a5bd5bb4f4afa41417
- depends:
- - libfreetype6 >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 8404
- timestamp: 1772756167212
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
- sha256: aba65b94bdbed52de17ec3d0c6f2ebac2ef77071ad22d6900d1614d0dd702a0c
- md5: 8eaba3d1a4d7525c6814e861614457fd
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libpng >=1.6.55,<1.7.0a0
- - libzlib >=1.3.1,<2.0a0
- constrains:
- - freetype >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 386316
- timestamp: 1772757193822
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
- sha256: 24dd0e0bee56e87935f885929f67659f1d3b8a01e7546568de2919cffd9e2e36
- md5: e726e134a392ae5d7bafa6cc4a3d5725
- depends:
- - __osx >=11.0
- - libpng >=1.6.55,<1.7.0a0
- - libzlib >=1.3.1,<2.0a0
- constrains:
- - freetype >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 338032
- timestamp: 1772756347899
-- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
- sha256: 1e80e01e5662bd3a0c0e094fbeaec449dbb2288949ca55ca80345e7812904e67
- md5: c21a474a38982cdb56b3454cf4f78389
- depends:
- - libpng >=1.6.55,<1.7.0a0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - freetype >=2.14.2
- license: GPL-2.0-only OR FTL
- purls: []
- size: 340155
- timestamp: 1772756166648
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
- sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5
- md5: 0aa00f03f9e39fb9876085dee11a85d4
- depends:
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex >=4.5
- constrains:
- - libgcc-ng ==15.2.0=*_18
- - libgomp 15.2.0 he0feb66_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 1041788
- timestamp: 1771378212382
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
- sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e
- md5: 92df6107310b1fff92c4cc84f0de247b
- depends:
- - _openmp_mutex
- constrains:
- - libgcc-ng ==15.2.0=*_18
- - libgomp 15.2.0 18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 401974
- timestamp: 1771378877463
-- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
- sha256: da2c96563c76b8c601746f03e03ac75d2b4640fa2ee017cb23d6c9fc31f1b2c6
- md5: b085746891cca3bd2704a450a7b4b5ce
- depends:
- - _openmp_mutex >=4.5
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- constrains:
- - libgcc-ng ==15.2.0=*_18
- - msys2-conda-epoch <0.0a0
- - libgomp 15.2.0 h8ee18e1_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 820022
- timestamp: 1771382190160
-- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
- sha256: 1abc6a81ee66e8ac9ac09a26e2d6ad7bba23f0a0cc3a6118654f036f9c0e1854
- md5: 06901733131833f5edd68cf3d9679798
- depends:
- - __unix
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 3084533
- timestamp: 1771377786730
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
- sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893
- md5: d5e96b1ed75ca01906b3d2469b4ce493
- depends:
- - libgcc 15.2.0 he0feb66_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 27526
- timestamp: 1771378224552
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
- sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee
- md5: 9063115da5bc35fdc3e1002e69b9ef6e
- depends:
- - libgfortran5 15.2.0 h68bc16d_18
- constrains:
- - libgfortran-ng ==15.2.0=*_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 27523
- timestamp: 1771378269450
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
- sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836
- md5: 26981599908ed2205366e8fc91b37fc6
- depends:
- - libgfortran5 15.2.0 hdae7583_18
- constrains:
- - libgfortran-ng ==15.2.0=*_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 138973
- timestamp: 1771379054939
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
- sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12
- md5: 646855f357199a12f02a87382d429b75
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 2482475
- timestamp: 1771378241063
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
- sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e
- md5: c4a6f7989cffb0544bfd9207b6789971
- depends:
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 598634
- timestamp: 1771378886363
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
- sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110
- md5: 239c5e9546c38a1e884d69effcf4c882
- depends:
- - __glibc >=2.17,<3.0.a0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 603262
- timestamp: 1771378117851
-- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
- sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da
- md5: 939fb173e2a4d4e980ef689e99b35223
- depends:
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- constrains:
- - msys2-conda-epoch <0.0a0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 663864
- timestamp: 1771382118742
-- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3
- md5: 3b576f6860f838f950c570f4433b086e
- depends:
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - libxml2
- - libxml2-16 >=2.14.6
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 2411241
- timestamp: 1765104337762
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f
- md5: 915f5995e94f60e9a4826e0b0920ee88
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: LGPL-2.1-only
- purls: []
- size: 790176
- timestamp: 1754908768807
-- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7
- md5: 64571d1dd6cdcfa25d0664a5950fdaa2
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LGPL-2.1-only
- purls: []
- size: 696926
- timestamp: 1754909290005
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
- sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065
- md5: 842a81de672ddcf476337c8bde3cad33
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libunistring >=0,<1.0a0
- license: LGPL-2.0-only
- license_family: LGPL
- purls: []
- size: 139036
- timestamp: 1760385590993
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
- sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32
- md5: 8397539e3a0bbd1695584fb4f927485a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - jpeg <0.0.0a
- license: IJG AND BSD-3-Clause AND Zlib
- purls: []
- size: 633710
- timestamp: 1762094827865
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
- sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f
- md5: f0695fbecf1006f27f4395d64bd0c4b8
- depends:
- - __osx >=11.0
- constrains:
- - jpeg <0.0.0a
- license: IJG AND BSD-3-Clause AND Zlib
- purls: []
- size: 551197
- timestamp: 1762095054358
-- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
- sha256: 795e2d4feb2f7fc4a2c6e921871575feb32b8082b5760726791f080d1e2c2597
- md5: 56a686f92ac0273c0f6af58858a3f013
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - jpeg <0.0.0a
- license: IJG AND BSD-3-Clause AND Zlib
- purls: []
- size: 841783
- timestamp: 1762094814336
-- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
- build_number: 5
- sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053
- md5: b38076eb5c8e40d0106beda6f95d7609
- depends:
- - libblas 3.11.0 5_h4a7cf45_openblas
- constrains:
- - blas 2.305 openblas
- - liblapacke 3.11.0 5*_openblas
- - libcblas 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18200
- timestamp: 1765818857876
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
- build_number: 5
- sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb
- md5: ca9d752201b7fa1225bca036ee300f2b
- depends:
- - libblas 3.11.0 5_h51639a9_openblas
- constrains:
- - libcblas 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapacke 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18551
- timestamp: 1765819121855
-- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
- build_number: 5
- sha256: a2d33f5cc2b8a9042f2af6981c6733ab1a661463823eaa56595a9c58c0ab77e1
- md5: e62c42a4196dee97d20400612afcb2b1
- depends:
- - libblas 3.11.0 5_hf2e6a31_mkl
- constrains:
- - libcblas 3.11.0 5*_mkl
- - blas 2.305 mkl
- - liblapacke 3.11.0 5*_mkl
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 80225
- timestamp: 1765819148014
-- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb
- md5: c7c83eecbb72d88b940c249af56c8b17
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - xz 5.8.2.*
- license: 0BSD
- purls: []
- size: 113207
- timestamp: 1768752626120
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e
- md5: 009f0d956d7bfb00de86901d16e486c7
- depends:
- - __osx >=11.0
- constrains:
- - xz 5.8.2.*
- license: 0BSD
- purls: []
- size: 92242
- timestamp: 1768752982486
-- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c
- md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - xz 5.8.2.*
- license: 0BSD
- purls: []
- size: 106169
- timestamp: 1768752763559
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
- sha256: 6b21e0f3d1577bbe10f27003212f0b8c9a881d99faa01a83476311730aed5c9d
- md5: a02cb80c806b7b768e1d60170f63375d
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - gnutls >=3.8.9,<3.9.0a0
- license: LGPL-2.0-or-later
- license_family: LGPL
- purls: []
- size: 286166
- timestamp: 1752566614604
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843
- md5: 2c21e66f50753a083cbe6b80f38268fa
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 92400
- timestamp: 1769482286018
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2
- md5: 57c4be259f5e0b99a5983799a228ae55
- depends:
- - __osx >=11.0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 73690
- timestamp: 1769482560514
-- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514
- md5: e4a9fc2bba3b022dad998c78856afe47
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 89411
- timestamp: 1769482314283
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690
- md5: b499ce4b026493a13774bcf0f4c33849
- depends:
- - __glibc >=2.17,<3.0.a0
- - c-ares >=1.34.5,<2.0a0
- - libev >=4.33,<4.34.0a0
- - libev >=4.33,<5.0a0
- - libgcc >=14
- - libstdcxx >=14
- - libzlib >=1.3.1,<2.0a0
- - openssl >=3.5.2,<4.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 666600
- timestamp: 1756834976695
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
- sha256: 1e7a7b34f8639a5feb75ba864127059e4d83edfe1a516547f0dbb9941e7b8f8b
- md5: 3fd926c321c6dbf386aa14bd8b125bfb
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 27046
- timestamp: 1753975516342
-- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
- sha256: 17952c32eac197a59c119fdf3fb6f08c6a29c225a80bae141ac904ad212b87dd
- md5: a66a909acf08924aced622903832a937
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- purls: []
- size: 14422867
- timestamp: 1753975387297
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5
- md5: be43915efc66345cccb3c310b6ed0374
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- constrains:
- - openblas >=0.3.30,<0.3.31.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 5927939
- timestamp: 1763114673331
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa
- md5: a6f6d3a31bb29e48d37ce65de54e2df0
- depends:
- - __osx >=11.0
- - libgfortran
- - libgfortran5 >=14.3.0
- - llvm-openmp >=19.1.7
- constrains:
- - openblas >=0.3.30,<0.3.31.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 4284132
- timestamp: 1768547079205
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
- sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c
- md5: 5f13ffc7d30ffec87864e678df9957b4
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libzlib >=1.3.1,<2.0a0
- license: zlib-acknowledgement
- purls: []
- size: 317669
- timestamp: 1770691470744
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
- sha256: 7a4fd29a6ee2d7f7a6e610754dfdf7410ed08f40d8d8b488a27bc0f9981d5abb
- md5: 871dc88b0192ac49b6a5509932c31377
- depends:
- - __osx >=11.0
- - libzlib >=1.3.1,<2.0a0
- license: zlib-acknowledgement
- purls: []
- size: 288950
- timestamp: 1770691485950
-- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
- sha256: db23f281fa80597a0dc0445b18318346862602d7081ed76244df8cc4418d6d68
- md5: 43f47a9151b9b8fc100aeefcf350d1a0
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - libzlib >=1.3.1,<2.0a0
- license: zlib-acknowledgement
- purls: []
- size: 383155
- timestamp: 1770691504832
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
- sha256: e03ed186eefb46d7800224ad34bad1268c9d19ecb8f621380a50601c6221a4a7
- md5: ad3a0e2dc4cce549b2860e2ef0e6d75b
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14.3.0
- - libstdcxx >=14.3.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 7949259
- timestamp: 1771377982207
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
- sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97
- md5: 7af961ef4aa2c1136e11dd43ded245ab
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- license: ISC
- purls: []
- size: 277661
- timestamp: 1772479381288
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
- sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227
- md5: 7cc5247987e6d115134ebab15186bc13
- depends:
- - __osx >=11.0
- license: ISC
- purls: []
- size: 248039
- timestamp: 1772479570912
-- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
- sha256: d915f4fa8ebbf237c7a6e511ed458f2cfdc7c76843a924740318a15d0dd33d6d
- md5: da2aa614d16a795b3007b6f4a1318a81
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: ISC
- purls: []
- size: 276860
- timestamp: 1772479407566
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
- sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993
- md5: fd893f6a3002a635b5e50ceb9dd2c0f4
- depends:
- - __glibc >=2.17,<3.0.a0
- - icu >=78.2,<79.0a0
- - libgcc >=14
- - libzlib >=1.3.1,<2.0a0
- license: blessing
- purls: []
- size: 951405
- timestamp: 1772818874251
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
- sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c
- md5: f6233a3fddc35a2ec9f617f79d6f3d71
- depends:
- - __osx >=11.0
- - icu >=78.2,<79.0a0
- - libzlib >=1.3.1,<2.0a0
- license: blessing
- purls: []
- size: 918420
- timestamp: 1772819478684
-- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
- sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583
- md5: 8830689d537fda55f990620680934bb1
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: blessing
- purls: []
- size: 1297302
- timestamp: 1772818899033
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
- sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661
- md5: eecce068c7e4eddeb169591baac20ac4
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- - libzlib >=1.3.1,<2.0a0
- - openssl >=3.5.0,<4.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 304790
- timestamp: 1745608545575
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
- sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e
- md5: 1b08cd684f34175e4514474793d44bcb
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc 15.2.0 he0feb66_18
- constrains:
- - libstdcxx-ng ==15.2.0=*_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 5852330
- timestamp: 1771378262446
-- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
- sha256: b1c3824769b92a1486bf3e2cc5f13304d83ae613ea061b7bc47bb6080d6dfdba
- md5: 865a399bce236119301ebd1532fced8d
- depends:
- - __unix
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 20171098
- timestamp: 1771377827750
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
- sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145
- md5: 6235adb93d064ecdf3d44faee6f468de
- depends:
- - libstdcxx 15.2.0 h934c35e_18
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 27575
- timestamp: 1771378314494
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
- sha256: a3f0c33ef567eb2e3a22d7fea0717a294a5fea4964478aa06b467ce1c93bec38
- md5: 0ffe6217a3d09398155d32a2ddb41251
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: LGPL-2.1-or-later
- purls: []
- size: 116738
- timestamp: 1768297813301
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
- sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0
- md5: cd5a90476766d53e901500df9215e927
- depends:
- - __glibc >=2.17,<3.0.a0
- - lerc >=4.0.0,<5.0a0
- - libdeflate >=1.25,<1.26.0a0
- - libgcc >=14
- - libjpeg-turbo >=3.1.0,<4.0a0
- - liblzma >=5.8.1,<6.0a0
- - libstdcxx >=14
- - libwebp-base >=1.6.0,<2.0a0
- - libzlib >=1.3.1,<2.0a0
- - zstd >=1.5.7,<1.6.0a0
- license: HPND
- purls: []
- size: 435273
- timestamp: 1762022005702
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
- sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f
- md5: e2a72ab2fa54ecb6abab2b26cde93500
- depends:
- - __osx >=11.0
- - lerc >=4.0.0,<5.0a0
- - libcxx >=19
- - libdeflate >=1.25,<1.26.0a0
- - libjpeg-turbo >=3.1.0,<4.0a0
- - liblzma >=5.8.1,<6.0a0
- - libwebp-base >=1.6.0,<2.0a0
- - libzlib >=1.3.1,<2.0a0
- - zstd >=1.5.7,<1.6.0a0
- license: HPND
- purls: []
- size: 373892
- timestamp: 1762022345545
-- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
- sha256: f1b8cccaaeea38a28b9cd496694b2e3d372bb5be0e9377c9e3d14b330d1cba8a
- md5: 549845d5133100142452812feb9ba2e8
- depends:
- - lerc >=4.0.0,<5.0a0
- - libdeflate >=1.25,<1.26.0a0
- - libjpeg-turbo >=3.1.0,<4.0a0
- - liblzma >=5.8.1,<6.0a0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - zstd >=1.5.7,<1.6.0a0
- license: HPND
- purls: []
- size: 993166
- timestamp: 1762022118895
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
- sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d
- md5: 7245a044b4a1980ed83196176b78b73a
- depends:
- - libgcc-ng >=9.3.0
- license: GPL-3.0-only OR LGPL-3.0-only
- purls: []
- size: 1433436
- timestamp: 1626955018689
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
- sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a
- md5: e179a69edd30d75c0144d7a380b88f28
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 75995
- timestamp: 1757032240102
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
- sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee
- md5: db409b7c1720428638e7c0d509d3e1b5
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 40311
- timestamp: 1766271528534
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
- sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b
- md5: aea31d2e5b1091feca96fcfe945c3cf9
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - libwebp 1.6.0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 429011
- timestamp: 1752159441324
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
- sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd
- md5: e5e7d467f80da752be17796b87fe6385
- depends:
- - __osx >=11.0
- constrains:
- - libwebp 1.6.0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 294974
- timestamp: 1752159906788
-- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
- sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843
- md5: f9bbae5e2537e3b06e0f7310ba76c893
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libwebp 1.6.0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 279176
- timestamp: 1752159543911
-- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0
- md5: 8a86073cf3b343b87d03f41790d8b4e5
- depends:
- - ucrt
- constrains:
- - pthreads-win32 <0.0a0
- - msys2-conda-epoch <0.0a0
- license: MIT AND BSD-3-Clause-Clear
- purls: []
- size: 36621
- timestamp: 1759768399557
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
- sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa
- md5: 92ed62436b625154323d40d5f2f11dd7
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- - pthread-stubs
- - xorg-libxau >=1.0.11,<2.0a0
- - xorg-libxdmcp
- license: MIT
- license_family: MIT
- purls: []
- size: 395888
- timestamp: 1727278577118
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
- sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71
- md5: af523aae2eca6dfa1c8eec693f5b9a79
- depends:
- - __osx >=11.0
- - pthread-stubs
- - xorg-libxau >=1.0.11,<2.0a0
- - xorg-libxdmcp
- license: MIT
- license_family: MIT
- purls: []
- size: 323658
- timestamp: 1727278733917
-- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
- sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737
- md5: a69bbf778a462da324489976c84cfc8c
- depends:
- - libgcc >=13
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - pthread-stubs
- - ucrt >=10.0.20348.0
- - xorg-libxau >=1.0.11,<2.0a0
- - xorg-libxdmcp
- license: MIT
- license_family: MIT
- purls: []
- size: 1208687
- timestamp: 1727279378819
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
- sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392
- md5: e49238a1609f9a4a844b09d9926f2c3d
- depends:
- - __glibc >=2.17,<3.0.a0
- - icu >=78.2,<79.0a0
- - libgcc >=14
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.2,<6.0a0
- - libxml2-16 2.15.2 hca6bf5a_0
- - libzlib >=1.3.1,<2.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 45968
- timestamp: 1772704614539
-- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
- sha256: f905eb7046987c336122121759e7f09144729f6898f48cd06df2a945b86998d8
- md5: 1007e1bfe181a2aee214779ee7f13d30
- depends:
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.2,<6.0a0
- - libxml2-16 2.15.2 h692994f_0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - icu <0.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 43681
- timestamp: 1772704748950
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
- sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c
- md5: f3bc152cb4f86babe30f3a4bf0dbef69
- depends:
- - __glibc >=2.17,<3.0.a0
- - icu >=78.2,<79.0a0
- - libgcc >=14
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.2,<6.0a0
- - libzlib >=1.3.1,<2.0a0
- constrains:
- - libxml2 2.15.2
- license: MIT
- license_family: MIT
- purls: []
- size: 557492
- timestamp: 1772704601644
-- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
- sha256: b8c71b3b609c7cfe17f3f2a47c75394d7b30acfb8b34ad7a049ea8757b4d33df
- md5: e365238134188e42ed36ee996159d482
- depends:
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.2,<6.0a0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libxml2 2.15.2
- - icu <0.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 520078
- timestamp: 1772704728534
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
- sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4
- md5: edb0dca6bc32e4f4789199455a1dbeb8
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- constrains:
- - zlib 1.3.1 *_2
- license: Zlib
- license_family: Other
- purls: []
- size: 60963
- timestamp: 1727963148474
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b
- md5: 369964e85dc26bfe78f41399b366c435
- depends:
- - __osx >=11.0
- constrains:
- - zlib 1.3.1 *_2
- license: Zlib
- license_family: Other
- purls: []
- size: 46438
- timestamp: 1727963202283
-- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402
- md5: 41fbfac52c601159df6c01f875de31b9
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- constrains:
- - zlib 1.3.1 *_2
- license: Zlib
- license_family: Other
- purls: []
- size: 55476
- timestamp: 1727963768015
-- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
- sha256: 991a82fbb64aba6d10719a017ce354e28df02ea5df1d9c7b0221da573c168d27
- md5: 1005e1f39083adad2384772e8e384e43
- depends:
- - python >=3.10
- - uc-micro-py
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/linkify-it-py?source=compressed-mapping
- size: 26062
- timestamp: 1772476821244
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
- sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d
- md5: ff0820b5588b20be3b858552ecf8ffae
- depends:
- - __osx >=11.0
- constrains:
- - openmp 22.1.0|22.1.0.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- purls: []
- size: 285558
- timestamp: 1772028716784
-- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
- sha256: bb55a3736380759d338f87aac68df4fd7d845ae090b94400525f5d21a55eea31
- md5: e5505e0b7d6ef5c19d5c0c1884a2f494
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - openmp 22.1.0|22.1.0.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- purls: []
- size: 347404
- timestamp: 1772025050288
-- pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
- name: logistro
- version: 2.0.1
- sha256: 06ffa127b9fb4ac8b1972ae6b2a9d7fde57598bf5939cd708f43ec5bba2d31eb
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
- name: loky
- version: 3.5.6
- sha256: 6d5300ac68cbd5084e89a6a0a187785d6a79950d461c80223d2c9a41d672b3d4
- requires_dist:
- - cloudpickle
- - packaging ; extra == 'tests'
- - pytest ; extra == 'tests'
- - psutil ; extra == 'tests'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
- sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346
- md5: 9de5350a85c4a20c685259b889aa6393
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- - libstdcxx >=13
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 167055
- timestamp: 1733741040117
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda
- sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652
- md5: 01511afc6cc1909c5303cf31be17b44f
- depends:
- - __osx >=11.0
- - libcxx >=18
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 148824
- timestamp: 1733741047892
-- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
- sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4
- md5: 45161d96307e3a447cc3eb5896cf6f8c
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- license: GPL-2.0-or-later
- license_family: GPL
- purls: []
- size: 191060
- timestamp: 1753889274283
-- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
- name: markdown-it-py
- version: 4.0.0
- sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147
- requires_dist:
- - mdurl~=0.1
- - psutil ; extra == 'benchmarking'
- - pytest ; extra == 'benchmarking'
- - pytest-benchmark ; extra == 'benchmarking'
- - commonmark~=0.9 ; extra == 'compare'
- - markdown~=3.4 ; extra == 'compare'
- - mistletoe~=1.0 ; extra == 'compare'
- - mistune~=3.0 ; extra == 'compare'
- - panflute~=2.3 ; extra == 'compare'
- - markdown-it-pyrs ; extra == 'compare'
- - linkify-it-py>=1,<3 ; extra == 'linkify'
- - mdit-py-plugins>=0.5.0 ; extra == 'plugins'
- - gprof2dot ; extra == 'profiling'
- - mdit-py-plugins>=0.5.0 ; extra == 'rtd'
- - myst-parser ; extra == 'rtd'
- - pyyaml ; extra == 'rtd'
- - sphinx ; extra == 'rtd'
- - sphinx-copybutton ; extra == 'rtd'
- - sphinx-design ; extra == 'rtd'
- - sphinx-book-theme~=1.0 ; extra == 'rtd'
- - jupyter-sphinx ; extra == 'rtd'
- - ipykernel ; extra == 'rtd'
- - coverage ; extra == 'testing'
- - pytest ; extra == 'testing'
- - pytest-cov ; extra == 'testing'
- - pytest-regressions ; extra == 'testing'
- - requests ; extra == 'testing'
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
- sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e
- md5: 5b5203189eb668f042ac2b0826244964
- depends:
- - mdurl >=0.1,<1
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/markdown-it-py?source=hash-mapping
- size: 64736
- timestamp: 1754951288511
-- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf
- md5: 9a17c4307d23318476d7fbf0fedc0cde
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/markupsafe?source=hash-mapping
- size: 27424
- timestamp: 1772445227915
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f
- md5: d33c0a15882b70255abdd54711b06a45
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/markupsafe?source=compressed-mapping
- size: 27256
- timestamp: 1772445397216
-- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c
- md5: 8de7b40f8b30a8fcaa423c2537fe4199
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/markupsafe?source=hash-mapping
- size: 30022
- timestamp: 1772445159549
-- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
- sha256: ee773261fbd6c76fc8174b0e4e1ce272b0bbaa56610f130e9d3d1f575106f04f
- md5: b8683e6068099b69c10dbfcf7204203f
- depends:
- - __glibc >=2.17,<3.0.a0
- - contourpy >=1.0.1
- - cycler >=0.10
- - fonttools >=4.22.0
- - freetype
- - kiwisolver >=1.3.1
- - libfreetype >=2.14.1
- - libfreetype6 >=2.14.1
- - libgcc >=14
- - libstdcxx >=14
- - numpy >=1.23
- - numpy >=1.23,<3
- - packaging >=20.0
- - pillow >=8
- - pyparsing >=2.3.1
- - python >=3.14,<3.15.0a0
- - python-dateutil >=2.7
- - python_abi 3.14.* *_cp314
- - qhull >=2020.2,<2020.3.0a0
- - tk >=8.6.13,<8.7.0a0
- license: PSF-2.0
- license_family: PSF
- purls:
- - pkg:pypi/matplotlib?source=hash-mapping
- size: 8473358
- timestamp: 1763055439346
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
- sha256: 198dcc0ed83e78bc7bf48e6ef8d4ecd220e9cf1f07db98508251b2bc0be067f9
- md5: c84152e510d41378b8758826655b6ed7
- depends:
- - __osx >=11.0
- - contourpy >=1.0.1
- - cycler >=0.10
- - fonttools >=4.22.0
- - freetype
- - kiwisolver >=1.3.1
- - libcxx >=19
- - libfreetype >=2.14.1
- - libfreetype6 >=2.14.1
- - numpy >=1.23
- - numpy >=1.23,<3
- - packaging >=20.0
- - pillow >=8
- - pyparsing >=2.3.1
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python-dateutil >=2.7
- - python_abi 3.14.* *_cp314
- - qhull >=2020.2,<2020.3.0a0
- license: PSF-2.0
- license_family: PSF
- purls:
- - pkg:pypi/matplotlib?source=hash-mapping
- size: 8286510
- timestamp: 1763055937766
-- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
- sha256: 82a50284275e8a1818cd3323846f3032dc89bd23a3f80dcf44e34a62b016256b
- md5: 9d491a60700e0e90e92607fcc4e2566c
- depends:
- - contourpy >=1.0.1
- - cycler >=0.10
- - fonttools >=4.22.0
- - freetype
- - kiwisolver >=1.3.1
- - libfreetype >=2.14.1
- - libfreetype6 >=2.14.1
- - numpy >=1.23
- - numpy >=1.23,<3
- - packaging >=20.0
- - pillow >=8
- - pyparsing >=2.3.1
- - python >=3.14,<3.15.0a0
- - python-dateutil >=2.7
- - python_abi 3.14.* *_cp314
- - qhull >=2020.2,<2020.3.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: PSF-2.0
- license_family: PSF
- purls:
- - pkg:pypi/matplotlib?source=hash-mapping
- size: 8185296
- timestamp: 1763055983613
-- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
- sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603
- md5: 00e120ce3e40bad7bfc78861ce3c4a25
- depends:
- - python >=3.10
- - traitlets
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/matplotlib-inline?source=hash-mapping
- size: 15175
- timestamp: 1761214578417
-- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
- sha256: 123cc004e2946879708cdb6a9eff24acbbb054990d6131bb94bca7a374ebebfc
- md5: 1997a083ef0b4c9331f9191564be275e
- depends:
- - markdown-it-py >=2.0.0,<5.0.0
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/mdit-py-plugins?source=hash-mapping
- size: 43805
- timestamp: 1754946862113
-- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
- name: mdurl
- version: 0.1.2
- sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8
- requires_python: '>=3.7'
-- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7
- md5: 592132998493b3ff25fd7479396e8351
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/mdurl?source=hash-mapping
- size: 14465
- timestamp: 1733255681319
-- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
- sha256: 575b877b4ad4f93c44532e99b4dd8fe402ce34bff63f87b420f141e81f647de6
- md5: 2951224e244e0e4a27e2c4b24b76ffba
- depends:
- - python
- - rich >=11.2.0
- - jinja2
- - textual >=0.34.0
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - lz4-c >=1.10.0,<1.11.0a0
- - python_abi 3.14.* *_cp314
- - libunwind >=1.8.3,<1.9.0a0
- - elfutils >=0.194,<0.195.0a0
- license: Apache-2.0 AND BSD-3-Clause
- purls:
- - pkg:pypi/memray?source=hash-mapping
- size: 1845157
- timestamp: 1773493681427
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/memray-1.19.2-py314h44d60dd_0.conda
- sha256: 5e053a64dbcdc98bd470f358f3fce1cde9b9fe362280a87cb66f1587e9f09e26
- md5: f29f08f053a687bcfe09089f8a410bc9
- depends:
- - python
- - rich >=11.2.0
- - jinja2
- - textual >=0.34.0
- - python 3.14.* *_cp314
- - __osx >=11.0
- - libcxx >=19
- - python_abi 3.14.* *_cp314
- - lz4-c >=1.10.0,<1.11.0a0
- license: Apache-2.0 AND BSD-3-Clause
- purls:
- - pkg:pypi/memray?source=hash-mapping
- size: 1744827
- timestamp: 1773493881871
-- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
- sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae
- md5: b11e360fc4de2b0035fc8aaa74f17fd6
- depends:
- - python >=3.10
- - typing_extensions
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/mistune?source=hash-mapping
- size: 74250
- timestamp: 1766504456031
-- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d
- md5: fd05d1e894497b012d05a804232254ed
- depends:
- - llvm-openmp >=21.1.8
- - tbb >=2022.3.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- purls: []
- size: 100224829
- timestamp: 1767634557029
-- pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
- name: ml-dtypes
- version: 0.5.4
- sha256: 2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22
- requires_dist:
- - numpy>=1.21
- - numpy>=1.21.2 ; python_full_version >= '3.10'
- - numpy>=1.23.3 ; python_full_version >= '3.11'
- - numpy>=1.26.0 ; python_full_version >= '3.12'
- - numpy>=2.1.0 ; python_full_version >= '3.13'
- - absl-py ; extra == 'dev'
- - pytest ; extra == 'dev'
- - pytest-xdist ; extra == 'dev'
- - pylint>=2.6.0 ; extra == 'dev'
- - pyink ; extra == 'dev'
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- name: ml-dtypes
- version: 0.5.4
- sha256: 14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f
- requires_dist:
- - numpy>=1.21
- - numpy>=1.21.2 ; python_full_version >= '3.10'
- - numpy>=1.23.3 ; python_full_version >= '3.11'
- - numpy>=1.26.0 ; python_full_version >= '3.12'
- - numpy>=2.1.0 ; python_full_version >= '3.13'
- - absl-py ; extra == 'dev'
- - pytest ; extra == 'dev'
- - pytest-xdist ; extra == 'dev'
- - pylint>=2.6.0 ; extra == 'dev'
- - pyink ; extra == 'dev'
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
- name: ml-dtypes
- version: 0.5.4
- sha256: 8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56
- requires_dist:
- - numpy>=1.21
- - numpy>=1.21.2 ; python_full_version >= '3.10'
- - numpy>=1.23.3 ; python_full_version >= '3.11'
- - numpy>=1.26.0 ; python_full_version >= '3.12'
- - numpy>=2.1.0 ; python_full_version >= '3.13'
- - absl-py ; extra == 'dev'
- - pytest ; extra == 'dev'
- - pytest-xdist ; extra == 'dev'
- - pylint>=2.6.0 ; extra == 'dev'
- - pyink ; extra == 'dev'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
- sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90
- md5: 37293a85a0f4f77bbd9cf7aaefc62609
- depends:
- - python >=3.9
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/munkres?source=hash-mapping
- size: 15851
- timestamp: 1749895533014
-- pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
- name: narwhals
- version: 2.18.0
- sha256: 68378155ee706ac9c5b25868ef62ecddd62947b6df7801a0a156bc0a615d2d0d
- requires_dist:
- - cudf-cu12>=24.10.0 ; extra == 'cudf'
- - dask[dataframe]>=2024.8 ; extra == 'dask'
- - duckdb>=1.1 ; extra == 'duckdb'
- - ibis-framework>=6.0.0 ; extra == 'ibis'
- - packaging ; extra == 'ibis'
- - pyarrow-hotfix ; extra == 'ibis'
- - rich ; extra == 'ibis'
- - modin ; extra == 'modin'
- - pandas>=1.1.3 ; extra == 'pandas'
- - polars>=0.20.4 ; extra == 'polars'
- - pyarrow>=13.0.0 ; extra == 'pyarrow'
- - pyspark>=3.5.0 ; extra == 'pyspark'
- - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect'
- - duckdb>=1.1 ; extra == 'sql'
- - sqlparse ; extra == 'sql'
- - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
- sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b
- md5: 00f5b8dafa842e0c27c1cd7296aa4875
- depends:
- - jupyter_client >=6.1.12
- - jupyter_core >=4.12,!=5.0.*
- - nbformat >=5.1
- - python >=3.8
- - traitlets >=5.4
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/nbclient?source=compressed-mapping
- size: 28473
- timestamp: 1766485646962
-- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
- sha256: 628fea99108df8e33396bb0b88658ec3d58edf245df224f57c0dce09615cbed2
- md5: b14079a39ae60ac7ad2ec3d9eab075ca
- depends:
- - beautifulsoup4
- - bleach-with-css !=5.0.0
- - defusedxml
- - importlib-metadata >=3.6
- - jinja2 >=3.0
- - jupyter_core >=4.7
- - jupyterlab_pygments
- - markupsafe >=2.0
- - mistune >=2.0.3,<4
- - nbclient >=0.5.0
- - nbformat >=5.7
- - packaging
- - pandocfilters >=1.4.1
- - pygments >=2.4.1
- - python >=3.10
- - traitlets >=5.1
- - python
- constrains:
- - pandoc >=2.9.2,<4.0.0
- - nbconvert ==7.17.0 *_0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/nbconvert?source=compressed-mapping
- size: 202284
- timestamp: 1769709543555
-- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
- sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838
- md5: bbe1963f1e47f594070ffe87cdf612ea
- depends:
- - jsonschema >=2.6
- - jupyter_core >=4.12,!=5.0.*
- - python >=3.9
- - python-fastjsonschema >=2.15
- - traitlets >=5.1
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/nbformat?source=hash-mapping
- size: 100945
- timestamp: 1733402844974
-- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586
- md5: 47e340acb35de30501a76c7c799c41d7
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- license: X11 AND BSD-3-Clause
- purls: []
- size: 891641
- timestamp: 1738195959188
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733
- md5: 068d497125e4bf8a66bf707254fff5ae
- depends:
- - __osx >=11.0
- license: X11 AND BSD-3-Clause
- purls: []
- size: 797030
- timestamp: 1738196177597
-- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
- sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0
- md5: 598fd7d4d0de2455fb74f56063969a97
- depends:
- - python >=3.9
- license: BSD-2-Clause
- license_family: BSD
- purls:
- - pkg:pypi/nest-asyncio?source=hash-mapping
- size: 11543
- timestamp: 1733325673691
-- conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
- sha256: 00b5a5e394d58cff5b08e0082699e773dd41995130bc14747740a16d9cacdd2c
- md5: 618bf3007df69a0ca9306ed8d6b48b48
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- - gmp >=6.3.0,<7.0a0
- license: GPL-2.0-or-later OR LGPL-3.0-or-later
- purls: []
- size: 1047686
- timestamp: 1748012178395
-- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6
- md5: a2c1eeadae7a309daed9d62c96012a2b
- depends:
- - python >=3.11
- - python
- constrains:
- - numpy >=1.25
- - scipy >=1.11.2
- - matplotlib-base >=3.8
- - pandas >=2.0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/networkx?source=hash-mapping
- size: 1587439
- timestamp: 1765215107045
-- pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
- name: nodeenv
- version: 1.10.0
- sha256: 5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827
- requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*'
-- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
- sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056
- md5: e7f89ea5f7ea9401642758ff50a2d9c1
- depends:
- - jupyter_server >=1.8,<3
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/notebook-shim?source=hash-mapping
- size: 16817
- timestamp: 1733408419340
-- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
- sha256: 1d8377c8001c15ed12c2713b723213474b435706ab9d34ede69795d64af9e94d
- md5: 4ea6b620fdf24a1a0bc4f1c7134dfafb
- depends:
- - python
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libcblas >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- - libblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/numpy?source=hash-mapping
- size: 8926994
- timestamp: 1770098474394
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
- sha256: 43b5ed0ead36e5133ee8462916d23284f0bce0e5f266fa4bd31a020a6cc22f14
- md5: 0f0ddf0575b98d91cda9e3ca9eaeb9a2
- depends:
- - python
- - __osx >=11.0
- - python 3.14.* *_cp314
- - libcxx >=19
- - libblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- - libcblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/numpy?source=hash-mapping
- size: 6992958
- timestamp: 1770098398327
-- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
- sha256: 34fc25b81cfa987e1825586ddb1a4ac76a246fdef343c9171109017674ad6503
- md5: 2fccd2c4e9feb4e4c2a90043015525d6
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - libblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/numpy?source=hash-mapping
- size: 7309134
- timestamp: 1770098414535
-- pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
- name: nvidia-cublas-cu12
- version: 12.9.1.4
- sha256: 453611eb21a7c1f2c2156ed9f3a45b691deda0440ec550860290dc901af5b4c2
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- name: nvidia-cuda-cccl-cu12
- version: 12.9.27
- sha256: 37869e17ce2e1ecec6eddf1927cca0f8c34e64fd848d40453df559091e2d7117
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
- name: nvidia-cuda-cupti-cu12
- version: 12.9.79
- sha256: 096bcf334f13e1984ba36685ad4c1d6347db214de03dbb6eebb237b41d9d934f
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- name: nvidia-cuda-nvcc-cu12
- version: 12.9.86
- sha256: 5d6a0d32fdc7ea39917c20065614ae93add6f577d840233237ff08e9a38f58f0
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- name: nvidia-cuda-nvrtc-cu12
- version: 12.9.86
- sha256: 210cf05005a447e29214e9ce50851e83fc5f4358df8b453155d5e1918094dcb4
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- name: nvidia-cuda-runtime-cu12
- version: 12.9.79
- sha256: 25bba2dfb01d48a9b59ca474a1ac43c6ebf7011f1b0b8cc44f54eb6ac48a96c3
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
- name: nvidia-cudnn-cu12
- version: 9.20.0.48
- sha256: 7d7479e1321c7a039b33827f0247791ee1be091759032c1f66a287c4a643396a
- requires_dist:
- - nvidia-cublas-cu12
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- name: nvidia-cufft-cu12
- version: 11.4.1.4
- sha256: c67884f2a7d276b4b80eb56a79322a95df592ae5e765cf1243693365ccab4e28
- requires_dist:
- - nvidia-nvjitlink-cu12
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
- name: nvidia-cusolver-cu12
- version: 11.7.5.82
- sha256: 15da72d1340d29b5b3cf3fd100e3cd53421dde36002eda6ed93811af63c40d88
- requires_dist:
- - nvidia-cublas-cu12
- - nvidia-nvjitlink-cu12
- - nvidia-cusparse-cu12
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- name: nvidia-cusparse-cu12
- version: 12.5.10.65
- sha256: 73060ce019ac064a057267c585bf1fd5a353734151f87472ff02b2c5c9984e78
- requires_dist:
- - nvidia-nvjitlink-cu12
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
- name: nvidia-nccl-cu12
- version: 2.29.7
- sha256: ecd0a012051abc20c1aa87328841efa8cade3ced65803046e38c2f03c0891fea
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
- name: nvidia-nvjitlink-cu12
- version: 12.9.86
- sha256: e3f1171dbdc83c5932a45f0f4c99180a70de9bd2718c1ab77d14104f6d7147f9
- requires_python: '>=3'
-- pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- name: nvidia-nvshmem-cu12
- version: 3.5.21
- sha256: 0e51b52bbd78f8896a7667701ac40e3e7a4f0f80703ccce75b304c18f359d73f
- requires_dist:
- - nvidia-cuda-cccl-cu12
- requires_python: '>=3'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
- sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d
- md5: 11b3379b191f63139e29c0d19dee24cd
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libpng >=1.6.50,<1.7.0a0
- - libstdcxx >=14
- - libtiff >=4.7.1,<4.8.0a0
- - libzlib >=1.3.1,<2.0a0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 355400
- timestamp: 1758489294972
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
- sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4
- md5: 4b5d3a91320976eec71678fad1e3569b
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libpng >=1.6.55,<1.7.0a0
- - libtiff >=4.7.1,<4.8.0a0
- - libzlib >=1.3.1,<2.0a0
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 319697
- timestamp: 1772625397692
-- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
- sha256: 24342dee891a49a9ba92e2018ec0bde56cc07fdaec95275f7a55b96f03ea4252
- md5: e723ab7cc2794c954e1b22fde51c16e4
- depends:
- - libpng >=1.6.55,<1.7.0a0
- - libtiff >=4.7.1,<4.8.0a0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-2-Clause
- license_family: BSD
- purls: []
- size: 245594
- timestamp: 1772624841727
-- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
- sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c
- md5: f61eb8cd60ff9057122a3d338b99c00f
- depends:
- - __glibc >=2.17,<3.0.a0
- - ca-certificates
- - libgcc >=14
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 3164551
- timestamp: 1769555830639
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
- sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67
- md5: f4f6ad63f98f64191c3e77c5f5f29d76
- depends:
- - __osx >=11.0
- - ca-certificates
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 3104268
- timestamp: 1769556384749
-- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
- sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6
- md5: eb585509b815415bc964b2c7e11c7eb3
- depends:
- - ca-certificates
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
- purls: []
- size: 9343023
- timestamp: 1769557547888
-- pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
- name: opt-einsum
- version: 3.4.0
- sha256: 69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl
- name: optimagic
- version: 0.5.3
- sha256: 6723076dad2c186a7f7871e5676eeb579f340030c988136196246e0fe8995a68
- requires_dist:
- - annotated-types
- - cloudpickle
- - joblib
- - numpy
- - pandas
- - plotly
- - pybaum>=0.1.2
- - scipy>=1.2.1
- - sqlalchemy>=1.3
- - typing-extensions
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
- name: optree
- version: 0.19.0
- sha256: d22b947603be4768c2bd73a59652c94d63465f928b3099e9035f9c48dfc61953
- requires_dist:
- - typing-extensions>=4.6.0
- - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
- - jax ; extra == 'jax'
- - numpy ; extra == 'numpy'
- - torch ; extra == 'torch'
- - cpplint ; extra == 'lint'
- - doc8 ; extra == 'lint'
- - mypy ; extra == 'lint'
- - pre-commit ; extra == 'lint'
- - pyenchant ; extra == 'lint'
- - pylint[spelling] ; extra == 'lint'
- - ruff ; extra == 'lint'
- - xdoctest ; extra == 'lint'
- - pytest ; extra == 'test'
- - pytest-cov ; extra == 'test'
- - covdefaults ; extra == 'test'
- - rich ; extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
- - sphinx~=8.0 ; extra == 'docs'
- - sphinx-autoapi ; extra == 'docs'
- - sphinx-autobuild ; extra == 'docs'
- - sphinx-autodoc-typehints ; extra == 'docs'
- - sphinx-copybutton ; extra == 'docs'
- - sphinx-rtd-theme ; extra == 'docs'
- - sphinxcontrib-bibtex ; extra == 'docs'
- - docutils ; extra == 'docs'
- - jax[cpu] ; extra == 'docs'
- - numpy ; extra == 'docs'
- - torch ; extra == 'docs'
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
- name: optree
- version: 0.19.0
- sha256: ff773c852122cef6dcae68b5e252a20aaf5d2986f78e278d747e226e7829d44e
- requires_dist:
- - typing-extensions>=4.6.0
- - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
- - jax ; extra == 'jax'
- - numpy ; extra == 'numpy'
- - torch ; extra == 'torch'
- - cpplint ; extra == 'lint'
- - doc8 ; extra == 'lint'
- - mypy ; extra == 'lint'
- - pre-commit ; extra == 'lint'
- - pyenchant ; extra == 'lint'
- - pylint[spelling] ; extra == 'lint'
- - ruff ; extra == 'lint'
- - xdoctest ; extra == 'lint'
- - pytest ; extra == 'test'
- - pytest-cov ; extra == 'test'
- - covdefaults ; extra == 'test'
- - rich ; extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
- - sphinx~=8.0 ; extra == 'docs'
- - sphinx-autoapi ; extra == 'docs'
- - sphinx-autobuild ; extra == 'docs'
- - sphinx-autodoc-typehints ; extra == 'docs'
- - sphinx-copybutton ; extra == 'docs'
- - sphinx-rtd-theme ; extra == 'docs'
- - sphinxcontrib-bibtex ; extra == 'docs'
- - docutils ; extra == 'docs'
- - jax[cpu] ; extra == 'docs'
- - numpy ; extra == 'docs'
- - torch ; extra == 'docs'
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- name: optree
- version: 0.19.0
- sha256: fb220bb85128c8de71aeffb9c38be817569e4bca413b38d5e0de11ba6471ef4a
- requires_dist:
- - typing-extensions>=4.6.0
- - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
- - jax ; extra == 'jax'
- - numpy ; extra == 'numpy'
- - torch ; extra == 'torch'
- - cpplint ; extra == 'lint'
- - doc8 ; extra == 'lint'
- - mypy ; extra == 'lint'
- - pre-commit ; extra == 'lint'
- - pyenchant ; extra == 'lint'
- - pylint[spelling] ; extra == 'lint'
- - ruff ; extra == 'lint'
- - xdoctest ; extra == 'lint'
- - pytest ; extra == 'test'
- - pytest-cov ; extra == 'test'
- - covdefaults ; extra == 'test'
- - rich ; extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
- - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
- - sphinx~=8.0 ; extra == 'docs'
- - sphinx-autoapi ; extra == 'docs'
- - sphinx-autobuild ; extra == 'docs'
- - sphinx-autodoc-typehints ; extra == 'docs'
- - sphinx-copybutton ; extra == 'docs'
- - sphinx-rtd-theme ; extra == 'docs'
- - sphinxcontrib-bibtex ; extra == 'docs'
- - docutils ; extra == 'docs'
- - jax[cpu] ; extra == 'docs'
- - numpy ; extra == 'docs'
- - torch ; extra == 'docs'
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
- name: orjson
- version: 3.11.7
- sha256: 845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- name: orjson
- version: 3.11.7
- sha256: a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
- name: orjson
- version: 3.11.7
- sha256: de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
- sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c
- md5: e51f1e4089cad105b6cac64bd8166587
- depends:
- - python >=3.9
- - typing_utils
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/overrides?source=hash-mapping
- size: 30139
- timestamp: 1734587755455
-- conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
- sha256: f63962d24d81d4fafa15112c03cd5db1fddadd520fdb2ad7ec71a1689e8e694f
- md5: 312989f1b7318c3763fffdc78df8474e
- depends:
- - __glibc >=2.17,<3.0.a0
- - libffi >=3.5.2,<3.6.0a0
- - libgcc >=14
- - libtasn1 >=4.21.0,<5.0a0
- license: MIT
- license_family: MIT
- purls: []
- size: 3831848
- timestamp: 1770417713801
-- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
- sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58
- md5: b76541e68fea4d511b1ac46a28dcd2c6
- depends:
- - python >=3.8
- - python
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/packaging?source=compressed-mapping
- size: 72010
- timestamp: 1769093650580
-- pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
- name: pandas
- version: 3.0.1
- sha256: 93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66
- requires_dist:
- - numpy>=1.26.0 ; python_full_version < '3.14'
- - numpy>=2.3.3 ; python_full_version >= '3.14'
- - python-dateutil>=2.8.2
- - tzdata ; sys_platform == 'win32'
- - tzdata ; sys_platform == 'emscripten'
- - hypothesis>=6.116.0 ; extra == 'test'
- - pytest>=8.3.4 ; extra == 'test'
- - pytest-xdist>=3.6.1 ; extra == 'test'
- - pyarrow>=13.0.0 ; extra == 'pyarrow'
- - bottleneck>=1.4.2 ; extra == 'performance'
- - numba>=0.60.0 ; extra == 'performance'
- - numexpr>=2.10.2 ; extra == 'performance'
- - scipy>=1.14.1 ; extra == 'computation'
- - xarray>=2024.10.0 ; extra == 'computation'
- - fsspec>=2024.10.0 ; extra == 'fss'
- - s3fs>=2024.10.0 ; extra == 'aws'
- - gcsfs>=2024.10.0 ; extra == 'gcp'
- - odfpy>=1.4.1 ; extra == 'excel'
- - openpyxl>=3.1.5 ; extra == 'excel'
- - python-calamine>=0.3.0 ; extra == 'excel'
- - pyxlsb>=1.0.10 ; extra == 'excel'
- - xlrd>=2.0.1 ; extra == 'excel'
- - xlsxwriter>=3.2.0 ; extra == 'excel'
- - pyarrow>=13.0.0 ; extra == 'parquet'
- - pyarrow>=13.0.0 ; extra == 'feather'
- - pyiceberg>=0.8.1 ; extra == 'iceberg'
- - tables>=3.10.1 ; extra == 'hdf5'
- - pyreadstat>=1.2.8 ; extra == 'spss'
- - sqlalchemy>=2.0.36 ; extra == 'postgresql'
- - psycopg2>=2.9.10 ; extra == 'postgresql'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
- - sqlalchemy>=2.0.36 ; extra == 'mysql'
- - pymysql>=1.1.1 ; extra == 'mysql'
- - sqlalchemy>=2.0.36 ; extra == 'sql-other'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
- - beautifulsoup4>=4.12.3 ; extra == 'html'
- - html5lib>=1.1 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'xml'
- - matplotlib>=3.9.3 ; extra == 'plot'
- - jinja2>=3.1.5 ; extra == 'output-formatting'
- - tabulate>=0.9.0 ; extra == 'output-formatting'
- - pyqt5>=5.15.9 ; extra == 'clipboard'
- - qtpy>=2.4.2 ; extra == 'clipboard'
- - zstandard>=0.23.0 ; extra == 'compression'
- - pytz>=2024.2 ; extra == 'timezone'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
- - beautifulsoup4>=4.12.3 ; extra == 'all'
- - bottleneck>=1.4.2 ; extra == 'all'
- - fastparquet>=2024.11.0 ; extra == 'all'
- - fsspec>=2024.10.0 ; extra == 'all'
- - gcsfs>=2024.10.0 ; extra == 'all'
- - html5lib>=1.1 ; extra == 'all'
- - hypothesis>=6.116.0 ; extra == 'all'
- - jinja2>=3.1.5 ; extra == 'all'
- - lxml>=5.3.0 ; extra == 'all'
- - matplotlib>=3.9.3 ; extra == 'all'
- - numba>=0.60.0 ; extra == 'all'
- - numexpr>=2.10.2 ; extra == 'all'
- - odfpy>=1.4.1 ; extra == 'all'
- - openpyxl>=3.1.5 ; extra == 'all'
- - psycopg2>=2.9.10 ; extra == 'all'
- - pyarrow>=13.0.0 ; extra == 'all'
- - pyiceberg>=0.8.1 ; extra == 'all'
- - pymysql>=1.1.1 ; extra == 'all'
- - pyqt5>=5.15.9 ; extra == 'all'
- - pyreadstat>=1.2.8 ; extra == 'all'
- - pytest>=8.3.4 ; extra == 'all'
- - pytest-xdist>=3.6.1 ; extra == 'all'
- - python-calamine>=0.3.0 ; extra == 'all'
- - pytz>=2024.2 ; extra == 'all'
- - pyxlsb>=1.0.10 ; extra == 'all'
- - qtpy>=2.4.2 ; extra == 'all'
- - scipy>=1.14.1 ; extra == 'all'
- - s3fs>=2024.10.0 ; extra == 'all'
- - sqlalchemy>=2.0.36 ; extra == 'all'
- - tables>=3.10.1 ; extra == 'all'
- - tabulate>=0.9.0 ; extra == 'all'
- - xarray>=2024.10.0 ; extra == 'all'
- - xlrd>=2.0.1 ; extra == 'all'
- - xlsxwriter>=3.2.0 ; extra == 'all'
- - zstandard>=0.23.0 ; extra == 'all'
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- name: pandas
- version: 3.0.1
- sha256: c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249
- requires_dist:
- - numpy>=1.26.0 ; python_full_version < '3.14'
- - numpy>=2.3.3 ; python_full_version >= '3.14'
- - python-dateutil>=2.8.2
- - tzdata ; sys_platform == 'win32'
- - tzdata ; sys_platform == 'emscripten'
- - hypothesis>=6.116.0 ; extra == 'test'
- - pytest>=8.3.4 ; extra == 'test'
- - pytest-xdist>=3.6.1 ; extra == 'test'
- - pyarrow>=13.0.0 ; extra == 'pyarrow'
- - bottleneck>=1.4.2 ; extra == 'performance'
- - numba>=0.60.0 ; extra == 'performance'
- - numexpr>=2.10.2 ; extra == 'performance'
- - scipy>=1.14.1 ; extra == 'computation'
- - xarray>=2024.10.0 ; extra == 'computation'
- - fsspec>=2024.10.0 ; extra == 'fss'
- - s3fs>=2024.10.0 ; extra == 'aws'
- - gcsfs>=2024.10.0 ; extra == 'gcp'
- - odfpy>=1.4.1 ; extra == 'excel'
- - openpyxl>=3.1.5 ; extra == 'excel'
- - python-calamine>=0.3.0 ; extra == 'excel'
- - pyxlsb>=1.0.10 ; extra == 'excel'
- - xlrd>=2.0.1 ; extra == 'excel'
- - xlsxwriter>=3.2.0 ; extra == 'excel'
- - pyarrow>=13.0.0 ; extra == 'parquet'
- - pyarrow>=13.0.0 ; extra == 'feather'
- - pyiceberg>=0.8.1 ; extra == 'iceberg'
- - tables>=3.10.1 ; extra == 'hdf5'
- - pyreadstat>=1.2.8 ; extra == 'spss'
- - sqlalchemy>=2.0.36 ; extra == 'postgresql'
- - psycopg2>=2.9.10 ; extra == 'postgresql'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
- - sqlalchemy>=2.0.36 ; extra == 'mysql'
- - pymysql>=1.1.1 ; extra == 'mysql'
- - sqlalchemy>=2.0.36 ; extra == 'sql-other'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
- - beautifulsoup4>=4.12.3 ; extra == 'html'
- - html5lib>=1.1 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'xml'
- - matplotlib>=3.9.3 ; extra == 'plot'
- - jinja2>=3.1.5 ; extra == 'output-formatting'
- - tabulate>=0.9.0 ; extra == 'output-formatting'
- - pyqt5>=5.15.9 ; extra == 'clipboard'
- - qtpy>=2.4.2 ; extra == 'clipboard'
- - zstandard>=0.23.0 ; extra == 'compression'
- - pytz>=2024.2 ; extra == 'timezone'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
- - beautifulsoup4>=4.12.3 ; extra == 'all'
- - bottleneck>=1.4.2 ; extra == 'all'
- - fastparquet>=2024.11.0 ; extra == 'all'
- - fsspec>=2024.10.0 ; extra == 'all'
- - gcsfs>=2024.10.0 ; extra == 'all'
- - html5lib>=1.1 ; extra == 'all'
- - hypothesis>=6.116.0 ; extra == 'all'
- - jinja2>=3.1.5 ; extra == 'all'
- - lxml>=5.3.0 ; extra == 'all'
- - matplotlib>=3.9.3 ; extra == 'all'
- - numba>=0.60.0 ; extra == 'all'
- - numexpr>=2.10.2 ; extra == 'all'
- - odfpy>=1.4.1 ; extra == 'all'
- - openpyxl>=3.1.5 ; extra == 'all'
- - psycopg2>=2.9.10 ; extra == 'all'
- - pyarrow>=13.0.0 ; extra == 'all'
- - pyiceberg>=0.8.1 ; extra == 'all'
- - pymysql>=1.1.1 ; extra == 'all'
- - pyqt5>=5.15.9 ; extra == 'all'
- - pyreadstat>=1.2.8 ; extra == 'all'
- - pytest>=8.3.4 ; extra == 'all'
- - pytest-xdist>=3.6.1 ; extra == 'all'
- - python-calamine>=0.3.0 ; extra == 'all'
- - pytz>=2024.2 ; extra == 'all'
- - pyxlsb>=1.0.10 ; extra == 'all'
- - qtpy>=2.4.2 ; extra == 'all'
- - scipy>=1.14.1 ; extra == 'all'
- - s3fs>=2024.10.0 ; extra == 'all'
- - sqlalchemy>=2.0.36 ; extra == 'all'
- - tables>=3.10.1 ; extra == 'all'
- - tabulate>=0.9.0 ; extra == 'all'
- - xarray>=2024.10.0 ; extra == 'all'
- - xlrd>=2.0.1 ; extra == 'all'
- - xlsxwriter>=3.2.0 ; extra == 'all'
- - zstandard>=0.23.0 ; extra == 'all'
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
- name: pandas
- version: 3.0.1
- sha256: 3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f
- requires_dist:
- - numpy>=1.26.0 ; python_full_version < '3.14'
- - numpy>=2.3.3 ; python_full_version >= '3.14'
- - python-dateutil>=2.8.2
- - tzdata ; sys_platform == 'win32'
- - tzdata ; sys_platform == 'emscripten'
- - hypothesis>=6.116.0 ; extra == 'test'
- - pytest>=8.3.4 ; extra == 'test'
- - pytest-xdist>=3.6.1 ; extra == 'test'
- - pyarrow>=13.0.0 ; extra == 'pyarrow'
- - bottleneck>=1.4.2 ; extra == 'performance'
- - numba>=0.60.0 ; extra == 'performance'
- - numexpr>=2.10.2 ; extra == 'performance'
- - scipy>=1.14.1 ; extra == 'computation'
- - xarray>=2024.10.0 ; extra == 'computation'
- - fsspec>=2024.10.0 ; extra == 'fss'
- - s3fs>=2024.10.0 ; extra == 'aws'
- - gcsfs>=2024.10.0 ; extra == 'gcp'
- - odfpy>=1.4.1 ; extra == 'excel'
- - openpyxl>=3.1.5 ; extra == 'excel'
- - python-calamine>=0.3.0 ; extra == 'excel'
- - pyxlsb>=1.0.10 ; extra == 'excel'
- - xlrd>=2.0.1 ; extra == 'excel'
- - xlsxwriter>=3.2.0 ; extra == 'excel'
- - pyarrow>=13.0.0 ; extra == 'parquet'
- - pyarrow>=13.0.0 ; extra == 'feather'
- - pyiceberg>=0.8.1 ; extra == 'iceberg'
- - tables>=3.10.1 ; extra == 'hdf5'
- - pyreadstat>=1.2.8 ; extra == 'spss'
- - sqlalchemy>=2.0.36 ; extra == 'postgresql'
- - psycopg2>=2.9.10 ; extra == 'postgresql'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
- - sqlalchemy>=2.0.36 ; extra == 'mysql'
- - pymysql>=1.1.1 ; extra == 'mysql'
- - sqlalchemy>=2.0.36 ; extra == 'sql-other'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
- - beautifulsoup4>=4.12.3 ; extra == 'html'
- - html5lib>=1.1 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'html'
- - lxml>=5.3.0 ; extra == 'xml'
- - matplotlib>=3.9.3 ; extra == 'plot'
- - jinja2>=3.1.5 ; extra == 'output-formatting'
- - tabulate>=0.9.0 ; extra == 'output-formatting'
- - pyqt5>=5.15.9 ; extra == 'clipboard'
- - qtpy>=2.4.2 ; extra == 'clipboard'
- - zstandard>=0.23.0 ; extra == 'compression'
- - pytz>=2024.2 ; extra == 'timezone'
- - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
- - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
- - beautifulsoup4>=4.12.3 ; extra == 'all'
- - bottleneck>=1.4.2 ; extra == 'all'
- - fastparquet>=2024.11.0 ; extra == 'all'
- - fsspec>=2024.10.0 ; extra == 'all'
- - gcsfs>=2024.10.0 ; extra == 'all'
- - html5lib>=1.1 ; extra == 'all'
- - hypothesis>=6.116.0 ; extra == 'all'
- - jinja2>=3.1.5 ; extra == 'all'
- - lxml>=5.3.0 ; extra == 'all'
- - matplotlib>=3.9.3 ; extra == 'all'
- - numba>=0.60.0 ; extra == 'all'
- - numexpr>=2.10.2 ; extra == 'all'
- - odfpy>=1.4.1 ; extra == 'all'
- - openpyxl>=3.1.5 ; extra == 'all'
- - psycopg2>=2.9.10 ; extra == 'all'
- - pyarrow>=13.0.0 ; extra == 'all'
- - pyiceberg>=0.8.1 ; extra == 'all'
- - pymysql>=1.1.1 ; extra == 'all'
- - pyqt5>=5.15.9 ; extra == 'all'
- - pyreadstat>=1.2.8 ; extra == 'all'
- - pytest>=8.3.4 ; extra == 'all'
- - pytest-xdist>=3.6.1 ; extra == 'all'
- - python-calamine>=0.3.0 ; extra == 'all'
- - pytz>=2024.2 ; extra == 'all'
- - pyxlsb>=1.0.10 ; extra == 'all'
- - qtpy>=2.4.2 ; extra == 'all'
- - scipy>=1.14.1 ; extra == 'all'
- - s3fs>=2024.10.0 ; extra == 'all'
- - sqlalchemy>=2.0.36 ; extra == 'all'
- - tables>=3.10.1 ; extra == 'all'
- - tabulate>=0.9.0 ; extra == 'all'
- - xarray>=2024.10.0 ; extra == 'all'
- - xlrd>=2.0.1 ; extra == 'all'
- - xlsxwriter>=3.2.0 ; extra == 'all'
- - zstandard>=0.23.0 ; extra == 'all'
- requires_python: '>=3.11'
-- pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
- name: pandas-stubs
- version: 3.0.0.260204
- sha256: 5ab9e4d55a6e2752e9720828564af40d48c4f709e6a2c69b743014a6fcb6c241
- requires_dist:
- - numpy>=1.23.5
- requires_python: '>=3.11'
+ - pypi: https://files.pythonhosted.org/packages/e8/1f/930d63ccc8adcdf27bfc051a24e3e4da2cf6ef987848d6d1d642e29d704b/nvidia_nvvm-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ea/78/501eee5cce9202fba2f3476529e296a7f6d003261d80b52ab0abfa09ddd6/nvidia_cuda_crt-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.whl
+ type-checking:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/18/14/69a25a0cad493fb6a947302471b579a03516a3b00e7bece77fdc6b4afb9b/ty-0.0.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ osx-arm64:
+ - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/0f/01/3f25909b02fac29bb0a62b2251f8d62e65d697781ffa4cf6b47a4c075c85/ty-0.0.23-py3-none-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ win-64:
+ - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
+ - pypi: .
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/31/2e/eaed4ff5c85e857a02415084c394e02c30476b65e158eec1938fdaa9a205/ty-0.0.23-py3-none-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+packages:
+- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ build_number: 20
+ sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9
+ md5: a9f577daf3de00bca7c3c76c0ecbd1de
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgomp >=7.5.0
+ constrains:
+ - openmp_impl <0.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 28948
+ timestamp: 1770939786096
+- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda
+ sha256: 39234a99df3d2e3065383808ed8bfda36760de5ef590c54c3692bb53571ef02b
+ md5: 3cca1b74b2752917b5b65b81f61f0553
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cffi >=2.0.0b1
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
+ size: 35598
+ timestamp: 1762509505285
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ sha256: 292aa18fe6ab5351710e6416fbd683eaef3aa5b1b7396da9350ff08efc660e4f
+ md5: 675ea6d90900350b1dcfa8231a5ea2dd
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 134426
+ timestamp: 1774274932726
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda
+ sha256: ccbf2cc4bea4aab6e071d67ecc2743197759f6df855787e7a5f57f7973f913a2
+ md5: 55eaf7066da1299d217ab32baedc7fa8
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.13,<0.10.14.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 134427
+ timestamp: 1777489423676
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda
+ sha256: f21d648349a318f4ae457ea5403d542ba6c0e0343b8642038523dd612b2a5064
+ md5: 3c3d02681058c3d206b562b2e3bc337f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - libgcc >=14
+ - openssl >=3.5.4,<4.0a0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 56230
+ timestamp: 1764593147526
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda
+ sha256: 926a5b9de0a586e88669d81de717c8dd3218c51ce55658e8a16af7e7fe87c833
+ md5: e36ad70a7e0b48f091ed6902f04c23b8
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 239605
+ timestamp: 1763585595898
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda
+ sha256: 1838bdc077b77168416801f4715335b65e9223f83641a2c28644f8acd8f9db0e
+ md5: f16f498641c9e05b645fe65902df661a
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 22278
+ timestamp: 1767790836624
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda
+ sha256: c6f910d400ef9034493988e8cd37bd4712e42d85921122bcda4ba68d4614b131
+ md5: 7bc920933e5fb225aba86a788164a8f1
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-compression >=0.3.2,<0.3.3.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 225868
+ timestamp: 1774270031584
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda
+ sha256: 38cfc8894db6729770ac18f900296c3f7c20f349a5586a8d8e1a62571fce61d5
+ md5: 77f70a9ab785a146dbf66fba00131403
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - aws-c-compression >=0.3.2,<0.3.3.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 225826
+ timestamp: 1774488399486
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda
+ sha256: e3e33031d641864128ab11f9b8585ad5beb82fa988fe833bb0767dd01878a371
+ md5: 14260392d0b491c537b5e26e9a506fff
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - s2n >=1.7.2,<1.7.3.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 181583
+ timestamp: 1777471132287
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda
+ sha256: c66ebb7815949db72bab7c86bf477197e4bc6937c381cf32248bdd1ce496db00
+ md5: dde6a3e4fe6bb2ecd2a7050dd1e701fb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - s2n >=1.7.1,<1.7.2.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 181624
+ timestamp: 1773868304737
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda
+ sha256: c15869656f5fbebe27cc5aa58b23831f75d85502d324fedd7ee7e552c79b495d
+ md5: 4c5c16bf1133dcfe100f33dd4470998e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-checksums >=0.2.10,<0.2.11.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - openssl >=3.5.5,<4.0a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 151340
+ timestamp: 1774282148690
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda
+ sha256: 4cecb4d595b7cf558087c37b8131cae5204b2c64d75f6b951dc3731d3f872bb8
+ md5: 50ae8372984b8b98e056ac8f6b70ab29
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-checksums >=0.2.10,<0.2.11.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - openssl >=3.5.6,<4.0a0
+ - aws-c-http >=0.10.13,<0.10.14.0a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 152657
+ timestamp: 1777824812393
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda
+ sha256: 9d62c5029f6f8219368a8665f0a549da572dc777f52413b7d75609cacdbc02cc
+ md5: c7e3e08b7b1b285524ab9d74162ce40b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 59383
+ timestamp: 1764610113765
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda
+ sha256: 09472dd5fa4473cffd44741ee4c1112f2c76d7168d1343de53c2ad283dc1efa6
+ md5: f8e1bcc5c7d839c5882e94498791be08
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 101435
+ timestamp: 1771063496927
+- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda
+ sha256: 74341b26a2b9475dc14ba3cf12432fcd10a23af285101883e720216d81d44676
+ md5: 83aa53cb3f5fc849851a84d777a60551
+ depends:
+ - ld_impl_linux-64 2.45.1 default_hbd61a6d_101
+ - sysroot_linux-64
+ - zstd >=1.5.7,<1.6.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 3744895
+ timestamp: 1770267152681
+- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda
+ sha256: 0a7d405064f53b9d91d92515f1460f7906ee5e8523f3cd8973430e81219f4917
+ md5: 8165352fdce2d2025bf884dc0ee85700
+ depends:
+ - ld_impl_linux-64 2.45.1 default_hbd61a6d_102
+ - sysroot_linux-64
+ - zstd >=1.5.7,<1.6.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 3661455
+ timestamp: 1774197460085
+- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda
+ sha256: 4826f97d33cbe54459970a1e84500dbe0cccf8326aaf370e707372ae20ec5a47
+ md5: dec96579f9a7035a59492bf6ee613b53
+ depends:
+ - binutils_impl_linux-64 2.45.1 default_hfdba357_101
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 36060
+ timestamp: 1770267177798
+- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda
+ sha256: 78a58d523d072b7f8e591b8f8572822e044b31764ed7e8d170392e7bc6d58339
+ md5: 2a307a17309d358c9b42afdd3199ddcc
+ depends:
+ - binutils_impl_linux-64 2.45.1 default_hfdba357_102
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 36304
+ timestamp: 1774197485247
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ sha256: e511644d691f05eb12ebe1e971fd6dc3ae55a4df5c253b4e1788b789bdf2dfa6
+ md5: 8ccf913aaba749a5496c17629d859ed1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - brotli-bin 1.2.0 hb03c661_1
+ - libbrotlidec 1.2.0 hb03c661_1
+ - libbrotlienc 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20103
+ timestamp: 1764017231353
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94
+ md5: af39b9a8711d4a8d437b52c1d78eb6a1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlidec 1.2.0 hb03c661_1
+ - libbrotlienc 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 21021
+ timestamp: 1764017221344
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
+ sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0
+ md5: 8910d2c46f7e7b519129f486e0fe927a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ constrains:
+ - libbrotlicommon 1.2.0 hb03c661_1
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/brotli?source=hash-mapping
+ size: 367376
+ timestamp: 1764017265553
+- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6
+ md5: d2ffd7602c02f2b316fd921d39876885
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 260182
+ timestamp: 1771350215188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
+ sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e
+ md5: 920bb03579f15389b9e512095ad995b7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 207882
+ timestamp: 1765214722852
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
+ sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e
+ md5: cf45f4278afd6f4e6d03eda0f435d527
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - pycparser
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/cffi?source=hash-mapping
+ size: 300271
+ timestamp: 1761203085220
+- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ sha256: b0314a7f1fb4a294b1a8bcf5481d4a8d9412a9fee23b7e3f93fb10e4d504f2cc
+ md5: 95bede9cdb7a30a4b611223d52a01aa4
+ depends:
+ - numpy >=1.25
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/contourpy?source=hash-mapping
+ size: 324013
+ timestamp: 1769155968691
+- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda
+ sha256: cf5f98a291c3a5489cb299bae38711d5dc21b88a00df981f3b1528781e18c909
+ md5: 78f547b78ace7541c4f54c4268ac9d2e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - tomli
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/coverage?source=compressed-mapping
+ size: 411308
+ timestamp: 1773761119353
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
+ sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45
+ md5: 503a94e20d2690d534d676a764a1852c
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 29138
+ timestamp: 1753975252445
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.2.78-ha770c72_0.conda
+ sha256: db0517510b960a14a0efd50881ea43954b27abdbbc782a60174872585ee4d207
+ md5: 2edadf855598e2f3e3e323d900fd27ab
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 30452
+ timestamp: 1776121224148
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
+ sha256: 57d1294ecfaf9dc8cdb5fc4be3e63ebc7614538bddb5de53cfd9b1b7de43aed5
+ md5: cb15315d19b58bd9cd424084e58ad081
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart_linux-64 12.9.79 h3f2d84a_0
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=13
+ - libstdcxx >=13
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 23242
+ timestamp: 1749218416505
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.2.75-hecca717_0.conda
+ sha256: 633bc9ba458a12a20a42776bf3fa25cecfddc65a22e4ed207fe09b9adcd9de58
+ md5: 9b7dcd83f8a965efcf7377dc54203619
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart_linux-64 13.2.75 h376f20c_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 24542
+ timestamp: 1776110472025
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda
+ sha256: 04d8235cb3cb3510c0492c3515a9d1a6053b50ef39be42b60cafb05044b5f4c6
+ md5: ba38a7c3b4c14625de45784b773f0c71
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart 12.9.79 h5888daf_0
+ - cuda-cudart-dev_linux-64 12.9.79 h3f2d84a_0
+ - cuda-cudart-static 12.9.79 h5888daf_0
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=13
+ - libstdcxx >=13
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 23687
+ timestamp: 1749218464010
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.2.75-hecca717_0.conda
+ sha256: c11c338b24c37ae05d39ae752a661b199c6530f2f189be1cc718b23485cd8626
+ md5: 145b05176a16bf8ffa64defccde19162
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart 13.2.75 hecca717_0
+ - cuda-cudart-dev_linux-64 13.2.75 h376f20c_0
+ - cuda-cudart-static 13.2.75 hecca717_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 25017
+ timestamp: 1776110522210
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
+ sha256: 6261e1d9af80e1ec308e3e5e2ff825d189ef922d24093beaf6efca12e67ce060
+ md5: d3c4ac48f4967f09dd910d9c15d40c81
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart-static_linux-64 12.9.79 h3f2d84a_0
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=13
+ - libstdcxx >=13
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 23283
+ timestamp: 1749218442382
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.2.75-hecca717_0.conda
+ sha256: bb55bbd1d5961953889abef8c1c2ec011eff0c4d3dd92f46d06fd4176285f430
+ md5: 42208a65f539b7dca4c900681649f599
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart-static_linux-64 13.2.75 h376f20c_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 24532
+ timestamp: 1776110498692
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
+ sha256: f7c5de6b1f0f463f73c78cc73439027cdd5cb94fb4ce099116969812973cabcb
+ md5: 02289b10ac97bac35ad1add086c5072a
+ depends:
+ - cuda-nvcc_linux-64 12.9.86.*
+ - gcc_linux-64
+ - gxx_linux-64
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 25472
+ timestamp: 1771619493470
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-13.2.78-hcdd1206_0.conda
+ sha256: cccfb670f1df05d877e5bda117f7904037980d43f54cc0466efb27130b02e660
+ md5: 08c7ce98e7422c620d653b8dd0b860bc
+ depends:
+ - cuda-nvcc_linux-64 13.2.78.*
+ - gcc_linux-64
+ - gxx_linux-64
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 25484
+ timestamp: 1776142712078
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
+ sha256: 961cf20d411b7685cd744e6c6ed35efea547d095c62151d6f3053d9931bb994d
+ md5: 67458d2685e7503933efa550f3ee40f3
+ depends:
+ - cuda-cudart >=12.9.79,<13.0a0
+ - cuda-cudart-dev
+ - cuda-nvcc-dev_linux-64 12.9.86 he91c749_2
+ - cuda-nvcc-tools 12.9.86 he02047a_2
+ - cuda-nvvm-impl 12.9.86 h4bc722e_2
+ - cuda-version >=12.9,<12.10.0a0
+ - libnvptxcompiler-dev 12.9.86 ha770c72_2
+ constrains:
+ - gcc_impl_linux-64 >=6,<15.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27215
+ timestamp: 1753975546846
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-13.2.78-h85509e4_0.conda
+ sha256: b72a26f00d79592e018228b460539d98c8d1fceefcd68ac4d38dbd7b352b9c48
+ md5: 4b65d9b967d7814742a7f62052872a7c
+ depends:
+ - cuda-cudart >=13.2.75,<14.0a0
+ - cuda-cudart-dev
+ - cuda-nvcc-dev_linux-64 13.2.78 he91c749_0
+ - cuda-nvcc-tools 13.2.78 he02047a_0
+ - cuda-nvvm-impl 13.2.78 h4bc722e_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libnvptxcompiler-dev 13.2.78 ha770c72_0
+ constrains:
+ - gcc_impl_linux-64 >=6,<16.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 28552
+ timestamp: 1776121483085
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
+ sha256: 0e849be7b5e4832ca218ec2c48a9ba3a15a984f629e2e54f38a53f4f57220341
+ md5: dc256c9864c2e8e9c817fbca1c84a4bc
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-crt-tools 12.9.86 ha770c72_2
+ - cuda-nvvm-tools 12.9.86 h4bc722e_2
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=12
+ - libstdcxx >=12
+ constrains:
+ - gcc_impl_linux-64 >=6,<15.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27380012
+ timestamp: 1753975454194
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.2.78-he02047a_0.conda
+ sha256: 31d97d74c7c81c22efe5b6d223df6ce6bb2a9c33ce50a6746191002b56a4deb2
+ md5: 542607fe8f59653d0f22363c6fe9a689
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-crt-tools 13.2.78 ha770c72_0
+ - cuda-nvvm-tools 13.2.78 h4bc722e_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=12
+ - libstdcxx >=12
+ constrains:
+ - gcc_impl_linux-64 >=6,<16.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 34050410
+ timestamp: 1776121396530
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda
+ sha256: c506221dafb7cfd081f7d12d01d8e8ab9b29adfcc7d69d61fedd3232174e4016
+ md5: 359d05bc3ec5d3a467eb558e3844aea2
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart-dev_linux-64 12.9.*
+ - cuda-driver-dev_linux-64 12.9.*
+ - cuda-nvcc-dev_linux-64 12.9.86.*
+ - cuda-nvcc-impl 12.9.86.*
+ - cuda-nvcc-tools 12.9.86.*
+ - sysroot_linux-64 >=2.17,<3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27575
+ timestamp: 1771619492974
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-13.2.78-hb2fc203_0.conda
+ sha256: 03239914b7f53a2aed3fcc9f6b8b0c7b06b6b85341636d191b62aa439a43a091
+ md5: 230423a2b6214c07c6d415976a96bc94
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-cudart-dev_linux-64 13.2.*
+ - cuda-driver-dev_linux-64 13.2.*
+ - cuda-nvcc-dev_linux-64 13.2.78.*
+ - cuda-nvcc-impl 13.2.78.*
+ - cuda-nvcc-tools 13.2.78.*
+ - sysroot_linux-64 >=2.17,<3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27594
+ timestamp: 1776142711212
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
+ sha256: f4d34556174e4faa9d374ba2244707082870e1bbc1bb441ad3d9d2cea37da6af
+ md5: 82125dd3c0c4aa009faa00e2829b93d8
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=12
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 21425520
+ timestamp: 1753975283188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.2.78-h4bc722e_0.conda
+ sha256: 944d132f61f240131abff67646da4040ae585a1f43c6b38fabebb6cc075a7c16
+ md5: 5e1021b4c73e795deabbf35ed1317dcb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=12
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 22205958
+ timestamp: 1776121258973
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
+ sha256: 45f5e881ed0d973132a5475a0b5c066db6e748ef3a831a14dba8374b252e0067
+ md5: f9af26e4079adcd72688a8e8dbecb229
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=12
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 24246736
+ timestamp: 1753975332907
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.2.78-h4bc722e_0.conda
+ sha256: 57636a84b88434c4aca3a3585ee9bb9eb7da6d4a53c3ad034b33f03bd8838f08
+ md5: 1b3e427ba98cd5d2a4df1c0e9f573023
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=12
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 25988023
+ timestamp: 1776121296869
+- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda
+ sha256: d9e89e351d7189c41615cfceca76b3bcacaa9c81d9945ac1caa6fb9e5184f610
+ md5: 57e6fad901c05754d5256fe3ab9f277b
+ depends:
+ - python
+ - libgcc >=14
+ - libstdcxx >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/debugpy?source=hash-mapping
+ size: 2886804
+ timestamp: 1769744977998
+- conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda
+ sha256: f71eae7dc8ff9392d225d2d529691b2db16289b7d8009646eeb1adf0caf3937b
+ md5: 6da1f998c8ea85ba7692afbb5db72fb9
+ depends:
+ - libgcc >=14
+ - libstdcxx >=14
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ - libsqlite >=3.51.1,<4.0a0
+ - libmicrohttpd >=1.0.2,<1.1.0a0
+ - libarchive >=3.8.2,<3.9.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - bzip2 >=1.0.8,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ - libcurl >=8.17.0,<9.0a0
+ license: LGPL-3.0-only
+ license_family: LGPL
+ purls: []
+ size: 1289929
+ timestamp: 1765447425767
+- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ sha256: 36857701b46828b6760c3c1652414ee504e7fc12740261ac6fcff3959b72bd7a
+ md5: eeec961fec28e747e1e1dc0446277452
+ depends:
+ - libfreetype 2.14.2 ha770c72_0
+ - libfreetype6 2.14.2 h73754d4_0
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 174292
+ timestamp: 1772757205296
+- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda
+ sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b
+ md5: 8462b5322567212beeb025f3519fb3e2
+ depends:
+ - libfreetype 2.14.3 ha770c72_0
+ - libfreetype6 2.14.3 h73754d4_0
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 173839
+ timestamp: 1774298173462
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda
+ sha256: 3b31a273b806c6851e16e9cf63ef87cae28d19be0df148433f3948e7da795592
+ md5: 30bb690150536f622873758b0e8d6712
+ depends:
+ - binutils_impl_linux-64 >=2.45
+ - libgcc >=14.3.0
+ - libgcc-devel_linux-64 14.3.0 hf649bbc_118
+ - libgomp >=14.3.0
+ - libsanitizer 14.3.0 h8f1669f_18
+ - libstdcxx >=14.3.0
+ - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118
+ - sysroot_linux-64
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 76302378
+ timestamp: 1771378056505
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda
+ sha256: a48400ec4b73369c1c59babe4ad35821b63a88bba0ec40a80cea5f8c53a26b83
+ md5: e3be72048d3c4a78b8e27ec48ba06252
+ depends:
+ - binutils_impl_linux-64 >=2.45
+ - libgcc >=15.2.0
+ - libgcc-devel_linux-64 15.2.0 hcc6f6b0_119
+ - libgomp >=15.2.0
+ - libsanitizer 15.2.0 h90f66d4_19
+ - libstdcxx >=15.2.0
+ - libstdcxx-devel_linux-64 15.2.0 hd446a21_119
+ - sysroot_linux-64
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 81180457
+ timestamp: 1778269124617
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda
+ sha256: 27ad0cd10dccffca74e20fb38c9f8643ff8fce56eee260bf89fa257d5ab0c90a
+ md5: 1403ed5fe091bd7442e4e8a229d14030
+ depends:
+ - gcc_impl_linux-64 14.3.0.*
+ - binutils_linux-64
+ - sysroot_linux-64
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 28946
+ timestamp: 1770908213807
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_24.conda
+ sha256: 7e1a77123819f9e6c15439df9a987c66235c53e4c6d12a9ab3cea883258214df
+ md5: 81f96ca8673107e2da4a6b9e3807cf74
+ depends:
+ - gcc_impl_linux-64 15.2.0.*
+ - binutils_linux-64
+ - sysroot_linux-64
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 29081
+ timestamp: 1777144726741
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
+ sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c
+ md5: c94a5994ef49749880a8139cf9afcbe1
+ depends:
+ - libgcc-ng >=12
+ - libstdcxx-ng >=12
+ license: GPL-2.0-or-later OR LGPL-3.0-or-later
+ purls: []
+ size: 460055
+ timestamp: 1718980856608
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.11-h18acefa_1.conda
+ sha256: c1e0ec25221c132fcee81098a23f956f3c26302739086d99e9119ab5546b05fe
+ md5: 334367662a82dfe67945438e373a1d3b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - gmp >=6.3.0,<7.0a0
+ - libgcc >=14
+ - libidn2 >=2,<3.0a0
+ - libstdcxx >=14
+ - libtasn1 >=4.21.0,<5.0a0
+ - nettle >=3.10.1,<3.11.0a0
+ - p11-kit >=0.26.0,<0.27.0a0
+ license: LGPL-2.1-or-later
+ license_family: LGPL
+ purls: []
+ size: 2030992
+ timestamp: 1768686277371
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda
+ sha256: dbdbb714064914281c755650bc54e1855412e7e2f4c99ad171b5123ed704b2b1
+ md5: 7c3de21891993e89aabdadaa603ed835
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - gmp >=6.3.0,<7.0a0
+ - libgcc >=14
+ - libidn2 >=2,<3.0a0
+ - libstdcxx >=14
+ - libtasn1 >=4.21.0,<5.0a0
+ - nettle >=3.10.1,<3.11.0a0
+ - p11-kit >=0.26.2,<0.27.0a0
+ license: LGPL-2.1-or-later
+ license_family: LGPL
+ purls: []
+ size: 2054535
+ timestamp: 1778044634746
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
+ sha256: 38ffca57cc9c264d461ac2ce9464a9d605e0f606d92d831de9075cb0d95fc68a
+ md5: 6514b3a10e84b6a849e1b15d3753eb22
+ depends:
+ - gcc_impl_linux-64 14.3.0 hbdf3cc3_18
+ - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118
+ - sysroot_linux-64
+ - tzdata
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 14566100
+ timestamp: 1771378271421
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda
+ sha256: 3f5288346b9fe233352443b3c2e31f1fde845e39d3e96475fc05ec2e782af158
+ md5: 9d41f3899b512199af0a4bb939b83e21
+ depends:
+ - gcc_impl_linux-64 15.2.0 he0086c7_19
+ - libstdcxx-devel_linux-64 15.2.0 hd446a21_119
+ - sysroot_linux-64
+ - tzdata
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 16356816
+ timestamp: 1778269332159
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda
+ sha256: 1e07c197e0779fa9105e59cd55a835ded96bfde59eb169439736a89b27b48e5d
+ md5: 7b51f4ff82eeb1f386bfee20a7bed3ed
+ depends:
+ - gxx_impl_linux-64 14.3.0.*
+ - gcc_linux-64 ==14.3.0 h298d278_21
+ - binutils_linux-64
+ - sysroot_linux-64
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 27503
+ timestamp: 1770908213813
+- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-he30e93d_24.conda
+ sha256: 9b40af502e2471ceff9a04a860165d8a6fac659c07dc115ed8357e1a77e2cbe7
+ md5: 0787df5104bd63d2186dd3902244e7c3
+ depends:
+ - gxx_impl_linux-64 15.2.0.*
+ - gcc_linux-64 ==15.2.0 h7be306e_24
+ - binutils_linux-64
+ - sysroot_linux-64
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 27602
+ timestamp: 1777144726741
+- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda
+ sha256: 48e18f20bc1ff15433299dd77c20a4160eb29572eea799ae5a73632c6c3d7dfd
+ md5: d93afa30018997705dd04513eeb5ac0f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cached-property
+ - hdf5 >=2.1.0,<3.0a0
+ - libgcc >=14
+ - numpy >=1.23,<3
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/h5py?source=hash-mapping
+ size: 1345557
+ timestamp: 1775581268685
+- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda
+ sha256: beb8a2fb18924ca7b5b82cfb50f008f882f577daef2c00ed88022abea35fec76
+ md5: 0d0595612fa229dddb5fc565c260a11f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.13,<0.10.14.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-s3 >=0.12.2,<0.12.3.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - libaec >=1.1.5,<2.0a0
+ - libcurl >=8.20.0,<9.0a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - libstdcxx >=14
+ - libzlib >=1.3.2,<2.0a0
+ - openssl >=3.5.6,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 4713397
+ timestamp: 1777861887131
+- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda
+ sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235
+ md5: 1d92558abd05cea0577f83a5eca38733
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-s3 >=0.11.5,<0.11.6.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - libaec >=1.1.5,<2.0a0
+ - libcurl >=8.19.0,<9.0a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - libstdcxx >=14
+ - libzlib >=1.3.2,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 4138489
+ timestamp: 1775243967708
+- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a
+ md5: c80d8a3b84358cb967fa81e7075fbc8a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: MIT
+ purls: []
+ size: 12723451
+ timestamp: 1773822285671
+- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4
+ md5: b38117a3c920364aff79f870c984b4a3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 134088
+ timestamp: 1754905959823
+- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ sha256: e3488ea4a336f29e57de8f282bf40c0505cfc482e03004615e694b48e7d9c79f
+ md5: 7397e418cab519b8d789936cf2dde6f6
+ depends:
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/kiwisolver?source=compressed-mapping
+ size: 77363
+ timestamp: 1773067048780
+- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25
+ md5: fb53fb07ce46a575c5d004bbc96032c2
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - keyutils >=1.6.3,<2.0a0
+ - libedit >=3.1.20250104,<3.2.0a0
+ - libedit >=3.1.20250104,<4.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - openssl >=3.5.5,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 1386730
+ timestamp: 1769769569681
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a
+ md5: 6f2e2c8f58160147c4d1c6f4c14cbac4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 249959
+ timestamp: 1768184673131
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda
+ sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8
+ md5: f92f984b558e6e6204014b16d212b271
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.4.1,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 251086
+ timestamp: 1778079286384
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3
+ md5: 12bd9a3f089ee6c9266a37dab82afabd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - zstd >=1.5.7,<1.6.0a0
+ constrains:
+ - binutils_impl_linux-64 2.45.1
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 725507
+ timestamp: 1770267139900
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
+ sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c
+ md5: 18335a698559cdbcd86150a48bf54ba6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - zstd >=1.5.7,<1.6.0a0
+ constrains:
+ - binutils_impl_linux-64 2.45.1
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 728002
+ timestamp: 1774197446916
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1
+ md5: a752488c68f2e7c456bcbd8f16eec275
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 261513
+ timestamp: 1773113328888
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688
+ md5: 86f7414544ae606282352fa1e116b41f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 36544
+ timestamp: 1769221884824
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
+ sha256: 69ea8da58658ad26cb64fb0bfccd8a3250339811f0b57c6b8a742e5e51bacf70
+ md5: 981d372c31a23e1aa9965d4e74d085d5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - libgcc >=14
+ - liblzma >=5.8.2,<6.0a0
+ - libxml2
+ - libxml2-16 >=2.14.6
+ - libzlib >=1.3.1,<2.0a0
+ - lz4-c >=1.10.0,<1.11.0a0
+ - lzo >=2.10,<3.0a0
+ - openssl >=3.5.5,<4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 887139
+ timestamp: 1773243188979
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_100.conda
+ sha256: 2071a3eb03a868effef273eee8bb7baed6ee9fb2fb94421e9958dcf48ab2c599
+ md5: dbeb5c8321cb2408d406a3da16a0ff0d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - libgcc >=14
+ - liblzma >=5.8.3,<6.0a0
+ - libxml2
+ - libxml2-16 >=2.14.6
+ - libzlib >=1.3.2,<2.0a0
+ - lz4-c >=1.10.0,<1.11.0a0
+ - lzo >=2.10,<3.0a0
+ - openssl >=3.5.6,<4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 891114
+ timestamp: 1776096017113
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ build_number: 5
+ sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c
+ md5: c160954f7418d7b6e87eaf05a8913fa9
+ depends:
+ - libopenblas >=0.3.30,<0.3.31.0a0
+ - libopenblas >=0.3.30,<1.0a0
+ constrains:
+ - mkl <2026
+ - liblapack 3.11.0 5*_openblas
+ - libcblas 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - liblapacke 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18213
+ timestamp: 1765818813880
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda
+ build_number: 6
+ sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6
+ md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e
+ depends:
+ - libopenblas >=0.3.32,<0.3.33.0a0
+ - libopenblas >=0.3.32,<1.0a0
+ constrains:
+ - blas 2.306 openblas
+ - liblapack 3.11.0 6*_openblas
+ - liblapacke 3.11.0 6*_openblas
+ - libcblas 3.11.0 6*_openblas
+ - mkl <2026
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18621
+ timestamp: 1774503034895
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e
+ md5: 72c8fd1af66bd67bf580645b426513ed
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 79965
+ timestamp: 1764017188531
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b
+ md5: 366b40a69f0ad6072561c1d09301c886
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlicommon 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 34632
+ timestamp: 1764017199083
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d
+ md5: 4ffbb341c8b616aa2494b6afb26a0c5f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlicommon 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 298378
+ timestamp: 1764017210931
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ build_number: 5
+ sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8
+ md5: 6636a2b6f1a87572df2970d3ebc87cc0
+ depends:
+ - libblas 3.11.0 5_h4a7cf45_openblas
+ constrains:
+ - liblapacke 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - liblapack 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18194
+ timestamp: 1765818837135
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda
+ build_number: 6
+ sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374
+ md5: 36ae340a916635b97ac8a0655ace2a35
+ depends:
+ - libblas 3.11.0 6_h4a7cf45_openblas
+ constrains:
+ - blas 2.306 openblas
+ - liblapack 3.11.0 6*_openblas
+ - liblapacke 3.11.0 6*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18622
+ timestamp: 1774503050205
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda
+ sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4
+ md5: d50608c443a30c341c24277d28290f76
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=14
+ - libnghttp2 >=1.67.0,<2.0a0
+ - libssh2 >=1.11.1,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: curl
+ license_family: MIT
+ purls: []
+ size: 466704
+ timestamp: 1773218522665
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda
+ sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb
+ md5: c3cc2864f82a944bc90a7beb4d3b0e88
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=14
+ - libnghttp2 >=1.68.1,<2.0a0
+ - libssh2 >=1.11.1,<2.0a0
+ - libzlib >=1.3.2,<2.0a0
+ - openssl >=3.5.6,<4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: curl
+ license_family: MIT
+ purls: []
+ size: 468706
+ timestamp: 1777461492876
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680
+ md5: 6c77a605a7a689d17d4819c0f8ac9a00
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 73490
+ timestamp: 1761979956660
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724
+ md5: c277e0a4d549b03ac1e9d6cbbe3d017b
+ depends:
+ - ncurses
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - ncurses >=6.5,<7.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 134676
+ timestamp: 1738479519902
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
+ sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4
+ md5: 172bf1cd1ff8629f2b1179945ed45055
+ depends:
+ - libgcc-ng >=12
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 112766
+ timestamp: 1702146165126
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5
+ md5: e7f7ce06ec24cfcfb9e36d28cf82ba57
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - expat 2.7.4.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 76798
+ timestamp: 1771259418166
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda
+ sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12
+ md5: a3b390520c563d78cc58974de95a03e5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - expat 2.8.0.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 77241
+ timestamp: 1777846112704
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6
+ md5: a360c33a5abe61c07959e449fa1453eb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 58592
+ timestamp: 1769456073053
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ sha256: 2e1bfe1e856eb707d258f669ef6851af583ceaffab5e64821b503b0f7cd09e9e
+ md5: 26c746d14402a3b6c684d045b23b9437
+ depends:
+ - libfreetype6 >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 8035
+ timestamp: 1772757210108
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda
+ sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2
+ md5: e289f3d17880e44b633ba911d57a321b
+ depends:
+ - libfreetype6 >=2.14.3
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 8049
+ timestamp: 1774298163029
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ sha256: aba65b94bdbed52de17ec3d0c6f2ebac2ef77071ad22d6900d1614d0dd702a0c
+ md5: 8eaba3d1a4d7525c6814e861614457fd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpng >=1.6.55,<1.7.0a0
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - freetype >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 386316
+ timestamp: 1772757193822
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda
+ sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d
+ md5: fb16b4b69e3f1dcfe79d80db8fd0c55d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpng >=1.6.55,<1.7.0a0
+ - libzlib >=1.3.2,<2.0a0
+ constrains:
+ - freetype >=2.14.3
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 384575
+ timestamp: 1774298162622
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5
+ md5: 0aa00f03f9e39fb9876085dee11a85d4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ constrains:
+ - libgcc-ng ==15.2.0=*_18
+ - libgomp 15.2.0 he0feb66_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 1041788
+ timestamp: 1771378212382
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
+ sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46
+ md5: 57736f29cc2b0ec0b6c2952d3f101b6a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ constrains:
+ - libgcc-ng ==15.2.0=*_19
+ - libgomp 15.2.0 he0feb66_19
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 1041084
+ timestamp: 1778269013026
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893
+ md5: d5e96b1ed75ca01906b3d2469b4ce493
+ depends:
+ - libgcc 15.2.0 he0feb66_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27526
+ timestamp: 1771378224552
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
+ sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98
+ md5: 331ee9b72b9dff570d56b1302c5ab37d
+ depends:
+ - libgcc 15.2.0 he0feb66_19
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27694
+ timestamp: 1778269016987
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee
+ md5: 9063115da5bc35fdc3e1002e69b9ef6e
+ depends:
+ - libgfortran5 15.2.0 h68bc16d_18
+ constrains:
+ - libgfortran-ng ==15.2.0=*_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27523
+ timestamp: 1771378269450
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
+ sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f
+ md5: 42bf7eca1a951735fa06c0e3c0d5c8e6
+ depends:
+ - libgfortran5 15.2.0 h68bc16d_19
+ constrains:
+ - libgfortran-ng ==15.2.0=*_19
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27655
+ timestamp: 1778269042954
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12
+ md5: 646855f357199a12f02a87382d429b75
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=15.2.0
+ constrains:
+ - libgfortran 15.2.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 2482475
+ timestamp: 1771378241063
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
+ sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4
+ md5: 85072b0ad177c966294f129b7c04a2d5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=15.2.0
+ constrains:
+ - libgfortran 15.2.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 2483673
+ timestamp: 1778269025089
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110
+ md5: 239c5e9546c38a1e884d69effcf4c882
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 603262
+ timestamp: 1771378117851
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
+ sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b
+ md5: faac990cb7aedc7f3a2224f2c9b0c26c
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 603817
+ timestamp: 1778268942614
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f
+ md5: 915f5995e94f60e9a4826e0b0920ee88
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: LGPL-2.1-only
+ purls: []
+ size: 790176
+ timestamp: 1754908768807
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda
+ sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065
+ md5: 842a81de672ddcf476337c8bde3cad33
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libunistring >=0,<1.0a0
+ license: LGPL-2.0-only
+ license_family: LGPL
+ purls: []
+ size: 139036
+ timestamp: 1760385590993
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32
+ md5: 8397539e3a0bbd1695584fb4f927485a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - jpeg <0.0.0a
+ license: IJG AND BSD-3-Clause AND Zlib
+ purls: []
+ size: 633710
+ timestamp: 1762094827865
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda
+ sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256
+ md5: 6178c6f2fb254558238ef4e6c56fb782
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - jpeg <0.0.0a
+ license: IJG AND BSD-3-Clause AND Zlib
+ purls: []
+ size: 633831
+ timestamp: 1775962768273
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ build_number: 5
+ sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053
+ md5: b38076eb5c8e40d0106beda6f95d7609
+ depends:
+ - libblas 3.11.0 5_h4a7cf45_openblas
+ constrains:
+ - blas 2.305 openblas
+ - liblapacke 3.11.0 5*_openblas
+ - libcblas 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18200
+ timestamp: 1765818857876
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda
+ build_number: 6
+ sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d
+ md5: 881d801569b201c2e753f03c84b85e15
+ depends:
+ - libblas 3.11.0 6_h4a7cf45_openblas
+ constrains:
+ - blas 2.306 openblas
+ - liblapacke 3.11.0 6*_openblas
+ - libcblas 3.11.0 6*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18624
+ timestamp: 1774503065378
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb
+ md5: c7c83eecbb72d88b940c249af56c8b17
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - xz 5.8.2.*
+ license: 0BSD
+ purls: []
+ size: 113207
+ timestamp: 1768752626120
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
+ sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d
+ md5: b88d90cad08e6bc8ad540cb310a761fb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - xz 5.8.3.*
+ license: 0BSD
+ purls: []
+ size: 113478
+ timestamp: 1775825492909
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda
+ sha256: 6b21e0f3d1577bbe10f27003212f0b8c9a881d99faa01a83476311730aed5c9d
+ md5: a02cb80c806b7b768e1d60170f63375d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - gnutls >=3.8.9,<3.9.0a0
+ license: LGPL-2.0-or-later
+ license_family: LGPL
+ purls: []
+ size: 286166
+ timestamp: 1752566614604
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843
+ md5: 2c21e66f50753a083cbe6b80f38268fa
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 92400
+ timestamp: 1769482286018
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
+ sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690
+ md5: b499ce4b026493a13774bcf0f4c33849
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - c-ares >=1.34.5,<2.0a0
+ - libev >=4.33,<4.34.0a0
+ - libev >=4.33,<5.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.2,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 666600
+ timestamp: 1756834976695
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
+ sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f
+ md5: 2a45e7f8af083626f009645a6481f12d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - c-ares >=1.34.6,<2.0a0
+ - libev >=4.33,<4.34.0a0
+ - libev >=4.33,<5.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 663344
+ timestamp: 1773854035739
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
+ sha256: 1e7a7b34f8639a5feb75ba864127059e4d83edfe1a516547f0dbb9941e7b8f8b
+ md5: 3fd926c321c6dbf386aa14bd8b125bfb
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27046
+ timestamp: 1753975516342
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.2.78-ha770c72_0.conda
+ sha256: 1ee47ea506cfacd6c06fd09afb229c68d8925c5342a40fa40d54682ae6216021
+ md5: 009ab9d572c1fe55cc952600acfcacf8
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ - libnvptxcompiler-dev_linux-64 13.2.78 ha770c72_0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 28437
+ timestamp: 1776121449699
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5
+ md5: be43915efc66345cccb3c310b6ed0374
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ constrains:
+ - openblas >=0.3.30,<0.3.31.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 5927939
+ timestamp: 1763114673331
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda
+ sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9
+ md5: 89d61bc91d3f39fda0ca10fcd3c68594
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ constrains:
+ - openblas >=0.3.32,<0.3.33.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 5928890
+ timestamp: 1774471724897
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c
+ md5: 5f13ffc7d30ffec87864e678df9957b4
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ license: zlib-acknowledgement
+ purls: []
+ size: 317669
+ timestamp: 1770691470744
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda
+ sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89
+ md5: eba48a68a1a2b9d3c0d9511548db85db
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libzlib >=1.3.2,<2.0a0
+ license: zlib-acknowledgement
+ purls: []
+ size: 317729
+ timestamp: 1776315175087
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda
+ sha256: e03ed186eefb46d7800224ad34bad1268c9d19ecb8f621380a50601c6221a4a7
+ md5: ad3a0e2dc4cce549b2860e2ef0e6d75b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14.3.0
+ - libstdcxx >=14.3.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 7949259
+ timestamp: 1771377982207
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda
+ sha256: 7a58892a52739ce4c0f7109de9e91b4353104748eb04fc6441d88e8af444ba99
+ md5: 67eef12ce33f7ff99900c212d7076fc2
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=15.2.0
+ - libstdcxx >=15.2.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 7930689
+ timestamp: 1778269054623
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda
+ sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97
+ md5: 7af961ef4aa2c1136e11dd43ded245ab
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ license: ISC
+ purls: []
+ size: 277661
+ timestamp: 1772479381288
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993
+ md5: fd893f6a3002a635b5e50ceb9dd2c0f4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 951405
+ timestamp: 1772818874251
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda
+ sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d
+ md5: 7dc38adcbf71e6b38748e919e16e0dce
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libzlib >=1.3.2,<2.0a0
+ license: blessing
+ purls: []
+ size: 954962
+ timestamp: 1777986471789
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda
+ sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661
+ md5: eecce068c7e4eddeb169591baac20ac4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.0,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 304790
+ timestamp: 1745608545575
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e
+ md5: 1b08cd684f34175e4514474793d44bcb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc 15.2.0 he0feb66_18
+ constrains:
+ - libstdcxx-ng ==15.2.0=*_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 5852330
+ timestamp: 1771378262446
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
+ sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc
+ md5: 5794b3bdc38177caf969dabd3af08549
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc 15.2.0 he0feb66_19
+ constrains:
+ - libstdcxx-ng ==15.2.0=*_19
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 5852044
+ timestamp: 1778269036376
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145
+ md5: 6235adb93d064ecdf3d44faee6f468de
+ depends:
+ - libstdcxx 15.2.0 h934c35e_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27575
+ timestamp: 1771378314494
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
+ sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9
+ md5: e5ce228e579726c07255dbf90dc62101
+ depends:
+ - libstdcxx 15.2.0 h934c35e_19
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27776
+ timestamp: 1778269074600
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda
+ sha256: a3f0c33ef567eb2e3a22d7fea0717a294a5fea4964478aa06b467ce1c93bec38
+ md5: 0ffe6217a3d09398155d32a2ddb41251
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 116738
+ timestamp: 1768297813301
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0
+ md5: cd5a90476766d53e901500df9215e927
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - lerc >=4.0.0,<5.0a0
+ - libdeflate >=1.25,<1.26.0a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.0,<4.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libstdcxx >=14
+ - libwebp-base >=1.6.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: HPND
+ purls: []
+ size: 435273
+ timestamp: 1762022005702
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2
+ sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d
+ md5: 7245a044b4a1980ed83196176b78b73a
+ depends:
+ - libgcc-ng >=9.3.0
+ license: GPL-3.0-only OR LGPL-3.0-only
+ purls: []
+ size: 1433436
+ timestamp: 1626955018689
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda
+ sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a
+ md5: e179a69edd30d75c0144d7a380b88f28
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 75995
+ timestamp: 1757032240102
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee
+ md5: db409b7c1720428638e7c0d509d3e1b5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 40311
+ timestamp: 1766271528534
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda
+ sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829
+ md5: 38ffe67b78c9d4de527be8315e5ada2c
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 40297
+ timestamp: 1775052476770
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b
+ md5: aea31d2e5b1091feca96fcfe945c3cf9
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - libwebp 1.6.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 429011
+ timestamp: 1752159441324
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa
+ md5: 92ed62436b625154323d40d5f2f11dd7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - pthread-stubs
+ - xorg-libxau >=1.0.11,<2.0a0
+ - xorg-libxdmcp
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 395888
+ timestamp: 1727278577118
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
+ sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c
+ md5: f3bc152cb4f86babe30f3a4bf0dbef69
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - libxml2 2.15.2
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 557492
+ timestamp: 1772704601644
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
+ sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a
+ md5: e79d2c2f24b027aa8d5ab1b1ba3061e7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.3,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.3,<6.0a0
+ - libzlib >=1.3.2,<2.0a0
+ constrains:
+ - libxml2 2.15.3
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 559775
+ timestamp: 1776376739004
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
+ sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392
+ md5: e49238a1609f9a4a844b09d9926f2c3d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libxml2-16 2.15.2 hca6bf5a_0
+ - libzlib >=1.3.1,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 45968
+ timestamp: 1772704614539
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
+ sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba
+ md5: 995d8c8bad2a3cc8db14675a153dec2b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.3,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.3,<6.0a0
+ - libxml2-16 2.15.3 hca6bf5a_0
+ - libzlib >=1.3.2,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 46810
+ timestamp: 1776376751152
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9
+ md5: d87ff7921124eccd67248aa483c23fec
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ constrains:
+ - zlib 1.3.2 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 63629
+ timestamp: 1774072609062
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346
+ md5: 9de5350a85c4a20c685259b889aa6393
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libstdcxx >=13
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 167055
+ timestamp: 1733741040117
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda
+ sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4
+ md5: 45161d96307e3a447cc3eb5896cf6f8c
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ license: GPL-2.0-or-later
+ license_family: GPL
+ purls: []
+ size: 191060
+ timestamp: 1753889274283
+- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
+ sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf
+ md5: 9a17c4307d23318476d7fbf0fedc0cde
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ constrains:
+ - jinja2 >=3.0.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/markupsafe?source=hash-mapping
+ size: 27424
+ timestamp: 1772445227915
+- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ sha256: ee773261fbd6c76fc8174b0e4e1ce272b0bbaa56610f130e9d3d1f575106f04f
+ md5: b8683e6068099b69c10dbfcf7204203f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - contourpy >=1.0.1
+ - cycler >=0.10
+ - fonttools >=4.22.0
+ - freetype
+ - kiwisolver >=1.3.1
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libgcc >=14
+ - libstdcxx >=14
+ - numpy >=1.23
+ - numpy >=1.23,<3
+ - packaging >=20.0
+ - pillow >=8
+ - pyparsing >=2.3.1
+ - python >=3.14,<3.15.0a0
+ - python-dateutil >=2.7
+ - python_abi 3.14.* *_cp314
+ - qhull >=2020.2,<2020.3.0a0
+ - tk >=8.6.13,<8.7.0a0
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/matplotlib?source=hash-mapping
+ size: 8473358
+ timestamp: 1763055439346
+- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda
+ sha256: 94599b0ca937530f7c7ba1e394cbe8420db613da2524bd0000988e9bbe118f0a
+ md5: 11a821746ad11e642fcc615c3d66aa44
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - contourpy >=1.0.1
+ - cycler >=0.10
+ - fonttools >=4.22.0
+ - freetype
+ - kiwisolver >=1.3.1
+ - libfreetype >=2.14.3
+ - libfreetype6 >=2.14.3
+ - libgcc >=14
+ - libstdcxx >=14
+ - numpy >=1.23
+ - numpy >=1.23,<3
+ - packaging >=20.0
+ - pillow >=8
+ - pyparsing >=2.3.1
+ - python >=3.14,<3.15.0a0
+ - python-dateutil >=2.7
+ - python_abi 3.14.* *_cp314
+ - qhull >=2020.2,<2020.3.0a0
+ - tk >=8.6.13,<8.7.0a0
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/matplotlib?source=hash-mapping
+ size: 8545652
+ timestamp: 1777000575998
+- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.2-py314hef15ded_0.conda
+ sha256: 575b877b4ad4f93c44532e99b4dd8fe402ce34bff63f87b420f141e81f647de6
+ md5: 2951224e244e0e4a27e2c4b24b76ffba
+ depends:
+ - python
+ - rich >=11.2.0
+ - jinja2
+ - textual >=0.34.0
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - lz4-c >=1.10.0,<1.11.0a0
+ - python_abi 3.14.* *_cp314
+ - libunwind >=1.8.3,<1.9.0a0
+ - elfutils >=0.194,<0.195.0a0
+ license: Apache-2.0 AND BSD-3-Clause
+ purls:
+ - pkg:pypi/memray?source=hash-mapping
+ size: 1845157
+ timestamp: 1773493681427
+- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py314hef15ded_0.conda
+ sha256: 729c193d71291cfc24db8161199ed9f3508579f1b2b7eb250f25cbf903dd58d9
+ md5: b2ace6799650355733a5eab297301940
+ depends:
+ - python
+ - rich >=11.2.0
+ - jinja2
+ - textual >=0.34.0
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - elfutils >=0.194,<0.195.0a0
+ - libunwind >=1.8.3,<1.9.0a0
+ - python_abi 3.14.* *_cp314
+ - lz4-c >=1.10.0,<1.11.0a0
+ license: Apache-2.0 AND BSD-3-Clause
+ purls:
+ - pkg:pypi/memray?source=hash-mapping
+ size: 1849063
+ timestamp: 1775683239172
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586
+ md5: 47e340acb35de30501a76c7c799c41d7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 891641
+ timestamp: 1738195959188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
+ sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3
+ md5: fc21868a1a5aacc937e7a18747acb8a5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 918956
+ timestamp: 1777422145199
+- conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h4a9d5aa_0.conda
+ sha256: 00b5a5e394d58cff5b08e0082699e773dd41995130bc14747740a16d9cacdd2c
+ md5: 618bf3007df69a0ca9306ed8d6b48b48
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - gmp >=6.3.0,<7.0a0
+ license: GPL-2.0-or-later OR LGPL-3.0-or-later
+ purls: []
+ size: 1047686
+ timestamp: 1748012178395
+- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda
+ sha256: 1d8377c8001c15ed12c2713b723213474b435706ab9d34ede69795d64af9e94d
+ md5: 4ea6b620fdf24a1a0bc4f1c7134dfafb
+ depends:
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libcblas >=3.9.0,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - libblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ constrains:
+ - numpy-base <0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/numpy?source=hash-mapping
+ size: 8926994
+ timestamp: 1770098474394
+- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda
+ sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec
+ md5: 36f5b7eb328bdc204954a2225cf908e2
+ depends:
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ - libcblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ - libblas >=3.9.0,<4.0a0
+ constrains:
+ - numpy-base <0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/numpy?source=hash-mapping
+ size: 8927860
+ timestamp: 1773839233468
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d
+ md5: 11b3379b191f63139e29c0d19dee24cd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpng >=1.6.50,<1.7.0a0
+ - libstdcxx >=14
+ - libtiff >=4.7.1,<4.8.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 355400
+ timestamp: 1758489294972
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c
+ md5: f61eb8cd60ff9057122a3d338b99c00f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - ca-certificates
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3164551
+ timestamp: 1769555830639
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda
+ sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb
+ md5: da1b85b6a87e141f5140bb9924cecab0
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - ca-certificates
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3167099
+ timestamp: 1775587756857
+- conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda
+ sha256: f63962d24d81d4fafa15112c03cd5db1fddadd520fdb2ad7ec71a1689e8e694f
+ md5: 312989f1b7318c3763fffdc78df8474e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - libtasn1 >=4.21.0,<5.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 3831848
+ timestamp: 1770417713801
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee
+ md5: 79678378ae235e24b3aa83cee1b38207
+ depends:
+ - python
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - python_abi 3.14.* *_cp314
+ - tk >=8.6.13,<8.7.0a0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libxcb >=1.17.0,<2.0a0
+ - openjpeg >=2.5.4,<3.0a0
+ - lcms2 >=2.18,<3.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ license: HPND
+ purls:
+ - pkg:pypi/pillow?source=hash-mapping
+ size: 1073026
+ timestamp: 1770794002408
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda
+ sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e
+ md5: 76c4757c0ec9d11f969e8eb44899307b
+ depends:
+ - python
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - openjpeg >=2.5.4,<3.0a0
+ - libxcb >=1.17.0,<2.0a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - libfreetype >=2.14.3
+ - libfreetype6 >=2.14.3
+ - lcms2 >=2.18,<3.0a0
+ - tk >=8.6.13,<8.7.0a0
+ license: HPND
+ purls:
+ - pkg:pypi/pillow?source=hash-mapping
+ size: 1082797
+ timestamp: 1775060059882
+- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.13-hb17b654_0.conda
+ sha256: d0f4f26f16e3fc61cad88e341adf7fda8a619a68dc0afbcdfe65571d22aaa5c7
+ md5: 605c9bd0d875ad759b4ea1f785f7ae70
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ constrains:
+ - __glibc >=2.17
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 5916663
+ timestamp: 1778015597635
+- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
+ sha256: a26627790776987421ecb130240dfd5c26e706d6811e173f7bdf3029bec13e1e
+ md5: 903cc9fafd676d3c13d9c1e71a52231a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - __glibc >=2.17
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 5638792
+ timestamp: 1773659796309
+- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
+ sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5
+ md5: 4f225a966cfee267a79c5cb6382bd121
+ depends:
+ - python
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/psutil?source=hash-mapping
+ size: 231303
+ timestamp: 1769678156552
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973
+ md5: b3c17d95b5a10c6e64a21fa17573e70e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 8252
+ timestamp: 1726802366959
+- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ build_number: 101
+ sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd
+ md5: c014ad06e60441661737121d3eae8a60
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - ld_impl_linux-64 >=2.36.1
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - liblzma >=5.8.2,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.2,<4.0a0
+ - libuuid >=2.41.3,<3.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.5,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - readline >=8.3,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ - zstd >=1.5.7,<1.6.0a0
+ license: Python-2.0
+ purls: []
+ size: 36702440
+ timestamp: 1770675584356
+ python_site_packages_path: lib/python3.14/site-packages
+- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda
+ build_number: 100
+ sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b
+ md5: a443f87920815d41bfe611296e507995
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - ld_impl_linux-64 >=2.36.1
+ - libexpat >=2.7.5,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - liblzma >=5.8.2,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.52.0,<4.0a0
+ - libuuid >=2.42,<3.0a0
+ - libzlib >=1.3.2,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.6,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - readline >=8.3,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ - zstd >=1.5.7,<1.6.0a0
+ license: Python-2.0
+ purls: []
+ size: 36705460
+ timestamp: 1775614357822
+ python_site_packages_path: lib/python3.14/site-packages
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
+ sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d
+ md5: 2035f68f96be30dc60a5dfd7452c7941
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - yaml >=0.2.5,<0.3.0a0
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pyyaml?source=compressed-mapping
+ size: 202391
+ timestamp: 1770223462836
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
+ noarch: python
+ sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28
+ md5: 082985717303dab433c976986c674b35
+ depends:
+ - python
+ - libgcc >=14
+ - libstdcxx >=14
+ - __glibc >=2.17,<3.0.a0
+ - zeromq >=4.3.5,<4.4.0a0
+ - _python_abi3_support 1.*
+ - cpython >=3.12
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pyzmq?source=compressed-mapping
+ size: 211567
+ timestamp: 1771716961404
+- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc
+ md5: 353823361b1d27eb3960efb076dfcaf6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc-ng >=12
+ - libstdcxx-ng >=12
+ license: LicenseRef-Qhull
+ purls: []
+ size: 552937
+ timestamp: 1720813982144
+- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002
+ md5: d7d95fc8287ea7bf33e0e7116d2b95ec
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 345073
+ timestamp: 1765813471974
+- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
+ sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446
+ md5: c1c368b5437b0d1a68f372ccf01cb133
+ depends:
+ - python
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ constrains:
+ - __glibc >=2.17
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rpds-py?source=hash-mapping
+ size: 376121
+ timestamp: 1764543122774
+- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda
+ sha256: dbbe4ab36b90427f12d69fc14a8b601b6bca4185c6c4dd67b8046a8da9daec03
+ md5: 9d978822b57bafe72ebd3f8b527bba71
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - openssl >=3.5.5,<4.0a0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 395083
+ timestamp: 1773251675551
+- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda
+ sha256: 856866fd519b812db3e092aba308248dd87b5c308186fcffe593f309373ae94c
+ md5: 3f578c7d2b0bb52469340e4060d48d94
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - openssl >=3.5.6,<4.0a0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 387306
+ timestamp: 1777466173323
+- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda
+ sha256: bcf374fe61712928c624f410a831e9f2a36ad13429f598e6028203588d24b914
+ md5: c9d90e43202c721281f3d74129223515
+ depends:
+ - python
+ - numpy >=1.24.1
+ - scipy >=1.10.0
+ - joblib >=1.3.0
+ - threadpoolctl >=3.2.0
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ - python_abi 3.14.* *_cp314
+ - numpy >=1.23,<3
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scikit-learn?source=hash-mapping
+ size: 9992698
+ timestamp: 1765801260253
+- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972
+ md5: d0510124f87c75403090e220db1e9d41
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libblas >=3.9.0,<4.0a0
+ - libcblas >=3.9.0,<4.0a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - liblapack >=3.9.0,<4.0a0
+ - libstdcxx >=14
+ - numpy <2.7
+ - numpy >=1.23,<3
+ - numpy >=1.25.2
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scipy?source=compressed-mapping
+ size: 17225275
+ timestamp: 1771880751368
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac
+ md5: cffd3bdd58090148f4cfcd831f4b26ab
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3301196
+ timestamp: 1769460227866
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ sha256: b8f9f9ae508d79c9c697eb01b6a8d2ed4bc1899370f44aa6497c8abbd15988ea
+ md5: e35f08043f54d26a1be93fdbf90d30c3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/tornado?source=hash-mapping
+ size: 905436
+ timestamp: 1765458949518
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda
+ sha256: ed8d06093ff530a2dae9ed1e51eb6f908fbfd171e8b62f4eae782d67b420be5a
+ md5: dc1ff1e915ab35a06b6fa61efae73ab5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/tornado?source=hash-mapping
+ size: 912476
+ timestamp: 1774358032579
+- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ sha256: ff1c1d7c23b91c9b0eb93a3e1380f4e2ac6c37ea2bba4f932a5484e9a55bba30
+ md5: 494fdf358c152f9fdd0673c128c2f3dd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/unicodedata2?source=hash-mapping
+ size: 409562
+ timestamp: 1770909102180
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b
+ md5: b2895afaf55bf96a8c8282a2e47a5de0
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 15321
+ timestamp: 1762976464266
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142
+ md5: 1dafce8548e38671bea82e3f5c6ce22f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20591
+ timestamp: 1762976546182
+- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
+ sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad
+ md5: a77f85f77be52ff59391544bfe73390a
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 85189
+ timestamp: 1753484064210
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
+ sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6
+ md5: 755b096086851e1193f3b10347415d7c
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - krb5 >=1.22.2,<1.23.0a0
+ - libsodium >=1.0.21,<1.0.22.0a0
+ license: MPL-2.0
+ license_family: MOZILLA
+ purls: []
+ size: 311150
+ timestamp: 1772476812121
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f
+ md5: 2aadb0d17215603a82a2a6b0afd9a4cb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 122618
+ timestamp: 1770167931827
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7
+ md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 601375
+ timestamp: 1764777111296
+- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
+ sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661
+ md5: aaa2a381ccc56eac91d63b6c1240312f
+ depends:
+ - cpython
+ - python-gil
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 8191
+ timestamp: 1744137672556
+- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda
+ sha256: eb0c4e2b24f1fbefaf96ce6c992c6bd64340bc3c06add4d7415ab69222b201da
+ md5: 11a2b8c732d215d977998ccd69a9d5e8
+ depends:
+ - exceptiongroup >=1.0.2
+ - idna >=2.8
+ - python >=3.10
+ - typing_extensions >=4.5
+ - python
+ constrains:
+ - trio >=0.32.0
+ - uvloop >=0.21
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/anyio?source=compressed-mapping
+ size: 145175
+ timestamp: 1767719033569
+- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda
+ sha256: f09aed24661cd45ba54a43772504f05c0698248734f9ae8cd289d314ac89707e
+ md5: af2df4b9108808da3dc76710fe50eae2
+ depends:
+ - exceptiongroup >=1.0.2
+ - idna >=2.8
+ - python >=3.10
+ - typing_extensions >=4.5
+ - python
+ constrains:
+ - trio >=0.32.0
+ - uvloop >=0.22.1
+ - winloop >=0.2.3
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/anyio?source=hash-mapping
+ size: 146764
+ timestamp: 1774359453364
+- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda
+ sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf
+ md5: 54898d0f524c9dee622d44bbb081a8ab
+ depends:
+ - python >=3.9
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/appnope?source=hash-mapping
+ size: 10076
+ timestamp: 1733332433806
+- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda
+ sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad
+ md5: 8ac12aff0860280ee0cff7fa2cf63f3b
+ depends:
+ - argon2-cffi-bindings
+ - python >=3.9
+ - typing-extensions
+ constrains:
+ - argon2_cffi ==999
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/argon2-cffi?source=hash-mapping
+ size: 18715
+ timestamp: 1749017288144
+- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda
+ sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141
+ md5: 85c4f19f377424eafc4ed7911b291642
+ depends:
+ - python >=3.10
+ - python-dateutil >=2.7.0
+ - python-tzdata
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/arrow?source=hash-mapping
+ size: 113854
+ timestamp: 1760831179410
+- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
+ sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010
+ md5: 9673a61a297b00016442e022d689faa6
+ depends:
+ - python >=3.10
+ constrains:
+ - astroid >=2,<5
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/asttokens?source=hash-mapping
+ size: 28797
+ timestamp: 1763410017955
+- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda
+ sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948
+ md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803
+ depends:
+ - python >=3.10
+ - typing_extensions >=4.0.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/async-lru?source=hash-mapping
+ size: 21470
+ timestamp: 1771623881915
+- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda
+ sha256: ea8486637cfb89dc26dc9559921640cd1d5fd37e5e02c33d85c94572139f2efe
+ md5: b85e84cb64c762569cc1a760c2327e0a
+ depends:
+ - python >=3.10
+ - typing_extensions >=4.0.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/async-lru?source=hash-mapping
+ size: 22949
+ timestamp: 1773926359134
+- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda
+ sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f
+ md5: 537296d57ea995666c68c821b00e360b
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/attrs?source=compressed-mapping
+ size: 64759
+ timestamp: 1764875182184
+- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
+ sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab
+ md5: c6b0543676ecb1fb2d7643941fe375f2
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/attrs?source=hash-mapping
+ size: 64927
+ timestamp: 1773935801332
+- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
+ sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770
+ md5: f1976ce927373500cc19d3c0b2c85177
+ depends:
+ - python >=3.10
+ - python
+ constrains:
+ - pytz >=2015.7
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/babel?source=compressed-mapping
+ size: 7684321
+ timestamp: 1772555330347
+- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda
+ noarch: generic
+ sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29
+ md5: a2ac7763a9ac75055b68f325d3255265
+ depends:
+ - python >=3.14
+ license: BSD-3-Clause AND MIT AND EPL-2.0
+ purls: []
+ size: 7514
+ timestamp: 1767044983590
+- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.4.0-py314h680f03e_0.conda
+ noarch: generic
+ sha256: de1755a35258eb1b59f2288559bbf0b76da60bd2fa6cd6f768ead442f85bd666
+ md5: b712198b257f378e9bd8cde277218296
+ depends:
+ - python >=3.14
+ license: BSD-3-Clause AND MIT AND EPL-2.0
+ purls: []
+ size: 7546
+ timestamp: 1777848733980
+- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda
+ sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6
+ md5: 5267bef8efea4127aacd1f4e1f149b6e
+ depends:
+ - python >=3.10
+ - soupsieve >=1.2
+ - typing-extensions
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/beautifulsoup4?source=hash-mapping
+ size: 90399
+ timestamp: 1764520638652
+- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda
+ sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46
+ md5: 7c5ebdc286220e8021bf55e6384acd67
+ depends:
+ - python >=3.10
+ - webencodings
+ - python
+ constrains:
+ - tinycss2 >=1.1.0,<1.5
+ license: Apache-2.0 AND MIT
+ purls:
+ - pkg:pypi/bleach?source=compressed-mapping
+ size: 142008
+ timestamp: 1770719370680
+- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda
+ sha256: 7c07a865e5e4cca233cc4e0eb3f0f5ff6c90776461687b4fb0b1764133e1fd61
+ md5: f11a319b9700b203aa14c295858782b6
+ depends:
+ - bleach ==6.3.0 pyhcf101f3_1
+ - tinycss2
+ license: Apache-2.0 AND MIT
+ purls: []
+ size: 4409
+ timestamp: 1770719370682
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
+ sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6
+ md5: f001e6e220355b7f87403a4d0e5bf1ca
+ depends:
+ - __win
+ license: ISC
+ purls: []
+ size: 147734
+ timestamp: 1772006322223
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc
+ md5: 4492fd26db29495f0ba23f146cd5638d
+ depends:
+ - __unix
+ license: ISC
+ purls: []
+ size: 147413
+ timestamp: 1772006283803
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda
+ sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d
+ md5: e18ad67cf881dcadee8b8d9e2f8e5f73
+ depends:
+ - __unix
+ license: ISC
+ purls: []
+ size: 131039
+ timestamp: 1776865545798
+- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2
+ noarch: python
+ sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17
+ md5: 9b347a7ec10940d3f7941ff6c460b551
+ depends:
+ - cached_property >=1.5.2,<1.5.3.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 4134
+ timestamp: 1615209571450
+- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2
+ sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7
+ md5: 576d629e47797577ab0f1b351297ef4a
+ depends:
+ - python >=3.6
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/cached-property?source=hash-mapping
+ size: 11065
+ timestamp: 1615209567874
+- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda
+ sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656
+ md5: 765c4d97e877cdbbb88ff33152b86125
+ depends:
+ - python >=3.10
+ license: ISC
+ purls:
+ - pkg:pypi/certifi?source=compressed-mapping
+ size: 151445
+ timestamp: 1772001170301
+- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda
+ sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878
+ md5: 929471569c93acefb30282a22060dcd5
+ depends:
+ - python >=3.10
+ license: ISC
+ purls:
+ - pkg:pypi/certifi?source=hash-mapping
+ size: 135656
+ timestamp: 1776866680878
+- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda
+ sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5
+ md5: 49ee13eb9b8f44d63879c69b8a40a74b
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/charset-normalizer?source=compressed-mapping
+ size: 58510
+ timestamp: 1773660086450
+- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
+ sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457
+ md5: a9167b9571f3baa9d448faa2139d1089
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/charset-normalizer?source=hash-mapping
+ size: 58872
+ timestamp: 1775127203018
+- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287
+ md5: 962b9857ee8e7018c22f2776ffa0b2d7
+ depends:
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/colorama?source=hash-mapping
+ size: 27011
+ timestamp: 1733218222191
+- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda
+ sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212
+ md5: 2da13f2b299d8e1995bafbbe9689a2f7
+ depends:
+ - python >=3.9
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/comm?source=hash-mapping
+ size: 14690
+ timestamp: 1753453984907
+- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
+ noarch: generic
+ sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c
+ md5: 3bb89e4f795e5414addaa531d6b1500a
+ depends:
+ - python >=3.14,<3.15.0a0
+ - python_abi * *_cp314
+ license: Python-2.0
+ purls: []
+ size: 50078
+ timestamp: 1770674447292
+- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda
+ noarch: generic
+ sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee
+ md5: f111d4cfaf1fe9496f386bc98ae94452
+ depends:
+ - python >=3.14,<3.15.0a0
+ - python_abi * *_cp314
+ license: Python-2.0
+ purls: []
+ size: 49809
+ timestamp: 1775614256655
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
+ sha256: 2ee3b9564ca326226e5cda41d11b251482df8e7c757e333d28ec75213c75d126
+ md5: 87ff6381e33b76e5b9b179a2cdd005ec
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 1150650
+ timestamp: 1746189825236
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.2.75-ha770c72_0.conda
+ sha256: afff92110ab09005b43047128d8c56b49ca96ef6425b2de8121ddf8e5d9c52fd
+ md5: 2a66581b5e2fba97243e6a7b3ea70061
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 1415553
+ timestamp: 1776108312905
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
+ sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304
+ md5: 79d280de61e18010df5997daea4743df
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 94239
+ timestamp: 1753975242354
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.2.78-ha770c72_0.conda
+ sha256: 5db93738a2523c418de442427ea0b5fb877fcb517e0d170b1428bdd298bcddfd
+ md5: 61799994af56d5ab31096a11d62d6be8
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 97068
+ timestamp: 1776121212858
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5
+ md5: 86e40eb67d83f1a58bdafdd44e5a77c6
+ depends:
+ - cuda-cccl_linux-64
+ - cuda-cudart-static_linux-64
+ - cuda-cudart_linux-64
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 389140
+ timestamp: 1749218427266
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.2.75-h376f20c_0.conda
+ sha256: feb6d90170dbdbbc873d065f17c55845b03e1bd132d5727ba16c9dc5048c3a98
+ md5: 0104d270d83f6c3f6b4f8f761da37bf4
+ depends:
+ - cuda-cccl_linux-64
+ - cuda-cudart-static_linux-64
+ - cuda-cudart_linux-64
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 398384
+ timestamp: 1776110485442
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
+ sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032
+ md5: b87bf315d81218dd63eb46cc1eaef775
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 1148889
+ timestamp: 1749218381225
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.2.75-h376f20c_0.conda
+ sha256: f4e8c80fe897a426bb6a413b685d7e16eaf52cdbbcf3fa73cf24c994da82b0ef
+ md5: 6e8700fbcdf3a916d4494db9811d955a
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 1105717
+ timestamp: 1776110435801
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
+ sha256: 6cde0ace2b995b49d0db2eefb7bc30bf00ffc06bb98ef7113632dec8f8907475
+ md5: 64508631775fbbf9eca83c84b1df0cae
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 197249
+ timestamp: 1749218394213
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.2.75-h376f20c_0.conda
+ sha256: cd03c67b2005e2e74ff278f6f8b17ca7d6f18cf43fb00775833669508d301a83
+ md5: ff98f2b9b87eb8b3a4b36745d3d5b93e
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 203339
+ timestamp: 1776110448238
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda
+ sha256: a15574d966e73135a79d5e6570c87e13accdb44bd432449b5deea71644ad442c
+ md5: d411828daa36ac84eab210ba3bbe5a64
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 37714
+ timestamp: 1749218405324
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-13.2.75-h376f20c_0.conda
+ sha256: adf85566baf27c8b05785807d6a21b3bb60264cd1b198a83cef4aac84dd74021
+ md5: a3fcf07a7dba934172ad464931773730
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 39432
+ timestamp: 1776110460213
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
+ sha256: a1672a34439a72869de9e011e935d41b62fc8dfb1a2700e85ed8a7a129b79981
+ md5: 19d4e090217f0ea89d30bedb7461c048
+ depends:
+ - cuda-crt-dev_linux-64 12.9.86 ha770c72_2
+ - cuda-nvvm-dev_linux-64 12.9.86 ha770c72_2
+ - cuda-version >=12.9,<12.10.0a0
+ - libgcc >=6
+ - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2
+ constrains:
+ - gcc_impl_linux-64 >=6,<15.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 28121
+ timestamp: 1753975535813
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-13.2.78-he91c749_0.conda
+ sha256: 2ec469887c35e379ae0c14f45a96579a8509b0e61977416e9b1cdcca31fea006
+ md5: 74d5f18e2461a1b54c438af4b88986d4
+ depends:
+ - cuda-crt-dev_linux-64 13.2.78 ha770c72_0
+ - cuda-nvvm-dev_linux-64 13.2.78 ha770c72_0
+ - cuda-version >=13.2,<13.3.0a0
+ - libgcc >=6
+ - libnvptxcompiler-dev_linux-64 13.2.78 ha770c72_0
+ constrains:
+ - gcc_impl_linux-64 >=6,<16.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 29428
+ timestamp: 1776121471034
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
+ sha256: 522722dcaffd133e0c7500c69dc70e21ac34d6762dcbaabfe847439f944028f0
+ md5: 7b386291414c7eea113d25ac28a33772
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 27096
+ timestamp: 1753975261562
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.2.78-ha770c72_0.conda
+ sha256: 13ce27aa4f3427eae9a6cc7402f08d8515604a56829825fcf9c0de1a1034309e
+ md5: 531411c4a10ef8d4d045695edf86e4da
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 28442
+ timestamp: 1776121235103
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
+ sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656
+ md5: b6d5d7f1c171cbd228ea06b556cfa859
+ constrains:
+ - cudatoolkit 12.9|12.9.*
+ - __cuda >=12
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 21578
+ timestamp: 1746134436166
+- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.2-he2cc418_3.conda
+ sha256: 64aebe8ccb3a2c3ff446d3c0c0e88ef4fdb069a5732c03539bf3a37243c4c679
+ md5: 45676e3dd76b30ec613f1f822d450eff
+ constrains:
+ - __cuda >=13
+ - cudatoolkit 13.2|13.2.*
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 21908
+ timestamp: 1773093709154
+- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1
+ md5: 4c2a8fef270f6c69591889b93f9f55c1
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/cycler?source=hash-mapping
+ size: 14778
+ timestamp: 1764466758386
+- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda
+ sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017
+ md5: 9ce473d1d1be1cc3810856a48b3fab32
+ depends:
+ - python >=3.9
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/decorator?source=hash-mapping
+ size: 14129
+ timestamp: 1740385067843
+- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2
+ sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be
+ md5: 961b3a227b437d82ad7054484cfa71b2
+ depends:
+ - python >=3.6
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/defusedxml?source=hash-mapping
+ size: 24062
+ timestamp: 1615232388757
+- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144
+ md5: 8e662bd460bda79b1ea39194e3c4c9ab
+ depends:
+ - python >=3.10
+ - typing_extensions >=4.6.0
+ license: MIT and PSF-2.0
+ purls:
+ - pkg:pypi/exceptiongroup?source=hash-mapping
+ size: 21333
+ timestamp: 1763918099466
+- conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda
+ sha256: 1acc6a420efc5b64c384c1f35f49129966f8a12c93b4bb2bdc30079e5dc9d8a8
+ md5: a57b4be42619213a94f31d2c69c5dda7
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/execnet?source=hash-mapping
+ size: 39499
+ timestamp: 1762974150770
+- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
+ sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad
+ md5: ff9efb7f7469aed3c4a8106ffa29593c
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/executing?source=hash-mapping
+ size: 30753
+ timestamp: 1756729456476
+- conda: https://conda.anaconda.org/conda-forge/noarch/filterpy-1.4.5-pyhd8ed1ab_2.conda
+ sha256: dc81e6283bd2cdc5e8a3e5c88527870b2992a8f71f25ddec9dd995223c08aed8
+ md5: 261bd75b03d09c5eeea5aedf7365e811
+ depends:
+ - matplotlib-base
+ - numpy
+ - python >=3.9
+ - scipy
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/filterpy?source=hash-mapping
+ size: 72868
+ timestamp: 1739826907157
+- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ sha256: ed4462f6e49b8dea4e45f7294cca576a38cf4fc41e04bbcd95f9cf55be7776b9
+ md5: 049f68f9c90f00069c748cd6fb7bfb55
+ depends:
+ - brotli
+ - munkres
+ - python >=3.10
+ - unicodedata2 >=15.1.0
+ track_features:
+ - fonttools_no_compile
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/fonttools?source=compressed-mapping
+ size: 837910
+ timestamp: 1773137210630
+- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda
+ sha256: fa77109df37580ce0933d4e6c5a44b2f0c192af2f8e503bfdbfb3b49a8b8e538
+ md5: 14cf1ac7a1e29553c6918f7860aab6d8
+ depends:
+ - brotli
+ - munkres
+ - python >=3.10
+ - unicodedata2 >=15.1.0
+ track_features:
+ - fonttools_no_compile
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/fonttools?source=hash-mapping
+ size: 840293
+ timestamp: 1776708212291
+- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda
+ sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276
+ md5: d3549fd50d450b6d9e7dddff25dd2110
+ depends:
+ - cached-property >=1.3.0
+ - python >=3.9,<4
+ license: MPL-2.0
+ license_family: MOZILLA
+ purls:
+ - pkg:pypi/fqdn?source=hash-mapping
+ size: 16705
+ timestamp: 1733327494780
+- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda
+ sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb
+ md5: b8993c19b0c32a2f7b66cbb58ca27069
+ depends:
+ - python >=3.10
+ - typing_extensions
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/h11?source=compressed-mapping
+ size: 39069
+ timestamp: 1767729720872
+- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
+ sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3
+ md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9
+ depends:
+ - python >=3.10
+ - hyperframe >=6.1,<7
+ - hpack >=4.1,<5
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/h2?source=hash-mapping
+ size: 95967
+ timestamp: 1756364871835
+- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
+ sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba
+ md5: 0a802cb9888dd14eeefc611f05c40b6e
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/hpack?source=hash-mapping
+ size: 30731
+ timestamp: 1737618390337
+- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda
+ sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b
+ md5: 4f14640d58e2cc0aa0819d9d8ba125bb
+ depends:
+ - python >=3.9
+ - h11 >=0.16
+ - h2 >=3,<5
+ - sniffio 1.*
+ - anyio >=4.0,<5.0
+ - certifi
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/httpcore?source=hash-mapping
+ size: 49483
+ timestamp: 1745602916758
+- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda
+ sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950
+ md5: d6989ead454181f4f9bc987d3dc4e285
+ depends:
+ - anyio
+ - certifi
+ - httpcore 1.*
+ - idna
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/httpx?source=hash-mapping
+ size: 63082
+ timestamp: 1733663449209
+- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
+ sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8
+ md5: 8e6923fc12f1fe8f8c4e5c9f343256ac
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/hyperframe?source=hash-mapping
+ size: 17397
+ timestamp: 1737618427549
+- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda
+ sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0
+ md5: 53abe63df7e10a6ba605dc5f9f961d36
+ depends:
+ - python >=3.10
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/idna?source=hash-mapping
+ size: 50721
+ timestamp: 1760286526795
+- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda
+ sha256: 9ab620e6f64bb67737bd7bc1ad6f480770124e304c6710617aba7fe60b089f48
+ md5: fb7130c190f9b4ec91219840a05ba3ac
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/idna?source=hash-mapping
+ size: 59038
+ timestamp: 1776947141407
+- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda
+ sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745
+ md5: 63ccfdc3a3ce25b027b8767eb722fca8
+ depends:
+ - python >=3.9
+ - zipp >=3.20
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/importlib-metadata?source=hash-mapping
+ size: 34641
+ timestamp: 1747934053147
+- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda
+ sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16
+ md5: 080594bf4493e6bae2607e65390c520a
+ depends:
+ - python >=3.10
+ - zipp >=3.20
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/importlib-metadata?source=hash-mapping
+ size: 34387
+ timestamp: 1773931568510
+- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19
+ md5: 9614359868482abba1bd15ce465e3c42
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/iniconfig?source=compressed-mapping
+ size: 13387
+ timestamp: 1760831448842
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda
+ sha256: 5c1f3e874adaf603449f2b135d48f168c5d510088c78c229bda0431268b43b27
+ md5: 4b53d436f3fbc02ce3eeaf8ae9bebe01
+ depends:
+ - appnope
+ - __osx
+ - comm >=0.1.1
+ - debugpy >=1.6.5
+ - ipython >=7.23.1
+ - jupyter_client >=8.8.0
+ - jupyter_core >=5.1,!=6.0.*
+ - matplotlib-inline >=0.1
+ - nest-asyncio >=1.4
+ - packaging >=22
+ - psutil >=5.7
+ - python >=3.10
+ - pyzmq >=25
+ - tornado >=6.4.1
+ - traitlets >=5.4.0
+ - python
+ constrains:
+ - appnope >=0.1.2
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipykernel?source=hash-mapping
+ size: 132260
+ timestamp: 1770566135697
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda
+ sha256: 9cdadaeef5abadca4113f92f5589db19f8b7df5e1b81cb0225f7024a3aedefa3
+ md5: b3a7d5842f857414d9ae831a799444dd
+ depends:
+ - __win
+ - comm >=0.1.1
+ - debugpy >=1.6.5
+ - ipython >=7.23.1
+ - jupyter_client >=8.8.0
+ - jupyter_core >=5.1,!=6.0.*
+ - matplotlib-inline >=0.1
+ - nest-asyncio >=1.4
+ - packaging >=22
+ - psutil >=5.7
+ - python >=3.10
+ - pyzmq >=25
+ - tornado >=6.4.1
+ - traitlets >=5.4.0
+ - python
+ constrains:
+ - appnope >=0.1.2
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipykernel?source=compressed-mapping
+ size: 132382
+ timestamp: 1770566174387
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda
+ sha256: b77ed58eb235e5ad80e742b03caeed4bbc2a2ef064cb9a2deee3b75dfae91b2a
+ md5: 8b267f517b81c13594ed68d646fd5dcb
+ depends:
+ - __linux
+ - comm >=0.1.1
+ - debugpy >=1.6.5
+ - ipython >=7.23.1
+ - jupyter_client >=8.8.0
+ - jupyter_core >=5.1,!=6.0.*
+ - matplotlib-inline >=0.1
+ - nest-asyncio >=1.4
+ - packaging >=22
+ - psutil >=5.7
+ - python >=3.10
+ - pyzmq >=25
+ - tornado >=6.4.1
+ - traitlets >=5.4.0
+ - python
+ constrains:
+ - appnope >=0.1.2
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipykernel?source=compressed-mapping
+ size: 133644
+ timestamp: 1770566133040
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda
+ sha256: 558073f3ceba49ab67d9e698ff2b49ddf1d1d3259de46b50795be1b6d8ec9de4
+ md5: a522444721669fe6bb482f8814b969f4
+ depends:
+ - __win
+ - decorator >=5.1.0
+ - ipython_pygments_lexers >=1.0.0
+ - jedi >=0.18.2
+ - matplotlib-inline >=0.1.6
+ - prompt-toolkit >=3.0.41,<3.1.0
+ - pygments >=2.14.0
+ - python >=3.12
+ - stack_data >=0.6.0
+ - traitlets >=5.13.0
+ - colorama >=0.4.4
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipython?source=compressed-mapping
+ size: 647253
+ timestamp: 1772790189384
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda
+ sha256: 1f90e346baab7926bc52d7b60c0625087e96b4fab1bdb9a7fe83ac842312c930
+ md5: 326c46b8ec2a1b4964927c7ea55ebf49
+ depends:
+ - __unix
+ - decorator >=5.1.0
+ - ipython_pygments_lexers >=1.0.0
+ - jedi >=0.18.2
+ - matplotlib-inline >=0.1.6
+ - prompt-toolkit >=3.0.41,<3.1.0
+ - pygments >=2.14.0
+ - python >=3.12
+ - stack_data >=0.6.0
+ - traitlets >=5.13.0
+ - pexpect >4.6
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipython?source=compressed-mapping
+ size: 648197
+ timestamp: 1772790149194
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda
+ sha256: a0af49948a1842dfd15a0b0b2fd56c94ddbd07e07a6c8b4bc70d43015eafaff0
+ md5: 73e9657cd19605740d21efb14d8d0cb9
+ depends:
+ - __unix
+ - decorator >=5.1.0
+ - ipython_pygments_lexers >=1.0.0
+ - jedi >=0.18.2
+ - matplotlib-inline >=0.1.6
+ - prompt-toolkit >=3.0.41,<3.1.0
+ - psutil >=7
+ - pygments >=2.14.0
+ - python >=3.11
+ - stack_data >=0.6.0
+ - traitlets >=5.13.0
+ - typing_extensions >=4.6
+ - pexpect >4.6
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipython?source=hash-mapping
+ size: 651632
+ timestamp: 1777038396606
+- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
+ sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104
+ md5: bd80ba060603cc228d9d81c257093119
+ depends:
+ - pygments
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/ipython-pygments-lexers?source=hash-mapping
+ size: 13993
+ timestamp: 1737123723464
+- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda
+ sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed
+ md5: 0b0154421989637d424ccf0f104be51a
+ depends:
+ - arrow >=0.15.0
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/isoduration?source=hash-mapping
+ size: 19832
+ timestamp: 1733493720346
+- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
+ sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8
+ md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9
+ depends:
+ - parso >=0.8.3,<0.9.0
+ - python >=3.9
+ license: Apache-2.0 AND MIT
+ purls:
+ - pkg:pypi/jedi?source=hash-mapping
+ size: 843646
+ timestamp: 1733300981994
+- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
+ sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b
+ md5: 04558c96691bed63104678757beb4f8d
+ depends:
+ - markupsafe >=2.0
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jinja2?source=compressed-mapping
+ size: 120685
+ timestamp: 1764517220861
+- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda
+ sha256: 301539229d7be6420c084490b8145583291123f0ce6b92f56be5948a2c83a379
+ md5: 615de2a4d97af50c350e5cf160149e77
+ depends:
+ - python >=3.10
+ - setuptools
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/joblib?source=hash-mapping
+ size: 226448
+ timestamp: 1765794135253
+- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda
+ sha256: ba03ca5a6db38d9f48bd30172e8c512dea7a686a5c7701c6fcdb7b3023dae2ad
+ md5: 8d5f66ebf832c4ce28d5c37a0e76605c
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/json5?source=hash-mapping
+ size: 34017
+ timestamp: 1767325114901
+- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.14.0-pyhd8ed1ab_0.conda
+ sha256: 9daa95bd164c8fa23b3ab196e906ef806141d749eddce2a08baa064f722d25fa
+ md5: 1269891272187518a0a75c286f7d0bbf
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/json5?source=hash-mapping
+ size: 34731
+ timestamp: 1774655440045
+- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda
+ sha256: 1a1328476d14dfa8b84dbacb7f7cd7051c175498406dc513ca6c679dc44f3981
+ md5: cd2214824e36b0180141d422aba01938
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jsonpointer?source=hash-mapping
+ size: 13967
+ timestamp: 1765026384757
+- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda
+ sha256: a3d10301b6ff399ba1f3d39e443664804a3d28315a4fb81e745b6817845f70ae
+ md5: 89bf346df77603055d3c8fe5811691e6
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jsonpointer?source=hash-mapping
+ size: 14190
+ timestamp: 1774311356147
+- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda
+ sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7
+ md5: ada41c863af263cc4c5fcbaff7c3e4dc
+ depends:
+ - attrs >=22.2.0
+ - jsonschema-specifications >=2023.3.6
+ - python >=3.10
+ - referencing >=0.28.4
+ - rpds-py >=0.25.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/jsonschema?source=compressed-mapping
+ size: 82356
+ timestamp: 1767839954256
+- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda
+ sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04
+ md5: 439cd0f567d697b20a8f45cb70a1005a
+ depends:
+ - python >=3.10
+ - referencing >=0.31.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/jsonschema-specifications?source=hash-mapping
+ size: 19236
+ timestamp: 1757335715225
+- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda
+ sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1
+ md5: 8368d58342d0825f0843dc6acdd0c483
+ depends:
+ - jsonschema >=4.26.0,<4.26.1.0a0
+ - fqdn
+ - idna
+ - isoduration
+ - jsonpointer >1.13
+ - rfc3339-validator
+ - rfc3986-validator >0.1.0
+ - rfc3987-syntax >=1.1.0
+ - uri-template
+ - webcolors >=24.6.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 4740
+ timestamp: 1767839954258
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
+ sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2
+ md5: 62b7c96c6cd77f8173cc5cada6a9acaa
+ depends:
+ - importlib-metadata >=4.8.3
+ - jupyter_server >=1.1.2
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-lsp?source=hash-mapping
+ size: 60377
+ timestamp: 1756388269267
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda
+ sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e
+ md5: 0c3b465ceee138b9c39279cc02e5c4a0
+ depends:
+ - importlib-metadata >=4.8.3
+ - jupyter_server >=1.1.2
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-lsp?source=hash-mapping
+ size: 61633
+ timestamp: 1775136333147
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda
+ sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3
+ md5: 8a3d6d0523f66cf004e563a50d9392b3
+ depends:
+ - jupyter_core >=5.1
+ - python >=3.10
+ - python-dateutil >=2.8.2
+ - pyzmq >=25.0
+ - tornado >=6.4.1
+ - traitlets >=5.3
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-client?source=compressed-mapping
+ size: 112785
+ timestamp: 1767954655912
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda
+ sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc
+ md5: a8db462b01221e9f5135be466faeb3e0
+ depends:
+ - __win
+ - pywin32
+ - platformdirs >=2.5
+ - python >=3.10
+ - traitlets >=5.3
+ - python
+ constrains:
+ - pywin32 >=300
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-core?source=hash-mapping
+ size: 64679
+ timestamp: 1760643889625
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda
+ sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a
+ md5: b38fe4e78ee75def7e599843ef4c1ab0
+ depends:
+ - __unix
+ - python
+ - platformdirs >=2.5
+ - python >=3.10
+ - traitlets >=5.3
+ - python
+ constrains:
+ - pywin32 >=300
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-core?source=hash-mapping
+ size: 65503
+ timestamp: 1760643864586
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda
+ sha256: e9964aaaf6d24a685cd5ce9d75731b643ed7f010fb979574a6580cd2f974c6cd
+ md5: 31e11c30bbee1682a55627f953c6725a
+ depends:
+ - jsonschema-with-format-nongpl >=4.18.0
+ - packaging
+ - python >=3.9
+ - python-json-logger >=2.0.4
+ - pyyaml >=5.3
+ - referencing
+ - rfc3339-validator
+ - rfc3986-validator >=0.1.1
+ - traitlets >=5.3
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-events?source=hash-mapping
+ size: 24306
+ timestamp: 1770937604863
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda
+ sha256: c7edb5682c6316a95ad781dccb1b6589cd2ec0bf94f23c21152974eb0363b5d7
+ md5: bf42ee94c750c0b2e7e998b79ac299ea
+ depends:
+ - jsonschema-with-format-nongpl >=4.18.0
+ - packaging
+ - python >=3.10
+ - python-json-logger >=2.0.4
+ - pyyaml >=5.3
+ - referencing
+ - rfc3339-validator
+ - rfc3986-validator >=0.1.1
+ - traitlets >=5.3
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-events?source=hash-mapping
+ size: 24002
+ timestamp: 1776861872237
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda
+ sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a
+ md5: d79a87dcfa726bcea8e61275feed6f83
+ depends:
+ - anyio >=3.1.0
+ - argon2-cffi >=21.1
+ - jinja2 >=3.0.3
+ - jupyter_client >=7.4.4
+ - jupyter_core >=4.12,!=5.0.*
+ - jupyter_events >=0.11.0
+ - jupyter_server_terminals >=0.4.4
+ - nbconvert-core >=6.4.4
+ - nbformat >=5.3.0
+ - overrides >=5.0
+ - packaging >=22.0
+ - prometheus_client >=0.9
+ - python >=3.10
+ - pyzmq >=24
+ - send2trash >=1.8.2
+ - terminado >=0.8.3
+ - tornado >=6.2.0
+ - traitlets >=5.6.0
+ - websocket-client >=1.7
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-server?source=hash-mapping
+ size: 347094
+ timestamp: 1755870522134
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda
+ sha256: 04fb8ea7749f67abaf76df6257bf86688e1389ceed55eb4fb0176fd2e882dbd6
+ md5: 5ee7945accf0f215ddd6055d25d7cd83
+ depends:
+ - anyio >=3.1.0
+ - argon2-cffi >=21.1
+ - jinja2 >=3.0.3
+ - jupyter_client >=7.4.4
+ - jupyter_core >=4.12,!=5.0.*
+ - jupyter_events >=0.11.0
+ - jupyter_server_terminals >=0.4.4
+ - nbconvert-core >=6.4.4
+ - nbformat >=5.3.0
+ - overrides >=5.0
+ - packaging >=22.0
+ - prometheus_client >=0.9
+ - python >=3.10
+ - pyzmq >=24
+ - send2trash >=1.8.2
+ - terminado >=0.8.3
+ - tornado >=6.2.0
+ - traitlets >=5.6.0
+ - websocket-client >=1.7
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-server?source=hash-mapping
+ size: 360522
+ timestamp: 1778060967727
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda
+ sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654
+ md5: 7b8bace4943e0dc345fc45938826f2b8
+ depends:
+ - python >=3.10
+ - terminado >=0.8.3
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyter-server-terminals?source=hash-mapping
+ size: 22052
+ timestamp: 1768574057200
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda
+ sha256: 436a70259a9b4e13ce8b15faa8b37342835954d77a0a74d21dd24547e0871088
+ md5: bcbb401d6fa84e0cee34d4926b0e9e93
+ depends:
+ - async-lru >=1.0.0
+ - httpx >=0.25.0,<1
+ - ipykernel >=6.5.0,!=6.30.0
+ - jinja2 >=3.0.3
+ - jupyter-lsp >=2.0.0
+ - jupyter_core
+ - jupyter_server >=2.4.0,<3
+ - jupyterlab_server >=2.28.0,<3
+ - notebook-shim >=0.2
+ - packaging
+ - python >=3.10
+ - setuptools >=41.1.0
+ - tomli >=1.2.2
+ - tornado >=6.2.0
+ - traitlets
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyterlab?source=compressed-mapping
+ size: 8245973
+ timestamp: 1773240966438
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda
+ sha256: b85befad5ba1f50c0cc042a2ffb26441d13ffc2f18572dc20d3541476da0c7b9
+ md5: 2ffe77234070324e763a6eddabb5f467
+ depends:
+ - async-lru >=1.0.0
+ - httpx >=0.25.0,<1
+ - ipykernel >=6.5.0,!=6.30.0
+ - jinja2 >=3.0.3
+ - jupyter-lsp >=2.0.0
+ - jupyter_core
+ - jupyter_server >=2.4.0,<3
+ - jupyterlab_server >=2.28.0,<3
+ - notebook-shim >=0.2
+ - packaging
+ - python >=3.10
+ - setuptools >=41.1.0
+ - tomli >=1.2.2
+ - tornado >=6.2.0
+ - traitlets
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyterlab?source=hash-mapping
+ size: 8861204
+ timestamp: 1777483115382
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda
+ sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0
+ md5: fd312693df06da3578383232528c468d
+ depends:
+ - pygments >=2.4.1,<3
+ - python >=3.9
+ constrains:
+ - jupyterlab >=4.0.8,<5.0.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyterlab-pygments?source=hash-mapping
+ size: 18711
+ timestamp: 1733328194037
+- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda
+ sha256: 381d2d6a259a3be5f38a69463e0f6c5dcf1844ae113058007b51c3bef13a7cee
+ md5: a63877cb23de826b1620d3adfccc4014
+ depends:
+ - babel >=2.10
+ - jinja2 >=3.0.3
+ - json5 >=0.9.0
+ - jsonschema >=4.18
+ - jupyter_server >=1.21,<3
+ - packaging >=21.3
+ - python >=3.10
+ - requests >=2.31
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/jupyterlab-server?source=hash-mapping
+ size: 51621
+ timestamp: 1761145478692
+- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
+ sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a
+ md5: 86d9cba083cd041bfbf242a01a7a1999
+ constrains:
+ - sysroot_linux-64 ==2.28
+ license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later
+ license_family: GPL
+ purls: []
+ size: 1278712
+ timestamp: 1765578681495
+- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda
+ sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699
+ md5: 9b965c999135d43a3d0f7bd7d024e26a
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/lark?source=compressed-mapping
+ size: 94312
+ timestamp: 1761596921009
+- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda
+ sha256: 1abc6a81ee66e8ac9ac09a26e2d6ad7bba23f0a0cc3a6118654f036f9c0e1854
+ md5: 06901733131833f5edd68cf3d9679798
+ depends:
+ - __unix
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 3084533
+ timestamp: 1771377786730
+- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda
+ sha256: 38a557eba305468ac1f90ac85e50d8defd76141cb0b8a43b2fc1aca71dd5d5f2
+ md5: 683fcb168e1df9a21fa80d5aa2d9330b
+ depends:
+ - __unix
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 3095909
+ timestamp: 1778268932148
+- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
+ sha256: 17952c32eac197a59c119fdf3fb6f08c6a29c225a80bae141ac904ad212b87dd
+ md5: a66a909acf08924aced622903832a937
+ depends:
+ - cuda-version >=12.9,<12.10.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 14422867
+ timestamp: 1753975387297
+- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.2.78-ha770c72_0.conda
+ sha256: 3d12a8f80dd25b889302cd091bdbb75135938c1365496a5d7be504fe2f347cf7
+ md5: 8727a04a5bc3d451d45c907d03cda88f
+ depends:
+ - cuda-version >=13.2,<13.3.0a0
+ license: LicenseRef-NVIDIA-End-User-License-Agreement
+ purls: []
+ size: 15164138
+ timestamp: 1776121337288
+- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
+ sha256: b1c3824769b92a1486bf3e2cc5f13304d83ae613ea061b7bc47bb6080d6dfdba
+ md5: 865a399bce236119301ebd1532fced8d
+ depends:
+ - __unix
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 20171098
+ timestamp: 1771377827750
+- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda
+ sha256: a2385f3611d5cd25378f9cf2367183320731709c067ddd08d43330d3170f15b8
+ md5: bcfe7eae40158c3e355d2f9d3ed41230
+ depends:
+ - __unix
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 20765069
+ timestamp: 1778268963689
+- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
+ sha256: 991a82fbb64aba6d10719a017ce354e28df02ea5df1d9c7b0221da573c168d27
+ md5: 1005e1f39083adad2384772e8e384e43
+ depends:
+ - python >=3.10
+ - uc-micro-py
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/linkify-it-py?source=compressed-mapping
+ size: 26062
+ timestamp: 1772476821244
+- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda
+ sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e
+ md5: 5b5203189eb668f042ac2b0826244964
+ depends:
+ - mdurl >=0.1,<1
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/markdown-it-py?source=hash-mapping
+ size: 64736
+ timestamp: 1754951288511
+- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
+ sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f
+ md5: 6d03368f2b2b0a5fb6839df53b2eb5e0
+ depends:
+ - mdurl >=0.1,<1
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/markdown-it-py?source=hash-mapping
+ size: 69017
+ timestamp: 1778169663339
+- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda
+ sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603
+ md5: 00e120ce3e40bad7bfc78861ce3c4a25
+ depends:
+ - python >=3.10
+ - traitlets
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/matplotlib-inline?source=hash-mapping
+ size: 15175
+ timestamp: 1761214578417
+- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
+ sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764
+ md5: 9acc1c385be401d533ff70ef5b50dae6
+ depends:
+ - python >=3.10
+ - traitlets
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/matplotlib-inline?source=compressed-mapping
+ size: 15725
+ timestamp: 1778264403247
+- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda
+ sha256: 123cc004e2946879708cdb6a9eff24acbbb054990d6131bb94bca7a374ebebfc
+ md5: 1997a083ef0b4c9331f9191564be275e
+ depends:
+ - markdown-it-py >=2.0.0,<5.0.0
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/mdit-py-plugins?source=hash-mapping
+ size: 43805
+ timestamp: 1754946862113
+- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda
+ sha256: 443e7f8ae88f71b3e7fd9c3d19d3816fb1965e2352d5e01a6bfdf2eccfcf4795
+ md5: 9a704e945e87078f464726c69071677a
+ depends:
+ - markdown-it-py >=2.0.0,<5.0.0
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/mdit-py-plugins?source=hash-mapping
+ size: 50607
+ timestamp: 1778171019802
+- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
+ sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7
+ md5: 592132998493b3ff25fd7479396e8351
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/mdurl?source=hash-mapping
+ size: 14465
+ timestamp: 1733255681319
+- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda
+ sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae
+ md5: b11e360fc4de2b0035fc8aaa74f17fd6
+ depends:
+ - python >=3.10
+ - typing_extensions
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/mistune?source=hash-mapping
+ size: 74250
+ timestamp: 1766504456031
+- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda
+ sha256: b52dc6c78fbbe7a3008535cb8bfd87d70d8053e9250bbe16e387470a9df07070
+ md5: b97e84d1553b4a1c765b87fff83453ad
+ depends:
+ - python >=3.10
+ - typing_extensions
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/mistune?source=hash-mapping
+ size: 74567
+ timestamp: 1777824616382
+- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90
+ md5: 37293a85a0f4f77bbd9cf7aaefc62609
+ depends:
+ - python >=3.9
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/munkres?source=hash-mapping
+ size: 15851
+ timestamp: 1749895533014
+- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
+ sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b
+ md5: 00f5b8dafa842e0c27c1cd7296aa4875
+ depends:
+ - jupyter_client >=6.1.12
+ - jupyter_core >=4.12,!=5.0.*
+ - nbformat >=5.1
+ - python >=3.8
+ - traitlets >=5.4
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/nbclient?source=compressed-mapping
+ size: 28473
+ timestamp: 1766485646962
+- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda
+ sha256: 628fea99108df8e33396bb0b88658ec3d58edf245df224f57c0dce09615cbed2
+ md5: b14079a39ae60ac7ad2ec3d9eab075ca
+ depends:
+ - beautifulsoup4
+ - bleach-with-css !=5.0.0
+ - defusedxml
+ - importlib-metadata >=3.6
+ - jinja2 >=3.0
+ - jupyter_core >=4.7
+ - jupyterlab_pygments
+ - markupsafe >=2.0
+ - mistune >=2.0.3,<4
+ - nbclient >=0.5.0
+ - nbformat >=5.7
+ - packaging
+ - pandocfilters >=1.4.1
+ - pygments >=2.4.1
+ - python >=3.10
+ - traitlets >=5.1
+ - python
+ constrains:
+ - pandoc >=2.9.2,<4.0.0
+ - nbconvert ==7.17.0 *_0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/nbconvert?source=compressed-mapping
+ size: 202284
+ timestamp: 1769709543555
+- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda
+ sha256: ab2ac79c5892c5434d50b3542d96645bdaa06d025b6e03734be29200de248ac2
+ md5: 2bce0d047658a91b99441390b9b27045
+ depends:
+ - beautifulsoup4
+ - bleach-with-css !=5.0.0
+ - defusedxml
+ - importlib-metadata >=3.6
+ - jinja2 >=3.0
+ - jupyter_core >=4.7
+ - jupyterlab_pygments
+ - markupsafe >=2.0
+ - mistune >=2.0.3,<4
+ - nbclient >=0.5.0
+ - nbformat >=5.7
+ - packaging
+ - pandocfilters >=1.4.1
+ - pygments >=2.4.1
+ - python >=3.10
+ - traitlets >=5.1
+ - python
+ constrains:
+ - pandoc >=2.9.2,<4.0.0
+ - nbconvert ==7.17.1 *_0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/nbconvert?source=hash-mapping
+ size: 202229
+ timestamp: 1775615493260
+- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda
+ sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838
+ md5: bbe1963f1e47f594070ffe87cdf612ea
+ depends:
+ - jsonschema >=2.6
+ - jupyter_core >=4.12,!=5.0.*
+ - python >=3.9
+ - python-fastjsonschema >=2.15
+ - traitlets >=5.1
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/nbformat?source=hash-mapping
+ size: 100945
+ timestamp: 1733402844974
+- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda
+ sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0
+ md5: 598fd7d4d0de2455fb74f56063969a97
+ depends:
+ - python >=3.9
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/nest-asyncio?source=hash-mapping
+ size: 11543
+ timestamp: 1733325673691
+- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
+ sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6
+ md5: a2c1eeadae7a309daed9d62c96012a2b
+ depends:
+ - python >=3.11
+ - python
+ constrains:
+ - numpy >=1.25
+ - scipy >=1.11.2
+ - matplotlib-base >=3.8
+ - pandas >=2.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/networkx?source=hash-mapping
+ size: 1587439
+ timestamp: 1765215107045
+- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda
+ sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056
+ md5: e7f89ea5f7ea9401642758ff50a2d9c1
+ depends:
+ - jupyter_server >=1.8,<3
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/notebook-shim?source=hash-mapping
+ size: 16817
+ timestamp: 1733408419340
+- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
+ sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c
+ md5: e51f1e4089cad105b6cac64bd8166587
+ depends:
+ - python >=3.9
+ - typing_utils
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/overrides?source=hash-mapping
+ size: 30139
+ timestamp: 1734587755455
+- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58
+ md5: b76541e68fea4d511b1ac46a28dcd2c6
+ depends:
+ - python >=3.8
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/packaging?source=compressed-mapping
+ size: 72010
+ timestamp: 1769093650580
+- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
+ sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890
+ md5: 4c06a92e74452cfa53623a81592e8934
+ depends:
+ - python >=3.8
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/packaging?source=hash-mapping
+ size: 91574
+ timestamp: 1777103621679
- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2
sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f
md5: 457c2c8c08e54905d6954e79cb5b5db9
depends:
- - python !=3.0,!=3.1,!=3.2,!=3.3
+ - python !=3.0,!=3.1,!=3.2,!=3.3
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pandocfilters?source=hash-mapping
+ size: 11627
+ timestamp: 1631603397334
+- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
+ sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94
+ md5: 97c1ce2fffa1209e7afb432810ec6e12
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/parso?source=hash-mapping
+ size: 82287
+ timestamp: 1770676243987
+- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
+ sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e
+ md5: 39894c952938276405a1bd30e4ce2caf
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/parso?source=hash-mapping
+ size: 82472
+ timestamp: 1777722955579
+- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
+ sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a
+ md5: d0d408b1f18883a944376da5cf8101ea
+ depends:
+ - ptyprocess >=0.5
+ - python >=3.9
+ license: ISC
+ purls:
+ - pkg:pypi/pexpect?source=hash-mapping
+ size: 53561
+ timestamp: 1733302019362
+- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
+ sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46
+ md5: 82c1787f2a65c0155ef9652466ee98d6
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/platformdirs?source=compressed-mapping
+ size: 25646
+ timestamp: 1773199142345
+- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda
+ sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5
+ md5: 89c0b6d1793601a2a3a3f7d2d3d8b937
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/platformdirs?source=hash-mapping
+ size: 25862
+ timestamp: 1775741140609
+- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e
+ md5: d7585b6550ad04c8c5e21097ada2888e
+ depends:
+ - python >=3.9
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pluggy?source=compressed-mapping
+ size: 25877
+ timestamp: 1764896838868
+- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
+ sha256: 75b2589159d04b3fb92db16d9970b396b9124652c784ab05b66f584edc97f283
+ md5: 7526d20621b53440b0aae45d4797847e
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/prometheus-client?source=compressed-mapping
+ size: 56634
+ timestamp: 1768476602855
+- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda
+ sha256: 4d7ec90d4f9c1f3b4a50623fefe4ebba69f651b102b373f7c0e9dbbfa43d495c
+ md5: a11ab1f31af799dd93c3a39881528884
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/prometheus-client?source=hash-mapping
+ size: 57113
+ timestamp: 1775771465170
+- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
+ sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae
+ md5: edb16f14d920fb3faf17f5ce582942d6
+ depends:
+ - python >=3.10
+ - wcwidth
+ constrains:
+ - prompt_toolkit 3.0.52
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/prompt-toolkit?source=hash-mapping
+ size: 273927
+ timestamp: 1756321848365
+- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
+ sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83
+ md5: 7d9daffbb8d8e0af0f769dbbcd173a54
+ depends:
+ - python >=3.9
+ license: ISC
+ purls:
+ - pkg:pypi/ptyprocess?source=hash-mapping
+ size: 19457
+ timestamp: 1733302371990
+- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
+ sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0
+ md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pure-eval?source=hash-mapping
+ size: 16668
+ timestamp: 1733569518868
+- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
+ sha256: 81e78e6f7df0542660a58aeda15ca8775f65f0b8f2e48b34c90b3d0b2e52fae0
+ md5: b205c133ca47b7fad4edebfa39f22dc8
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pybaum?source=hash-mapping
+ size: 15654
+ timestamp: 1736947913720
+- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
+ sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6
+ md5: 12c566707c80111f9799308d9e265aef
+ depends:
+ - python >=3.9
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pycparser?source=hash-mapping
+ size: 110100
+ timestamp: 1733195786147
+- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a
+ md5: 6b6ece66ebcae2d5f326c77ef2c5a066
+ depends:
+ - python >=3.9
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pygments?source=hash-mapping
+ size: 889287
+ timestamp: 1750615908735
+- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
+ sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86
+ md5: 16c18772b340887160c79a6acc022db0
+ depends:
+ - python >=3.10
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pygments?source=hash-mapping
+ size: 893031
+ timestamp: 1774796815820
+- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de
+ md5: 3687cc0b82a8b4c17e1f0eb7e47163d5
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pyparsing?source=hash-mapping
+ size: 110893
+ timestamp: 1769003998136
+- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
+ sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca
+ md5: e2fd202833c4a981ce8a65974fe4abd1
+ depends:
+ - __win
+ - python >=3.9
+ - win_inet_pton
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pysocks?source=hash-mapping
+ size: 21784
+ timestamp: 1733217448189
+- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
+ sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8
+ md5: 461219d1a5bd61342293efa2c0c90eac
+ depends:
+ - __unix
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pysocks?source=hash-mapping
+ size: 21085
+ timestamp: 1733217331982
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520
+ md5: 2b694bad8a50dc2f712f5368de866480
+ depends:
+ - pygments >=2.7.2
+ - python >=3.10
+ - iniconfig >=1.0.1
+ - packaging >=22
+ - pluggy >=1.5,<2
+ - tomli >=1
+ - colorama >=0.4
+ - exceptiongroup >=1
+ - python
+ constrains:
+ - pytest-faulthandler >=2
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest?source=hash-mapping
+ size: 299581
+ timestamp: 1765062031645
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
+ sha256: 960f59442173eee0731906a9077bd5ccf60f4b4226f05a22d1728ab9a21a879c
+ md5: 6a991452eadf2771952f39d43615bb3e
+ depends:
+ - colorama >=0.4
+ - pygments >=2.7.2
+ - python >=3.10
+ - iniconfig >=1.0.1
+ - packaging >=22
+ - pluggy >=1.5,<2
+ - tomli >=1
+ - exceptiongroup >=1
+ - python
+ constrains:
+ - pytest-faulthandler >=2
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest?source=hash-mapping
+ size: 299984
+ timestamp: 1775644472530
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
+ sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26
+ md5: 6891acad5e136cb62a8c2ed2679d6528
+ depends:
+ - coverage >=7.10.6
+ - pluggy >=1.2
+ - pytest >=7
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest-cov?source=hash-mapping
+ size: 29016
+ timestamp: 1757612051022
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
+ sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5
+ md5: 67d1790eefa81ed305b89d8e314c7923
+ depends:
+ - coverage >=7.10.6
+ - pluggy >=1.2
+ - pytest >=7
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest-cov?source=hash-mapping
+ size: 29559
+ timestamp: 1774139250481
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
+ sha256: 03f9bc063bf51454bfcad859918dbb08673fb848d8d7b12f1b8130fa59fec9fa
+ md5: 8ec1201026003252fb9a9c1c67c10ebf
+ depends:
+ - memray >=1.4.1
+ - pytest >=7.2
+ - python >=3.9
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/pytest-memray?source=hash-mapping
+ size: 22422
+ timestamp: 1755587168132
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
+ sha256: b7b58a5be090883198411337b99afb6404127809c3d1c9f96e99b59f36177a96
+ md5: 8375cfbda7c57fbceeda18229be10417
+ depends:
+ - execnet >=2.1
+ - pytest >=7.0.0
+ - python >=3.9
+ constrains:
+ - psutil >=3.0
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest-xdist?source=hash-mapping
+ size: 39300
+ timestamp: 1751452761594
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664
+ md5: 5b8d21249ff20967101ffa321cab24e8
+ depends:
+ - python >=3.9
+ - six >=1.5
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/python-dateutil?source=hash-mapping
+ size: 233310
+ timestamp: 1751104122689
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
+ sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8
+ md5: 23029aae904a2ba587daba708208012f
+ depends:
+ - python >=3.9
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/fastjsonschema?source=hash-mapping
+ size: 244628
+ timestamp: 1755304154927
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
+ sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a
+ md5: 235765e4ea0d0301c75965985163b5a1
+ depends:
+ - cpython 3.14.3.*
+ - python_abi * *_cp314
+ license: Python-2.0
+ purls: []
+ size: 50062
+ timestamp: 1770674497152
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda
+ sha256: 36ff7984e4565c85149e64f8206303d412a0652e55cf806dcb856903fa056314
+ md5: e4e60721757979d01d3964122f674959
+ depends:
+ - cpython 3.14.4.*
+ - python_abi * *_cp314
+ license: Python-2.0
+ purls: []
+ size: 49806
+ timestamp: 1775614307464
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
+ sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca
+ md5: a61bf9ec79426938ff785eb69dbb1960
+ depends:
+ - python >=3.6
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/python-json-logger?source=hash-mapping
+ size: 13383
+ timestamp: 1677079727691
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda
+ sha256: 1c55116c22512cef7b01d55ae49697707f2c1fd829407183c19817e2d300fd8d
+ md5: 1cd2f3e885162ee1366312bd1b1677fd
+ depends:
+ - python >=3.10
+ - typing_extensions
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/python-json-logger?source=hash-mapping
+ size: 18969
+ timestamp: 1777318679482
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
+ sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd
+ md5: 7ead57407430ba33f681738905278d03
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/tzdata?source=compressed-mapping
+ size: 143542
+ timestamp: 1765719982349
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda
+ sha256: e943f9c15a6bdba2e1b9f423ab913b3f6b02197b0ef9f8e6b7464d78b59965b9
+ md5: f6ad7450fc21e00ecc23812baed6d2e4
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/tzdata?source=hash-mapping
+ size: 146639
+ timestamp: 1777068997932
+- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ build_number: 8
+ sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
+ md5: 0539938c55b6b1a59b560e843ad864a4
+ constrains:
+ - python 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 6989
+ timestamp: 1752805904792
+- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
+ sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414
+ md5: 870293df500ca7e18bedefa5838a22ab
+ depends:
+ - attrs >=22.2.0
+ - python >=3.10
+ - rpds-py >=0.7.0
+ - typing_extensions >=4.4.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/referencing?source=hash-mapping
+ size: 51788
+ timestamp: 1760379115194
+- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
+ sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5
+ md5: c65df89a0b2e321045a9e01d1337b182
+ depends:
+ - python >=3.10
+ - certifi >=2017.4.17
+ - charset-normalizer >=2,<4
+ - idna >=2.5,<4
+ - urllib3 >=1.21.1,<3
+ - python
+ constrains:
+ - chardet >=3.0.2,<6
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/requests?source=compressed-mapping
+ size: 63602
+ timestamp: 1766926974520
+- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda
+ sha256: 7f2c24dd3bd3c104a1d2c9a10ead5ed6758b0976b74f972cfe9c19884ccc4241
+ md5: 9659f587a8ceacc21864260acd02fc67
+ depends:
+ - python >=3.10
+ - certifi >=2023.5.7
+ - charset-normalizer >=2,<4
+ - idna >=2.5,<4
+ - urllib3 >=1.26,<3
+ - python
+ constrains:
+ - chardet >=3.0.2,<8
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/requests?source=hash-mapping
+ size: 63728
+ timestamp: 1777030058920
+- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
+ sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5
+ md5: 36de09a8d3e5d5e6f4ee63af49e59706
+ depends:
+ - python >=3.9
+ - six
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rfc3339-validator?source=hash-mapping
+ size: 10209
+ timestamp: 1733600040800
+- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
+ sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37
+ md5: 912a71cc01012ee38e6b90ddd561e36f
+ depends:
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rfc3986-validator?source=hash-mapping
+ size: 7818
+ timestamp: 1598024297745
+- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
+ sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92
+ md5: 7234f99325263a5af6d4cd195035e8f2
+ depends:
+ - python >=3.9
+ - lark >=1.2.2
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rfc3987-syntax?source=hash-mapping
+ size: 22913
+ timestamp: 1752876729969
+- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
+ sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590
+ md5: 7a6289c50631d620652f5045a63eb573
+ depends:
+ - markdown-it-py >=2.2.0
+ - pygments >=2.13.0,<3.0.0
+ - python >=3.10
+ - typing_extensions >=4.0.0,<5.0.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rich?source=compressed-mapping
+ size: 208472
+ timestamp: 1771572730357
+- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda
+ sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a
+ md5: 0242025a3c804966bf71aa04eee82f66
+ depends:
+ - markdown-it-py >=2.2.0
+ - pygments >=2.13.0,<3.0.0
+ - python >=3.10
+ - typing_extensions >=4.0.0,<5.0.0
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rich?source=hash-mapping
+ size: 208577
+ timestamp: 1775991661559
+- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
+ sha256: 8fc024bf1a7b99fc833b131ceef4bef8c235ad61ecb95a71a6108be2ccda63e8
+ md5: b70e2d44e6aa2beb69ba64206a16e4c6
+ depends:
+ - __osx
+ - pyobjc-framework-cocoa
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/send2trash?source=hash-mapping
+ size: 22519
+ timestamp: 1770937603551
+- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
+ sha256: 305446a0b018f285351300463653d3d3457687270e20eda37417b12ee386ef76
+ md5: 6ac53f3fff2c416d63511843a04646fa
+ depends:
+ - __win
+ - pywin32
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/send2trash?source=hash-mapping
+ size: 22864
+ timestamp: 1770937641143
+- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
+ sha256: 59656f6b2db07229351dfb3a859c35e57cc8e8bcbc86d4e501bff881a6f771f1
+ md5: 28eb91468df04f655a57bcfbb35fc5c5
+ depends:
+ - __linux
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/send2trash?source=hash-mapping
+ size: 24108
+ timestamp: 1770937597662
+- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
+ sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1
+ md5: 8e194e7b992f99a5015edbd4ebd38efd
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/setuptools?source=compressed-mapping
+ size: 639697
+ timestamp: 1773074868565
+- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d
+ md5: 3339e3b65d58accf4ca4fb8748ab16b3
+ depends:
+ - python >=3.9
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/six?source=hash-mapping
+ size: 18455
+ timestamp: 1753199211006
+- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
+ sha256: 833326122c18887b338262c13365cb146b6702c79d72da74a1c6b8af4c50e162
+ md5: 421b7a950e384949ca1b0f04f0751ce0
+ depends:
+ - python >=3.9
+ - tornado >=2.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/snakeviz?source=hash-mapping
+ size: 171545
+ timestamp: 1735289409501
+- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
+ sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad
+ md5: 03fe290994c5e4ec17293cfb6bdce520
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/sniffio?source=hash-mapping
+ size: 15698
+ timestamp: 1762941572482
+- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
+ sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac
+ md5: 18de09b20462742fe093ba39185d9bac
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/soupsieve?source=hash-mapping
+ size: 38187
+ timestamp: 1769034509657
+- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
+ sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41
+ md5: b1b505328da7a6b246787df4b5a49fbc
+ depends:
+ - asttokens
+ - executing
+ - pure_eval
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/stack-data?source=hash-mapping
+ size: 26988
+ timestamp: 1733569565672
+- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
+ sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851
+ md5: 13dc3adbc692664cd3beabd216434749
+ depends:
+ - __glibc >=2.28
+ - kernel-headers_linux-64 4.18.0 he073ed8_9
+ - tzdata
+ license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later
+ license_family: GPL
+ purls: []
+ size: 24008591
+ timestamp: 1765578833462
+- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
+ sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340
+ md5: e43ca10d61e55d0a8ec5d8c62474ec9e
+ depends:
+ - __win
+ - pywinpty >=1.1.0
+ - python >=3.10
+ - tornado >=6.1.0
+ - python
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/terminado?source=hash-mapping
+ size: 23665
+ timestamp: 1766513806974
+- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
+ sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb
+ md5: 17b43cee5cc84969529d5d0b0309b2cb
+ depends:
+ - __unix
+ - ptyprocess
+ - python >=3.10
+ - tornado >=6.1.0
+ - python
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/terminado?source=hash-mapping
+ size: 24749
+ timestamp: 1766513766867
+- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
+ sha256: c75250e2b34faa52324fc95fce138cded1bdb226547790cc9e437ab0e20c11b1
+ md5: 4a666e8fdaa357e0fe397d16ca40bd7c
+ depends:
+ - pygments >=2.19.2,<3.0.0
+ - typing_extensions >=4.4.0,<5.0.0
+ - platformdirs >=3.6.0,<5
+ - python >=3.10,<4.0.0
+ - markdown-it-py >=2.1.0
+ - linkify-it-py >=1,<3
+ - mdit-py-plugins
+ - rich >=14.2.0
+ - python
+ constrains:
+ - tree_sitter >=0.25.0
+ - tree_sitter_languages 1.10.2.*
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/textual?source=hash-mapping
+ size: 528806
+ timestamp: 1773220924332
+- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.5-pyhcf101f3_0.conda
+ sha256: 9fb5734805d4c78d1f05c712485db2f537a933083eee70a854fb11f305da51b6
+ md5: ab380da68231be1e9b10519f63a4e77e
+ depends:
+ - pygments >=2.19.2,<3.0.0
+ - typing_extensions >=4.4.0,<5.0.0
+ - platformdirs >=3.6.0,<5
+ - python >=3.10,<4.0.0
+ - markdown-it-py >=2.1.0
+ - linkify-it-py >=1,<3
+ - mdit-py-plugins
+ - rich >=14.2.0
+ - python
+ constrains:
+ - tree_sitter >=0.25.0
+ - tree_sitter_languages 1.10.2.*
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/textual?source=hash-mapping
+ size: 535137
+ timestamp: 1777572419169
+- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda
+ sha256: 6016672e0e72c4cf23c0cf7b1986283bd86a9c17e8d319212d78d8e9ae42fdfd
+ md5: 9d64911b31d57ca443e9f1e36b04385f
+ depends:
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/threadpoolctl?source=hash-mapping
+ size: 23869
+ timestamp: 1741878358548
+- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
+ sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2
+ md5: f1acf5fdefa8300de697982bcb1761c9
+ depends:
+ - python >=3.5
+ - webencodings >=0.4
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/tinycss2?source=hash-mapping
+ size: 28285
+ timestamp: 1729802975370
+- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
+ sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8
+ md5: 72e780e9aa2d0a3295f59b1874e3768b
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/tomli?source=compressed-mapping
+ size: 21453
+ timestamp: 1768146676791
+- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
+ sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd
+ md5: b5325cf06a000c5b14970462ff5e4d58
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/tomli?source=hash-mapping
+ size: 21561
+ timestamp: 1774492402955
+- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
+ sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959
+ md5: 019a7385be9af33791c989871317e1ed
+ depends:
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/traitlets?source=hash-mapping
+ size: 110051
+ timestamp: 1733367480074
+- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda
+ sha256: dfb681579be59c2e790c95f7f49b7529a9b0511d6385ad276e3c8988cbd54d2c
+ md5: 4bada6a6d908a27262af8ebddf4f7492
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/traitlets?source=hash-mapping
+ size: 115165
+ timestamp: 1778074251714
+- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
+ sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c
+ md5: edd329d7d3a4ab45dcf905899a7a6115
+ depends:
+ - typing_extensions ==4.15.0 pyhcf101f3_0
+ license: PSF-2.0
+ license_family: PSF
+ purls: []
+ size: 91383
+ timestamp: 1756220668932
+- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731
+ md5: 0caa1af407ecff61170c9437a808404d
+ depends:
+ - python >=3.10
+ - python
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/typing-extensions?source=hash-mapping
+ size: 51692
+ timestamp: 1756220668932
+- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
+ sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c
+ md5: f6d7aa696c67756a650e91e15e88223c
+ depends:
+ - python >=3.9
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/typing-utils?source=hash-mapping
+ size: 15183
+ timestamp: 1733331395943
+- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c
+ md5: ad659d0a2b3e47e38d829aa8cad2d610
+ license: LicenseRef-Public-Domain
+ purls: []
+ size: 119135
+ timestamp: 1767016325805
+- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
+ sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc
+ md5: 4fdd327852ffefc83173a7c029690d0c
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/uc-micro-py?source=compressed-mapping
+ size: 13378
+ timestamp: 1772479008776
+- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
+ sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0
+ md5: e7cb0f5745e4c5035a460248334af7eb
+ depends:
+ - python >=3.9
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/uri-template?source=hash-mapping
+ size: 23990
+ timestamp: 1733323714454
+- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
+ sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a
+ md5: 9272daa869e03efe68833e3dc7a02130
+ depends:
+ - backports.zstd >=1.0.0
+ - brotli-python >=1.2.0
+ - h2 >=4,<5
+ - pysocks >=1.5.6,<2.0,!=1.5.7
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/urllib3?source=hash-mapping
+ size: 103172
+ timestamp: 1767817860341
+- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
+ sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4
+ md5: cbb88288f74dbe6ada1c6c7d0a97223e
+ depends:
+ - backports.zstd >=1.0.0
+ - brotli-python >=1.2.0
+ - h2 >=4,<5
+ - pysocks >=1.5.6,<2.0,!=1.5.7
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/urllib3?source=hash-mapping
+ size: 103560
+ timestamp: 1778188657149
+- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
+ sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa
+ md5: c3197f8c0d5b955c904616b716aca093
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/wcwidth?source=hash-mapping
+ size: 71550
+ timestamp: 1770634638503
+- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda
+ sha256: 1ee2d8384972ecbf8630ce8a3ea9d16858358ad3e8566675295e66996d5352da
+ md5: eb9538b8e55069434a18547f43b96059
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/wcwidth?source=hash-mapping
+ size: 82917
+ timestamp: 1777744489106
+- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
+ sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6
+ md5: 6639b6b0d8b5a284f027a2003669aa65
+ depends:
+ - python >=3.10
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/webcolors?source=hash-mapping
+ size: 18987
+ timestamp: 1761899393153
+- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
+ sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6
+ md5: 2841eb5bfc75ce15e9a0054b98dcd64d
+ depends:
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/webencodings?source=hash-mapping
+ size: 15496
+ timestamp: 1733236131358
+- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
+ sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397
+ md5: 2f1ed718fcd829c184a6d4f0f2e07409
+ depends:
+ - python >=3.10
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/websocket-client?source=hash-mapping
+ size: 61391
+ timestamp: 1759928175142
+- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
+ sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f
+ md5: 46e441ba871f524e2b067929da3051c2
+ depends:
+ - __win
+ - python >=3.9
+ license: LicenseRef-Public-Domain
+ purls:
+ - pkg:pypi/win-inet-pton?source=hash-mapping
+ size: 9555
+ timestamp: 1733130678956
+- conda: https://conda.anaconda.org/conda-forge/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
+ sha256: 64f09069d8b3a3791643230cedc80d9f9422f667e3e328b40d527375352fe8d4
+ md5: 91f5637b706492b9e418da1872fd61ce
+ depends:
+ - python >=3.10
+ license: BSD-3-Clause AND BSD-4-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/xlrd?source=hash-mapping
+ size: 93671
+ timestamp: 1756170155688
+- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
+ sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae
+ md5: 30cd29cb87d819caead4d55184c1d115
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/zipp?source=hash-mapping
+ size: 24194
+ timestamp: 1764460141901
+- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda
+ sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca
+ md5: e1c36c6121a7c9c76f2f148f1e83b983
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/zipp?source=hash-mapping
+ size: 24461
+ timestamp: 1776131454755
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
+ build_number: 7
+ sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd
+ md5: a44032f282e7d2acdeb1c240308052dd
+ depends:
+ - llvm-openmp >=9.0.1
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 8325
+ timestamp: 1764092507920
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda
+ sha256: aab60bbaea5cc49dff37438d1ad469d64025cda2ce58103cf68da61701ed2075
+ md5: a240a79a49a95b388ef81ccda27a5e51
+ depends:
+ - __osx >=11.0
+ - cffi >=2.0.0b1
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
+ size: 34218
+ timestamp: 1762509977830
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda
+ sha256: aba942578ad57e7b584434ed4e39c5ff7ed4ad3f326ac3eda26913ca343ea255
+ md5: 1c701edc28f543a0e040325b223d5ca0
+ depends:
+ - __osx >=11.0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 116820
+ timestamp: 1774275057443
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda
+ sha256: 13c42cb54619df0a1c3e5e5b0f7c8e575460b689084024fd23abeb443aac391b
+ md5: 8baab664c541d6f059e83423d9fc5e30
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 45233
+ timestamp: 1764593742187
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda
+ sha256: cd3817c82470826167b1d8008485676862640cff65750c34062e6c20aeac419b
+ md5: b759f02a7fa946ea9fd9fb035422c848
+ depends:
+ - __osx >=11.0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 224116
+ timestamp: 1763585987935
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda
+ sha256: ce405171612acef0924a1ff9729d556db7936ad380a81a36325b7df5405a6214
+ md5: 6edccad10fc1c76a7a34b9c14efbeaa3
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 21470
+ timestamp: 1767790900862
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda
+ sha256: b25380b43c2c5733dcaac88b075fa286893af1c147ca40d50286df150ace5fb8
+ md5: 806ff124512457583d675c62336b1392
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-compression >=0.3.2,<0.3.3.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 172940
+ timestamp: 1774270153001
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda
+ sha256: 0e6ba2c8f250f466b9d671d3970e1f7c149c925b79c10fa7778708192a2a7833
+ md5: 730d1cbd0973bd7ac150e181d3b572f3
+ depends:
+ - __osx >=11.0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 177072
+ timestamp: 1773868341204
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda
+ sha256: bd8f4ffb8346dd02bda2bc1ae9993ebdb131298b1308cb9e6b1e771b530d9dd5
+ md5: f33735fd60f9c4a21c51a0283eb8afc1
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-checksums >=0.2.10,<0.2.11.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 129783
+ timestamp: 1774282252139
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda
+ sha256: 8a4ee03ea6e14d5a498657e5fe96875a133b4263b910c5b60176db1a1a0aaa27
+ md5: 658a8236f3f1ebecaaa937b5ccd5d730
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 53430
+ timestamp: 1764755714246
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda
+ sha256: 06661bc848b27aa38a85d8018ace8d4f4a3069e22fa0963e2431dc6c0dc30450
+ md5: 07f6c5a5238f5deeed6e985826b30de8
+ depends:
+ - __osx >=11.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 91917
+ timestamp: 1771063496505
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda
+ sha256: 422ac5c91f8ef07017c594d9135b7ae068157393d2a119b1908c7e350938579d
+ md5: 48ece20aa479be6ac9a284772827d00c
+ depends:
+ - __osx >=11.0
+ - brotli-bin 1.2.0 hc919400_1
+ - libbrotlidec 1.2.0 hc919400_1
+ - libbrotlienc 1.2.0 hc919400_1
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20237
+ timestamp: 1764018058424
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda
+ sha256: e2d142052a83ff2e8eab3fe68b9079cad80d109696dc063a3f92275802341640
+ md5: 377d015c103ad7f3371be1777f8b584c
+ depends:
+ - __osx >=11.0
+ - libbrotlidec 1.2.0 hc919400_1
+ - libbrotlienc 1.2.0 hc919400_1
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 18628
+ timestamp: 1764018033635
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
+ sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99
+ md5: f9501812fe7c66b6548c7fcaa1c1f252
+ depends:
+ - __osx >=11.0
+ - libcxx >=19
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ constrains:
+ - libbrotlicommon 1.2.0 hc919400_1
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/brotli?source=hash-mapping
+ size: 359854
+ timestamp: 1764018178608
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
+ sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df
+ md5: 620b85a3f45526a8bc4d23fd78fc22f0
+ depends:
+ - __osx >=11.0
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 124834
+ timestamp: 1771350416561
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
+ sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196
+ md5: bcb3cba70cf1eec964a03b4ba7775f01
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 180327
+ timestamp: 1765215064054
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda
+ sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98
+ md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7
+ depends:
+ - __osx >=11.0
+ - libffi >=3.5.2,<3.6.0a0
+ - pycparser
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/cffi?source=hash-mapping
+ size: 292983
+ timestamp: 1761203354051
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda
+ sha256: 754ab72f1c1ae99ef7c57995f59224dc9632cbd6731fe7e6277437fd01d43156
+ md5: cddc851000ce131d757678c2f329eaad
+ depends:
+ - numpy >=1.25
+ - python
+ - python 3.14.* *_cp314
+ - __osx >=11.0
+ - libcxx >=19
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/contourpy?source=hash-mapping
+ size: 290405
+ timestamp: 1769156069514
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda
+ sha256: 808ebcb57027251f379f84e53a3755d2851918f78bdd512d131afe40ca64a041
+ md5: cdbafe4a3e605024e7372c9580f9d734
+ depends:
+ - __osx >=11.0
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ - tomli
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/coverage?source=compressed-mapping
+ size: 412458
+ timestamp: 1773761280047
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda
+ sha256: 7736a82ebe75c0f3ea6991298363d1f2edb34291f8616c1d3719862881c3a167
+ md5: 407c74dc27356ba6bf3a0191070e3ac0
+ depends:
+ - python
+ - python 3.14.* *_cp314
+ - __osx >=11.0
+ - libcxx >=19
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/debugpy?source=hash-mapping
+ size: 2778080
+ timestamp: 1769745040206
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.2-hce30654_0.conda
+ sha256: 3c02ecdbfd94d25721811f51d0f400bf705005a728011e19db9975a8985e1021
+ md5: ca730d8e7d1de1f71013edfef0e08f13
+ depends:
+ - libfreetype 2.14.2 hce30654_0
+ - libfreetype6 2.14.2 hdfa99f5_0
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 173786
+ timestamp: 1772756361577
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda
+ sha256: 0762ed080bf45ca475da96796a8883a6c719603c44fa9b07a5883785649a4a0f
+ md5: ab9a6c652fd25407c9cf67b9b6b87496
+ depends:
+ - __osx >=11.0
+ - cached-property
+ - hdf5 >=2.1.0,<3.0a0
+ - numpy >=1.23,<3
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/h5py?source=hash-mapping
+ size: 1203956
+ timestamp: 1775583125726
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda
+ sha256: 5b96accf983be97718fbfaddd6706591d7ef6511b4ccdac8a09f6b9899d1b284
+ md5: e5390fd4a3b964a3ed619480df918294
+ depends:
+ - __osx >=11.0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-s3 >=0.11.5,<0.11.6.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - libaec >=1.1.5,<2.0a0
+ - libcurl >=8.19.0,<9.0a0
+ - libcxx >=19
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - libzlib >=1.3.2,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 3418702
+ timestamp: 1775244340092
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
+ sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5
+ md5: f1182c91c0de31a7abd40cedf6a5ebef
+ depends:
+ - __osx >=11.0
+ license: MIT
+ purls: []
+ size: 12361647
+ timestamp: 1773822915649
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda
+ sha256: 840de1b0ba2fa646475bc53ba0f723c8a13e66139633a070831b8279deaa7c64
+ md5: eb1465d8a644ef290d18fb86af6e9bc4
+ depends:
+ - python
+ - python 3.14.* *_cp314
+ - libcxx >=19
+ - __osx >=11.0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/kiwisolver?source=compressed-mapping
+ size: 69284
+ timestamp: 1773067285911
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda
+ sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed
+ md5: e446e1822f4da8e5080a9de93474184d
+ depends:
+ - __osx >=11.0
+ - libcxx >=19
+ - libedit >=3.1.20250104,<3.2.0a0
+ - libedit >=3.1.20250104,<4.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 1160828
+ timestamp: 1769770119811
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
+ sha256: d768da024ab74a4b30642401877fa914a68bdc238667f16b1ec2e0e98b2451a6
+ md5: 6631a7bd2335bb9699b1dbc234b19784
+ depends:
+ - __osx >=11.0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 211756
+ timestamp: 1768184994800
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda
+ sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51
+ md5: 095e5749868adab9cae42d4b460e5443
+ depends:
+ - __osx >=11.0
+ - libcxx >=19
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 164222
+ timestamp: 1773114244984
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda
+ sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46
+ md5: 13e6d9ae0efbc9d2e9a01a91f4372b41
+ depends:
+ - __osx >=11.0
+ - libcxx >=19
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 30390
+ timestamp: 1769222133373
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
+ build_number: 5
+ sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d
+ md5: bcc025e2bbaf8a92982d20863fe1fb69
+ depends:
+ - libopenblas >=0.3.30,<0.3.31.0a0
+ - libopenblas >=0.3.30,<1.0a0
+ constrains:
+ - libcblas 3.11.0 5*_openblas
+ - liblapack 3.11.0 5*_openblas
+ - liblapacke 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - mkl <2026
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18546
+ timestamp: 1765819094137
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
+ sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229
+ md5: 006e7ddd8a110771134fcc4e1e3a6ffa
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 79443
+ timestamp: 1764017945924
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
+ sha256: 2eae444039826db0454b19b52a3390f63bfe24f6b3e63089778dd5a5bf48b6bf
+ md5: 079e88933963f3f149054eec2c487bc2
+ depends:
+ - __osx >=11.0
+ - libbrotlicommon 1.2.0 hc919400_1
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 29452
+ timestamp: 1764017979099
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
+ sha256: 01436c32bb41f9cb4bcf07dda647ce4e5deb8307abfc3abdc8da5317db8189d1
+ md5: b2b7c8288ca1a2d71ff97a8e6a1e8883
+ depends:
+ - __osx >=11.0
+ - libbrotlicommon 1.2.0 hc919400_1
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 290754
+ timestamp: 1764018009077
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
+ build_number: 5
+ sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0
+ md5: efd8bd15ca56e9d01748a3beab8404eb
+ depends:
+ - libblas 3.11.0 5_h51639a9_openblas
+ constrains:
+ - liblapacke 3.11.0 5*_openblas
+ - liblapack 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18548
+ timestamp: 1765819108956
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda
+ sha256: c4d581b067fa60f9dc0e1c5f18b756760ff094a03139e6b206eb98d185ae2bb1
+ md5: 9fc7771fc8104abed9119113160be15a
+ depends:
+ - __osx >=11.0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libnghttp2 >=1.67.0,<2.0a0
+ - libssh2 >=1.11.1,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: curl
+ license_family: MIT
+ purls: []
+ size: 399616
+ timestamp: 1773219210246
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
+ sha256: 3c8142cdd3109c250a926c492ec45bc954697b288e5d1154ada95272ffa21be8
+ md5: 7a290d944bc0c481a55baf33fa289deb
+ depends:
+ - __osx >=11.0
+ license: Apache-2.0 WITH LLVM-exception
+ license_family: Apache
+ purls: []
+ size: 570281
+ timestamp: 1773203613980
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda
+ sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c
+ md5: a6130c709305cd9828b4e1bd9ba0000c
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 55420
+ timestamp: 1761980066242
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda
+ sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631
+ md5: 44083d2d2c2025afca315c7a172eab2b
+ depends:
+ - ncurses
+ - __osx >=11.0
+ - ncurses >=6.5,<7.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 107691
+ timestamp: 1738479560845
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
+ sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f
+ md5: 36d33e440c31857372a72137f78bacf5
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 107458
+ timestamp: 1702146414478
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
+ sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf
+ md5: a92e310ae8dfc206ff449f362fc4217f
+ depends:
+ - __osx >=11.0
+ constrains:
+ - expat 2.7.4.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 68199
+ timestamp: 1771260020767
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
+ sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7
+ md5: 43c04d9cb46ef176bb2a4c77e324d599
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 40979
+ timestamp: 1769456747661
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
+ sha256: 6061ef5321b8e697d5577d8dfe7a4c75bfe3e706c956d0d84bfec6bea3ed9f77
+ md5: a3a53232936b55ffea76806aefe19e8b
+ depends:
+ - libfreetype6 >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 8076
+ timestamp: 1772756349852
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
+ sha256: 24dd0e0bee56e87935f885929f67659f1d3b8a01e7546568de2919cffd9e2e36
+ md5: e726e134a392ae5d7bafa6cc4a3d5725
+ depends:
+ - __osx >=11.0
+ - libpng >=1.6.55,<1.7.0a0
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - freetype >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 338032
+ timestamp: 1772756347899
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
+ sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e
+ md5: 92df6107310b1fff92c4cc84f0de247b
+ depends:
+ - _openmp_mutex
+ constrains:
+ - libgcc-ng ==15.2.0=*_18
+ - libgomp 15.2.0 18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 401974
+ timestamp: 1771378877463
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
+ sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836
+ md5: 26981599908ed2205366e8fc91b37fc6
+ depends:
+ - libgfortran5 15.2.0 hdae7583_18
+ constrains:
+ - libgfortran-ng ==15.2.0=*_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 138973
+ timestamp: 1771379054939
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
+ sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e
+ md5: c4a6f7989cffb0544bfd9207b6789971
+ depends:
+ - libgcc >=15.2.0
+ constrains:
+ - libgfortran 15.2.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 598634
+ timestamp: 1771378886363
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
+ sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f
+ md5: f0695fbecf1006f27f4395d64bd0c4b8
+ depends:
+ - __osx >=11.0
+ constrains:
+ - jpeg <0.0.0a
+ license: IJG AND BSD-3-Clause AND Zlib
+ purls: []
+ size: 551197
+ timestamp: 1762095054358
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
+ build_number: 5
+ sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb
+ md5: ca9d752201b7fa1225bca036ee300f2b
+ depends:
+ - libblas 3.11.0 5_h51639a9_openblas
+ constrains:
+ - libcblas 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - liblapacke 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18551
+ timestamp: 1765819121855
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
+ sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e
+ md5: 009f0d956d7bfb00de86901d16e486c7
+ depends:
+ - __osx >=11.0
+ constrains:
+ - xz 5.8.2.*
+ license: 0BSD
+ purls: []
+ size: 92242
+ timestamp: 1768752982486
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
+ sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2
+ md5: 57c4be259f5e0b99a5983799a228ae55
+ depends:
+ - __osx >=11.0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 73690
+ timestamp: 1769482560514
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
+ sha256: 2bc7bc3978066f2c274ebcbf711850cc9ab92e023e433b9631958a098d11e10a
+ md5: 6ea18834adbc3b33df9bd9fb45eaf95b
+ depends:
+ - __osx >=11.0
+ - c-ares >=1.34.6,<2.0a0
+ - libcxx >=19
+ - libev >=4.33,<4.34.0a0
+ - libev >=4.33,<5.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 576526
+ timestamp: 1773854624224
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
+ sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa
+ md5: a6f6d3a31bb29e48d37ce65de54e2df0
+ depends:
+ - __osx >=11.0
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - llvm-openmp >=19.1.7
+ constrains:
+ - openblas >=0.3.30,<0.3.31.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 4284132
+ timestamp: 1768547079205
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda
+ sha256: 7a4fd29a6ee2d7f7a6e610754dfdf7410ed08f40d8d8b488a27bc0f9981d5abb
+ md5: 871dc88b0192ac49b6a5509932c31377
+ depends:
+ - __osx >=11.0
+ - libzlib >=1.3.1,<2.0a0
+ license: zlib-acknowledgement
+ purls: []
+ size: 288950
+ timestamp: 1770691485950
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda
+ sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227
+ md5: 7cc5247987e6d115134ebab15186bc13
+ depends:
+ - __osx >=11.0
+ license: ISC
+ purls: []
+ size: 248039
+ timestamp: 1772479570912
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
+ sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c
+ md5: f6233a3fddc35a2ec9f617f79d6f3d71
+ depends:
+ - __osx >=11.0
+ - icu >=78.2,<79.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 918420
+ timestamp: 1772819478684
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda
+ sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a
+ md5: b68e8f66b94b44aaa8de4583d3d4cc40
+ depends:
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.0,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 279193
+ timestamp: 1745608793272
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda
+ sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f
+ md5: e2a72ab2fa54ecb6abab2b26cde93500
+ depends:
+ - __osx >=11.0
+ - lerc >=4.0.0,<5.0a0
+ - libcxx >=19
+ - libdeflate >=1.25,<1.26.0a0
+ - libjpeg-turbo >=3.1.0,<4.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: HPND
+ purls: []
+ size: 373892
+ timestamp: 1762022345545
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda
+ sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd
+ md5: e5e7d467f80da752be17796b87fe6385
+ depends:
+ - __osx >=11.0
+ constrains:
+ - libwebp 1.6.0
license: BSD-3-Clause
license_family: BSD
- purls:
- - pkg:pypi/pandocfilters?source=hash-mapping
- size: 11627
- timestamp: 1631603397334
-- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda
- sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94
- md5: 97c1ce2fffa1209e7afb432810ec6e12
+ purls: []
+ size: 294974
+ timestamp: 1752159906788
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda
+ sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71
+ md5: af523aae2eca6dfa1c8eec693f5b9a79
depends:
- - python >=3.10
- - python
+ - __osx >=11.0
+ - pthread-stubs
+ - xorg-libxau >=1.0.11,<2.0a0
+ - xorg-libxdmcp
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/parso?source=hash-mapping
- size: 82287
- timestamp: 1770676243987
-- pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
- name: pathlib-abc
- version: 0.5.2
- sha256: 4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb
- requires_python: '>=3.9'
-- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
- name: pdbp
- version: 1.8.2
- sha256: d4fd05e177636b5ccd0b2e03e378cec57afc06149e5fd975de6f8ddb3d0109a8
- requires_dist:
- - pygments>=2.19.2
- - tabcompleter>=1.4.0
- - colorama>=0.4.6 ; sys_platform == 'win32'
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a
- md5: d0d408b1f18883a944376da5cf8101ea
+ purls: []
+ size: 323658
+ timestamp: 1727278733917
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05
+ md5: bc5a5721b6439f2f62a84f2548136082
depends:
- - ptyprocess >=0.5
- - python >=3.9
- license: ISC
- purls:
- - pkg:pypi/pexpect?source=hash-mapping
- size: 53561
- timestamp: 1733302019362
-- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
- sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee
- md5: 79678378ae235e24b3aa83cee1b38207
+ - __osx >=11.0
+ constrains:
+ - zlib 1.3.2 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 47759
+ timestamp: 1774072956767
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda
+ sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d
+ md5: ff0820b5588b20be3b858552ecf8ffae
depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libwebp-base >=1.6.0,<2.0a0
- - zlib-ng >=2.3.3,<2.4.0a0
+ - __osx >=11.0
+ constrains:
+ - openmp 22.1.0|22.1.0.*
+ - intel-openmp <0.0a0
+ license: Apache-2.0 WITH LLVM-exception
+ license_family: APACHE
+ purls: []
+ size: 285558
+ timestamp: 1772028716784
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda
+ sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652
+ md5: 01511afc6cc1909c5303cf31be17b44f
+ depends:
+ - __osx >=11.0
+ - libcxx >=18
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 148824
+ timestamp: 1733741047892
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
+ sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f
+ md5: d33c0a15882b70255abdd54711b06a45
+ depends:
+ - __osx >=11.0
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
- python_abi 3.14.* *_cp314
- - tk >=8.6.13,<8.7.0a0
- - libjpeg-turbo >=3.1.2,<4.0a0
- - libxcb >=1.17.0,<2.0a0
- - openjpeg >=2.5.4,<3.0a0
- - lcms2 >=2.18,<3.0a0
- - libtiff >=4.7.1,<4.8.0a0
+ constrains:
+ - jinja2 >=3.0.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/markupsafe?source=compressed-mapping
+ size: 27256
+ timestamp: 1772445397216
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
+ sha256: 198dcc0ed83e78bc7bf48e6ef8d4ecd220e9cf1f07db98508251b2bc0be067f9
+ md5: c84152e510d41378b8758826655b6ed7
+ depends:
+ - __osx >=11.0
+ - contourpy >=1.0.1
+ - cycler >=0.10
+ - fonttools >=4.22.0
+ - freetype
+ - kiwisolver >=1.3.1
+ - libcxx >=19
- libfreetype >=2.14.1
- libfreetype6 >=2.14.1
- license: HPND
+ - numpy >=1.23
+ - numpy >=1.23,<3
+ - packaging >=20.0
+ - pillow >=8
+ - pyparsing >=2.3.1
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python-dateutil >=2.7
+ - python_abi 3.14.* *_cp314
+ - qhull >=2020.2,<2020.3.0a0
+ license: PSF-2.0
+ license_family: PSF
purls:
- - pkg:pypi/pillow?source=hash-mapping
- size: 1073026
- timestamp: 1770794002408
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
- sha256: 1659ff6e8ea6170a90fb8eb7291990d12bba270aab18176defa0717ed34ce186
- md5: bcb38a8005e93a3b240a0dbcf28df87a
+ - pkg:pypi/matplotlib?source=hash-mapping
+ size: 8286510
+ timestamp: 1763055937766
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/memray-1.19.2-py314h44d60dd_0.conda
+ sha256: 5e053a64dbcdc98bd470f358f3fce1cde9b9fe362280a87cb66f1587e9f09e26
+ md5: f29f08f053a687bcfe09089f8a410bc9
depends:
- python
+ - rich >=11.2.0
+ - jinja2
+ - textual >=0.34.0
- python 3.14.* *_cp314
- __osx >=11.0
- - libxcb >=1.17.0,<2.0a0
- - zlib-ng >=2.3.3,<2.4.0a0
- - openjpeg >=2.5.4,<3.0a0
- - tk >=8.6.13,<8.7.0a0
- - libfreetype >=2.14.1
- - libfreetype6 >=2.14.1
- - libjpeg-turbo >=3.1.2,<4.0a0
- - libtiff >=4.7.1,<4.8.0a0
+ - libcxx >=19
- python_abi 3.14.* *_cp314
- - lcms2 >=2.18,<3.0a0
- - libwebp-base >=1.6.0,<2.0a0
- license: HPND
+ - lz4-c >=1.10.0,<1.11.0a0
+ license: Apache-2.0 AND BSD-3-Clause
purls:
- - pkg:pypi/pillow?source=hash-mapping
- size: 996187
- timestamp: 1770794152243
-- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
- sha256: f4387e480970e0f429a0505d668bc677e84ef118d3db2cba56b547d1bd2c2dbf
- md5: 819c3d15988cea0f2c599b405023f55d
+ - pkg:pypi/memray?source=hash-mapping
+ size: 1744827
+ timestamp: 1773493881871
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733
+ md5: 068d497125e4bf8a66bf707254fff5ae
+ depends:
+ - __osx >=11.0
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 797030
+ timestamp: 1738196177597
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
+ sha256: 43b5ed0ead36e5133ee8462916d23284f0bce0e5f266fa4bd31a020a6cc22f14
+ md5: 0f0ddf0575b98d91cda9e3ca9eaeb9a2
depends:
- python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
+ - __osx >=11.0
+ - python 3.14.* *_cp314
+ - libcxx >=19
+ - libblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - libcblas >=3.9.0,<4.0a0
+ constrains:
+ - numpy-base <0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/numpy?source=hash-mapping
+ size: 6992958
+ timestamp: 1770098398327
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda
+ sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4
+ md5: 4b5d3a91320976eec71678fad1e3569b
+ depends:
+ - __osx >=11.0
+ - libcxx >=19
+ - libpng >=1.6.55,<1.7.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 319697
+ timestamp: 1772625397692
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda
+ sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67
+ md5: f4f6ad63f98f64191c3e77c5f5f29d76
+ depends:
+ - __osx >=11.0
+ - ca-certificates
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3104268
+ timestamp: 1769556384749
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
+ sha256: 1659ff6e8ea6170a90fb8eb7291990d12bba270aab18176defa0717ed34ce186
+ md5: bcb38a8005e93a3b240a0dbcf28df87a
+ depends:
+ - python
+ - python 3.14.* *_cp314
+ - __osx >=11.0
- libxcb >=1.17.0,<2.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - openjpeg >=2.5.4,<3.0a0
- tk >=8.6.13,<8.7.0a0
- libfreetype >=2.14.1
- libfreetype6 >=2.14.1
- - libtiff >=4.7.1,<4.8.0a0
- - openjpeg >=2.5.4,<3.0a0
- libjpeg-turbo >=3.1.2,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - python_abi 3.14.* *_cp314
- lcms2 >=2.18,<3.0a0
- libwebp-base >=1.6.0,<2.0a0
- - python_abi 3.14.* *_cp314
- - zlib-ng >=2.3.3,<2.4.0a0
license: HPND
purls:
- pkg:pypi/pillow?source=hash-mapping
- size: 973701
- timestamp: 1770794018422
-- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda
- sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46
- md5: 82c1787f2a65c0155ef9652466ee98d6
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/platformdirs?source=compressed-mapping
- size: 25646
- timestamp: 1773199142345
-- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
- name: plotly
- version: 6.6.0
- sha256: 8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0
- requires_dist:
- - narwhals>=1.15.1
- - packaging
- - numpy ; extra == 'express'
- - kaleido>=1.1.0 ; extra == 'kaleido'
- - pytest ; extra == 'dev-core'
- - requests ; extra == 'dev-core'
- - ruff==0.11.12 ; extra == 'dev-core'
- - plotly[dev-core] ; extra == 'dev-build'
- - build ; extra == 'dev-build'
- - jupyter ; extra == 'dev-build'
- - plotly[dev-build] ; extra == 'dev-optional'
- - plotly[kaleido] ; extra == 'dev-optional'
- - anywidget ; extra == 'dev-optional'
- - colorcet ; extra == 'dev-optional'
- - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev-optional'
- - geopandas ; extra == 'dev-optional'
- - inflect ; extra == 'dev-optional'
- - numpy ; extra == 'dev-optional'
- - orjson ; extra == 'dev-optional'
- - pandas ; extra == 'dev-optional'
- - pdfrw ; extra == 'dev-optional'
- - pillow ; extra == 'dev-optional'
- - plotly-geo ; extra == 'dev-optional'
- - polars[timezone] ; extra == 'dev-optional'
- - pyarrow ; extra == 'dev-optional'
- - pyshp ; extra == 'dev-optional'
- - pytz ; extra == 'dev-optional'
- - scikit-image ; extra == 'dev-optional'
- - scipy ; extra == 'dev-optional'
- - shapely ; extra == 'dev-optional'
- - statsmodels ; extra == 'dev-optional'
- - vaex ; python_full_version < '3.10' and extra == 'dev-optional'
- - xarray ; extra == 'dev-optional'
- - plotly[dev-optional] ; extra == 'dev'
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
- name: pluggy
- version: 1.6.0
- sha256: e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746
- requires_dist:
- - pre-commit ; extra == 'dev'
- - tox ; extra == 'dev'
- - pytest ; extra == 'testing'
- - pytest-benchmark ; extra == 'testing'
- - coverage ; extra == 'testing'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e
- md5: d7585b6550ad04c8c5e21097ada2888e
- depends:
- - python >=3.9
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/pluggy?source=compressed-mapping
- size: 25877
- timestamp: 1764896838868
-- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.6-hb17b654_0.conda
- sha256: a26627790776987421ecb130240dfd5c26e706d6811e173f7bdf3029bec13e1e
- md5: 903cc9fafd676d3c13d9c1e71a52231a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- purls: []
- size: 5638792
- timestamp: 1773659796309
+ size: 996187
+ timestamp: 1770794152243
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.6-h6fdd925_0.conda
sha256: 9acb2a629c5cf8b423532a18bd385fa1e2b06b587ced8055e0075d2232a6903a
md5: 4b7ebf6d9d829849c264171a00cb7395
@@ -8831,57 +10730,6 @@ packages:
purls: []
size: 5203524
timestamp: 1773660234368
-- conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
- sha256: 31984152d475d6854a64786b9308dd180e2a4b014fea519b4959513e51dcab26
- md5: 042c6b6426dbeef69ec7aef3864427bf
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- purls: []
- size: 5913998
- timestamp: 1773659816255
-- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda
- sha256: 75b2589159d04b3fb92db16d9970b396b9124652c784ab05b66f584edc97f283
- md5: 7526d20621b53440b0aae45d4797847e
- depends:
- - python >=3.10
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/prometheus-client?source=compressed-mapping
- size: 56634
- timestamp: 1768476602855
-- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae
- md5: edb16f14d920fb3faf17f5ce582942d6
- depends:
- - python >=3.10
- - wcwidth
- constrains:
- - prompt_toolkit 3.0.52
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/prompt-toolkit?source=hash-mapping
- size: 273927
- timestamp: 1756321848365
-- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5
- md5: 4f225a966cfee267a79c5cb6382bd121
- depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/psutil?source=hash-mapping
- size: 231303
- timestamp: 1769678156552
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
sha256: e0f31c053eb11803d63860c213b2b1b57db36734f5f84a3833606f7c91fedff9
md5: fc4c7ab223873eee32080d51600ce7e7
@@ -8896,109 +10744,16 @@ packages:
- pkg:pypi/psutil?source=hash-mapping
size: 245502
timestamp: 1769678303655
-- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- sha256: 17c8274ce5a32c9793f73a5a0094bd6188f3a13026a93147655143d4df034214
- md5: fd539ac231820f64066839251aa9fa48
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/psutil?source=hash-mapping
- size: 249950
- timestamp: 1769678167309
-- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
- sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973
- md5: b3c17d95b5a10c6e64a21fa17573e70e
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- license: MIT
- license_family: MIT
- purls: []
- size: 8252
- timestamp: 1726802366959
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda
- sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3
- md5: 415816daf82e0b23a736a069a75e9da7
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 8381
- timestamp: 1726802424786
-- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
- sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b
- md5: 3c8f2573569bb816483e5cf57efbbe29
- depends:
- - libgcc >=13
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- purls: []
- size: 9389
- timestamp: 1726802555076
-- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83
- md5: 7d9daffbb8d8e0af0f769dbbcd173a54
- depends:
- - python >=3.9
- license: ISC
- purls:
- - pkg:pypi/ptyprocess?source=hash-mapping
- size: 19457
- timestamp: 1733302371990
-- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0
- md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/pure-eval?source=hash-mapping
- size: 16668
- timestamp: 1733569518868
-- conda: https://conda.anaconda.org/conda-forge/noarch/pybaum-0.1.3-pyhd8ed1ab_1.conda
- sha256: 81e78e6f7df0542660a58aeda15ca8775f65f0b8f2e48b34c90b3d0b2e52fae0
- md5: b205c133ca47b7fad4edebfa39f22dc8
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/pybaum?source=hash-mapping
- size: 15654
- timestamp: 1736947913720
-- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6
- md5: 12c566707c80111f9799308d9e265aef
- depends:
- - python >=3.9
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/pycparser?source=hash-mapping
- size: 110100
- timestamp: 1733195786147
-- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
- sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a
- md5: 6b6ece66ebcae2d5f326c77ef2c5a066
- depends:
- - python >=3.9
- license: BSD-2-Clause
- license_family: BSD
- purls:
- - pkg:pypi/pygments?source=hash-mapping
- size: 889287
- timestamp: 1750615908735
+ sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3
+ md5: 415816daf82e0b23a736a069a75e9da7
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 8381
+ timestamp: 1726802424786
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
sha256: df5af268c5a74b7160d772c263ece6f43257faff571783443e34b5f1d5a61cf2
md5: 75a84fc8337557347252cc4fd3ba2a93
@@ -9031,1234 +10786,1439 @@ packages:
- pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping
size: 374792
timestamp: 1763160601898
-- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
- sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de
- md5: 3687cc0b82a8b4c17e1f0eb7e47163d5
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
+ build_number: 101
+ sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce
+ md5: 753c8d0447677acb7ddbcc6e03e82661
depends:
- - python >=3.10
- - python
+ - __osx >=11.0
+ - bzip2 >=1.0.8,<2.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.2,<4.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.5,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - readline >=8.3,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ - zstd >=1.5.7,<1.6.0a0
+ license: Python-2.0
+ purls: []
+ size: 13522698
+ timestamp: 1770675365241
+ python_site_packages_path: lib/python3.14/site-packages
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
+ sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252
+ md5: dcf51e564317816cb8d546891019b3ab
+ depends:
+ - __osx >=11.0
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ - yaml >=0.2.5,<0.3.0a0
license: MIT
license_family: MIT
purls:
- - pkg:pypi/pyparsing?source=hash-mapping
- size: 110893
- timestamp: 1769003998136
-- pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
- name: pyreadline3
- version: 3.5.4
- sha256: eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6
- requires_dist:
- - build ; extra == 'dev'
- - flake8 ; extra == 'dev'
- - mypy ; extra == 'dev'
- - pytest ; extra == 'dev'
- - twine ; extra == 'dev'
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca
- md5: e2fd202833c4a981ce8a65974fe4abd1
+ - pkg:pypi/pyyaml?source=hash-mapping
+ size: 189475
+ timestamp: 1770223788648
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
+ noarch: python
+ sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772
+ md5: 2f6b79700452ef1e91f45a99ab8ffe5a
depends:
- - __win
- - python >=3.9
- - win_inet_pton
+ - python
+ - libcxx >=19
+ - __osx >=11.0
+ - _python_abi3_support 1.*
+ - cpython >=3.12
+ - zeromq >=4.3.5,<4.4.0a0
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/pysocks?source=hash-mapping
- size: 21784
- timestamp: 1733217448189
-- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8
- md5: 461219d1a5bd61342293efa2c0c90eac
+ - pkg:pypi/pyzmq?source=compressed-mapping
+ size: 191641
+ timestamp: 1771717073430
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
+ sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4
+ md5: 6483b1f59526e05d7d894e466b5b6924
depends:
- - __unix
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/pysocks?source=hash-mapping
- size: 21085
- timestamp: 1733217331982
-- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
- name: pytask
- version: 0.5.8
- sha256: 217ed6b3e12140c442afa5e333bbb91e98f8d4fd5c746d323fbbf9778985a92f
- requires_dist:
- - attrs>=21.3.0
- - click>=8.1.8,!=8.2.0
- - click-default-group>=1.2.4
- - networkx>=2.4.0
- - optree>=0.9.0
- - packaging>=23.0.0
- - pluggy>=1.3.0
- - rich>=13.8.0
- - sqlalchemy>=2.0.31
- - tomli>=1 ; python_full_version < '3.11'
- - typing-extensions>=4.8.0 ; python_full_version < '3.11'
- - universal-pathlib>=0.2.2
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
- name: pytask-parallel
- version: 0.5.2
- sha256: b5bf37a2aad4381d4c29484f87ef8623155c8cd1dff57af4952ccf894ae9898f
- requires_dist:
- - attrs>=21.3.0
- - click>=8.1.8,!=8.2.0
- - cloudpickle
- - loky
- - pluggy>=1.0.0
- - pytask>=0.5.2
- - rich
- requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
- name: pytest
- version: 9.0.2
- sha256: 711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b
- requires_dist:
- - colorama>=0.4 ; sys_platform == 'win32'
- - exceptiongroup>=1 ; python_full_version < '3.11'
- - iniconfig>=1.0.1
- - packaging>=22
- - pluggy>=1.5,<2
- - pygments>=2.7.2
- - tomli>=1 ; python_full_version < '3.11'
- - argcomplete ; extra == 'dev'
- - attrs>=19.2 ; extra == 'dev'
- - hypothesis>=3.56 ; extra == 'dev'
- - mock ; extra == 'dev'
- - requests ; extra == 'dev'
- - setuptools ; extra == 'dev'
- - xmlschema ; extra == 'dev'
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
- sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520
- md5: 2b694bad8a50dc2f712f5368de866480
+ - __osx >=11.0
+ - libcxx >=16
+ license: LicenseRef-Qhull
+ purls: []
+ size: 516376
+ timestamp: 1720814307311
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477
+ md5: f8381319127120ce51e081dce4865cf4
+ depends:
+ - __osx >=11.0
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 313930
+ timestamp: 1765813902568
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
+ sha256: e161dd97403b8b8a083d047369a5cf854557dba1204d29e2f0250f5ac4403925
+ md5: 76a4f88d1b7748c477abf3c341edc64c
depends:
- - pygments >=2.7.2
- - python >=3.10
- - iniconfig >=1.0.1
- - packaging >=22
- - pluggy >=1.5,<2
- - tomli >=1
- - colorama >=0.4
- - exceptiongroup >=1
- python
+ - __osx >=11.0
+ - python 3.14.* *_cp314
+ - python_abi 3.14.* *_cp314
constrains:
- - pytest-faulthandler >=2
+ - __osx >=11.0
license: MIT
license_family: MIT
purls:
- - pkg:pypi/pytest?source=hash-mapping
- size: 299581
- timestamp: 1765062031645
-- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda
- sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26
- md5: 6891acad5e136cb62a8c2ed2679d6528
+ - pkg:pypi/rpds-py?source=hash-mapping
+ size: 350976
+ timestamp: 1764543169524
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda
+ sha256: 3b30f332fb87598de8c31a3cbec1bc79b926bcc6f535bda10054721a96c256dc
+ md5: d9bc75bfda103e05a55e4034fded8ddf
+ depends:
+ - python
+ - numpy >=1.24.1
+ - scipy >=1.10.0
+ - joblib >=1.3.0
+ - threadpoolctl >=3.2.0
+ - llvm-openmp >=19.1.7
+ - python 3.14.* *_cp314
+ - __osx >=11.0
+ - libcxx >=19
+ - python_abi 3.14.* *_cp314
+ - numpy >=1.23,<3
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scikit-learn?source=hash-mapping
+ size: 9383244
+ timestamp: 1766550871162
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
+ sha256: 6ca2abcaff2cd071aabaabd82b10a87fc7de3a4619f6c98820cc28e90cc2cb20
+ md5: 7806ce54b78b0b11517b465a3398e910
+ depends:
+ - __osx >=11.0
+ - libblas >=3.9.0,<4.0a0
+ - libcblas >=3.9.0,<4.0a0
+ - libcxx >=19
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - liblapack >=3.9.0,<4.0a0
+ - numpy <2.7
+ - numpy >=1.23,<3
+ - numpy >=1.25.2
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scipy?source=hash-mapping
+ size: 13986990
+ timestamp: 1771881110844
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
+ sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3
+ md5: a9d86bc62f39b94c4661716624eb21b0
+ depends:
+ - __osx >=11.0
+ - libzlib >=1.3.1,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3127137
+ timestamp: 1769460817696
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
+ sha256: affbc6300e1baef5848f6e69569733a3e7a118aa642487c853f53d6f2bd23b89
+ md5: 83e1a2d7b0c1352870bbe9d9406135cf
+ depends:
+ - __osx >=11.0
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/tornado?source=hash-mapping
+ size: 909298
+ timestamp: 1765836779269
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
+ sha256: 09bfbee5a2bcf4df06f21a2aa9eb40a7af97864a569beb5ea85fd6baf6e03ce7
+ md5: 4fffb3ba871bb05f34ffb705534dfef5
+ depends:
+ - __osx >=11.0
+ - python >=3.14,<3.15.0a0
+ - python >=3.14,<3.15.0a0 *_cp314
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/unicodedata2?source=hash-mapping
+ size: 416130
+ timestamp: 1770909728445
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
+ sha256: adae11db0f66f86156569415ed79cda75b2dbf4bea48d1577831db701438164f
+ md5: 78b548eed8227a689f93775d5d23ae09
depends:
- - coverage >=7.10.6
- - pluggy >=1.2
- - pytest >=7
- - python >=3.10
- - python
+ - __osx >=11.0
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/pytest-cov?source=hash-mapping
- size: 29016
- timestamp: 1757612051022
-- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-memray-1.8.0-pyhd8ed1ab_0.conda
- sha256: 03f9bc063bf51454bfcad859918dbb08673fb848d8d7b12f1b8130fa59fec9fa
- md5: 8ec1201026003252fb9a9c1c67c10ebf
+ purls: []
+ size: 14105
+ timestamp: 1762976976084
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
+ sha256: f7fa0de519d8da589995a1fe78ef74556bb8bc4172079ae3a8d20c3c81354906
+ md5: 9d1299ace1924aa8f4e0bc8e71dd0cf7
depends:
- - memray >=1.4.1
- - pytest >=7.2
- - python >=3.9
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/pytest-memray?source=hash-mapping
- size: 22422
- timestamp: 1755587168132
-- pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
- name: pytest-timeout
- version: 2.4.0
- sha256: c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2
- requires_dist:
- - pytest>=7.0.0
- requires_python: '>=3.7'
-- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda
- sha256: b7b58a5be090883198411337b99afb6404127809c3d1c9f96e99b59f36177a96
- md5: 8375cfbda7c57fbceeda18229be10417
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 19156
+ timestamp: 1762977035194
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
+ sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac
+ md5: 78a0fe9e9c50d2c381e8ee47e3ea437d
depends:
- - execnet >=2.1
- - pytest >=7.0.0
- - python >=3.9
- constrains:
- - psutil >=3.0
+ - __osx >=11.0
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/pytest-xdist?source=hash-mapping
- size: 39300
- timestamp: 1751452761594
-- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
- build_number: 101
- sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd
- md5: c014ad06e60441661737121d3eae8a60
+ purls: []
+ size: 83386
+ timestamp: 1753484079473
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
+ sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868
+ md5: e85dcd3bde2b10081cdcaeae15797506
depends:
- - __glibc >=2.17,<3.0.a0
- - bzip2 >=1.0.8,<2.0a0
- - ld_impl_linux-64 >=2.36.1
- - libexpat >=2.7.3,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - libgcc >=14
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.51.2,<4.0a0
- - libuuid >=2.41.3,<3.0a0
- - libzlib >=1.3.1,<2.0a0
- - ncurses >=6.5,<7.0a0
- - openssl >=3.5.5,<4.0a0
- - python_abi 3.14.* *_cp314
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
+ - __osx >=11.0
+ - libcxx >=19
+ - krb5 >=1.22.2,<1.23.0a0
+ - libsodium >=1.0.21,<1.0.22.0a0
+ license: MPL-2.0
+ license_family: MOZILLA
purls: []
- size: 36702440
- timestamp: 1770675584356
- python_site_packages_path: lib/python3.14/site-packages
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
- build_number: 101
- sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce
- md5: 753c8d0447677acb7ddbcc6e03e82661
+ size: 245246
+ timestamp: 1772476886668
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
+ sha256: a339606a6b224bb230ff3d711e801934f3b3844271df9720165e0353716580d4
+ md5: d99c2a23a31b0172e90f456f580b695e
depends:
- __osx >=11.0
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.7.3,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.51.2,<4.0a0
- - libzlib >=1.3.1,<2.0a0
- - ncurses >=6.5,<7.0a0
- - openssl >=3.5.5,<4.0a0
- - python_abi 3.14.* *_cp314
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
+ - libcxx >=19
+ license: Zlib
+ license_family: Other
purls: []
- size: 13522698
- timestamp: 1770675365241
- python_site_packages_path: lib/python3.14/site-packages
-- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
- build_number: 101
- sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7
- md5: 7ec2be7eaf59f83f3e5617665f3fbb2e
+ size: 94375
+ timestamp: 1770168363685
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
+ sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9
+ md5: ab136e4c34e97f34fb621d2592a393d8
depends:
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.7.3,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.51.2,<4.0a0
+ - __osx >=11.0
- libzlib >=1.3.1,<2.0a0
- - openssl >=3.5.5,<4.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 433413
+ timestamp: 1764777166076
+- conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda
+ build_number: 20
+ sha256: 8a1cee28bd0ee7451ada1cd50b64720e57e17ff994fc62dd8329bef570d382e4
+ md5: 1626967b574d1784b578b52eaeb071e7
+ depends:
+ - libgomp >=7.5.0
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ constrains:
+ - openmp_impl <0.0a0
+ - msys2-conda-epoch <0.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 52252
+ timestamp: 1770943776666
+- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda
+ sha256: a742e7cd0d5534bfff3fd550a0c1e430411fad60a24f88930d261056ab08096f
+ md5: ffa247e46f47e157851dc547f4c513e4
+ depends:
+ - cffi >=2.0.0b1
+ - python >=3.14,<3.15.0a0
- python_abi 3.14.* *_cp314
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
- purls: []
- size: 18273230
- timestamp: 1770675442998
- python_site_packages_path: Lib/site-packages
-- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
- sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664
- md5: 5b8d21249ff20967101ffa321cab24e8
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/argon2-cffi-bindings?source=hash-mapping
+ size: 38653
+ timestamp: 1762509771011
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ sha256: f937d40f01493c4799a673f56d70434d6cddb2ec967cf642a39e0e04282a9a1e
+ md5: 908d5d8755564e2c3f3770fca7ff0736
depends:
- - python >=3.9
- - six >=1.5
- - python
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
license: Apache-2.0
license_family: APACHE
- purls:
- - pkg:pypi/python-dateutil?source=hash-mapping
- size: 233310
- timestamp: 1751104122689
-- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8
- md5: 23029aae904a2ba587daba708208012f
+ purls: []
+ size: 127421
+ timestamp: 1774275018076
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ sha256: 5f61082caea9fbdd6ba02702935e9dea9997459a7e6c06fd47f21b81aac882fb
+ md5: 7cc4953d504d4e8f3d6f4facb8549465
depends:
- - python >=3.9
- - python
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/fastjsonschema?source=hash-mapping
- size: 244628
- timestamp: 1755304154927
-- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda
- sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a
- md5: 235765e4ea0d0301c75965985163b5a1
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 53613
+ timestamp: 1764593604081
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ sha256: 0627691c34eb3d9fcd18c71346d9f16f83e8e58f9983e792138a2cccf387d18a
+ md5: b1465f33b05b9af02ad0887c01837831
depends:
- - cpython 3.14.3.*
- - python_abi * *_cp314
- license: Python-2.0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
purls: []
- size: 50062
- timestamp: 1770674497152
-- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
- sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca
- md5: a61bf9ec79426938ff785eb69dbb1960
+ size: 236441
+ timestamp: 1763586152571
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda
+ sha256: f98fbb797d28de3ae41dbd42590549ee0a2a4e61772f9cc6d1a4fa45d47637de
+ md5: 0385f2340be1776b513258adaf70e208
+ depends:
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 23087
+ timestamp: 1767790877990
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda
+ sha256: dc297fbce04335f5f80b30bcdee1925ed4a0d95e7a2382523870c6b4981ca1b2
+ md5: 26af0e9d7853d27e909ce01c287692b4
+ depends:
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-compression >=0.3.2,<0.3.3.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 207778
+ timestamp: 1774270109581
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ sha256: 3c9d50fb7895df4edd72d177299551608c24d8b0b82db0cf34c8e2bf6644979c
+ md5: ce36c60ed6b15c8dbb7ccddec4ebf57f
depends:
- - python >=3.6
- license: BSD-2-Clause
- license_family: BSD
- purls:
- - pkg:pypi/python-json-logger?source=hash-mapping
- size: 13383
- timestamp: 1677079727691
-- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda
- sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd
- md5: 7ead57407430ba33f681738905278d03
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 182296
+ timestamp: 1773868342627
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ sha256: 62367b6d4d8aa1b43fb63e51d779bb829dfdd53d908c1b6700efa23255dd38db
+ md5: 2d90128559ec4b3c78d1b889b8b13b50
depends:
- - python >=3.10
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-cal >=0.9.13,<0.9.14.0a0
+ - aws-checksums >=0.2.10,<0.2.11.0a0
license: Apache-2.0
license_family: APACHE
- purls:
- - pkg:pypi/tzdata?source=compressed-mapping
- size: 143542
- timestamp: 1765719982349
-- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- build_number: 8
- sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
- md5: 0539938c55b6b1a59b560e843ad864a4
- constrains:
- - python 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
purls: []
- size: 6989
- timestamp: 1752805904792
-- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
- sha256: 6918a8067f296f3c65d43e84558170c9e6c3f4dd735cfe041af41a7fdba7b171
- md5: 2d7b7ba21e8a8ced0eca553d4d53f773
+ size: 141733
+ timestamp: 1774282227215
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ sha256: c86c30edba7457e04d905c959328142603b62d7d1888aed893b2e21cca9c302c
+ md5: 3c97faee5be6fd0069410cf2bca71c85
depends:
- - python
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- ucrt >=10.0.20348.0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 56509
+ timestamp: 1764610148907
+- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda
+ sha256: 505b2365bbf3c197c9c2e007ba8262bcdaaddc970f84ce67cf73868ca2990989
+ md5: 96e950e5007fb691322db578736aba52
+ depends:
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: PSF-2.0
- license_family: PSF
- purls:
- - pkg:pypi/pywin32?source=hash-mapping
- size: 6713155
- timestamp: 1756487145487
-- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
- sha256: 048e20641da680aedaab285640a2aca56b7b5baf7a18f8f164f2796e13628c1f
- md5: dd84e8748bd3c85a5c751b0576488080
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 116853
+ timestamp: 1771063509650
+- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda
+ sha256: a4fffdf1c9b9d3d0d787e20c724cff3a284dfa3773f9ce609c93b1cfd0ce8933
+ md5: bc58fdbced45bb096364de0fba1637af
depends:
- - python >=3.14.0rc3,<3.15.0a0
- - python_abi 3.14.* *_cp314
+ - brotli-bin 1.2.0 hfd05255_1
+ - libbrotlidec 1.2.0 hfd05255_1
+ - libbrotlienc 1.2.0 hfd05255_1
- ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- - winpty
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/pywinpty?source=hash-mapping
- size: 216325
- timestamp: 1759557436167
-- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d
- md5: 2035f68f96be30dc60a5dfd7452c7941
+ purls: []
+ size: 20342
+ timestamp: 1764017988883
+- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda
+ sha256: e76966232ef9612de33c2087e3c92c2dc42ea5f300050735a3c646f33bce0429
+ md5: 6abd7089eb3f0c790235fe469558d190
depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - yaml >=0.2.5,<0.3.0a0
+ - libbrotlidec 1.2.0 hfd05255_1
+ - libbrotlienc 1.2.0 hfd05255_1
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/pyyaml?source=compressed-mapping
- size: 202391
- timestamp: 1770223462836
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252
- md5: dcf51e564317816cb8d546891019b3ab
+ purls: []
+ size: 22714
+ timestamp: 1764017952449
+- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
+ sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b
+ md5: 1302b74b93c44791403cbeee6a0f62a3
depends:
- - __osx >=11.0
- python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- python_abi 3.14.* *_cp314
- - yaml >=0.2.5,<0.3.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - libbrotlicommon 1.2.0 hfd05255_1
license: MIT
license_family: MIT
purls:
- - pkg:pypi/pyyaml?source=hash-mapping
- size: 189475
- timestamp: 1770223788648
-- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997
- md5: 0cd9b88826d0f8db142071eb830bce56
+ - pkg:pypi/brotli?source=hash-mapping
+ size: 335782
+ timestamp: 1764018443683
+- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
+ sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902
+ md5: 4cb8e6b48f67de0b018719cdf1136306
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 56115
+ timestamp: 1771350256444
+- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda
+ sha256: 924f2f01fa7a62401145ef35ab6fc95f323b7418b2644a87fea0ea68048880ed
+ md5: c360170be1c9183654a240aadbedad94
depends:
+ - pycparser
- python >=3.14,<3.15.0a0
- python_abi 3.14.* *_cp314
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- - yaml >=0.2.5,<0.3.0a0
license: MIT
license_family: MIT
purls:
- - pkg:pypi/pyyaml?source=compressed-mapping
- size: 181257
- timestamp: 1770223460931
-- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda
- noarch: python
- sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28
- md5: 082985717303dab433c976986c674b35
+ - pkg:pypi/cffi?source=hash-mapping
+ size: 294731
+ timestamp: 1761203441365
+- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda
+ sha256: f141bcbf8e490b49b2f53f517173d13a64d75e43cfae170e0d931cb0b66f4bce
+ md5: c26934035616f7d578f9da0491aed3d8
depends:
+ - numpy >=1.25
- python
- - libgcc >=14
- - libstdcxx >=14
- - __glibc >=2.17,<3.0.a0
- - zeromq >=4.3.5,<4.4.0a0
- - _python_abi3_support 1.*
- - cpython >=3.12
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/pyzmq?source=compressed-mapping
- size: 211567
- timestamp: 1771716961404
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda
- noarch: python
- sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772
- md5: 2f6b79700452ef1e91f45a99ab8ffe5a
+ - pkg:pypi/contourpy?source=hash-mapping
+ size: 247437
+ timestamp: 1769155978556
+- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda
+ sha256: 80a6a7be7eef784b8314a4cb563563c654e2180a0b2b31b232f79b2e7334aaf2
+ md5: 849f0bd5b83d4fd59b41202b21bb3ca2
+ depends:
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - tomli
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/coverage?source=compressed-mapping
+ size: 438927
+ timestamp: 1773760993379
+- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda
+ sha256: ece1d8299ad081edaf1e5279f2a900bdedddb2c795ac029a06401543cd7610ad
+ md5: 48ae8370a4562f7049d587d017792a3a
depends:
- python
- - libcxx >=19
- - __osx >=11.0
- - _python_abi3_support 1.*
- - cpython >=3.12
- - zeromq >=4.3.5,<4.4.0a0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/debugpy?source=hash-mapping
+ size: 4026404
+ timestamp: 1769745008861
+- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda
+ sha256: 6dd4bb3862ea3d07015331059504cf3b6af1a11a6909e7a9b6e04a20e253da28
+ md5: c360b467564b875a9f5dc481b8726cee
+ depends:
+ - libfreetype 2.14.2 h57928b3_0
+ - libfreetype6 2.14.2 hdbac1cb_0
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 185633
+ timestamp: 1772756186241
+- conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda
+ sha256: 5ee88f1f691829d2430761a26a690c3d880e7cd41e40a4057131360a8904e0bd
+ md5: 19bdd6358ce2be9ef29f92b1564db61d
+ depends:
+ - cached-property
+ - hdf5 >=2.1.0,<3.0a0
+ - numpy >=1.23,<3
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/pyzmq?source=compressed-mapping
- size: 191641
- timestamp: 1771717073430
-- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
- noarch: python
- sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df
- md5: eb1ec67a70b4d479f7dd76e6c8fe7575
+ - pkg:pypi/h5py?source=hash-mapping
+ size: 1101679
+ timestamp: 1775582027560
+- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda
+ sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652
+ md5: 37c1890c40a1514fa92ba13e27d5b1c3
+ depends:
+ - aws-c-auth >=0.10.1,<0.10.2.0a0
+ - aws-c-common >=0.12.6,<0.12.7.0a0
+ - aws-c-http >=0.10.12,<0.10.13.0a0
+ - aws-c-io >=0.26.3,<0.26.4.0a0
+ - aws-c-s3 >=0.11.5,<0.11.6.0a0
+ - aws-c-sdkutils >=0.2.4,<0.2.5.0a0
+ - libaec >=1.1.5,<2.0a0
+ - libcurl >=8.19.0,<9.0a0
+ - libzlib >=1.3.2,<2.0a0
+ - openssl >=3.5.5,<4.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 2564561
+ timestamp: 1775244102272
+- conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda
+ sha256: 37cbc49fd7255532d09fb3bc9cc699554693e632fa90678a9b3d0ed12557d0d7
+ md5: 0508c8dabeab91311e5c59b5e3f6d278
depends:
- python
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- ucrt >=10.0.20348.0
- - zeromq >=4.3.5,<4.3.6.0a0
- - _python_abi3_support 1.*
- - cpython >=3.12
+ - python_abi 3.14.* *_cp314
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/pyzmq?source=hash-mapping
- size: 183235
- timestamp: 1771716967192
-- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
- sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc
- md5: 353823361b1d27eb3960efb076dfcaf6
+ - pkg:pypi/kiwisolver?source=compressed-mapping
+ size: 73330
+ timestamp: 1773067062280
+- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda
+ sha256: eb60f1ad8b597bcf95dee11bc11fe71a8325bc1204cf51d2bb1f2120ffd77761
+ md5: 4432f52dc0c8eb6a7a6abc00a037d93c
depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc-ng >=12
- - libstdcxx-ng >=12
- license: LicenseRef-Qhull
+ - openssl >=3.5.5,<4.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: MIT
+ license_family: MIT
purls: []
- size: 552937
- timestamp: 1720813982144
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda
- sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4
- md5: 6483b1f59526e05d7d894e466b5b6924
+ size: 751055
+ timestamp: 1769769688841
+- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda
+ sha256: 7eeb18c5c86db146b62da66d9e8b0e753a52987f9134a494309588bbeceddf28
+ md5: b6c68d6b829b044cd17a41e0a8a23ca1
depends:
- - __osx >=11.0
- - libcxx >=16
- license: LicenseRef-Qhull
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: MIT
+ license_family: MIT
purls: []
- size: 516376
- timestamp: 1720814307311
-- conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
- sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8
- md5: 854fbdff64b572b5c0b470f334d34c11
+ size: 522238
+ timestamp: 1768184858107
+- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda
+ sha256: 45df58fca800b552b17c3914cc9ab0d55a82c5172d72b5c44a59c710c06c5473
+ md5: 54b231d595bc1ff9bff668dd443ee012
depends:
- ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- license: LicenseRef-Qhull
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
purls: []
- size: 1377020
- timestamp: 1720814433486
-- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002
- md5: d7d95fc8287ea7bf33e0e7116d2b95ec
+ size: 172395
+ timestamp: 1773113455582
+- conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda
+ sha256: e54c08964262c73671d9e80e400333e59c617e0b454476ad68933c0c458156c8
+ md5: 43b6385cfad52a7083f2c41984eb4e91
depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - ncurses >=6.5,<7.0a0
- license: GPL-3.0-only
- license_family: GPL
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-2-Clause
+ license_family: BSD
purls: []
- size: 345073
- timestamp: 1765813471974
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477
- md5: f8381319127120ce51e081dce4865cf4
+ size: 34463
+ timestamp: 1769221960556
+- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
+ build_number: 5
+ sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b
+ md5: f9decf88743af85c9c9e05556a4c47c0
depends:
- - __osx >=11.0
- - ncurses >=6.5,<7.0a0
- license: GPL-3.0-only
- license_family: GPL
+ - mkl >=2025.3.0,<2026.0a0
+ constrains:
+ - liblapack 3.11.0 5*_mkl
+ - libcblas 3.11.0 5*_mkl
+ - blas 2.305 mkl
+ - liblapacke 3.11.0 5*_mkl
+ license: BSD-3-Clause
+ license_family: BSD
purls: []
- size: 313930
- timestamp: 1765813902568
-- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda
- sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414
- md5: 870293df500ca7e18bedefa5838a22ab
+ size: 67438
+ timestamp: 1765819100043
+- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda
+ sha256: 5097303c2fc8ebf9f9ea9731520aa5ce4847d0be41764edd7f6dee2100b82986
+ md5: 444b0a45bbd1cb24f82eedb56721b9c4
depends:
- - attrs >=22.2.0
- - python >=3.10
- - rpds-py >=0.7.0
- - typing_extensions >=4.4.0
- - python
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/referencing?source=hash-mapping
- size: 51788
- timestamp: 1760379115194
-- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda
- sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5
- md5: c65df89a0b2e321045a9e01d1337b182
- depends:
- - python >=3.10
- - certifi >=2017.4.17
- - charset-normalizer >=2,<4
- - idna >=2.5,<4
- - urllib3 >=1.21.1,<3
- - python
- constrains:
- - chardet >=3.0.2,<6
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/requests?source=compressed-mapping
- size: 63602
- timestamp: 1766926974520
-- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda
- sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5
- md5: 36de09a8d3e5d5e6f4ee63af49e59706
+ purls: []
+ size: 82042
+ timestamp: 1764017799966
+- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda
+ sha256: 3239ce545cf1c32af6fffb7fc7c75cb1ef5b6ea8221c66c85416bb2d46f5cccb
+ md5: 450e3ae947fc46b60f1d8f8f318b40d4
depends:
- - python >=3.9
- - six
+ - libbrotlicommon 1.2.0 hfd05255_1
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/rfc3339-validator?source=hash-mapping
- size: 10209
- timestamp: 1733600040800
-- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2
- sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37
- md5: 912a71cc01012ee38e6b90ddd561e36f
+ purls: []
+ size: 34449
+ timestamp: 1764017851337
+- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda
+ sha256: 3226df6b7df98734440739f75527d585d42ca2bfe912fbe8d1954c512f75341a
+ md5: ccd93cfa8e54fd9df4e83dbe55ff6e8c
depends:
- - python
+ - libbrotlicommon 1.2.0 hfd05255_1
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/rfc3986-validator?source=hash-mapping
- size: 7818
- timestamp: 1598024297745
-- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda
- sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92
- md5: 7234f99325263a5af6d4cd195035e8f2
+ purls: []
+ size: 252903
+ timestamp: 1764017901735
+- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
+ build_number: 5
+ sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d
+ md5: b3fa8e8b55310ba8ef0060103afb02b5
depends:
- - python >=3.9
- - lark >=1.2.2
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/rfc3987-syntax?source=hash-mapping
- size: 22913
- timestamp: 1752876729969
-- pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
- name: rich
- version: 14.3.3
- sha256: 793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d
- requires_dist:
- - ipywidgets>=7.5.1,<9 ; extra == 'jupyter'
- - markdown-it-py>=2.2.0
- - pygments>=2.13.0,<3.0.0
- requires_python: '>=3.8.0'
-- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda
- sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590
- md5: 7a6289c50631d620652f5045a63eb573
+ - libblas 3.11.0 5_hf2e6a31_mkl
+ constrains:
+ - liblapack 3.11.0 5*_mkl
+ - liblapacke 3.11.0 5*_mkl
+ - blas 2.305 mkl
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 68079
+ timestamp: 1765819124349
+- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda
+ sha256: 6b2143ba5454b399dab4471e9e1d07352a2f33b569975e6b8aedc2d9bf51cbb0
+ md5: ed181e29a7ebf0f60b84b98d6140a340
depends:
- - markdown-it-py >=2.2.0
- - pygments >=2.13.0,<3.0.0
- - python >=3.10
- - typing_extensions >=4.0.0,<5.0.0
- - python
- license: MIT
+ - krb5 >=1.22.2,<1.23.0a0
+ - libssh2 >=1.11.1,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: curl
license_family: MIT
- purls:
- - pkg:pypi/rich?source=compressed-mapping
- size: 208472
- timestamp: 1771572730357
-- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
- sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446
- md5: c1c368b5437b0d1a68f372ccf01cb133
+ purls: []
+ size: 392543
+ timestamp: 1773218585056
+- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda
+ sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee
+ md5: e77030e67343e28b084fabd7db0ce43e
depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- constrains:
- - __glibc >=2.17
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/rpds-py?source=hash-mapping
- size: 376121
- timestamp: 1764543122774
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda
- sha256: e161dd97403b8b8a083d047369a5cf854557dba1204d29e2f0250f5ac4403925
- md5: 76a4f88d1b7748c477abf3c341edc64c
- depends:
- - python
- - __osx >=11.0
- - python 3.14.* *_cp314
- - python_abi 3.14.* *_cp314
+ purls: []
+ size: 156818
+ timestamp: 1761979842440
+- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda
+ sha256: b31f6fb629c4e17885aaf2082fb30384156d16b48b264e454de4a06a313b533d
+ md5: 1c1ced969021592407f16ada4573586d
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
constrains:
- - __osx >=11.0
+ - expat 2.7.4.*
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/rpds-py?source=hash-mapping
- size: 350976
- timestamp: 1764543169524
-- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
- sha256: e4435368c5c25076dc0f5918ba531c5a92caee8e0e2f9912ef6810049cf00db2
- md5: e86531e278ad304438e530953cd55d14
+ purls: []
+ size: 70323
+ timestamp: 1771259521393
+- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
+ sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190
+ md5: 720b39f5ec0610457b725eb3f396219a
depends:
- - python
+ - ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/rpds-py?source=hash-mapping
- size: 235780
- timestamp: 1764543046065
-- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
- sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972
- md5: d0510124f87c75403090e220db1e9d41
+ purls: []
+ size: 45831
+ timestamp: 1769456418774
+- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda
+ sha256: 427c3072b311e65bd3eae3fcb78f6847b15b2dbb173a8546424de56550b2abfb
+ md5: 153d52fd0e4ba2a5bd5bb4f4afa41417
depends:
- - __glibc >=2.17,<3.0.a0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx >=14
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/scipy?source=compressed-mapping
- size: 17225275
- timestamp: 1771880751368
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda
- sha256: 6ca2abcaff2cd071aabaabd82b10a87fc7de3a4619f6c98820cc28e90cc2cb20
- md5: 7806ce54b78b0b11517b465a3398e910
+ - libfreetype6 >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 8404
+ timestamp: 1772756167212
+- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda
+ sha256: 1e80e01e5662bd3a0c0e094fbeaec449dbb2288949ca55ca80345e7812904e67
+ md5: c21a474a38982cdb56b3454cf4f78389
depends:
- - __osx >=11.0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=19
- - libgfortran
- - libgfortran5 >=14.3.0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/scipy?source=hash-mapping
- size: 13986990
- timestamp: 1771881110844
-- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
- sha256: d9a7b6d3a306195eef4db814614a74746aae4b63e570f6db15769bd28d19a957
- md5: cfcd38938ee0137f4bf0ca824dfb0887
+ - libpng >=1.6.55,<1.7.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - freetype >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 340155
+ timestamp: 1772756166648
+- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda
+ sha256: da2c96563c76b8c601746f03e03ac75d2b4640fa2ee017cb23d6c9fc31f1b2c6
+ md5: b085746891cca3bd2704a450a7b4b5ce
depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
+ - _openmp_mutex >=4.5
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ constrains:
+ - libgcc-ng ==15.2.0=*_18
+ - msys2-conda-epoch <0.0a0
+ - libgomp 15.2.0 h8ee18e1_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 820022
+ timestamp: 1771382190160
+- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda
+ sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da
+ md5: 939fb173e2a4d4e980ef689e99b35223
+ depends:
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ constrains:
+ - msys2-conda-epoch <0.0a0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 663864
+ timestamp: 1771382118742
+- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
+ sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3
+ md5: 3b576f6860f838f950c570f4433b086e
+ depends:
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ - libxml2
+ - libxml2-16 >=2.14.6
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
license: BSD-3-Clause
license_family: BSD
- purls:
- - pkg:pypi/scipy?source=hash-mapping
- size: 14970549
- timestamp: 1771881565717
-- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda
- sha256: 8fc024bf1a7b99fc833b131ceef4bef8c235ad61ecb95a71a6108be2ccda63e8
- md5: b70e2d44e6aa2beb69ba64206a16e4c6
+ purls: []
+ size: 2411241
+ timestamp: 1765104337762
+- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
+ sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7
+ md5: 64571d1dd6cdcfa25d0664a5950fdaa2
depends:
- - __osx
- - pyobjc-framework-cocoa
- - python >=3.10
- - python
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: LGPL-2.1-only
+ purls: []
+ size: 696926
+ timestamp: 1754909290005
+- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda
+ sha256: 795e2d4feb2f7fc4a2c6e921871575feb32b8082b5760726791f080d1e2c2597
+ md5: 56a686f92ac0273c0f6af58858a3f013
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - jpeg <0.0.0a
+ license: IJG AND BSD-3-Clause AND Zlib
+ purls: []
+ size: 841783
+ timestamp: 1762094814336
+- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda
+ build_number: 5
+ sha256: a2d33f5cc2b8a9042f2af6981c6733ab1a661463823eaa56595a9c58c0ab77e1
+ md5: e62c42a4196dee97d20400612afcb2b1
+ depends:
+ - libblas 3.11.0 5_hf2e6a31_mkl
+ constrains:
+ - libcblas 3.11.0 5*_mkl
+ - blas 2.305 mkl
+ - liblapacke 3.11.0 5*_mkl
license: BSD-3-Clause
license_family: BSD
- purls:
- - pkg:pypi/send2trash?source=hash-mapping
- size: 22519
- timestamp: 1770937603551
-- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- sha256: 305446a0b018f285351300463653d3d3457687270e20eda37417b12ee386ef76
- md5: 6ac53f3fff2c416d63511843a04646fa
+ purls: []
+ size: 80225
+ timestamp: 1765819148014
+- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
+ sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c
+ md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3
depends:
- - __win
- - pywin32
- - python >=3.10
- - python
- license: BSD-3-Clause
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - xz 5.8.2.*
+ license: 0BSD
+ purls: []
+ size: 106169
+ timestamp: 1768752763559
+- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
+ sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514
+ md5: e4a9fc2bba3b022dad998c78856afe47
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-2-Clause
license_family: BSD
- purls:
- - pkg:pypi/send2trash?source=hash-mapping
- size: 22864
- timestamp: 1770937641143
-- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda
- sha256: 59656f6b2db07229351dfb3a859c35e57cc8e8bcbc86d4e501bff881a6f771f1
- md5: 28eb91468df04f655a57bcfbb35fc5c5
+ purls: []
+ size: 89411
+ timestamp: 1769482314283
+- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda
+ sha256: db23f281fa80597a0dc0445b18318346862602d7081ed76244df8cc4418d6d68
+ md5: 43f47a9151b9b8fc100aeefcf350d1a0
+ depends:
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - libzlib >=1.3.1,<2.0a0
+ license: zlib-acknowledgement
+ purls: []
+ size: 383155
+ timestamp: 1770691504832
+- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda
+ sha256: d915f4fa8ebbf237c7a6e511ed458f2cfdc7c76843a924740318a15d0dd33d6d
+ md5: da2aa614d16a795b3007b6f4a1318a81
+ depends:
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ license: ISC
+ purls: []
+ size: 276860
+ timestamp: 1772479407566
+- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda
+ sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583
+ md5: 8830689d537fda55f990620680934bb1
depends:
- - __linux
- - python >=3.10
- - python
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: blessing
+ purls: []
+ size: 1297302
+ timestamp: 1772818899033
+- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda
+ sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09
+ md5: 9dce2f112bfd3400f4f432b3d0ac07b2
+ depends:
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.0,<4.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
license: BSD-3-Clause
license_family: BSD
- purls:
- - pkg:pypi/send2trash?source=hash-mapping
- size: 24108
- timestamp: 1770937597662
-- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1
- md5: 8e194e7b992f99a5015edbd4ebd38efd
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/setuptools?source=compressed-mapping
- size: 639697
- timestamp: 1773074868565
-- pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
- name: simplejson
- version: 3.20.2
- sha256: 3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017
- requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*'
-- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d
- md5: 3339e3b65d58accf4ca4fb8748ab16b3
+ purls: []
+ size: 292785
+ timestamp: 1745608759342
+- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda
+ sha256: f1b8cccaaeea38a28b9cd496694b2e3d372bb5be0e9377c9e3d14b330d1cba8a
+ md5: 549845d5133100142452812feb9ba2e8
depends:
- - python >=3.9
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/six?source=hash-mapping
- size: 18455
- timestamp: 1753199211006
-- pypi: ./
- name: skillmodels
- version: 0.0.24.dev242+g859d7ecae
- sha256: 4f390213c39753657a315f50f7597b22802fe529305722f787011d8fd2e88b1c
- requires_dist:
- - dags>=0.5.1
- - jax>=0.9
- - jupyter-book>=2
- - kaleido>=1.2
- - numpy>=2.4
- - optimagic>=0.5.3
- - pandas>=3
- - plotly>=6.6
- - pytask-parallel>=0.5.2
- - pytask>=0.5.8
- requires_python: '>=3.14,<3.15'
-- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
- sha256: 833326122c18887b338262c13365cb146b6702c79d72da74a1c6b8af4c50e162
- md5: 421b7a950e384949ca1b0f04f0751ce0
+ - lerc >=4.0.0,<5.0a0
+ - libdeflate >=1.25,<1.26.0a0
+ - libjpeg-turbo >=3.1.0,<4.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - zstd >=1.5.7,<1.6.0a0
+ license: HPND
+ purls: []
+ size: 993166
+ timestamp: 1762022118895
+- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda
+ sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843
+ md5: f9bbae5e2537e3b06e0f7310ba76c893
depends:
- - python >=3.9
- - tornado >=2.0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - libwebp 1.6.0
license: BSD-3-Clause
license_family: BSD
- purls:
- - pkg:pypi/snakeviz?source=hash-mapping
- size: 171545
- timestamp: 1735289409501
-- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda
- sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad
- md5: 03fe290994c5e4ec17293cfb6bdce520
+ purls: []
+ size: 279176
+ timestamp: 1752159543911
+- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
+ sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0
+ md5: 8a86073cf3b343b87d03f41790d8b4e5
depends:
- - python >=3.10
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/sniffio?source=hash-mapping
- size: 15698
- timestamp: 1762941572482
-- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda
- sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac
- md5: 18de09b20462742fe093ba39185d9bac
+ - ucrt
+ constrains:
+ - pthreads-win32 <0.0a0
+ - msys2-conda-epoch <0.0a0
+ license: MIT AND BSD-3-Clause-Clear
+ purls: []
+ size: 36621
+ timestamp: 1759768399557
+- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda
+ sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737
+ md5: a69bbf778a462da324489976c84cfc8c
depends:
- - python >=3.10
+ - libgcc >=13
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ - pthread-stubs
+ - ucrt >=10.0.20348.0
+ - xorg-libxau >=1.0.11,<2.0a0
+ - xorg-libxdmcp
license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/soupsieve?source=hash-mapping
- size: 38187
- timestamp: 1769034509657
-- pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
- name: sqlalchemy
- version: 2.0.48
- sha256: 144921da96c08feb9e2b052c5c5c1d0d151a292c6135623c6b2c041f2a45f9e0
- requires_dist:
- - importlib-metadata ; python_full_version < '3.8'
- - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
- - typing-extensions>=4.6.0
- - greenlet>=1 ; extra == 'asyncio'
- - mypy>=0.910 ; extra == 'mypy'
- - pyodbc ; extra == 'mssql'
- - pymssql ; extra == 'mssql-pymssql'
- - pyodbc ; extra == 'mssql-pyodbc'
- - mysqlclient>=1.4.0 ; extra == 'mysql'
- - mysql-connector-python ; extra == 'mysql-connector'
- - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
- - cx-oracle>=8 ; extra == 'oracle'
- - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
- - psycopg2>=2.7 ; extra == 'postgresql'
- - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
- - greenlet>=1 ; extra == 'postgresql-asyncpg'
- - asyncpg ; extra == 'postgresql-asyncpg'
- - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
- - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
- - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
- - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
- - pymysql ; extra == 'pymysql'
- - greenlet>=1 ; extra == 'aiomysql'
- - aiomysql>=0.2.0 ; extra == 'aiomysql'
- - greenlet>=1 ; extra == 'aioodbc'
- - aioodbc ; extra == 'aioodbc'
- - greenlet>=1 ; extra == 'asyncmy'
- - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
- - greenlet>=1 ; extra == 'aiosqlite'
- - aiosqlite ; extra == 'aiosqlite'
- - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
- - sqlcipher3-binary ; extra == 'sqlcipher'
- requires_python: '>=3.7'
-- pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- name: sqlalchemy
- version: 2.0.48
- sha256: 426c5ca86415d9b8945c7073597e10de9644802e2ff502b8e1f11a7a2642856b
- requires_dist:
- - importlib-metadata ; python_full_version < '3.8'
- - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
- - typing-extensions>=4.6.0
- - greenlet>=1 ; extra == 'asyncio'
- - mypy>=0.910 ; extra == 'mypy'
- - pyodbc ; extra == 'mssql'
- - pymssql ; extra == 'mssql-pymssql'
- - pyodbc ; extra == 'mssql-pyodbc'
- - mysqlclient>=1.4.0 ; extra == 'mysql'
- - mysql-connector-python ; extra == 'mysql-connector'
- - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
- - cx-oracle>=8 ; extra == 'oracle'
- - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
- - psycopg2>=2.7 ; extra == 'postgresql'
- - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
- - greenlet>=1 ; extra == 'postgresql-asyncpg'
- - asyncpg ; extra == 'postgresql-asyncpg'
- - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
- - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
- - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
- - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
- - pymysql ; extra == 'pymysql'
- - greenlet>=1 ; extra == 'aiomysql'
- - aiomysql>=0.2.0 ; extra == 'aiomysql'
- - greenlet>=1 ; extra == 'aioodbc'
- - aioodbc ; extra == 'aioodbc'
- - greenlet>=1 ; extra == 'asyncmy'
- - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
- - greenlet>=1 ; extra == 'aiosqlite'
- - aiosqlite ; extra == 'aiosqlite'
- - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
- - sqlcipher3-binary ; extra == 'sqlcipher'
- requires_python: '>=3.7'
-- pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
- name: sqlalchemy
- version: 2.0.48
- sha256: e2d0d88686e3d35a76f3e15a34e8c12d73fc94c1dea1cd55782e695cc14086dd
- requires_dist:
- - importlib-metadata ; python_full_version < '3.8'
- - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
- - typing-extensions>=4.6.0
- - greenlet>=1 ; extra == 'asyncio'
- - mypy>=0.910 ; extra == 'mypy'
- - pyodbc ; extra == 'mssql'
- - pymssql ; extra == 'mssql-pymssql'
- - pyodbc ; extra == 'mssql-pyodbc'
- - mysqlclient>=1.4.0 ; extra == 'mysql'
- - mysql-connector-python ; extra == 'mysql-connector'
- - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
- - cx-oracle>=8 ; extra == 'oracle'
- - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
- - psycopg2>=2.7 ; extra == 'postgresql'
- - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
- - greenlet>=1 ; extra == 'postgresql-asyncpg'
- - asyncpg ; extra == 'postgresql-asyncpg'
- - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
- - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
- - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
- - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
- - pymysql ; extra == 'pymysql'
- - greenlet>=1 ; extra == 'aiomysql'
- - aiomysql>=0.2.0 ; extra == 'aiomysql'
- - greenlet>=1 ; extra == 'aioodbc'
- - aioodbc ; extra == 'aioodbc'
- - greenlet>=1 ; extra == 'asyncmy'
- - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
- - greenlet>=1 ; extra == 'aiosqlite'
- - aiosqlite ; extra == 'aiosqlite'
- - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
- - sqlcipher3-binary ; extra == 'sqlcipher'
- requires_python: '>=3.7'
-- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41
- md5: b1b505328da7a6b246787df4b5a49fbc
+ license_family: MIT
+ purls: []
+ size: 1208687
+ timestamp: 1727279378819
+- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda
+ sha256: b8c71b3b609c7cfe17f3f2a47c75394d7b30acfb8b34ad7a049ea8757b4d33df
+ md5: e365238134188e42ed36ee996159d482
depends:
- - asttokens
- - executing
- - pure_eval
- - python >=3.9
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - libxml2 2.15.2
+ - icu <0.0a0
license: MIT
license_family: MIT
- purls:
- - pkg:pypi/stack-data?source=hash-mapping
- size: 26988
- timestamp: 1733569565672
-- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda
- sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851
- md5: 13dc3adbc692664cd3beabd216434749
+ purls: []
+ size: 520078
+ timestamp: 1772704728534
+- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda
+ sha256: f905eb7046987c336122121759e7f09144729f6898f48cd06df2a945b86998d8
+ md5: 1007e1bfe181a2aee214779ee7f13d30
depends:
- - __glibc >=2.28
- - kernel-headers_linux-64 4.18.0 he073ed8_9
- - tzdata
- license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later
- license_family: GPL
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libxml2-16 2.15.2 h692994f_0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - icu <0.0a0
+ license: MIT
+ license_family: MIT
purls: []
- size: 24008591
- timestamp: 1765578833462
-- pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
- name: tabcompleter
- version: 1.4.0
- sha256: d744aa735b49c0a6cc2fb8fcd40077fec47425e4388301010b14e6ce3311368b
- requires_dist:
- - pyreadline3 ; sys_platform == 'win32'
- requires_python: '>=3.8'
-- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9
- md5: 0f9817ffbe25f9e69ceba5ea70c52606
+ size: 43681
+ timestamp: 1772704748950
+- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061
+ md5: dbabbd6234dea34040e631f87676292f
depends:
- - libhwloc >=2.12.2,<2.12.3.0a0
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- license: Apache-2.0
+ constrains:
+ - zlib 1.3.2 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 58347
+ timestamp: 1774072851498
+- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda
+ sha256: bb55a3736380759d338f87aac68df4fd7d845ae090b94400525f5d21a55eea31
+ md5: e5505e0b7d6ef5c19d5c0c1884a2f494
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - openmp 22.1.0|22.1.0.*
+ - intel-openmp <0.0a0
+ license: Apache-2.0 WITH LLVM-exception
license_family: APACHE
purls: []
- size: 155869
- timestamp: 1767886839029
-- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda
- sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340
- md5: e43ca10d61e55d0a8ec5d8c62474ec9e
+ size: 347404
+ timestamp: 1772025050288
+- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
+ sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c
+ md5: 8de7b40f8b30a8fcaa423c2537fe4199
depends:
- - __win
- - pywinpty >=1.1.0
- - python >=3.10
- - tornado >=6.1.0
- - python
- license: BSD-2-Clause
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - jinja2 >=3.0.0
+ license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/terminado?source=hash-mapping
- size: 23665
- timestamp: 1766513806974
-- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda
- sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb
- md5: 17b43cee5cc84969529d5d0b0309b2cb
+ - pkg:pypi/markupsafe?source=hash-mapping
+ size: 30022
+ timestamp: 1772445159549
+- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda
+ sha256: 82a50284275e8a1818cd3323846f3032dc89bd23a3f80dcf44e34a62b016256b
+ md5: 9d491a60700e0e90e92607fcc4e2566c
+ depends:
+ - contourpy >=1.0.1
+ - cycler >=0.10
+ - fonttools >=4.22.0
+ - freetype
+ - kiwisolver >=1.3.1
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - numpy >=1.23
+ - numpy >=1.23,<3
+ - packaging >=20.0
+ - pillow >=8
+ - pyparsing >=2.3.1
+ - python >=3.14,<3.15.0a0
+ - python-dateutil >=2.7
+ - python_abi 3.14.* *_cp314
+ - qhull >=2020.2,<2020.3.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/matplotlib?source=hash-mapping
+ size: 8185296
+ timestamp: 1763055983613
+- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
+ sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d
+ md5: fd05d1e894497b012d05a804232254ed
+ depends:
+ - llvm-openmp >=21.1.8
+ - tbb >=2022.3.0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: LicenseRef-IntelSimplifiedSoftwareOct2022
+ license_family: Proprietary
+ purls: []
+ size: 100224829
+ timestamp: 1767634557029
+- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda
+ sha256: 34fc25b81cfa987e1825586ddb1a4ac76a246fdef343c9171109017674ad6503
+ md5: 2fccd2c4e9feb4e4c2a90043015525d6
depends:
- - __unix
- - ptyprocess
- - python >=3.10
- - tornado >=6.1.0
- python
- license: BSD-2-Clause
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
+ - libcblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ - libblas >=3.9.0,<4.0a0
+ constrains:
+ - numpy-base <0a0
+ license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/terminado?source=hash-mapping
- size: 24749
- timestamp: 1766513766867
-- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.1.1-pyhcf101f3_1.conda
- sha256: c75250e2b34faa52324fc95fce138cded1bdb226547790cc9e437ab0e20c11b1
- md5: 4a666e8fdaa357e0fe397d16ca40bd7c
+ - pkg:pypi/numpy?source=hash-mapping
+ size: 7309134
+ timestamp: 1770098414535
+- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda
+ sha256: 24342dee891a49a9ba92e2018ec0bde56cc07fdaec95275f7a55b96f03ea4252
+ md5: e723ab7cc2794c954e1b22fde51c16e4
+ depends:
+ - libpng >=1.6.55,<1.7.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 245594
+ timestamp: 1772624841727
+- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda
+ sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6
+ md5: eb585509b815415bc964b2c7e11c7eb3
+ depends:
+ - ca-certificates
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 9343023
+ timestamp: 1769557547888
+- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda
+ sha256: f4387e480970e0f429a0505d668bc677e84ef118d3db2cba56b547d1bd2c2dbf
+ md5: 819c3d15988cea0f2c599b405023f55d
depends:
- - pygments >=2.19.2,<3.0.0
- - typing_extensions >=4.4.0,<5.0.0
- - platformdirs >=3.6.0,<5
- - python >=3.10,<4.0.0
- - markdown-it-py >=2.1.0
- - linkify-it-py >=1,<3
- - mdit-py-plugins
- - rich >=14.2.0
- python
- constrains:
- - tree_sitter >=0.25.0
- - tree_sitter_languages 1.10.2.*
- license: MIT
- license_family: MIT
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - libxcb >=1.17.0,<2.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libtiff >=4.7.1,<4.8.0a0
+ - openjpeg >=2.5.4,<3.0a0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - lcms2 >=2.18,<3.0a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - python_abi 3.14.* *_cp314
+ - zlib-ng >=2.3.3,<2.4.0a0
+ license: HPND
purls:
- - pkg:pypi/textual?source=hash-mapping
- size: 528806
- timestamp: 1773220924332
-- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda
- sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2
- md5: f1acf5fdefa8300de697982bcb1761c9
+ - pkg:pypi/pillow?source=hash-mapping
+ size: 973701
+ timestamp: 1770794018422
+- conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.6-h18a1a76_0.conda
+ sha256: 31984152d475d6854a64786b9308dd180e2a4b014fea519b4959513e51dcab26
+ md5: 042c6b6426dbeef69ec7aef3864427bf
+ depends:
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 5913998
+ timestamp: 1773659816255
+- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
+ sha256: 17c8274ce5a32c9793f73a5a0094bd6188f3a13026a93147655143d4df034214
+ md5: fd539ac231820f64066839251aa9fa48
depends:
- - python >=3.5
- - webencodings >=0.4
+ - python
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/tinycss2?source=hash-mapping
- size: 28285
- timestamp: 1729802975370
-- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac
- md5: cffd3bdd58090148f4cfcd831f4b26ab
+ - pkg:pypi/psutil?source=hash-mapping
+ size: 249950
+ timestamp: 1769678167309
+- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda
+ sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b
+ md5: 3c8f2573569bb816483e5cf57efbbe29
depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libzlib >=1.3.1,<2.0a0
- constrains:
- - xorg-libx11 >=1.8.12,<2.0a0
- license: TCL
- license_family: BSD
+ - libgcc >=13
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ - ucrt >=10.0.20348.0
+ license: MIT
+ license_family: MIT
purls: []
- size: 3301196
- timestamp: 1769460227866
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3
- md5: a9d86bc62f39b94c4661716624eb21b0
+ size: 9389
+ timestamp: 1726802555076
+- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda
+ build_number: 101
+ sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7
+ md5: 7ec2be7eaf59f83f3e5617665f3fbb2e
depends:
- - __osx >=11.0
+ - bzip2 >=1.0.8,<2.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.2,<4.0a0
- libzlib >=1.3.1,<2.0a0
- license: TCL
- license_family: BSD
- purls: []
- size: 3127137
- timestamp: 1769460817696
-- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3
- md5: 0481bfd9814bf525bd4b3ee4b51494c4
- depends:
+ - openssl >=3.5.5,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- license: TCL
- license_family: BSD
+ - zstd >=1.5.7,<1.6.0a0
+ license: Python-2.0
purls: []
- size: 3526350
- timestamp: 1769460339384
-- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda
- sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8
- md5: 72e780e9aa2d0a3295f59b1874e3768b
+ size: 18273230
+ timestamp: 1770675442998
+ python_site_packages_path: Lib/site-packages
+- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda
+ sha256: 6918a8067f296f3c65d43e84558170c9e6c3f4dd735cfe041af41a7fdba7b171
+ md5: 2d7b7ba21e8a8ced0eca553d4d53f773
depends:
- - python >=3.10
- python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/tomli?source=compressed-mapping
- size: 21453
- timestamp: 1768146676791
-- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
- sha256: b8f9f9ae508d79c9c697eb01b6a8d2ed4bc1899370f44aa6497c8abbd15988ea
- md5: e35f08043f54d26a1be93fdbf90d30c3
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
- python_abi 3.14.* *_cp314
- license: Apache-2.0
- license_family: Apache
+ license: PSF-2.0
+ license_family: PSF
purls:
- - pkg:pypi/tornado?source=hash-mapping
- size: 905436
- timestamp: 1765458949518
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
- sha256: affbc6300e1baef5848f6e69569733a3e7a118aa642487c853f53d6f2bd23b89
- md5: 83e1a2d7b0c1352870bbe9d9406135cf
+ - pkg:pypi/pywin32?source=hash-mapping
+ size: 6713155
+ timestamp: 1756487145487
+- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda
+ sha256: 048e20641da680aedaab285640a2aca56b7b5baf7a18f8f164f2796e13628c1f
+ md5: dd84e8748bd3c85a5c751b0576488080
depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
+ - python >=3.14.0rc3,<3.15.0a0
- python_abi 3.14.* *_cp314
- license: Apache-2.0
- license_family: Apache
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ - winpty
+ license: MIT
+ license_family: MIT
purls:
- - pkg:pypi/tornado?source=hash-mapping
- size: 909298
- timestamp: 1765836779269
-- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
- sha256: 40fde32a4992ab0f875618f97d9aadf263d39c6c92ace7572c6b0a71c655abe1
- md5: 00157f40fd3ea957a2616e9ffda6b84f
+ - pkg:pypi/pywinpty?source=hash-mapping
+ size: 216325
+ timestamp: 1759557436167
+- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
+ sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997
+ md5: 0cd9b88826d0f8db142071eb830bce56
depends:
- python >=3.14,<3.15.0a0
- python_abi 3.14.* *_cp314
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
+ - yaml >=0.2.5,<0.3.0a0
+ license: MIT
+ license_family: MIT
purls:
- - pkg:pypi/tornado?source=hash-mapping
- size: 908399
- timestamp: 1765836848636
-- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda
- sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959
- md5: 019a7385be9af33791c989871317e1ed
+ - pkg:pypi/pyyaml?source=compressed-mapping
+ size: 181257
+ timestamp: 1770223460931
+- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda
+ noarch: python
+ sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df
+ md5: eb1ec67a70b4d479f7dd76e6c8fe7575
depends:
- - python >=3.9
+ - python
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - zeromq >=4.3.5,<4.3.6.0a0
+ - _python_abi3_support 1.*
+ - cpython >=3.12
license: BSD-3-Clause
license_family: BSD
purls:
- - pkg:pypi/traitlets?source=hash-mapping
- size: 110051
- timestamp: 1733367480074
-- pypi: https://files.pythonhosted.org/packages/0f/01/3f25909b02fac29bb0a62b2251f8d62e65d697781ffa4cf6b47a4c075c85/ty-0.0.23-py3-none-macosx_11_0_arm64.whl
- name: ty
- version: 0.0.23
- sha256: bd6a340969577b4645f231572c4e46012acba2d10d4c0c6570fe1ab74e76ae00
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/18/14/69a25a0cad493fb6a947302471b579a03516a3b00e7bece77fdc6b4afb9b/ty-0.0.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- name: ty
- version: 0.0.23
- sha256: 559d9a299df793cb7a7902caed5eda8a720ff69164c31c979673e928f02251ee
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/31/2e/eaed4ff5c85e857a02415084c394e02c30476b65e158eec1938fdaa9a205/ty-0.0.23-py3-none-win_amd64.whl
- name: ty
- version: 0.0.23
- sha256: 1e137e955f05c501cfbb81dd2190c8fb7d01ec037c7e287024129c722a83c9ad
- requires_python: '>=3.8'
-- pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
- name: types-pytz
- version: 2026.1.1.20260304
- sha256: 175332c1cf7bd6b1cc56b877f70bf02def1a3f75e5adcc05385ce2c3c70e6500
- requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c
- md5: edd329d7d3a4ab45dcf905899a7a6115
+ - pkg:pypi/pyzmq?source=hash-mapping
+ size: 183235
+ timestamp: 1771716967192
+- conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda
+ sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8
+ md5: 854fbdff64b572b5c0b470f334d34c11
depends:
- - typing_extensions ==4.15.0 pyhcf101f3_0
- license: PSF-2.0
- license_family: PSF
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ license: LicenseRef-Qhull
purls: []
- size: 91383
- timestamp: 1756220668932
-- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731
- md5: 0caa1af407ecff61170c9437a808404d
+ size: 1377020
+ timestamp: 1720814433486
+- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda
+ sha256: e4435368c5c25076dc0f5918ba531c5a92caee8e0e2f9912ef6810049cf00db2
+ md5: e86531e278ad304438e530953cd55d14
depends:
- - python >=3.10
- python
- license: PSF-2.0
- license_family: PSF
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/rpds-py?source=hash-mapping
+ size: 235780
+ timestamp: 1764543046065
+- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda
+ sha256: ce701fcf35e0b65d0822fe916f5536ed326c1b842fe1ba6d08c5fcac4ec8dc75
+ md5: ba2216c82d626684433912bfec8a4843
+ depends:
+ - python
+ - numpy >=1.24.1
+ - scipy >=1.10.0
+ - joblib >=1.3.0
+ - threadpoolctl >=3.2.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ - ucrt >=10.0.20348.0
+ - python_abi 3.14.* *_cp314
+ - numpy >=1.23,<3
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scikit-learn?source=hash-mapping
+ size: 9139165
+ timestamp: 1765801295593
+- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda
+ sha256: d9a7b6d3a306195eef4db814614a74746aae4b63e570f6db15769bd28d19a957
+ md5: cfcd38938ee0137f4bf0ca824dfb0887
+ depends:
+ - libblas >=3.9.0,<4.0a0
+ - libcblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ - numpy <2.7
+ - numpy >=1.23,<3
+ - numpy >=1.25.2
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-3-Clause
+ license_family: BSD
purls:
- - pkg:pypi/typing-extensions?source=hash-mapping
- size: 51692
- timestamp: 1756220668932
-- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda
- sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c
- md5: f6d7aa696c67756a650e91e15e88223c
+ - pkg:pypi/scipy?source=hash-mapping
+ size: 14970549
+ timestamp: 1771881565717
+- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
+ sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9
+ md5: 0f9817ffbe25f9e69ceba5ea70c52606
depends:
- - python >=3.9
+ - libhwloc >=2.12.2,<2.12.3.0a0
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
license: Apache-2.0
license_family: APACHE
- purls:
- - pkg:pypi/typing-utils?source=hash-mapping
- size: 15183
- timestamp: 1733331395943
-- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c
- md5: ad659d0a2b3e47e38d829aa8cad2d610
- license: LicenseRef-Public-Domain
purls: []
- size: 119135
- timestamp: 1767016325805
-- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda
- sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc
- md5: 4fdd327852ffefc83173a7c029690d0c
+ size: 155869
+ timestamp: 1767886839029
+- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
+ sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3
+ md5: 0481bfd9814bf525bd4b3ee4b51494c4
depends:
- - python >=3.10
- license: MIT
- license_family: MIT
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3526350
+ timestamp: 1769460339384
+- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda
+ sha256: 40fde32a4992ab0f875618f97d9aadf263d39c6c92ace7572c6b0a71c655abe1
+ md5: 00157f40fd3ea957a2616e9ffda6b84f
+ depends:
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
purls:
- - pkg:pypi/uc-micro-py?source=compressed-mapping
- size: 13378
- timestamp: 1772479008776
+ - pkg:pypi/tornado?source=hash-mapping
+ size: 908399
+ timestamp: 1765836848636
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5
md5: 71b24316859acd00bdb8b38f5e2ce328
@@ -10269,34 +12229,6 @@ packages:
purls: []
size: 694692
timestamp: 1756385147981
-- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
- sha256: ff1c1d7c23b91c9b0eb93a3e1380f4e2ac6c37ea2bba4f932a5484e9a55bba30
- md5: 494fdf358c152f9fdd0673c128c2f3dd
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/unicodedata2?source=hash-mapping
- size: 409562
- timestamp: 1770909102180
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda
- sha256: 09bfbee5a2bcf4df06f21a2aa9eb40a7af97864a569beb5ea85fd6baf6e03ce7
- md5: 4fffb3ba871bb05f34ffb705534dfef5
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: Apache-2.0
- license_family: Apache
- purls:
- - pkg:pypi/unicodedata2?source=hash-mapping
- size: 416130
- timestamp: 1770909728445
- conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda
sha256: 9041e463044944460f73f9528f2ec491180f0ffe857e3555aa8160b81050b8d9
md5: d6b580a13384df5155c6ca19ee66854e
@@ -10312,64 +12244,6 @@ packages:
- pkg:pypi/unicodedata2?source=hash-mapping
size: 406126
timestamp: 1770909191618
-- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
- name: universal-pathlib
- version: 0.3.10
- sha256: dfaf2fb35683d2eb1287a3ed7b215e4d6016aa6eaf339c607023d22f90821c66
- requires_dist:
- - fsspec>=2024.5.0
- - pathlib-abc>=0.5.1,<0.6.0
- - pytest>=8 ; extra == 'tests'
- - pytest-sugar>=0.9.7 ; extra == 'tests'
- - pytest-cov>=4.1.0 ; extra == 'tests'
- - pytest-mock>=3.12.0 ; extra == 'tests'
- - pylint>=2.17.4 ; extra == 'tests'
- - mypy>=1.10.0 ; extra == 'tests'
- - pydantic>=2 ; extra == 'tests'
- - pytest-mypy-plugins>=3.1.2 ; extra == 'tests'
- - packaging ; extra == 'tests'
- - mypy>=1.10.0 ; extra == 'typechecking'
- - pytest-mypy-plugins>=3.1.2 ; extra == 'typechecking'
- - fsspec[adl,gcs,github,http,s3,smb,ssh]>=2024.5.0 ; extra == 'dev'
- - s3fs>=2024.5.0 ; extra == 'dev'
- - gcsfs>=2024.5.0 ; extra == 'dev'
- - adlfs>=2024 ; extra == 'dev'
- - huggingface-hub ; extra == 'dev'
- - webdav4[fsspec] ; extra == 'dev'
- - moto[s3,server] ; extra == 'dev'
- - wsgidav ; extra == 'dev'
- - cheroot ; extra == 'dev'
- - pyftpdlib ; extra == 'dev'
- - typing-extensions ; python_full_version < '3.11' and extra == 'dev'
- - pydantic ; extra == 'dev-third-party'
- - pydantic-settings ; extra == 'dev-third-party'
- requires_python: '>=3.9'
-- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda
- sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0
- md5: e7cb0f5745e4c5035a460248334af7eb
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/uri-template?source=hash-mapping
- size: 23990
- timestamp: 1733323714454
-- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda
- sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a
- md5: 9272daa869e03efe68833e3dc7a02130
- depends:
- - backports.zstd >=1.0.0
- - brotli-python >=1.2.0
- - h2 >=4,<5
- - pysocks >=1.5.6,<2.0,!=1.5.7
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/urllib3?source=hash-mapping
- size: 103172
- timestamp: 1767817860341
- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda
sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a
md5: 1e610f2416b6acdd231c5f573d754a0f
@@ -10407,61 +12281,6 @@ packages:
purls: []
size: 115235
timestamp: 1767320173250
-- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda
- sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa
- md5: c3197f8c0d5b955c904616b716aca093
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/wcwidth?source=hash-mapping
- size: 71550
- timestamp: 1770634638503
-- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda
- sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6
- md5: 6639b6b0d8b5a284f027a2003669aa65
- depends:
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/webcolors?source=hash-mapping
- size: 18987
- timestamp: 1761899393153
-- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda
- sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6
- md5: 2841eb5bfc75ce15e9a0054b98dcd64d
- depends:
- - python >=3.9
- license: BSD-3-Clause
- license_family: BSD
- purls:
- - pkg:pypi/webencodings?source=hash-mapping
- size: 15496
- timestamp: 1733236131358
-- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda
- sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397
- md5: 2f1ed718fcd829c184a6d4f0f2e07409
- depends:
- - python >=3.10
- license: Apache-2.0
- license_family: APACHE
- purls:
- - pkg:pypi/websocket-client?source=hash-mapping
- size: 61391
- timestamp: 1759928175142
-- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f
- md5: 46e441ba871f524e2b067929da3051c2
- depends:
- - __win
- - python >=3.9
- license: LicenseRef-Public-Domain
- purls:
- - pkg:pypi/win-inet-pton?source=hash-mapping
- size: 9555
- timestamp: 1733130678956
- conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2
sha256: 9df10c5b607dd30e05ba08cbd940009305c75db242476f4e845ea06008b0a283
md5: 1cee351bf20b830d991dbe0bc8cd7dfe
@@ -10469,60 +12288,18 @@ packages:
license_family: MIT
purls: []
size: 1176306
-- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
- sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b
- md5: b2895afaf55bf96a8c8282a2e47a5de0
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 15321
- timestamp: 1762976464266
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda
- sha256: adae11db0f66f86156569415ed79cda75b2dbf4bea48d1577831db701438164f
- md5: 78b548eed8227a689f93775d5d23ae09
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 14105
- timestamp: 1762976976084
- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda
- sha256: 156a583fa43609507146de1c4926172286d92458c307bb90871579601f6bc568
- md5: 8436cab9a76015dfe7208d3c9f97c156
- depends:
- - libgcc >=14
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- purls: []
- size: 109246
- timestamp: 1762977105140
-- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
- sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142
- md5: 1dafce8548e38671bea82e3f5c6ce22f
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: MIT
- license_family: MIT
- purls: []
- size: 20591
- timestamp: 1762976546182
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda
- sha256: f7fa0de519d8da589995a1fe78ef74556bb8bc4172079ae3a8d20c3c81354906
- md5: 9d1299ace1924aa8f4e0bc8e71dd0cf7
+ sha256: 156a583fa43609507146de1c4926172286d92458c307bb90871579601f6bc568
+ md5: 8436cab9a76015dfe7208d3c9f97c156
depends:
- - __osx >=11.0
+ - libgcc >=14
+ - libwinpthread >=12.0.0.r4.gg4f2fc60ca
+ - ucrt >=10.0.20348.0
license: MIT
license_family: MIT
purls: []
- size: 19156
- timestamp: 1762977035194
+ size: 109246
+ timestamp: 1762977105140
- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda
sha256: 366b8ae202c3b48958f0b8784bbfdc37243d3ee1b1cd4b8e76c10abe41fa258b
md5: a7c03e38aa9c0e84d41881b9236eacfb
@@ -10535,27 +12312,6 @@ packages:
purls: []
size: 70691
timestamp: 1762977015220
-- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad
- md5: a77f85f77be52ff59391544bfe73390a
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- license: MIT
- license_family: MIT
- purls: []
- size: 85189
- timestamp: 1753484064210
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac
- md5: 78a0fe9e9c50d2c381e8ee47e3ea437d
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- purls: []
- size: 83386
- timestamp: 1753484079473
- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309
md5: 433699cba6602098ae8957a323da2664
@@ -10571,33 +12327,6 @@ packages:
purls: []
size: 63944
timestamp: 1753484092156
-- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda
- sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6
- md5: 755b096086851e1193f3b10347415d7c
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=14
- - krb5 >=1.22.2,<1.23.0a0
- - libsodium >=1.0.21,<1.0.22.0a0
- license: MPL-2.0
- license_family: MOZILLA
- purls: []
- size: 311150
- timestamp: 1772476812121
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda
- sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868
- md5: e85dcd3bde2b10081cdcaeae15797506
- depends:
- - __osx >=11.0
- - libcxx >=19
- - krb5 >=1.22.2,<1.23.0a0
- - libsodium >=1.0.21,<1.0.22.0a0
- license: MPL-2.0
- license_family: MOZILLA
- purls: []
- size: 245246
- timestamp: 1772476886668
- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda
sha256: b8568dfde46edf3455458912ea6ffb760e4456db8230a0cf34ecbc557d3c275f
md5: 1ab0237036bfb14e923d6107473b0021
@@ -10612,41 +12341,6 @@ packages:
purls: []
size: 265665
timestamp: 1772476832995
-- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda
- sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae
- md5: 30cd29cb87d819caead4d55184c1d115
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- purls:
- - pkg:pypi/zipp?source=hash-mapping
- size: 24194
- timestamp: 1764460141901
-- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
- sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f
- md5: 2aadb0d17215603a82a2a6b0afd9a4cb
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- license: Zlib
- license_family: Other
- purls: []
- size: 122618
- timestamp: 1770167931827
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda
- sha256: a339606a6b224bb230ff3d711e801934f3b3844271df9720165e0353716580d4
- md5: d99c2a23a31b0172e90f456f580b695e
- depends:
- - __osx >=11.0
- - libcxx >=19
- license: Zlib
- license_family: Other
- purls: []
- size: 94375
- timestamp: 1770168363685
- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda
sha256: 71332532332d13b5dbe57074ddcf82ae711bdc132affa5a2982a29ffa06dc234
md5: 46a21c0a4e65f1a135251fc7c8663f83
@@ -10659,28 +12353,6 @@ packages:
purls: []
size: 124542
timestamp: 1770167984883
-- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7
- md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829
- depends:
- - __glibc >=2.17,<3.0.a0
- - libzlib >=1.3.1,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 601375
- timestamp: 1764777111296
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9
- md5: ab136e4c34e97f34fb621d2592a393d8
- depends:
- - __osx >=11.0
- - libzlib >=1.3.1,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 433413
- timestamp: 1764777166076
- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2
md5: 053b84beec00b71ea8ff7a4f84b55207
@@ -10694,3 +12366,2029 @@ packages:
purls: []
size: 388453
timestamp: 1764777142545
+- pypi: .
+ name: skillmodels
+ requires_dist:
+ - beartype>=0.22
+ - dags>=0.5.1
+ - jax>=0.9
+ - jaxopt>=0.8.5
+ - jupyter-book>=2
+ - kaleido>=1.2
+ - numpy>=2.4
+ - optimagic>=0.5.3
+ - pandas>=3
+ - plotly>=6.6
+ - pytask-parallel>=0.5.2
+ - pytask>=0.5.8
+ - scikit-learn>=1.5
+ requires_python: '>=3.14,<3.15'
+- pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ name: optimagic
+ version: 0.5.4.dev9+gecd9ebe0d
+ requires_dist:
+ - annotated-types>=0.4
+ - cloudpickle>=2.2
+ - joblib>=1.1
+ - numpy>=1.26
+ - pandas>=2.1
+ - plotly>=5.14
+ - pybaum>=0.1.2
+ - scipy>=1.11
+ - sqlalchemy>=2.0
+ - typing-extensions>=4.5
+ requires_python: '>=3.12'
+- pypi: https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl
+ name: simplejson
+ version: 3.20.2
+ sha256: 3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017
+ requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*'
+- pypi: https://files.pythonhosted.org/packages/08/67/2e19866a03a6e75eb62194a5b55e1e3154ca1517478c300232b0229f8c2a/optree-0.19.0-cp314-cp314-macosx_11_0_arm64.whl
+ name: optree
+ version: 0.19.0
+ sha256: d22b947603be4768c2bd73a59652c94d63465f928b3099e9035f9c48dfc61953
+ requires_dist:
+ - typing-extensions>=4.6.0
+ - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
+ - jax ; extra == 'jax'
+ - numpy ; extra == 'numpy'
+ - torch ; extra == 'torch'
+ - cpplint ; extra == 'lint'
+ - doc8 ; extra == 'lint'
+ - mypy ; extra == 'lint'
+ - pre-commit ; extra == 'lint'
+ - pyenchant ; extra == 'lint'
+ - pylint[spelling] ; extra == 'lint'
+ - ruff ; extra == 'lint'
+ - xdoctest ; extra == 'lint'
+ - pytest ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - covdefaults ; extra == 'test'
+ - rich ; extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
+ - sphinx~=8.0 ; extra == 'docs'
+ - sphinx-autoapi ; extra == 'docs'
+ - sphinx-autobuild ; extra == 'docs'
+ - sphinx-autodoc-typehints ; extra == 'docs'
+ - sphinx-copybutton ; extra == 'docs'
+ - sphinx-rtd-theme ; extra == 'docs'
+ - sphinxcontrib-bibtex ; extra == 'docs'
+ - docutils ; extra == 'docs'
+ - jax[cpu] ; extra == 'docs'
+ - numpy ; extra == 'docs'
+ - torch ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
+ name: pandas
+ version: 3.0.1
+ sha256: 93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66
+ requires_dist:
+ - numpy>=1.26.0 ; python_full_version < '3.14'
+ - numpy>=2.3.3 ; python_full_version >= '3.14'
+ - python-dateutil>=2.8.2
+ - tzdata ; sys_platform == 'win32'
+ - tzdata ; sys_platform == 'emscripten'
+ - hypothesis>=6.116.0 ; extra == 'test'
+ - pytest>=8.3.4 ; extra == 'test'
+ - pytest-xdist>=3.6.1 ; extra == 'test'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - bottleneck>=1.4.2 ; extra == 'performance'
+ - numba>=0.60.0 ; extra == 'performance'
+ - numexpr>=2.10.2 ; extra == 'performance'
+ - scipy>=1.14.1 ; extra == 'computation'
+ - xarray>=2024.10.0 ; extra == 'computation'
+ - fsspec>=2024.10.0 ; extra == 'fss'
+ - s3fs>=2024.10.0 ; extra == 'aws'
+ - gcsfs>=2024.10.0 ; extra == 'gcp'
+ - odfpy>=1.4.1 ; extra == 'excel'
+ - openpyxl>=3.1.5 ; extra == 'excel'
+ - python-calamine>=0.3.0 ; extra == 'excel'
+ - pyxlsb>=1.0.10 ; extra == 'excel'
+ - xlrd>=2.0.1 ; extra == 'excel'
+ - xlsxwriter>=3.2.0 ; extra == 'excel'
+ - pyarrow>=13.0.0 ; extra == 'parquet'
+ - pyarrow>=13.0.0 ; extra == 'feather'
+ - pyiceberg>=0.8.1 ; extra == 'iceberg'
+ - tables>=3.10.1 ; extra == 'hdf5'
+ - pyreadstat>=1.2.8 ; extra == 'spss'
+ - sqlalchemy>=2.0.36 ; extra == 'postgresql'
+ - psycopg2>=2.9.10 ; extra == 'postgresql'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
+ - sqlalchemy>=2.0.36 ; extra == 'mysql'
+ - pymysql>=1.1.1 ; extra == 'mysql'
+ - sqlalchemy>=2.0.36 ; extra == 'sql-other'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
+ - beautifulsoup4>=4.12.3 ; extra == 'html'
+ - html5lib>=1.1 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'xml'
+ - matplotlib>=3.9.3 ; extra == 'plot'
+ - jinja2>=3.1.5 ; extra == 'output-formatting'
+ - tabulate>=0.9.0 ; extra == 'output-formatting'
+ - pyqt5>=5.15.9 ; extra == 'clipboard'
+ - qtpy>=2.4.2 ; extra == 'clipboard'
+ - zstandard>=0.23.0 ; extra == 'compression'
+ - pytz>=2024.2 ; extra == 'timezone'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
+ - beautifulsoup4>=4.12.3 ; extra == 'all'
+ - bottleneck>=1.4.2 ; extra == 'all'
+ - fastparquet>=2024.11.0 ; extra == 'all'
+ - fsspec>=2024.10.0 ; extra == 'all'
+ - gcsfs>=2024.10.0 ; extra == 'all'
+ - html5lib>=1.1 ; extra == 'all'
+ - hypothesis>=6.116.0 ; extra == 'all'
+ - jinja2>=3.1.5 ; extra == 'all'
+ - lxml>=5.3.0 ; extra == 'all'
+ - matplotlib>=3.9.3 ; extra == 'all'
+ - numba>=0.60.0 ; extra == 'all'
+ - numexpr>=2.10.2 ; extra == 'all'
+ - odfpy>=1.4.1 ; extra == 'all'
+ - openpyxl>=3.1.5 ; extra == 'all'
+ - psycopg2>=2.9.10 ; extra == 'all'
+ - pyarrow>=13.0.0 ; extra == 'all'
+ - pyiceberg>=0.8.1 ; extra == 'all'
+ - pymysql>=1.1.1 ; extra == 'all'
+ - pyqt5>=5.15.9 ; extra == 'all'
+ - pyreadstat>=1.2.8 ; extra == 'all'
+ - pytest>=8.3.4 ; extra == 'all'
+ - pytest-xdist>=3.6.1 ; extra == 'all'
+ - python-calamine>=0.3.0 ; extra == 'all'
+ - pytz>=2024.2 ; extra == 'all'
+ - pyxlsb>=1.0.10 ; extra == 'all'
+ - qtpy>=2.4.2 ; extra == 'all'
+ - scipy>=1.14.1 ; extra == 'all'
+ - s3fs>=2024.10.0 ; extra == 'all'
+ - sqlalchemy>=2.0.36 ; extra == 'all'
+ - tables>=3.10.1 ; extra == 'all'
+ - tabulate>=0.9.0 ; extra == 'all'
+ - xarray>=2024.10.0 ; extra == 'all'
+ - xlrd>=2.0.1 ; extra == 'all'
+ - xlsxwriter>=3.2.0 ; extra == 'all'
+ - zstandard>=0.23.0 ; extra == 'all'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/0f/01/3f25909b02fac29bb0a62b2251f8d62e65d697781ffa4cf6b47a4c075c85/ty-0.0.23-py3-none-macosx_11_0_arm64.whl
+ name: ty
+ version: 0.0.23
+ sha256: bd6a340969577b4645f231572c4e46012acba2d10d4c0c6570fe1ab74e76ae00
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cusparse-cu12
+ version: 12.5.10.65
+ sha256: 73060ce019ac064a057267c585bf1fd5a353734151f87472ff02b2c5c9984e78
+ requires_dist:
+ - nvidia-nvjitlink-cu12
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
+ name: orjson
+ version: 3.11.7
+ sha256: 845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl
+ name: rich
+ version: 14.3.3
+ sha256: 793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d
+ requires_dist:
+ - ipywidgets>=7.5.1,<9 ; extra == 'jupyter'
+ - markdown-it-py>=2.2.0
+ - pygments>=2.13.0,<3.0.0
+ requires_python: '>=3.8.0'
+- pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ name: pandas
+ version: 3.0.2
+ sha256: deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535
+ requires_dist:
+ - numpy>=1.26.0 ; python_full_version < '3.14'
+ - numpy>=2.3.3 ; python_full_version >= '3.14'
+ - python-dateutil>=2.8.2
+ - tzdata ; sys_platform == 'win32'
+ - tzdata ; sys_platform == 'emscripten'
+ - hypothesis>=6.116.0 ; extra == 'test'
+ - pytest>=8.3.4 ; extra == 'test'
+ - pytest-xdist>=3.6.1 ; extra == 'test'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - bottleneck>=1.4.2 ; extra == 'performance'
+ - numba>=0.60.0 ; extra == 'performance'
+ - numexpr>=2.10.2 ; extra == 'performance'
+ - scipy>=1.14.1 ; extra == 'computation'
+ - xarray>=2024.10.0 ; extra == 'computation'
+ - fsspec>=2024.10.0 ; extra == 'fss'
+ - s3fs>=2024.10.0 ; extra == 'aws'
+ - gcsfs>=2024.10.0 ; extra == 'gcp'
+ - odfpy>=1.4.1 ; extra == 'excel'
+ - openpyxl>=3.1.5 ; extra == 'excel'
+ - python-calamine>=0.3.0 ; extra == 'excel'
+ - pyxlsb>=1.0.10 ; extra == 'excel'
+ - xlrd>=2.0.1 ; extra == 'excel'
+ - xlsxwriter>=3.2.0 ; extra == 'excel'
+ - pyarrow>=13.0.0 ; extra == 'parquet'
+ - pyarrow>=13.0.0 ; extra == 'feather'
+ - pyiceberg>=0.8.1 ; extra == 'iceberg'
+ - tables>=3.10.1 ; extra == 'hdf5'
+ - pyreadstat>=1.2.8 ; extra == 'spss'
+ - sqlalchemy>=2.0.36 ; extra == 'postgresql'
+ - psycopg2>=2.9.10 ; extra == 'postgresql'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
+ - sqlalchemy>=2.0.36 ; extra == 'mysql'
+ - pymysql>=1.1.1 ; extra == 'mysql'
+ - sqlalchemy>=2.0.36 ; extra == 'sql-other'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
+ - beautifulsoup4>=4.12.3 ; extra == 'html'
+ - html5lib>=1.1 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'xml'
+ - matplotlib>=3.9.3 ; extra == 'plot'
+ - jinja2>=3.1.5 ; extra == 'output-formatting'
+ - tabulate>=0.9.0 ; extra == 'output-formatting'
+ - pyqt5>=5.15.9 ; extra == 'clipboard'
+ - qtpy>=2.4.2 ; extra == 'clipboard'
+ - zstandard>=0.23.0 ; extra == 'compression'
+ - pytz>=2024.2 ; extra == 'timezone'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
+ - beautifulsoup4>=4.12.3 ; extra == 'all'
+ - bottleneck>=1.4.2 ; extra == 'all'
+ - fastparquet>=2024.11.0 ; extra == 'all'
+ - fsspec>=2024.10.0 ; extra == 'all'
+ - gcsfs>=2024.10.0 ; extra == 'all'
+ - html5lib>=1.1 ; extra == 'all'
+ - hypothesis>=6.116.0 ; extra == 'all'
+ - jinja2>=3.1.5 ; extra == 'all'
+ - lxml>=5.3.0 ; extra == 'all'
+ - matplotlib>=3.9.3 ; extra == 'all'
+ - numba>=0.60.0 ; extra == 'all'
+ - numexpr>=2.10.2 ; extra == 'all'
+ - odfpy>=1.4.1 ; extra == 'all'
+ - openpyxl>=3.1.5 ; extra == 'all'
+ - psycopg2>=2.9.10 ; extra == 'all'
+ - pyarrow>=13.0.0 ; extra == 'all'
+ - pyiceberg>=0.8.1 ; extra == 'all'
+ - pymysql>=1.1.1 ; extra == 'all'
+ - pyqt5>=5.15.9 ; extra == 'all'
+ - pyreadstat>=1.2.8 ; extra == 'all'
+ - pytest>=8.3.4 ; extra == 'all'
+ - pytest-xdist>=3.6.1 ; extra == 'all'
+ - python-calamine>=0.3.0 ; extra == 'all'
+ - pytz>=2024.2 ; extra == 'all'
+ - pyxlsb>=1.0.10 ; extra == 'all'
+ - qtpy>=2.4.2 ; extra == 'all'
+ - scipy>=1.14.1 ; extra == 'all'
+ - s3fs>=2024.10.0 ; extra == 'all'
+ - sqlalchemy>=2.0.36 ; extra == 'all'
+ - tables>=3.10.1 ; extra == 'all'
+ - tabulate>=0.9.0 ; extra == 'all'
+ - xarray>=2024.10.0 ; extra == 'all'
+ - xlrd>=2.0.1 ; extra == 'all'
+ - xlsxwriter>=3.2.0 ; extra == 'all'
+ - zstandard>=0.23.0 ; extra == 'all'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/17/e9/3632d7eddb8f282b50bf7c095bba9de91aae0de9baea56d1699d982fe5f8/jax_cuda12_plugin-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ name: jax-cuda12-plugin
+ version: 0.9.1
+ sha256: 55888255c325f98af961cf5f665ca8223d0e36363eb544fc0286277be2324e8f
+ requires_dist:
+ - jax-cuda12-pjrt==0.9.1
+ - nvidia-cublas-cu12>=12.1.3.1 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-cupti-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-nvcc-cu12>=12.6.85 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-runtime-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cudnn-cu12>=9.8,<10.0 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cufft-cu12>=11.0.2.54 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cusolver-cu12>=11.4.5.107 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cusparse-cu12>=12.1.0.106 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nccl-cu12>=2.18.1 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nvjitlink-cu12>=12.1.105 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-nvrtc-cu12>=12.1.55 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nvshmem-cu12>=3.2.5 ; sys_platform == 'linux' and extra == 'with-cuda'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/18/14/69a25a0cad493fb6a947302471b579a03516a3b00e7bece77fdc6b4afb9b/ty-0.0.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ name: ty
+ version: 0.0.23
+ sha256: 559d9a299df793cb7a7902caed5eda8a720ff69164c31c979673e928f02251ee
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-cccl-cu12
+ version: 12.9.27
+ sha256: 37869e17ce2e1ecec6eddf1927cca0f8c34e64fd848d40453df559091e2d7117
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/1e/b5/dae67f0c45516cfaff2d7fba873c7425c2866d4c9ede5c14a269d89ed79b/nvidia_nvjitlink-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-nvjitlink
+ version: 13.2.78
+ sha256: 27964b6702aeceee05fc0ab47b4c97e3f8966bd47d05d9827e913c49a025656b
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/21/98/77f15d81fd0637da454e453c8456d4a2b5c8b2e66823b4237ee8689152cf/jax_cuda13_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl
+ name: jax-cuda13-pjrt
+ version: 0.10.0
+ sha256: 848d6ae3e663d040c53e902ea9d380a902bfa5e7da881053cec408360036fa7a
+- pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ name: opt-einsum
+ version: 3.4.0
+ sha256: 69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/25/1f/cca084ca2572810fff12ea9dbdcbe39eac048f40daf4a9077b49fcbe8cee/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: msgspec
+ version: 0.21.1
+ sha256: 3d6b9dc50948eaf65df54d2fd0ff66e6d8c32f116037209ee861810eb9b676cb
+ requires_dist:
+ - tomli ; python_full_version < '3.11' and extra == 'toml'
+ - tomli-w ; extra == 'toml'
+ - pyyaml ; extra == 'yaml'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-cuda-nvcc-cu12
+ version: 12.9.86
+ sha256: 5d6a0d32fdc7ea39917c20065614ae93add6f577d840233237ff08e9a38f58f0
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
+ name: click-default-group
+ version: 1.2.4
+ sha256: 9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f
+ requires_dist:
+ - click
+ - pytest ; extra == 'test'
+ requires_python: '>=2.7'
+- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl
+ name: dags
+ version: 0.5.1
+ sha256: e9fd9fbe0536784fe8b8ce58ea194801b1de39d7364941d4a1f2d8240c14123d
+ requires_dist:
+ - flatten-dict
+ - networkx>=3.6
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/2e/84/efc7c0bf3a1c5eef81d397f6fddac855becdbb11cb38ff957888603014a7/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: sqlalchemy
+ version: 2.0.49
+ sha256: 685e93e9c8f399b0c96a624799820176312f5ceef958c0f88215af4013d29066
+ requires_dist:
+ - importlib-metadata ; python_full_version < '3.8'
+ - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
+ - typing-extensions>=4.6.0
+ - greenlet>=1 ; extra == 'asyncio'
+ - mypy>=0.910 ; extra == 'mypy'
+ - pyodbc ; extra == 'mssql'
+ - pymssql ; extra == 'mssql-pymssql'
+ - pyodbc ; extra == 'mssql-pyodbc'
+ - mysqlclient>=1.4.0 ; extra == 'mysql'
+ - mysql-connector-python ; extra == 'mysql-connector'
+ - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
+ - cx-oracle>=8 ; extra == 'oracle'
+ - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
+ - psycopg2>=2.7 ; extra == 'postgresql'
+ - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
+ - greenlet>=1 ; extra == 'postgresql-asyncpg'
+ - asyncpg ; extra == 'postgresql-asyncpg'
+ - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
+ - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
+ - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
+ - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
+ - pymysql ; extra == 'pymysql'
+ - greenlet>=1 ; extra == 'aiomysql'
+ - aiomysql>=0.2.0 ; extra == 'aiomysql'
+ - greenlet>=1 ; extra == 'aioodbc'
+ - aioodbc ; extra == 'aioodbc'
+ - greenlet>=1 ; extra == 'asyncmy'
+ - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
+ - greenlet>=1 ; extra == 'aiosqlite'
+ - aiosqlite ; extra == 'aiosqlite'
+ - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
+ - sqlcipher3-binary ; extra == 'sqlcipher'
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/31/1e/9e366f36efc550f07d6737f199e3f6bffafdf28795d007f10a77dd274f5c/nvidia_nccl_cu12-2.29.7-py3-none-manylinux_2_18_x86_64.whl
+ name: nvidia-nccl-cu12
+ version: 2.29.7
+ sha256: ecd0a012051abc20c1aa87328841efa8cade3ced65803046e38c2f03c0891fea
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/31/2e/eaed4ff5c85e857a02415084c394e02c30476b65e158eec1938fdaa9a205/ty-0.0.23-py3-none-win_amd64.whl
+ name: ty
+ version: 0.0.23
+ sha256: 1e137e955f05c501cfbb81dd2190c8fb7d01ec037c7e287024129c722a83c9ad
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cusolver-cu12
+ version: 11.7.5.82
+ sha256: 15da72d1340d29b5b3cf3fd100e3cd53421dde36002eda6ed93811af63c40d88
+ requires_dist:
+ - nvidia-cublas-cu12
+ - nvidia-nvjitlink-cu12
+ - nvidia-cusparse-cu12
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cufft
+ version: 12.2.0.46
+ sha256: a9667ae4d81b9e54ddbbad24a9e72334f89d4fc184566d05ef028e2760c820eb
+ requires_dist:
+ - nvidia-nvjitlink
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/3b/52/94aecda69df65ba1079a8b7dbe84632af5614dc0ed2c733185f6431874e3/nvidia_cudnn_cu12-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cudnn-cu12
+ version: 9.20.0.48
+ sha256: 7d7479e1321c7a039b33827f0247791ee1be091759032c1f66a287c4a643396a
+ requires_dist:
+ - nvidia-cublas-cu12
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
+ name: pytest
+ version: 9.0.2
+ sha256: 711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b
+ requires_dist:
+ - colorama>=0.4 ; sys_platform == 'win32'
+ - exceptiongroup>=1 ; python_full_version < '3.11'
+ - iniconfig>=1.0.1
+ - packaging>=22
+ - pluggy>=1.5,<2
+ - pygments>=2.7.2
+ - tomli>=1 ; python_full_version < '3.11'
+ - argcomplete ; extra == 'dev'
+ - attrs>=19.2 ; extra == 'dev'
+ - hypothesis>=3.56 ; extra == 'dev'
+ - mock ; extra == 'dev'
+ - requests ; extra == 'dev'
+ - setuptools ; extra == 'dev'
+ - xmlschema ; extra == 'dev'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/3e/93/6d020a69fc37e57fae8a96ab0c53102d96538db256e933e914d100e5a430/nvidia_nccl_cu13-2.30.4-py3-none-manylinux_2_18_x86_64.whl
+ name: nvidia-nccl-cu13
+ version: 2.30.4
+ sha256: 534dbf3058cadb625f08ab0d17f1dffad3b961a2bfa360d66633fcf21be53f57
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl
+ name: flatten-dict
+ version: 0.4.2
+ sha256: 7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad
+ requires_dist:
+ - importlib-metadata ; python_full_version < '3.8'
+ - pathlib2>=2.3,<3.0 ; python_full_version < '3.4'
+ - six>=1.12,<2.0
+ requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*'
+- pypi: https://files.pythonhosted.org/packages/44/6a/cf1265d48719852f5144055ff611d9e71678a9b29afb7ace72bf248a0cd8/nvidia_nvshmem_cu12-3.5.21-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-nvshmem-cu12
+ version: 3.5.21
+ sha256: 0e51b52bbd78f8896a7667701ac40e3e7a4f0f80703ccce75b304c18f359d73f
+ requires_dist:
+ - nvidia-cuda-cccl-cu12
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-py3-none-any.whl
+ name: jaxopt
+ version: 0.8.5
+ sha256: ff221d1a86908ec759eb1e219ee1d12bf208a70707e961bf7401076fe7cf4d5e
+ requires_dist:
+ - jax>=0.2.18
+ - jaxlib>=0.1.69
+ - numpy>=1.18.4
+ - scipy>=1.0.0
+- pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-nvjitlink-cu12
+ version: 12.9.86
+ sha256: e3f1171dbdc83c5932a45f0f4c99180a70de9bd2718c1ab77d14104f6d7147f9
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl
+ name: kaleido
+ version: 1.2.0
+ sha256: c27ed82b51df6b923d0e656feac221343a0dbcd2fb9bc7e6b1db97f61e9a1513
+ requires_dist:
+ - choreographer>=1.1.1
+ - logistro>=1.0.8
+ - orjson>=3.10.15
+ - packaging
+ - pytest-timeout>=2.4.0
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl
+ name: pdbp
+ version: 1.8.2
+ sha256: d4fd05e177636b5ccd0b2e03e378cec57afc06149e5fd975de6f8ddb3d0109a8
+ requires_dist:
+ - pygments>=2.19.2
+ - tabcompleter>=1.4.0
+ - colorama>=0.4.6 ; sys_platform == 'win32'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
+ name: plotly
+ version: 6.6.0
+ sha256: 8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0
+ requires_dist:
+ - narwhals>=1.15.1
+ - packaging
+ - numpy ; extra == 'express'
+ - kaleido>=1.1.0 ; extra == 'kaleido'
+ - pytest ; extra == 'dev-core'
+ - requests ; extra == 'dev-core'
+ - ruff==0.11.12 ; extra == 'dev-core'
+ - plotly[dev-core] ; extra == 'dev-build'
+ - build ; extra == 'dev-build'
+ - jupyter ; extra == 'dev-build'
+ - plotly[dev-build] ; extra == 'dev-optional'
+ - plotly[kaleido] ; extra == 'dev-optional'
+ - anywidget ; extra == 'dev-optional'
+ - colorcet ; extra == 'dev-optional'
+ - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev-optional'
+ - geopandas ; extra == 'dev-optional'
+ - inflect ; extra == 'dev-optional'
+ - numpy ; extra == 'dev-optional'
+ - orjson ; extra == 'dev-optional'
+ - pandas ; extra == 'dev-optional'
+ - pdfrw ; extra == 'dev-optional'
+ - pillow ; extra == 'dev-optional'
+ - plotly-geo ; extra == 'dev-optional'
+ - polars[timezone] ; extra == 'dev-optional'
+ - pyarrow ; extra == 'dev-optional'
+ - pyshp ; extra == 'dev-optional'
+ - pytz ; extra == 'dev-optional'
+ - scikit-image ; extra == 'dev-optional'
+ - scipy ; extra == 'dev-optional'
+ - shapely ; extra == 'dev-optional'
+ - statsmodels ; extra == 'dev-optional'
+ - vaex ; python_full_version < '3.10' and extra == 'dev-optional'
+ - xarray ; extra == 'dev-optional'
+ - plotly[dev-optional] ; extra == 'dev'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
+ name: jaxlib
+ version: 0.9.1
+ sha256: 61160d686e6a4703ef30a6a3aa199c934e6359f42d0aa1c0f9c475d3953b9459
+ requires_dist:
+ - scipy>=1.13
+ - numpy>=2.0
+ - ml-dtypes>=0.5.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
+ name: pluggy
+ version: 1.6.0
+ sha256: e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746
+ requires_dist:
+ - pre-commit ; extra == 'dev'
+ - tox ; extra == 'dev'
+ - pytest ; extra == 'testing'
+ - pytest-benchmark ; extra == 'testing'
+ - coverage ; extra == 'testing'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl
+ name: logistro
+ version: 2.0.1
+ sha256: 06ffa127b9fb4ac8b1972ae6b2a9d7fde57598bf5939cd708f43ec5bba2d31eb
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ name: pandas
+ version: 3.0.1
+ sha256: c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249
+ requires_dist:
+ - numpy>=1.26.0 ; python_full_version < '3.14'
+ - numpy>=2.3.3 ; python_full_version >= '3.14'
+ - python-dateutil>=2.8.2
+ - tzdata ; sys_platform == 'win32'
+ - tzdata ; sys_platform == 'emscripten'
+ - hypothesis>=6.116.0 ; extra == 'test'
+ - pytest>=8.3.4 ; extra == 'test'
+ - pytest-xdist>=3.6.1 ; extra == 'test'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - bottleneck>=1.4.2 ; extra == 'performance'
+ - numba>=0.60.0 ; extra == 'performance'
+ - numexpr>=2.10.2 ; extra == 'performance'
+ - scipy>=1.14.1 ; extra == 'computation'
+ - xarray>=2024.10.0 ; extra == 'computation'
+ - fsspec>=2024.10.0 ; extra == 'fss'
+ - s3fs>=2024.10.0 ; extra == 'aws'
+ - gcsfs>=2024.10.0 ; extra == 'gcp'
+ - odfpy>=1.4.1 ; extra == 'excel'
+ - openpyxl>=3.1.5 ; extra == 'excel'
+ - python-calamine>=0.3.0 ; extra == 'excel'
+ - pyxlsb>=1.0.10 ; extra == 'excel'
+ - xlrd>=2.0.1 ; extra == 'excel'
+ - xlsxwriter>=3.2.0 ; extra == 'excel'
+ - pyarrow>=13.0.0 ; extra == 'parquet'
+ - pyarrow>=13.0.0 ; extra == 'feather'
+ - pyiceberg>=0.8.1 ; extra == 'iceberg'
+ - tables>=3.10.1 ; extra == 'hdf5'
+ - pyreadstat>=1.2.8 ; extra == 'spss'
+ - sqlalchemy>=2.0.36 ; extra == 'postgresql'
+ - psycopg2>=2.9.10 ; extra == 'postgresql'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
+ - sqlalchemy>=2.0.36 ; extra == 'mysql'
+ - pymysql>=1.1.1 ; extra == 'mysql'
+ - sqlalchemy>=2.0.36 ; extra == 'sql-other'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
+ - beautifulsoup4>=4.12.3 ; extra == 'html'
+ - html5lib>=1.1 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'xml'
+ - matplotlib>=3.9.3 ; extra == 'plot'
+ - jinja2>=3.1.5 ; extra == 'output-formatting'
+ - tabulate>=0.9.0 ; extra == 'output-formatting'
+ - pyqt5>=5.15.9 ; extra == 'clipboard'
+ - qtpy>=2.4.2 ; extra == 'clipboard'
+ - zstandard>=0.23.0 ; extra == 'compression'
+ - pytz>=2024.2 ; extra == 'timezone'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
+ - beautifulsoup4>=4.12.3 ; extra == 'all'
+ - bottleneck>=1.4.2 ; extra == 'all'
+ - fastparquet>=2024.11.0 ; extra == 'all'
+ - fsspec>=2024.10.0 ; extra == 'all'
+ - gcsfs>=2024.10.0 ; extra == 'all'
+ - html5lib>=1.1 ; extra == 'all'
+ - hypothesis>=6.116.0 ; extra == 'all'
+ - jinja2>=3.1.5 ; extra == 'all'
+ - lxml>=5.3.0 ; extra == 'all'
+ - matplotlib>=3.9.3 ; extra == 'all'
+ - numba>=0.60.0 ; extra == 'all'
+ - numexpr>=2.10.2 ; extra == 'all'
+ - odfpy>=1.4.1 ; extra == 'all'
+ - openpyxl>=3.1.5 ; extra == 'all'
+ - psycopg2>=2.9.10 ; extra == 'all'
+ - pyarrow>=13.0.0 ; extra == 'all'
+ - pyiceberg>=0.8.1 ; extra == 'all'
+ - pymysql>=1.1.1 ; extra == 'all'
+ - pyqt5>=5.15.9 ; extra == 'all'
+ - pyreadstat>=1.2.8 ; extra == 'all'
+ - pytest>=8.3.4 ; extra == 'all'
+ - pytest-xdist>=3.6.1 ; extra == 'all'
+ - python-calamine>=0.3.0 ; extra == 'all'
+ - pytz>=2024.2 ; extra == 'all'
+ - pyxlsb>=1.0.10 ; extra == 'all'
+ - qtpy>=2.4.2 ; extra == 'all'
+ - scipy>=1.14.1 ; extra == 'all'
+ - s3fs>=2024.10.0 ; extra == 'all'
+ - sqlalchemy>=2.0.36 ; extra == 'all'
+ - tables>=3.10.1 ; extra == 'all'
+ - tabulate>=0.9.0 ; extra == 'all'
+ - xarray>=2024.10.0 ; extra == 'all'
+ - xlrd>=2.0.1 ; extra == 'all'
+ - xlsxwriter>=3.2.0 ; extra == 'all'
+ - zstandard>=0.23.0 ; extra == 'all'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cudnn-cu13
+ version: 9.22.0.52
+ sha256: 7b24277af8cd2e4e5be731f5cf910255105d4b92481999771b99dbffee75d03e
+ requires_dist:
+ - nvidia-cublas
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl
+ name: pyreadline3
+ version: 3.5.4
+ sha256: eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6
+ requires_dist:
+ - build ; extra == 'dev'
+ - flake8 ; extra == 'dev'
+ - mypy ; extra == 'dev'
+ - pytest ; extra == 'dev'
+ - twine ; extra == 'dev'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/5b/f2/44a7dd795a52d34d033b1cb1a6b1162eada650079e557e236fb6b88943be/pytask_parallel-0.5.4-py3-none-any.whl
+ name: pytask-parallel
+ version: 0.5.4
+ sha256: f05ca8e3251e25621b260659e01bceec43875155afa3dab84a912e1bbd9971d0
+ requires_dist:
+ - attrs>=21.3.0
+ - click>=8.1.8,!=8.2.0
+ - cloudpickle
+ - loky
+ - pluggy>=1.0.0
+ - pytask>=0.5.2
+ - rich
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/5d/7b/2ab033584a3339552472ac8d79543c503a0e06dd0d082448b06697e7f716/nvidia_nvshmem_cu13-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-nvshmem-cu13
+ version: 3.6.5
+ sha256: 4001aabc72ead32ecc3c9add3c6781befcb71adcbe286d7f5956042e68668c70
+ requires_dist:
+ - nvidia-cuda-cccl
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-cuda-nvrtc
+ version: 13.2.78
+ sha256: a9049031da08cbedd0c20e3470e5a978dc330af0e0326b3b05774718c665dc3e
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/65/0f/c7c7d538c61794130e759ad74710ab5aa8cab1f700ee1754381f8c665605/nvidia_cuda_nvcc-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-nvcc
+ version: 13.2.78
+ sha256: c3bd144dd9b6b25e062589acb7bbd43d93d3120c72fad71da808f9817aba1239
+ requires_dist:
+ - nvidia-nvvm
+ - nvidia-cuda-runtime
+ - nvidia-cuda-crt
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl
+ name: tabcompleter
+ version: 1.4.0
+ sha256: d744aa735b49c0a6cc2fb8fcd40077fec47425e4388301010b14e6ce3311368b
+ requires_dist:
+ - pyreadline3 ; sys_platform == 'win32'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cusolver
+ version: 12.2.0.1
+ sha256: 4693ea3c2a5d20369da7b5a4970a41df9b40f1b6f2ef9909c95f7c8c8c5ffb4d
+ requires_dist:
+ - nvidia-cublas
+ - nvidia-nvjitlink
+ - nvidia-cusparse
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl
+ name: jax
+ version: 0.10.0
+ sha256: 76c42ba163c8db3dc2e449e225b888c0edfb623ded31efdc96d85e0fda1d26e8
+ requires_dist:
+ - jaxlib<=0.10.0,>=0.10.0
+ - ml-dtypes>=0.5.0
+ - numpy>=2.0
+ - opt-einsum
+ - scipy>=1.14
+ - jaxlib==0.10.0 ; extra == 'minimum-jaxlib'
+ - jaxlib==0.9.2 ; extra == 'ci'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'tpu'
+ - libtpu==0.0.40.* ; extra == 'tpu'
+ - requests ; extra == 'tpu'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'cuda'
+ - jax-cuda12-plugin[with-cuda]<=0.10.0,>=0.10.0 ; extra == 'cuda'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'cuda12'
+ - jax-cuda12-plugin[with-cuda]<=0.10.0,>=0.10.0 ; extra == 'cuda12'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'cuda13'
+ - jax-cuda13-plugin[with-cuda]<=0.10.0,>=0.10.0 ; extra == 'cuda13'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'cuda12-local'
+ - jax-cuda12-plugin<=0.10.0,>=0.10.0 ; extra == 'cuda12-local'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'cuda13-local'
+ - jax-cuda13-plugin<=0.10.0,>=0.10.0 ; extra == 'cuda13-local'
+ - jaxlib<=0.10.0,>=0.10.0 ; extra == 'rocm7-local'
+ - jax-rocm7-plugin==0.10.0.* ; extra == 'rocm7-local'
+ - kubernetes ; extra == 'k8s'
+ - xprof ; extra == 'xprof'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ name: beartype
+ version: 0.22.9
+ sha256: d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2
+ requires_dist:
+ - autoapi>=0.9.0 ; extra == 'dev'
+ - celery ; extra == 'dev'
+ - click ; extra == 'dev'
+ - coverage>=5.5 ; extra == 'dev'
+ - docutils>=0.22.0 ; extra == 'dev'
+ - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'dev'
+ - fastmcp ; python_full_version < '3.14' and extra == 'dev'
+ - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'dev'
+ - jaxtyping ; sys_platform == 'linux' and extra == 'dev'
+ - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'dev'
+ - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'dev'
+ - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'dev'
+ - numba ; python_full_version < '3.14' and extra == 'dev'
+ - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'dev'
+ - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'dev'
+ - poetry ; extra == 'dev'
+ - polars ; python_full_version < '3.14' and extra == 'dev'
+ - pydata-sphinx-theme<=0.7.2 ; extra == 'dev'
+ - pygments ; extra == 'dev'
+ - pyinstaller ; extra == 'dev'
+ - pyright>=1.1.370 ; extra == 'dev'
+ - pytest>=6.2.0 ; extra == 'dev'
+ - redis ; extra == 'dev'
+ - rich-click ; extra == 'dev'
+ - setuptools ; extra == 'dev'
+ - sphinx ; extra == 'dev'
+ - sphinx>=4.2.0,<6.0.0 ; extra == 'dev'
+ - sphinxext-opengraph>=0.7.5 ; extra == 'dev'
+ - sqlalchemy ; extra == 'dev'
+ - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'dev'
+ - tox>=3.20.1 ; extra == 'dev'
+ - typer ; extra == 'dev'
+ - typing-extensions>=3.10.0.0 ; extra == 'dev'
+ - xarray ; python_full_version < '3.15' and extra == 'dev'
+ - mkdocs-material[imaging]>=9.6.0 ; extra == 'doc-ghp'
+ - mkdocstrings-python-xref>=1.16.0 ; extra == 'doc-ghp'
+ - mkdocstrings-python>=1.16.0 ; extra == 'doc-ghp'
+ - autoapi>=0.9.0 ; extra == 'doc-rtd'
+ - pydata-sphinx-theme<=0.7.2 ; extra == 'doc-rtd'
+ - setuptools ; extra == 'doc-rtd'
+ - sphinx>=4.2.0,<6.0.0 ; extra == 'doc-rtd'
+ - sphinxext-opengraph>=0.7.5 ; extra == 'doc-rtd'
+ - celery ; extra == 'test'
+ - click ; extra == 'test'
+ - coverage>=5.5 ; extra == 'test'
+ - docutils>=0.22.0 ; extra == 'test'
+ - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test'
+ - fastmcp ; python_full_version < '3.14' and extra == 'test'
+ - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test'
+ - jaxtyping ; sys_platform == 'linux' and extra == 'test'
+ - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test'
+ - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'test'
+ - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test'
+ - numba ; python_full_version < '3.14' and extra == 'test'
+ - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test'
+ - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'test'
+ - poetry ; extra == 'test'
+ - polars ; python_full_version < '3.14' and extra == 'test'
+ - pygments ; extra == 'test'
+ - pyinstaller ; extra == 'test'
+ - pyright>=1.1.370 ; extra == 'test'
+ - pytest>=6.2.0 ; extra == 'test'
+ - redis ; extra == 'test'
+ - rich-click ; extra == 'test'
+ - sphinx ; extra == 'test'
+ - sqlalchemy ; extra == 'test'
+ - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test'
+ - tox>=3.20.1 ; extra == 'test'
+ - typer ; extra == 'test'
+ - typing-extensions>=3.10.0.0 ; extra == 'test'
+ - xarray ; python_full_version < '3.15' and extra == 'test'
+ - celery ; extra == 'test-tox'
+ - click ; extra == 'test-tox'
+ - docutils>=0.22.0 ; extra == 'test-tox'
+ - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test-tox'
+ - fastmcp ; python_full_version < '3.14' and extra == 'test-tox'
+ - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test-tox'
+ - jaxtyping ; sys_platform == 'linux' and extra == 'test-tox'
+ - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test-tox'
+ - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'test-tox'
+ - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test-tox'
+ - numba ; python_full_version < '3.14' and extra == 'test-tox'
+ - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test-tox'
+ - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'test-tox'
+ - poetry ; extra == 'test-tox'
+ - polars ; python_full_version < '3.14' and extra == 'test-tox'
+ - pygments ; extra == 'test-tox'
+ - pyinstaller ; extra == 'test-tox'
+ - pyright>=1.1.370 ; extra == 'test-tox'
+ - pytest>=6.2.0 ; extra == 'test-tox'
+ - redis ; extra == 'test-tox'
+ - rich-click ; extra == 'test-tox'
+ - sphinx ; extra == 'test-tox'
+ - sqlalchemy ; extra == 'test-tox'
+ - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test-tox'
+ - typer ; extra == 'test-tox'
+ - typing-extensions>=3.10.0.0 ; extra == 'test-tox'
+ - xarray ; python_full_version < '3.15' and extra == 'test-tox'
+ - coverage>=5.5 ; extra == 'test-tox-coverage'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl
+ name: pandas
+ version: 3.0.1
+ sha256: 3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f
+ requires_dist:
+ - numpy>=1.26.0 ; python_full_version < '3.14'
+ - numpy>=2.3.3 ; python_full_version >= '3.14'
+ - python-dateutil>=2.8.2
+ - tzdata ; sys_platform == 'win32'
+ - tzdata ; sys_platform == 'emscripten'
+ - hypothesis>=6.116.0 ; extra == 'test'
+ - pytest>=8.3.4 ; extra == 'test'
+ - pytest-xdist>=3.6.1 ; extra == 'test'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - bottleneck>=1.4.2 ; extra == 'performance'
+ - numba>=0.60.0 ; extra == 'performance'
+ - numexpr>=2.10.2 ; extra == 'performance'
+ - scipy>=1.14.1 ; extra == 'computation'
+ - xarray>=2024.10.0 ; extra == 'computation'
+ - fsspec>=2024.10.0 ; extra == 'fss'
+ - s3fs>=2024.10.0 ; extra == 'aws'
+ - gcsfs>=2024.10.0 ; extra == 'gcp'
+ - odfpy>=1.4.1 ; extra == 'excel'
+ - openpyxl>=3.1.5 ; extra == 'excel'
+ - python-calamine>=0.3.0 ; extra == 'excel'
+ - pyxlsb>=1.0.10 ; extra == 'excel'
+ - xlrd>=2.0.1 ; extra == 'excel'
+ - xlsxwriter>=3.2.0 ; extra == 'excel'
+ - pyarrow>=13.0.0 ; extra == 'parquet'
+ - pyarrow>=13.0.0 ; extra == 'feather'
+ - pyiceberg>=0.8.1 ; extra == 'iceberg'
+ - tables>=3.10.1 ; extra == 'hdf5'
+ - pyreadstat>=1.2.8 ; extra == 'spss'
+ - sqlalchemy>=2.0.36 ; extra == 'postgresql'
+ - psycopg2>=2.9.10 ; extra == 'postgresql'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql'
+ - sqlalchemy>=2.0.36 ; extra == 'mysql'
+ - pymysql>=1.1.1 ; extra == 'mysql'
+ - sqlalchemy>=2.0.36 ; extra == 'sql-other'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other'
+ - beautifulsoup4>=4.12.3 ; extra == 'html'
+ - html5lib>=1.1 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'html'
+ - lxml>=5.3.0 ; extra == 'xml'
+ - matplotlib>=3.9.3 ; extra == 'plot'
+ - jinja2>=3.1.5 ; extra == 'output-formatting'
+ - tabulate>=0.9.0 ; extra == 'output-formatting'
+ - pyqt5>=5.15.9 ; extra == 'clipboard'
+ - qtpy>=2.4.2 ; extra == 'clipboard'
+ - zstandard>=0.23.0 ; extra == 'compression'
+ - pytz>=2024.2 ; extra == 'timezone'
+ - adbc-driver-postgresql>=1.2.0 ; extra == 'all'
+ - adbc-driver-sqlite>=1.2.0 ; extra == 'all'
+ - beautifulsoup4>=4.12.3 ; extra == 'all'
+ - bottleneck>=1.4.2 ; extra == 'all'
+ - fastparquet>=2024.11.0 ; extra == 'all'
+ - fsspec>=2024.10.0 ; extra == 'all'
+ - gcsfs>=2024.10.0 ; extra == 'all'
+ - html5lib>=1.1 ; extra == 'all'
+ - hypothesis>=6.116.0 ; extra == 'all'
+ - jinja2>=3.1.5 ; extra == 'all'
+ - lxml>=5.3.0 ; extra == 'all'
+ - matplotlib>=3.9.3 ; extra == 'all'
+ - numba>=0.60.0 ; extra == 'all'
+ - numexpr>=2.10.2 ; extra == 'all'
+ - odfpy>=1.4.1 ; extra == 'all'
+ - openpyxl>=3.1.5 ; extra == 'all'
+ - psycopg2>=2.9.10 ; extra == 'all'
+ - pyarrow>=13.0.0 ; extra == 'all'
+ - pyiceberg>=0.8.1 ; extra == 'all'
+ - pymysql>=1.1.1 ; extra == 'all'
+ - pyqt5>=5.15.9 ; extra == 'all'
+ - pyreadstat>=1.2.8 ; extra == 'all'
+ - pytest>=8.3.4 ; extra == 'all'
+ - pytest-xdist>=3.6.1 ; extra == 'all'
+ - python-calamine>=0.3.0 ; extra == 'all'
+ - pytz>=2024.2 ; extra == 'all'
+ - pyxlsb>=1.0.10 ; extra == 'all'
+ - qtpy>=2.4.2 ; extra == 'all'
+ - scipy>=1.14.1 ; extra == 'all'
+ - s3fs>=2024.10.0 ; extra == 'all'
+ - sqlalchemy>=2.0.36 ; extra == 'all'
+ - tables>=3.10.1 ; extra == 'all'
+ - tabulate>=0.9.0 ; extra == 'all'
+ - xarray>=2024.10.0 ; extra == 'all'
+ - xlrd>=2.0.1 ; extra == 'all'
+ - xlsxwriter>=3.2.0 ; extra == 'all'
+ - zstandard>=0.23.0 ; extra == 'all'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl
+ name: ml-dtypes
+ version: 0.5.4
+ sha256: 2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22
+ requires_dist:
+ - numpy>=1.21
+ - numpy>=1.21.2 ; python_full_version >= '3.10'
+ - numpy>=1.23.3 ; python_full_version >= '3.11'
+ - numpy>=1.26.0 ; python_full_version >= '3.12'
+ - numpy>=2.1.0 ; python_full_version >= '3.13'
+ - absl-py ; extra == 'dev'
+ - pytest ; extra == 'dev'
+ - pytest-xdist ; extra == 'dev'
+ - pylint>=2.6.0 ; extra == 'dev'
+ - pyink ; extra == 'dev'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl
+ name: flatten-dict
+ version: 0.5.0
+ sha256: c4bd2010052e4d33241433720d054322403fa7ad914fdc5cb1b31a713d4c561e
+ requires_python: '>=3.10,<4.0'
+- pypi: https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ name: orjson
+ version: 3.11.9
+ sha256: aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/76/fe/67d2c414b0860d42f4a20b1fadbe7aeffb1b3d885efebd7aedf22a4bc2a2/jaxlib-0.9.1-cp314-cp314-manylinux_2_27_x86_64.whl
+ name: jaxlib
+ version: 0.9.1
+ sha256: 2287a1c891b152c52eb9b73925f57cde01be35d2bab4dad9673d3c83c5982ca8
+ requires_dist:
+ - scipy>=1.13
+ - numpy>=2.0
+ - ml-dtypes>=0.5.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/77/3c/aa88abe01f3be3d1f8f787d1d33dc83e76fec05945f9a28fbb41cfb99cd5/nvidia_cublas_cu12-12.9.1.4-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cublas-cu12
+ version: 12.9.1.4
+ sha256: 453611eb21a7c1f2c2156ed9f3a45b691deda0440ec550860290dc901af5b4c2
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/78/91/3635cdb13318cb0a328abaa69e2b91251caad39d6779aa308098f341f6cb/simplejson-4.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
+ name: simplejson
+ version: 4.1.1
+ sha256: 3851658d642c1184d2023f0e6c9ce44a21eb1629e74e7c84ef956b128841fe12
+ requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*'
+- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
+ name: annotated-types
+ version: 0.7.0
+ sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53
+ requires_dist:
+ - typing-extensions>=4.0.0 ; python_full_version < '3.9'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/7c/25/6fe2dfc3d830ec614c5f83f88fc7472c4ed892b7f7f496367d31de4110c4/jupyter_book-2.1.2-py3-none-any.whl
+ name: jupyter-book
+ version: 2.1.2
+ sha256: 1e92850680782ca777452780f9dee0550b52af338e6fe8c115961142ebf30a0e
+ requires_dist:
+ - ipykernel
+ - jupyter-core
+ - jupyter-server
+ - platformdirs>=4.2.2
+ - nodeenv>=1.9.1
+ - markdown ; extra == 'docs'
+ - pandas ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
+ name: pandas-stubs
+ version: 3.0.0.260204
+ sha256: 5ab9e4d55a6e2752e9720828564af40d48c4f709e6a2c69b743014a6fcb6c241
+ requires_dist:
+ - numpy>=1.23.5
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/7e/c3/587cc9aa8d4742cd690da79460081e7d834499e07e8b2bd2ccc4c66928df/optree-0.19.0-cp314-cp314-win_amd64.whl
+ name: optree
+ version: 0.19.0
+ sha256: ff773c852122cef6dcae68b5e252a20aaf5d2986f78e278d747e226e7829d44e
+ requires_dist:
+ - typing-extensions>=4.6.0
+ - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
+ - jax ; extra == 'jax'
+ - numpy ; extra == 'numpy'
+ - torch ; extra == 'torch'
+ - cpplint ; extra == 'lint'
+ - doc8 ; extra == 'lint'
+ - mypy ; extra == 'lint'
+ - pre-commit ; extra == 'lint'
+ - pyenchant ; extra == 'lint'
+ - pylint[spelling] ; extra == 'lint'
+ - ruff ; extra == 'lint'
+ - xdoctest ; extra == 'lint'
+ - pytest ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - covdefaults ; extra == 'test'
+ - rich ; extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
+ - sphinx~=8.0 ; extra == 'docs'
+ - sphinx-autoapi ; extra == 'docs'
+ - sphinx-autobuild ; extra == 'docs'
+ - sphinx-autodoc-typehints ; extra == 'docs'
+ - sphinx-copybutton ; extra == 'docs'
+ - sphinx-rtd-theme ; extra == 'docs'
+ - sphinxcontrib-bibtex ; extra == 'docs'
+ - docutils ; extra == 'docs'
+ - jax[cpu] ; extra == 'docs'
+ - numpy ; extra == 'docs'
+ - torch ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl
+ name: pytask
+ version: 0.5.8
+ sha256: 217ed6b3e12140c442afa5e333bbb91e98f8d4fd5c746d323fbbf9778985a92f
+ requires_dist:
+ - attrs>=21.3.0
+ - click>=8.1.8,!=8.2.0
+ - click-default-group>=1.2.4
+ - networkx>=2.4.0
+ - optree>=0.9.0
+ - packaging>=23.0.0
+ - pluggy>=1.3.0
+ - rich>=13.8.0
+ - sqlalchemy>=2.0.31
+ - tomli>=1 ; python_full_version < '3.11'
+ - typing-extensions>=4.8.0 ; python_full_version < '3.11'
+ - universal-pathlib>=0.2.2
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/80/e4/88778c6a23b65224e5088e68fd0924e5bde2196a26e76edb3ea3543fed6a/jax-0.9.1-py3-none-any.whl
+ name: jax
+ version: 0.9.1
+ sha256: d11cb53d362912253013e8c4d6926cb9f3a4b59ab5b25a7dc08123567067d088
+ requires_dist:
+ - jaxlib<=0.9.1,>=0.9.1
+ - ml-dtypes>=0.5.0
+ - numpy>=2.0
+ - opt-einsum
+ - scipy>=1.13
+ - jaxlib==0.9.1 ; extra == 'minimum-jaxlib'
+ - jaxlib==0.9.0 ; extra == 'ci'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'tpu'
+ - libtpu==0.0.35.* ; extra == 'tpu'
+ - requests ; extra == 'tpu'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda'
+ - jax-cuda12-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda12'
+ - jax-cuda12-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda12'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda13'
+ - jax-cuda13-plugin[with-cuda]<=0.9.1,>=0.9.1 ; extra == 'cuda13'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda12-local'
+ - jax-cuda12-plugin<=0.9.1,>=0.9.1 ; extra == 'cuda12-local'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'cuda13-local'
+ - jax-cuda13-plugin<=0.9.1,>=0.9.1 ; extra == 'cuda13-local'
+ - jaxlib<=0.9.1,>=0.9.1 ; extra == 'rocm'
+ - jax-rocm7-plugin<=0.9.1,>=0.9.1 ; extra == 'rocm'
+ - kubernetes ; extra == 'k8s'
+ - xprof ; extra == 'xprof'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ name: cloudpickle
+ version: 3.1.2
+ sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl
+ name: nodeenv
+ version: 1.10.0
+ sha256: 5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827
+ requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*'
+- pypi: https://files.pythonhosted.org/packages/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
+ name: pytask-parallel
+ version: 0.5.2
+ sha256: b5bf37a2aad4381d4c29484f87ef8623155c8cd1dff57af4952ccf894ae9898f
+ requires_dist:
+ - attrs>=21.3.0
+ - click>=8.1.8,!=8.2.0
+ - cloudpickle
+ - loky
+ - pluggy>=1.0.0
+ - pytask>=0.5.2
+ - rich
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/8f/2b/5c63c29d155afdf1d7827f8c04efe8cac47fc6783d8c53959e43de879dcc/jax_cuda13_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl
+ name: jax-cuda13-plugin
+ version: 0.10.0
+ sha256: 09dff8dadac0334dccd43a79b00bb81f27df74ab05656b78d10ef784a29ea5f6
+ requires_dist:
+ - jax-cuda13-pjrt==0.10.0
+ - nvidia-cublas>=13.0.0.19 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-cupti>=13.0.48 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-nvcc>=13.0.48 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-runtime>=13.0.48 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cudnn-cu13>=9.12.0.46,<10.0 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cufft>=12.0.0.15 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cusolver>=12.0.3.29 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cusparse>=12.6.2.49 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nccl-cu13>=2.27.7 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nvjitlink>=13.0.39 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-cuda-nvrtc>=13.0.48 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nvshmem-cu13>=3.3.20 ; sys_platform == 'linux' and extra == 'with-cuda'
+ - nvidia-nvvm ; extra == 'with-cuda'
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl
+ name: plotly
+ version: 6.7.0
+ sha256: ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0
+ requires_dist:
+ - narwhals>=1.15.1
+ - packaging
+ - anywidget ; extra == 'dev'
+ - build ; extra == 'dev'
+ - colorcet ; extra == 'dev'
+ - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev'
+ - geopandas ; extra == 'dev'
+ - inflect ; extra == 'dev'
+ - jupyterlab ; extra == 'dev'
+ - kaleido>=1.1.0 ; extra == 'dev'
+ - numpy>=1.22 ; extra == 'dev'
+ - orjson ; extra == 'dev'
+ - pandas ; extra == 'dev'
+ - pdfrw ; extra == 'dev'
+ - pillow ; extra == 'dev'
+ - plotly-geo ; extra == 'dev'
+ - polars[timezone] ; extra == 'dev'
+ - pyarrow ; extra == 'dev'
+ - pyshp ; extra == 'dev'
+ - pytest ; extra == 'dev'
+ - pytz ; extra == 'dev'
+ - requests ; extra == 'dev'
+ - ruff==0.11.12 ; extra == 'dev'
+ - scikit-image ; extra == 'dev'
+ - scipy ; extra == 'dev'
+ - shapely ; extra == 'dev'
+ - statsmodels ; extra == 'dev'
+ - vaex ; python_full_version < '3.10' and extra == 'dev'
+ - xarray ; extra == 'dev'
+ - build ; extra == 'dev-build'
+ - jupyterlab ; extra == 'dev-build'
+ - pytest ; extra == 'dev-build'
+ - requests ; extra == 'dev-build'
+ - ruff==0.11.12 ; extra == 'dev-build'
+ - pytest ; extra == 'dev-core'
+ - requests ; extra == 'dev-core'
+ - ruff==0.11.12 ; extra == 'dev-core'
+ - anywidget ; extra == 'dev-optional'
+ - build ; extra == 'dev-optional'
+ - colorcet ; extra == 'dev-optional'
+ - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev-optional'
+ - geopandas ; extra == 'dev-optional'
+ - inflect ; extra == 'dev-optional'
+ - jupyterlab ; extra == 'dev-optional'
+ - kaleido>=1.1.0 ; extra == 'dev-optional'
+ - numpy>=1.22 ; extra == 'dev-optional'
+ - orjson ; extra == 'dev-optional'
+ - pandas ; extra == 'dev-optional'
+ - pdfrw ; extra == 'dev-optional'
+ - pillow ; extra == 'dev-optional'
+ - plotly-geo ; extra == 'dev-optional'
+ - polars[timezone] ; extra == 'dev-optional'
+ - pyarrow ; extra == 'dev-optional'
+ - pyshp ; extra == 'dev-optional'
+ - pytest ; extra == 'dev-optional'
+ - pytz ; extra == 'dev-optional'
+ - requests ; extra == 'dev-optional'
+ - ruff==0.11.12 ; extra == 'dev-optional'
+ - scikit-image ; extra == 'dev-optional'
+ - scipy ; extra == 'dev-optional'
+ - shapely ; extra == 'dev-optional'
+ - statsmodels ; extra == 'dev-optional'
+ - vaex ; python_full_version < '3.10' and extra == 'dev-optional'
+ - xarray ; extra == 'dev-optional'
+ - numpy>=1.22 ; extra == 'express'
+ - kaleido>=1.1.0 ; extra == 'kaleido'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/92/87/d23db8276b76b4a7e4a702eebdc0a70e3b56c17b4dcd980ecb0f68b022e1/nvidia_cuda_cccl-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-cccl
+ version: 13.2.75
+ sha256: 11a2b1948e8709805a0ccf04441baf5279a9219c13eb11dc13d57bb023151768
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
+ name: markdown-it-py
+ version: 4.0.0
+ sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147
+ requires_dist:
+ - mdurl~=0.1
+ - psutil ; extra == 'benchmarking'
+ - pytest ; extra == 'benchmarking'
+ - pytest-benchmark ; extra == 'benchmarking'
+ - commonmark~=0.9 ; extra == 'compare'
+ - markdown~=3.4 ; extra == 'compare'
+ - mistletoe~=1.0 ; extra == 'compare'
+ - mistune~=3.0 ; extra == 'compare'
+ - panflute~=2.3 ; extra == 'compare'
+ - markdown-it-pyrs ; extra == 'compare'
+ - linkify-it-py>=1,<3 ; extra == 'linkify'
+ - mdit-py-plugins>=0.5.0 ; extra == 'plugins'
+ - gprof2dot ; extra == 'profiling'
+ - mdit-py-plugins>=0.5.0 ; extra == 'rtd'
+ - myst-parser ; extra == 'rtd'
+ - pyyaml ; extra == 'rtd'
+ - sphinx ; extra == 'rtd'
+ - sphinx-copybutton ; extra == 'rtd'
+ - sphinx-design ; extra == 'rtd'
+ - sphinx-book-theme~=1.0 ; extra == 'rtd'
+ - jupyter-sphinx ; extra == 'rtd'
+ - ipykernel ; extra == 'rtd'
+ - coverage ; extra == 'testing'
+ - pytest ; extra == 'testing'
+ - pytest-cov ; extra == 'testing'
+ - pytest-regressions ; extra == 'testing'
+ - requests ; extra == 'testing'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/94/b8/e77c355f179dc89d44e7ca6dbf7a46e650806df1d356a5462e5829fccea5/types_pytz-2026.1.1.20260304-py3-none-any.whl
+ name: types-pytz
+ version: 2026.1.1.20260304
+ sha256: 175332c1cf7bd6b1cc56b877f70bf02def1a3f75e5adcc05385ce2c3c70e6500
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl
+ name: sqlalchemy
+ version: 2.0.48
+ sha256: 144921da96c08feb9e2b052c5c5c1d0d151a292c6135623c6b2c041f2a45f9e0
+ requires_dist:
+ - importlib-metadata ; python_full_version < '3.8'
+ - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
+ - typing-extensions>=4.6.0
+ - greenlet>=1 ; extra == 'asyncio'
+ - mypy>=0.910 ; extra == 'mypy'
+ - pyodbc ; extra == 'mssql'
+ - pymssql ; extra == 'mssql-pymssql'
+ - pyodbc ; extra == 'mssql-pyodbc'
+ - mysqlclient>=1.4.0 ; extra == 'mysql'
+ - mysql-connector-python ; extra == 'mysql-connector'
+ - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
+ - cx-oracle>=8 ; extra == 'oracle'
+ - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
+ - psycopg2>=2.7 ; extra == 'postgresql'
+ - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
+ - greenlet>=1 ; extra == 'postgresql-asyncpg'
+ - asyncpg ; extra == 'postgresql-asyncpg'
+ - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
+ - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
+ - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
+ - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
+ - pymysql ; extra == 'pymysql'
+ - greenlet>=1 ; extra == 'aiomysql'
+ - aiomysql>=0.2.0 ; extra == 'aiomysql'
+ - greenlet>=1 ; extra == 'aioodbc'
+ - aioodbc ; extra == 'aioodbc'
+ - greenlet>=1 ; extra == 'asyncmy'
+ - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
+ - greenlet>=1 ; extra == 'aiosqlite'
+ - aiosqlite ; extra == 'aiosqlite'
+ - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
+ - sqlcipher3-binary ; extra == 'sqlcipher'
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cufft-cu12
+ version: 11.4.1.4
+ sha256: c67884f2a7d276b4b80eb56a79322a95df592ae5e765cf1243693365ccab4e28
+ requires_dist:
+ - nvidia-nvjitlink-cu12
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
+ name: click
+ version: 8.3.1
+ sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6
+ requires_dist:
+ - colorama ; sys_platform == 'win32'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/9c/1a/4834b1f2fb1847412353d7342eb7a1d001a4f3bd9d24155e057135a4aa44/optree-0.19.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ name: optree
+ version: 0.19.1
+ sha256: 3d0e1493429ae1d1a5e34855774ee604c974a8f76656bd0e562cdbf9466c9b1f
+ requires_dist:
+ - typing-extensions>=4.6.0
+ - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
+ - attrs ; extra == 'attrs'
+ - jax ; extra == 'jax'
+ - numpy ; extra == 'numpy'
+ - torch ; extra == 'torch'
+ - cpplint ; extra == 'lint'
+ - doc8 ; extra == 'lint'
+ - mypy ; extra == 'lint'
+ - pre-commit ; extra == 'lint'
+ - pyenchant ; extra == 'lint'
+ - pylint[spelling] ; extra == 'lint'
+ - ruff ; extra == 'lint'
+ - xdoctest ; extra == 'lint'
+ - pytest ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - covdefaults ; extra == 'test'
+ - rich ; extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
+ - sphinx~=8.0 ; extra == 'docs'
+ - sphinx-autoapi ; extra == 'docs'
+ - sphinx-autobuild ; extra == 'docs'
+ - sphinx-autodoc-typehints ; extra == 'docs'
+ - sphinx-copybutton ; extra == 'docs'
+ - sphinx-rtd-theme ; extra == 'docs'
+ - sphinxcontrib-bibtex ; extra == 'docs'
+ - docutils ; extra == 'docs'
+ - attrs ; extra == 'docs'
+ - jax[cpu] ; extra == 'docs'
+ - numpy ; extra == 'docs'
+ - torch ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/9e/b9/a6d8bb7d228940f01885bd9f327ab7f9d366a9be775c4bf366bf9d9477ae/kaleido-1.3.0-py3-none-any.whl
+ name: kaleido
+ version: 1.3.0
+ sha256: 52714dfd38e8f2a114831826200c40bb10d0ca0c11d4272f3f48ad499cd8f8ea
+ requires_dist:
+ - choreographer>=1.3.0
+ - logistro>=1.0.8
+ - orjson>=3.10.15
+ - packaging
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl
+ name: jaxlib
+ version: 0.10.0
+ sha256: 2a42cf04c0f88bc03b150a17fa7ddbb2f40e096667ec8a1b840ed87913e6e735
+ requires_dist:
+ - scipy>=1.14
+ - numpy>=2.0
+ - ml-dtypes>=0.5.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ name: greenlet
+ version: 3.5.0
+ sha256: 8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7
+ requires_dist:
+ - sphinx ; extra == 'docs'
+ - furo ; extra == 'docs'
+ - objgraph ; extra == 'test'
+ - psutil ; extra == 'test'
+ - setuptools ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/a4/b0/f2c9caa6f545d4ecc1eab528c68c9191e40087f1bc79a6da2e29c6416510/jaxlib-0.9.1-cp314-cp314-macosx_11_0_arm64.whl
+ name: jaxlib
+ version: 0.9.1
+ sha256: 3071bf493f6f48207c56b1e9a5bf895e2acebc5bd40f6f35458e76eb8bf210c7
+ requires_dist:
+ - scipy>=1.13
+ - numpy>=2.0
+ - ml-dtypes>=0.5.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/a7/2c/8ddb471091b46de99bba7eaa7f4e3983f9c8e74e310e585ff08915ce8b7a/jax_cuda12_pjrt-0.9.1-py3-none-manylinux_2_27_x86_64.whl
+ name: jax-cuda12-pjrt
+ version: 0.9.1
+ sha256: 6447fe3d661b1d824ae7329914c4ac05fe54aeab68c7a7ca23c4f5306dec2e1f
+- pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl
+ name: click
+ version: 8.3.3
+ sha256: a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613
+ requires_dist:
+ - colorama ; sys_platform == 'win32'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl
+ name: pathlib-abc
+ version: 0.5.2
+ sha256: 4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
+ name: mdurl
+ version: 0.1.2
+ sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/b5/83/205e7af4153d9690c3cb94fa9cea670c0d26ce7f022aaa589a9e136f1491/jupyter_book-2.1.5-py3-none-any.whl
+ name: jupyter-book
+ version: 2.1.5
+ sha256: 19eedc70bb8d5ed5de0f7f3cb8de312da3a50900dcdda9b0c5a9704410a7758d
+ requires_dist:
+ - ipykernel
+ - jupyter-core
+ - jupyter-server
+ - platformdirs>=4.2.2
+ - nodeenv>=1.9.1
+ - markdown ; extra == 'docs'
+ - pandas ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl
+ name: nvidia-cuda-cupti
+ version: 13.2.75
+ sha256: f75aca6bef89c625a4076a820302bb06764daa1d21595286f6bee5e237d3a187
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
+ name: choreographer
+ version: 1.2.1
+ sha256: 9af5385effa3c204dbc337abf7ac74fd8908ced326a15645dc31dde75718c77e
+ requires_dist:
+ - logistro>=2.0.1
+ - simplejson>=3.19.3
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cusparse
+ version: 12.7.10.1
+ sha256: f0d110640aa63e7182fa787cc245afa07c5fb84ac30f1c4029e4fa3012353172
+ requires_dist:
+ - nvidia-nvjitlink
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-cuda-nvrtc-cu12
+ version: 12.9.86
+ sha256: 210cf05005a447e29214e9ce50851e83fc5f4358df8b453155d5e1918094dcb4
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/ba/6c/ff8bf52315064dbeb55cb5067e191120a5b2e58bb648d0d34cf7969dc2c2/choreographer-1.3.0-py3-none-any.whl
+ name: choreographer
+ version: 1.3.0
+ sha256: cea4cb739e4f61625e4b53888a8d3fa1d3bf73948b56753e460ab44da7d8d44f
+ requires_dist:
+ - logistro>=2.0.1
+ - platformdirs>=4.3.6
+ - simplejson>=3.19.3
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-runtime-cu12
+ version: 12.9.79
+ sha256: 25bba2dfb01d48a9b59ca474a1ac43c6ebf7011f1b0b8cc44f54eb6ac48a96c3
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl
+ name: nvidia-cuda-cupti-cu12
+ version: 12.9.79
+ sha256: 096bcf334f13e1984ba36685ad4c1d6347db214de03dbb6eebb237b41d9d934f
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ name: orjson
+ version: 3.11.7
+ sha256: a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ name: ml-dtypes
+ version: 0.5.4
+ sha256: 14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f
+ requires_dist:
+ - numpy>=1.21
+ - numpy>=1.21.2 ; python_full_version >= '3.10'
+ - numpy>=1.23.3 ; python_full_version >= '3.11'
+ - numpy>=1.26.0 ; python_full_version >= '3.12'
+ - numpy>=2.1.0 ; python_full_version >= '3.13'
+ - absl-py ; extra == 'dev'
+ - pytest ; extra == 'dev'
+ - pytest-xdist ; extra == 'dev'
+ - pylint>=2.6.0 ; extra == 'dev'
+ - pyink ; extra == 'dev'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl
+ name: tomli-w
+ version: 1.2.0
+ sha256: 188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/c7/e1/68c2256b69a314eba133673377ba9118c356f6342a0c02b61de449cf2bf2/narwhals-2.21.0-py3-none-any.whl
+ name: narwhals
+ version: 2.21.0
+ sha256: 1e6617d0fca68ae1fda29e5397c4eaacd3ffc9fffe6bcd6ded0c690475e853be
+ requires_dist:
+ - cudf-cu12>=24.10.0 ; extra == 'cudf'
+ - dask[dataframe]>=2024.8 ; extra == 'dask'
+ - duckdb>=1.1 ; extra == 'duckdb'
+ - ibis-framework>=6.0.0 ; extra == 'ibis'
+ - packaging ; extra == 'ibis'
+ - pyarrow-hotfix ; extra == 'ibis'
+ - rich ; extra == 'ibis'
+ - modin ; extra == 'modin'
+ - pandas>=1.1.3 ; extra == 'pandas'
+ - polars>=0.20.4 ; extra == 'polars'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - pyspark>=3.5.0 ; extra == 'pyspark'
+ - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect'
+ - duckdb>=1.1 ; extra == 'sql'
+ - sqlparse ; extra == 'sql'
+ - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
+ name: iniconfig
+ version: 2.3.0
+ sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl
+ name: tabcompleter
+ version: 1.4.1
+ sha256: 26b5cf330a48f32625b00e1664aa589f67c8e98275b6d9c2b85d19917dac1601
+ requires_dist:
+ - pyreadline3 ; sys_platform == 'win32'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/ce/80/7f1f1bf8c2d5dfd8e9c0e1191aa355ff8b80b5619f84d6dcc2703fa7fd5a/loky-3.5.6-py3-none-any.whl
+ name: loky
+ version: 3.5.6
+ sha256: 6d5300ac68cbd5084e89a6a0a187785d6a79950d461c80223d2c9a41d672b3d4
+ requires_dist:
+ - cloudpickle
+ - packaging ; extra == 'tests'
+ - pytest ; extra == 'tests'
+ - psutil ; extra == 'tests'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
+ name: greenlet
+ version: 3.3.2
+ sha256: 63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506
+ requires_dist:
+ - sphinx ; extra == 'docs'
+ - furo ; extra == 'docs'
+ - objgraph ; extra == 'test'
+ - psutil ; extra == 'test'
+ - setuptools ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl
+ name: fsspec
+ version: 2026.4.0
+ sha256: 11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2
+ requires_dist:
+ - adlfs ; extra == 'abfs'
+ - adlfs ; extra == 'adl'
+ - pyarrow>=1 ; extra == 'arrow'
+ - dask ; extra == 'dask'
+ - distributed ; extra == 'dask'
+ - pre-commit ; extra == 'dev'
+ - ruff>=0.5 ; extra == 'dev'
+ - numpydoc ; extra == 'doc'
+ - sphinx ; extra == 'doc'
+ - sphinx-design ; extra == 'doc'
+ - sphinx-rtd-theme ; extra == 'doc'
+ - yarl ; extra == 'doc'
+ - dropbox ; extra == 'dropbox'
+ - dropboxdrivefs ; extra == 'dropbox'
+ - requests ; extra == 'dropbox'
+ - adlfs ; extra == 'full'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full'
+ - dask ; extra == 'full'
+ - distributed ; extra == 'full'
+ - dropbox ; extra == 'full'
+ - dropboxdrivefs ; extra == 'full'
+ - fusepy ; extra == 'full'
+ - gcsfs>2024.2.0 ; extra == 'full'
+ - libarchive-c ; extra == 'full'
+ - ocifs ; extra == 'full'
+ - panel ; extra == 'full'
+ - paramiko ; extra == 'full'
+ - pyarrow>=1 ; extra == 'full'
+ - pygit2 ; extra == 'full'
+ - requests ; extra == 'full'
+ - s3fs>2024.2.0 ; extra == 'full'
+ - smbprotocol ; extra == 'full'
+ - tqdm ; extra == 'full'
+ - fusepy ; extra == 'fuse'
+ - gcsfs>2024.2.0 ; extra == 'gcs'
+ - pygit2 ; extra == 'git'
+ - requests ; extra == 'github'
+ - gcsfs ; extra == 'gs'
+ - panel ; extra == 'gui'
+ - pyarrow>=1 ; extra == 'hdfs'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http'
+ - libarchive-c ; extra == 'libarchive'
+ - ocifs ; extra == 'oci'
+ - s3fs>2024.2.0 ; extra == 's3'
+ - paramiko ; extra == 'sftp'
+ - smbprotocol ; extra == 'smb'
+ - paramiko ; extra == 'ssh'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test'
+ - numpy ; extra == 'test'
+ - pytest ; extra == 'test'
+ - pytest-asyncio!=0.22.0 ; extra == 'test'
+ - pytest-benchmark ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - pytest-mock ; extra == 'test'
+ - pytest-recording ; extra == 'test'
+ - pytest-rerunfailures ; extra == 'test'
+ - requests ; extra == 'test'
+ - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream'
+ - dask[dataframe,test] ; extra == 'test-downstream'
+ - moto[server]>4,<5 ; extra == 'test-downstream'
+ - pytest-timeout ; extra == 'test-downstream'
+ - xarray ; extra == 'test-downstream'
+ - adlfs ; extra == 'test-full'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full'
+ - backports-zstd ; python_full_version < '3.14' and extra == 'test-full'
+ - cloudpickle ; extra == 'test-full'
+ - dask ; extra == 'test-full'
+ - distributed ; extra == 'test-full'
+ - dropbox ; extra == 'test-full'
+ - dropboxdrivefs ; extra == 'test-full'
+ - fastparquet ; extra == 'test-full'
+ - fusepy ; extra == 'test-full'
+ - gcsfs ; extra == 'test-full'
+ - jinja2 ; extra == 'test-full'
+ - kerchunk ; extra == 'test-full'
+ - libarchive-c ; extra == 'test-full'
+ - lz4 ; extra == 'test-full'
+ - notebook ; extra == 'test-full'
+ - numpy ; extra == 'test-full'
+ - ocifs ; extra == 'test-full'
+ - pandas<3.0.0 ; extra == 'test-full'
+ - panel ; extra == 'test-full'
+ - paramiko ; extra == 'test-full'
+ - pyarrow ; extra == 'test-full'
+ - pyarrow>=1 ; extra == 'test-full'
+ - pyftpdlib ; extra == 'test-full'
+ - pygit2 ; extra == 'test-full'
+ - pytest ; extra == 'test-full'
+ - pytest-asyncio!=0.22.0 ; extra == 'test-full'
+ - pytest-benchmark ; extra == 'test-full'
+ - pytest-cov ; extra == 'test-full'
+ - pytest-mock ; extra == 'test-full'
+ - pytest-recording ; extra == 'test-full'
+ - pytest-rerunfailures ; extra == 'test-full'
+ - python-snappy ; extra == 'test-full'
+ - requests ; extra == 'test-full'
+ - smbprotocol ; extra == 'test-full'
+ - tqdm ; extra == 'test-full'
+ - urllib3 ; extra == 'test-full'
+ - zarr ; extra == 'test-full'
+ - zstandard ; python_full_version < '3.14' and extra == 'test-full'
+ - tqdm ; extra == 'tqdm'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/d7/54/c30cb1d08258612ece1dfa72c6918998bebecb916c54fca6d806bc780f2b/pytask-0.6.0-py3-none-any.whl
+ name: pytask
+ version: 0.6.0
+ sha256: cc4c31ead39f5c64be037640f7bf589b68bd0e87ea9e1a049ba86ceab42c9d13
+ requires_dist:
+ - click>=8.1.8,!=8.2.0
+ - click-default-group>=1.2.4
+ - msgspec>=0.18.6
+ - msgspec[toml]>=0.18.6
+ - optree>=0.9.0
+ - packaging>=23.0.0
+ - pluggy>=1.3.0
+ - rich>=13.8.0
+ - sqlalchemy>=2.0.31
+ - tomli>=1 ; python_full_version < '3.11'
+ - typing-extensions>=4.8.0 ; python_full_version < '3.11'
+ - universal-pathlib>=0.2.2
+ - networkx>=2.4.0 ; extra == 'dag'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-runtime
+ version: 13.2.75
+ sha256: 72bf454902da594e0b833cadeddc8b7100ce1c7cf7ed9023943931be1aa913b7
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ name: universal-pathlib
+ version: 0.3.10
+ sha256: dfaf2fb35683d2eb1287a3ed7b215e4d6016aa6eaf339c607023d22f90821c66
+ requires_dist:
+ - fsspec>=2024.5.0
+ - pathlib-abc>=0.5.1,<0.6.0
+ - pytest>=8 ; extra == 'tests'
+ - pytest-sugar>=0.9.7 ; extra == 'tests'
+ - pytest-cov>=4.1.0 ; extra == 'tests'
+ - pytest-mock>=3.12.0 ; extra == 'tests'
+ - pylint>=2.17.4 ; extra == 'tests'
+ - mypy>=1.10.0 ; extra == 'tests'
+ - pydantic>=2 ; extra == 'tests'
+ - pytest-mypy-plugins>=3.1.2 ; extra == 'tests'
+ - packaging ; extra == 'tests'
+ - mypy>=1.10.0 ; extra == 'typechecking'
+ - pytest-mypy-plugins>=3.1.2 ; extra == 'typechecking'
+ - fsspec[adl,gcs,github,http,s3,smb,ssh]>=2024.5.0 ; extra == 'dev'
+ - s3fs>=2024.5.0 ; extra == 'dev'
+ - gcsfs>=2024.5.0 ; extra == 'dev'
+ - adlfs>=2024 ; extra == 'dev'
+ - huggingface-hub ; extra == 'dev'
+ - webdav4[fsspec] ; extra == 'dev'
+ - moto[s3,server] ; extra == 'dev'
+ - wsgidav ; extra == 'dev'
+ - cheroot ; extra == 'dev'
+ - pyftpdlib ; extra == 'dev'
+ - typing-extensions ; python_full_version < '3.11' and extra == 'dev'
+ - pydantic ; extra == 'dev-third-party'
+ - pydantic-settings ; extra == 'dev-third-party'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl
+ name: fsspec
+ version: 2026.2.0
+ sha256: 98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437
+ requires_dist:
+ - adlfs ; extra == 'abfs'
+ - adlfs ; extra == 'adl'
+ - pyarrow>=1 ; extra == 'arrow'
+ - dask ; extra == 'dask'
+ - distributed ; extra == 'dask'
+ - pre-commit ; extra == 'dev'
+ - ruff>=0.5 ; extra == 'dev'
+ - numpydoc ; extra == 'doc'
+ - sphinx ; extra == 'doc'
+ - sphinx-design ; extra == 'doc'
+ - sphinx-rtd-theme ; extra == 'doc'
+ - yarl ; extra == 'doc'
+ - dropbox ; extra == 'dropbox'
+ - dropboxdrivefs ; extra == 'dropbox'
+ - requests ; extra == 'dropbox'
+ - adlfs ; extra == 'full'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full'
+ - dask ; extra == 'full'
+ - distributed ; extra == 'full'
+ - dropbox ; extra == 'full'
+ - dropboxdrivefs ; extra == 'full'
+ - fusepy ; extra == 'full'
+ - gcsfs>2024.2.0 ; extra == 'full'
+ - libarchive-c ; extra == 'full'
+ - ocifs ; extra == 'full'
+ - panel ; extra == 'full'
+ - paramiko ; extra == 'full'
+ - pyarrow>=1 ; extra == 'full'
+ - pygit2 ; extra == 'full'
+ - requests ; extra == 'full'
+ - s3fs>2024.2.0 ; extra == 'full'
+ - smbprotocol ; extra == 'full'
+ - tqdm ; extra == 'full'
+ - fusepy ; extra == 'fuse'
+ - gcsfs>2024.2.0 ; extra == 'gcs'
+ - pygit2 ; extra == 'git'
+ - requests ; extra == 'github'
+ - gcsfs ; extra == 'gs'
+ - panel ; extra == 'gui'
+ - pyarrow>=1 ; extra == 'hdfs'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http'
+ - libarchive-c ; extra == 'libarchive'
+ - ocifs ; extra == 'oci'
+ - s3fs>2024.2.0 ; extra == 's3'
+ - paramiko ; extra == 'sftp'
+ - smbprotocol ; extra == 'smb'
+ - paramiko ; extra == 'ssh'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test'
+ - numpy ; extra == 'test'
+ - pytest ; extra == 'test'
+ - pytest-asyncio!=0.22.0 ; extra == 'test'
+ - pytest-benchmark ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - pytest-mock ; extra == 'test'
+ - pytest-recording ; extra == 'test'
+ - pytest-rerunfailures ; extra == 'test'
+ - requests ; extra == 'test'
+ - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream'
+ - dask[dataframe,test] ; extra == 'test-downstream'
+ - moto[server]>4,<5 ; extra == 'test-downstream'
+ - pytest-timeout ; extra == 'test-downstream'
+ - xarray ; extra == 'test-downstream'
+ - adlfs ; extra == 'test-full'
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full'
+ - backports-zstd ; python_full_version < '3.14' and extra == 'test-full'
+ - cloudpickle ; extra == 'test-full'
+ - dask ; extra == 'test-full'
+ - distributed ; extra == 'test-full'
+ - dropbox ; extra == 'test-full'
+ - dropboxdrivefs ; extra == 'test-full'
+ - fastparquet ; extra == 'test-full'
+ - fusepy ; extra == 'test-full'
+ - gcsfs ; extra == 'test-full'
+ - jinja2 ; extra == 'test-full'
+ - kerchunk ; extra == 'test-full'
+ - libarchive-c ; extra == 'test-full'
+ - lz4 ; extra == 'test-full'
+ - notebook ; extra == 'test-full'
+ - numpy ; extra == 'test-full'
+ - ocifs ; extra == 'test-full'
+ - pandas<3.0.0 ; extra == 'test-full'
+ - panel ; extra == 'test-full'
+ - paramiko ; extra == 'test-full'
+ - pyarrow ; extra == 'test-full'
+ - pyarrow>=1 ; extra == 'test-full'
+ - pyftpdlib ; extra == 'test-full'
+ - pygit2 ; extra == 'test-full'
+ - pytest ; extra == 'test-full'
+ - pytest-asyncio!=0.22.0 ; extra == 'test-full'
+ - pytest-benchmark ; extra == 'test-full'
+ - pytest-cov ; extra == 'test-full'
+ - pytest-mock ; extra == 'test-full'
+ - pytest-recording ; extra == 'test-full'
+ - pytest-rerunfailures ; extra == 'test-full'
+ - python-snappy ; extra == 'test-full'
+ - requests ; extra == 'test-full'
+ - smbprotocol ; extra == 'test-full'
+ - tqdm ; extra == 'test-full'
+ - urllib3 ; extra == 'test-full'
+ - zarr ; extra == 'test-full'
+ - zstandard ; python_full_version < '3.14' and extra == 'test-full'
+ - tqdm ; extra == 'tqdm'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/e8/1f/930d63ccc8adcdf27bfc051a24e3e4da2cf6ef987848d6d1d642e29d704b/nvidia_nvvm-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl
+ name: nvidia-nvvm
+ version: 13.2.78
+ sha256: f5aa433631109bbdec81802c5b5f319bf10bc891fe2f212e4e445845211d6f77
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
+ name: orjson
+ version: 3.11.7
+ sha256: de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl
+ name: ml-dtypes
+ version: 0.5.4
+ sha256: 8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56
+ requires_dist:
+ - numpy>=1.21
+ - numpy>=1.21.2 ; python_full_version >= '3.10'
+ - numpy>=1.23.3 ; python_full_version >= '3.11'
+ - numpy>=1.26.0 ; python_full_version >= '3.12'
+ - numpy>=2.1.0 ; python_full_version >= '3.13'
+ - absl-py ; extra == 'dev'
+ - pytest ; extra == 'dev'
+ - pytest-xdist ; extra == 'dev'
+ - pylint>=2.6.0 ; extra == 'dev'
+ - pyink ; extra == 'dev'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/ea/78/501eee5cce9202fba2f3476529e296a7f6d003261d80b52ab0abfa09ddd6/nvidia_cuda_crt-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: nvidia-cuda-crt
+ version: 13.2.78
+ sha256: 2c8615ee30ed466cb6298ecb8ffe9e6ea8b252ca833206152d155750bf831608
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: sqlalchemy
+ version: 2.0.48
+ sha256: 426c5ca86415d9b8945c7073597e10de9644802e2ff502b8e1f11a7a2642856b
+ requires_dist:
+ - importlib-metadata ; python_full_version < '3.8'
+ - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
+ - typing-extensions>=4.6.0
+ - greenlet>=1 ; extra == 'asyncio'
+ - mypy>=0.910 ; extra == 'mypy'
+ - pyodbc ; extra == 'mssql'
+ - pymssql ; extra == 'mssql-pymssql'
+ - pyodbc ; extra == 'mssql-pyodbc'
+ - mysqlclient>=1.4.0 ; extra == 'mysql'
+ - mysql-connector-python ; extra == 'mysql-connector'
+ - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
+ - cx-oracle>=8 ; extra == 'oracle'
+ - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
+ - psycopg2>=2.7 ; extra == 'postgresql'
+ - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
+ - greenlet>=1 ; extra == 'postgresql-asyncpg'
+ - asyncpg ; extra == 'postgresql-asyncpg'
+ - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
+ - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
+ - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
+ - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
+ - pymysql ; extra == 'pymysql'
+ - greenlet>=1 ; extra == 'aiomysql'
+ - aiomysql>=0.2.0 ; extra == 'aiomysql'
+ - greenlet>=1 ; extra == 'aioodbc'
+ - aioodbc ; extra == 'aioodbc'
+ - greenlet>=1 ; extra == 'asyncmy'
+ - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
+ - greenlet>=1 ; extra == 'aiosqlite'
+ - aiosqlite ; extra == 'aiosqlite'
+ - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
+ - sqlcipher3-binary ; extra == 'sqlcipher'
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl
+ name: greenlet
+ version: 3.3.2
+ sha256: 8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492
+ requires_dist:
+ - sphinx ; extra == 'docs'
+ - furo ; extra == 'docs'
+ - objgraph ; extra == 'test'
+ - psutil ; extra == 'test'
+ - setuptools ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl
+ name: sqlalchemy
+ version: 2.0.48
+ sha256: e2d0d88686e3d35a76f3e15a34e8c12d73fc94c1dea1cd55782e695cc14086dd
+ requires_dist:
+ - importlib-metadata ; python_full_version < '3.8'
+ - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'
+ - typing-extensions>=4.6.0
+ - greenlet>=1 ; extra == 'asyncio'
+ - mypy>=0.910 ; extra == 'mypy'
+ - pyodbc ; extra == 'mssql'
+ - pymssql ; extra == 'mssql-pymssql'
+ - pyodbc ; extra == 'mssql-pyodbc'
+ - mysqlclient>=1.4.0 ; extra == 'mysql'
+ - mysql-connector-python ; extra == 'mysql-connector'
+ - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector'
+ - cx-oracle>=8 ; extra == 'oracle'
+ - oracledb>=1.0.1 ; extra == 'oracle-oracledb'
+ - psycopg2>=2.7 ; extra == 'postgresql'
+ - pg8000>=1.29.1 ; extra == 'postgresql-pg8000'
+ - greenlet>=1 ; extra == 'postgresql-asyncpg'
+ - asyncpg ; extra == 'postgresql-asyncpg'
+ - psycopg2-binary ; extra == 'postgresql-psycopg2binary'
+ - psycopg2cffi ; extra == 'postgresql-psycopg2cffi'
+ - psycopg>=3.0.7 ; extra == 'postgresql-psycopg'
+ - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary'
+ - pymysql ; extra == 'pymysql'
+ - greenlet>=1 ; extra == 'aiomysql'
+ - aiomysql>=0.2.0 ; extra == 'aiomysql'
+ - greenlet>=1 ; extra == 'aioodbc'
+ - aioodbc ; extra == 'aioodbc'
+ - greenlet>=1 ; extra == 'asyncmy'
+ - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy'
+ - greenlet>=1 ; extra == 'aiosqlite'
+ - aiosqlite ; extra == 'aiosqlite'
+ - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
+ - sqlcipher3-binary ; extra == 'sqlcipher'
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.whl
+ name: nvidia-cublas
+ version: 13.4.1.1
+ sha256: 28c983c8c03aa9a2d7b36cddcef2bfeeea85e13241d77df7622665502159f347
+ requires_dist:
+ - nvidia-cuda-nvrtc
+ requires_python: '>=3'
+- pypi: https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl
+ name: pytest-timeout
+ version: 2.4.0
+ sha256: c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2
+ requires_dist:
+ - pytest>=7.0.0
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
+ name: optree
+ version: 0.19.0
+ sha256: fb220bb85128c8de71aeffb9c38be817569e4bca413b38d5e0de11ba6471ef4a
+ requires_dist:
+ - typing-extensions>=4.6.0
+ - typing-extensions>=4.12.0 ; python_full_version >= '3.13'
+ - jax ; extra == 'jax'
+ - numpy ; extra == 'numpy'
+ - torch ; extra == 'torch'
+ - cpplint ; extra == 'lint'
+ - doc8 ; extra == 'lint'
+ - mypy ; extra == 'lint'
+ - pre-commit ; extra == 'lint'
+ - pyenchant ; extra == 'lint'
+ - pylint[spelling] ; extra == 'lint'
+ - ruff ; extra == 'lint'
+ - xdoctest ; extra == 'lint'
+ - pytest ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - covdefaults ; extra == 'test'
+ - rich ; extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.6.0 ; python_full_version < '3.13' and sys_platform == 'win32' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'linux' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'darwin' and extra == 'test'
+ - typing-extensions==4.12.0 ; python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'test'
+ - sphinx~=8.0 ; extra == 'docs'
+ - sphinx-autoapi ; extra == 'docs'
+ - sphinx-autobuild ; extra == 'docs'
+ - sphinx-autodoc-typehints ; extra == 'docs'
+ - sphinx-copybutton ; extra == 'docs'
+ - sphinx-rtd-theme ; extra == 'docs'
+ - sphinxcontrib-bibtex ; extra == 'docs'
+ - docutils ; extra == 'docs'
+ - jax[cpu] ; extra == 'docs'
+ - numpy ; extra == 'docs'
+ - torch ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/fe/75/0b4a10da17a44cf13567d08a9c7632a285297e46253263f1ae119129d10a/narwhals-2.18.0-py3-none-any.whl
+ name: narwhals
+ version: 2.18.0
+ sha256: 68378155ee706ac9c5b25868ef62ecddd62947b6df7801a0a156bc0a615d2d0d
+ requires_dist:
+ - cudf-cu12>=24.10.0 ; extra == 'cudf'
+ - dask[dataframe]>=2024.8 ; extra == 'dask'
+ - duckdb>=1.1 ; extra == 'duckdb'
+ - ibis-framework>=6.0.0 ; extra == 'ibis'
+ - packaging ; extra == 'ibis'
+ - pyarrow-hotfix ; extra == 'ibis'
+ - rich ; extra == 'ibis'
+ - modin ; extra == 'modin'
+ - pandas>=1.1.3 ; extra == 'pandas'
+ - polars>=0.20.4 ; extra == 'polars'
+ - pyarrow>=13.0.0 ; extra == 'pyarrow'
+ - pyspark>=3.5.0 ; extra == 'pyspark'
+ - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect'
+ - duckdb>=1.1 ; extra == 'sql'
+ - sqlparse ; extra == 'sql'
+ - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe'
+ requires_python: '>=3.9'
diff --git a/pyproject.toml b/pyproject.toml
index bb09d59a..25bbc829 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -29,8 +29,10 @@ classifiers = [
]
dynamic = [ "version" ]
dependencies = [
+ "beartype>=0.22",
"dags>=0.5.1",
"jax>=0.9",
+ "jaxopt>=0.8.5",
"jupyter-book>=2",
"kaleido>=1.2",
"numpy>=2.4",
@@ -39,6 +41,7 @@ dependencies = [
"plotly>=6.6",
"pytask>=0.5.8",
"pytask-parallel>=0.5.2",
+ "scikit-learn>=1.5",
]
[[project.authors]]
name = "Janoś Gabler"
@@ -55,13 +58,92 @@ Repository = "https://github.com/OpenSourceEconomics/skillmodels"
Tracker = "https://github.com/OpenSourceEconomics/skillmodels/issues"
[tool.hatch]
+version.source = "vcs"
+metadata.allow-direct-references = true
build.hooks.vcs.version-file = "src/skillmodels/_version.py"
build.targets.sdist.exclude = [ "tests" ]
build.targets.sdist.only-packages = true
build.targets.wheel.only-include = [ "src" ]
build.targets.wheel.sources = [ "src" ]
-metadata.allow-direct-references = true
-version.source = "vcs"
+
+[tool.pixi.dependencies]
+filterpy = "*"
+ipykernel = "*"
+jupyterlab = "*"
+nbformat = "*"
+networkx = "*"
+prek = "*"
+pybaum = "*"
+python = "~=3.14.0"
+scikit-learn = "*"
+scipy = "*"
+h5py = ">=3.16.0,<4"
+xlrd = ">=2.0.2,<3"
+[tool.pixi.environments]
+cuda = { features = [ "cuda" ], solve-group = "cuda" }
+docs = { features = [ "docs" ], solve-group = "default" }
+tests-cpu = { features = [ "tests" ], solve-group = "default" }
+tests-cuda = { features = [ "tests", "cuda" ], solve-group = "cuda" }
+type-checking = { features = [ "type-checking" ], solve-group = "default" }
+tests-cuda12 = { features = [ "tests", "cuda" ], solve-group = "cuda" }
+tests-cuda13 = { features = [ "tests", "cuda13" ], solve-group = "cuda13" }
+[tool.pixi.feature.cuda]
+platforms = [ "linux-64" ]
+system-requirements = { cuda = "12" }
+[tool.pixi.feature.cuda.dependencies]
+cuda-nvcc = ">=12"
+[tool.pixi.feature.cuda.pypi-dependencies]
+jax = { version = ">=0.7", extras = [ "cuda12" ] }
+[tool.pixi.feature.cuda.tasks]
+mem-cuda = """\
+ pytest -x -s --pdb --memray --fail-on-increase \
+ tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
+ """
+[tool.pixi.feature.cuda13]
+platforms = [ "linux-64" ]
+system-requirements = { cuda = "13" }
+[tool.pixi.feature.cuda13.dependencies]
+cuda-nvcc = ">=13"
+[tool.pixi.feature.cuda13.pypi-dependencies]
+jax = { version = ">=0.9", extras = [ "cuda13" ] }
+[tool.pixi.feature.docs.tasks]
+build-docs = { cmd = "jupyter book build --html", cwd = "docs" }
+view-docs = { cmd = "jupyter book start", cwd = "docs" }
+[tool.pixi.feature.tests.dependencies]
+pytest = "*"
+pytest-cov = "*"
+pytest-xdist = "*"
+snakeviz = "*"
+xlrd = ">=2"
+[tool.pixi.feature.tests.target.unix.dependencies]
+pytest-memray = "*"
+[tool.pixi.feature.tests.tasks]
+tests = "pytest tests -m 'not long_running'"
+tests-with-cov = "pytest tests --cov-report=xml --cov=./"
+mem = """\
+ pytest -x -s --pdb --memray --fail-on-increase \
+ tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
+ """
+mem-on-clean-repo = """\
+ git status --porcelain && git diff-index --quiet HEAD -- && git rev-parse HEAD && \
+ pytest -x -s --pdb --memray --fail-on-increase \
+ tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
+ """
+[tool.pixi.feature.type-checking.pypi-dependencies]
+matplotlib = "*" # required because of pandas
+pandas-stubs = "*"
+ty = "*"
+types-pytz = "*"
+[tool.pixi.feature.type-checking.tasks]
+ty = "ty check src tests docs"
+[tool.pixi.pypi-dependencies]
+jaxopt = ">=0.8.5"
+optimagic = { git = "https://github.com/optimagic-dev/optimagic.git", branch = "probability-allow-fixed-entries" }
+pdbp = "*"
+skillmodels = { path = ".", editable = true }
+[tool.pixi.workspace]
+channels = [ "conda-forge" ]
+platforms = [ "linux-64", "osx-arm64", "win-64" ]
[tool.ruff]
fix = true
@@ -84,8 +166,10 @@ extend-ignore = [
"TRY003", # Long messages outside exception class
]
per-file-ignores."**/*.ipynb" = [
+ "ANN", # Missing type annotations on tutorial helpers.
"B018", # Found useless expression
"INP001", # File is part of an implicit namespace package
+ "PD010", # `.pivot_table` preferred -- presentation tables read fine without it.
"T201", # print found
]
per-file-ignores."tests/*" = [
@@ -95,6 +179,7 @@ per-file-ignores."tests/*" = [
"FBT003", # Boolean positional value in function call
"INP001", # File is part of an implicit namespace package
"S101", # Use of assert detected
+ "T201", # print found (useful for manual inspection in long-running tests)
]
pydocstyle.convention = "google"
@@ -148,76 +233,16 @@ rules.unused-awaitable = "error"
rules.unused-ignore-comment = "error"
[tool.pytest]
-ini_options.addopts = [ "--pdbcls=pdbp:Pdb" ]
-ini_options.filterwarnings = []
-ini_options.markers = [ "integration: integration tests requiring MODEL2 + data" ]
ini_options.norecursedirs = [ "docs" ]
-
-[tool.pixi.dependencies]
-filterpy = "*"
-ipykernel = "*"
-jupyterlab = "*"
-nbformat = "*"
-networkx = "*"
-prek = "*"
-pybaum = "*"
-python = "~=3.14.0"
-scipy = "*"
-[tool.pixi.environments]
-cuda = { features = [ "cuda" ], solve-group = "cuda" }
-docs = { features = [ "docs" ], solve-group = "default" }
-tests-cpu = { features = [ "tests" ], solve-group = "default" }
-tests-cuda = { features = [ "tests", "cuda" ], solve-group = "cuda" }
-type-checking = { features = [ "type-checking" ], solve-group = "default" }
-tests-cuda12 = { features = [ "tests", "cuda" ], solve-group = "cuda" }
-[tool.pixi.feature.cuda]
-platforms = [ "linux-64" ]
-system-requirements = { cuda = "12" }
-[tool.pixi.feature.cuda.dependencies]
-cuda-nvcc = ">=12"
-[tool.pixi.feature.cuda.pypi-dependencies]
-jax = { version = ">=0.7", extras = [ "cuda12" ] }
-[tool.pixi.feature.cuda.tasks]
-mem-cuda = """\
- pytest -x -s --pdb --memray --fail-on-increase \
- tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
- """
-[tool.pixi.feature.docs.tasks]
-build-docs = { cmd = "jupyter book build --html", cwd = "docs" }
-view-docs = { cmd = "jupyter book start", cwd = "docs" }
-[tool.pixi.feature.tests.dependencies]
-pytest = "*"
-pytest-cov = "*"
-pytest-xdist = "*"
-snakeviz = "*"
-[tool.pixi.feature.tests.target.unix.dependencies]
-pytest-memray = "*"
-[tool.pixi.feature.tests.tasks]
-tests = "pytest tests"
-tests-with-cov = "pytest tests --cov-report=xml --cov=./"
-mem = """\
- pytest -x -s --pdb --memray --fail-on-increase \
- tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
- """
-mem-on-clean-repo = """\
- git status --porcelain && git diff-index --quiet HEAD -- && git rev-parse HEAD && \
- pytest -x -s --pdb --memray --fail-on-increase \
- tests/test_likelihood_regression.py::test_likelihood_contributions_large_nobs\
- """
-[tool.pixi.feature.type-checking.pypi-dependencies]
-matplotlib = "*" # required because of pandas
-pandas-stubs = "*"
-ty = "*"
-types-pytz = "*"
-[tool.pixi.feature.type-checking.tasks]
-ty = "ty check src tests docs"
-[tool.pixi.pypi-dependencies]
-# optimagic = { git = "https://github.com/optimagic-dev/optimagic.git", branch = "main" }
-pdbp = "*"
-skillmodels = { path = ".", editable = true }
-[tool.pixi.workspace]
-channels = [ "conda-forge" ]
-platforms = [ "linux-64", "osx-arm64", "win-64" ]
+ini_options.addopts = [ "--pdbcls=pdbp:Pdb" ]
+ini_options.markers = [
+ "end_to_end: end-to-end estimation tests requiring external data",
+ "integration: integration tests requiring MODEL2 + data",
+ "long_running: slow tests skipped in CI (run with -m long_running)",
+]
+ini_options.filterwarnings = [
+ "ignore::pandas.errors.PerformanceWarning",
+]
[tool.yamlfix]
line_length = 88
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000..bf5ab88b
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,66 @@
+# Pip-only requirements for the skillmodels `af-estimator` branch.
+#
+# Installs every package needed to run the skillmodels test suite and
+# the two downstream research applications (`skane-struct-bw`,
+# `health-cognition`) -- minus the two applications themselves, which
+# their teams provide separately.
+#
+# Defaults to CPU JAX. For CUDA-12, replace `jax>=0.9` with
+# `jax[cuda12]>=0.9` (and provide a CUDA-12 toolkit on the host). See
+# https://jax.readthedocs.io/en/latest/installation.html for details.
+#
+# Usage (Python 3.14 venv):
+# pip install -r requirements.txt
+#
+# Notes on dependencies that come from the downstream apps and are NOT
+# direct skillmodels dependencies are marked with `# downstream:` below.
+
+# Core scientific stack
+numpy>=2.4
+pandas>=3
+scipy>=1.16.0
+h5py>=3.16.0,<4
+jax>=0.9
+networkx
+filterpy
+pybaum>=0.1.3
+scikit-learn>=1.5 # AMN Stage 1 (mixture EM)
+statsmodels>=0.14.5 # downstream: regression diagnostics in skane / health-cognition
+seaborn # downstream: figure styling in health-cognition
+
+# Estimation engine — pinned to the optimagic branch the AF estimator
+# relies on (`probability-allow-fixed-entries`); the PyPI release does
+# not yet carry the required `FixedConstraintWithValue` semantics.
+optimagic @ git+https://github.com/optimagic-dev/optimagic.git@probability-allow-fixed-entries
+fides>=0.7.8 # downstream: optimagic algorithm used by skane / health-cognition
+
+# Workflow / pipelines
+dags>=0.5.1
+pytask>=0.5.8
+pytask-parallel>=0.5.2
+
+# Viz + reporting
+plotly>=6.6
+kaleido>=1.2
+jupyter-book>=2
+tabulate>=0.9.0 # downstream: table formatting in skane / health-cognition reports
+nbformat>=5.10.4
+ipykernel>=6.29.5
+jupyterlab
+
+# Data / IO utilities
+statadict>=1.1.0 # downstream: Stata variable labels in skane / health-cognition
+deepdiff>=8.5.0 # downstream: snapshot diffing in skane / health-cognition
+xlrd>=2 # required by `tests/matlab_ces_repro` (CNLSY xls reader)
+
+# Dev / test / profiling tooling
+pytest>=8.4.1
+pytest-cov>=6.2.1
+pytest-xdist>=3.8.0
+pytest-memray; platform_system != 'Windows'
+memray>=1.17.2 # downstream: heap profiling driver
+snakeviz
+pdbp
+
+# Skillmodels itself, pulled from the `af-estimator` branch.
+skillmodels @ git+https://github.com/OpenSourceEconomics/skillmodels.git@af-estimator
diff --git a/src/skillmodels/__init__.py b/src/skillmodels/__init__.py
index c4fd82f4..e012af61 100644
--- a/src/skillmodels/__init__.py
+++ b/src/skillmodels/__init__.py
@@ -1,43 +1,67 @@
"""Skillmodels: A Python package for estimating latent factor models."""
+# Enable 64-bit JAX before any skillmodels submodule. Every CHS / AF / AMN
+# entry point already sets this inside its function body; centralising it
+# here makes the package behave consistently for direct callers.
import contextlib
+import os
+
+os.environ.setdefault("JAX_ENABLE_X64", "1")
+
+import jax
+
+jax.config.update("jax_enable_x64", True) # noqa: FBT003
with contextlib.suppress(ImportError):
import pdbp # noqa: F401
-from skillmodels.diagnostic_plots import (
- plot_likelihood_contributions,
- plot_residual_boxplots,
+from skillmodels.af.estimate import estimate_af # noqa: E402
+from skillmodels.af.types import AFEstimationOptions, AFEstimationResult # noqa: E402
+from skillmodels.amn.estimate import estimate_amn # noqa: E402
+from skillmodels.amn.types import ( # noqa: E402
+ AMNEstimationOptions,
+ AMNEstimationResult,
)
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.model_spec import (
+from skillmodels.chs.estimate import estimate_chs # noqa: E402
+from skillmodels.chs.maximization_inputs import get_maximization_inputs # noqa: E402
+from skillmodels.chs.options import CHSEstimationOptions # noqa: E402
+from skillmodels.chs.types import CHSEstimationResult # noqa: E402
+from skillmodels.common.control_function import generate_kappa_terms # noqa: E402
+from skillmodels.common.estimation import ( # noqa: E402
+ CommonEstimationOptions,
+ CommonEstimationResult,
+)
+from skillmodels.common.individual_states import ( # noqa: E402
+ get_individual_states,
+ get_individual_states_from_params,
+)
+from skillmodels.common.model_spec import ( # noqa: E402
AnchoringSpec,
- EstimationOptions,
+ CorrectionSpec,
FactorSpec,
ModelSpec,
Normalizations,
)
-from skillmodels.process_debug_data import create_state_ranges
-from skillmodels.simulate_data import simulate_dataset, simulate_policy_effect
-from skillmodels.variance_decomposition import (
- decompose_measurement_variance,
- summarize_measurement_reliability,
-)
__all__ = [
+ "AFEstimationOptions",
+ "AFEstimationResult",
+ "AMNEstimationOptions",
+ "AMNEstimationResult",
"AnchoringSpec",
- "EstimationOptions",
+ "CHSEstimationOptions",
+ "CHSEstimationResult",
+ "CommonEstimationOptions",
+ "CommonEstimationResult",
+ "CorrectionSpec",
"FactorSpec",
"ModelSpec",
"Normalizations",
- "create_state_ranges",
- "decompose_measurement_variance",
- "get_filtered_states",
+ "estimate_af",
+ "estimate_amn",
+ "estimate_chs",
+ "generate_kappa_terms",
+ "get_individual_states",
+ "get_individual_states_from_params",
"get_maximization_inputs",
- "plot_likelihood_contributions",
- "plot_residual_boxplots",
- "simulate_dataset",
- "simulate_policy_effect",
- "summarize_measurement_reliability",
]
diff --git a/src/skillmodels/_beartype_conf.py b/src/skillmodels/_beartype_conf.py
new file mode 100644
index 00000000..24409fb7
--- /dev/null
+++ b/src/skillmodels/_beartype_conf.py
@@ -0,0 +1,87 @@
+"""Per-exception `BeartypeConf` instances used at the skillmodels perimeter.
+
+Decorators at user-facing entry points configure beartype to raise the
+existing project exception class on parameter-type violations,
+preserving the documented exception hierarchy in
+`skillmodels.exceptions`.
+
+The constructors and call sites decorated through this module are the
+"perimeter": ModelSpec / FactorSpec / AnchoringSpec / Normalizations,
+the three estimation-options dataclasses, and every public function
+exposed from the top-level package or the subpackage `__init__`s. The
+internal helpers below the perimeter are unannotated for beartype and
+trust the perimeter to have already validated parameter types.
+"""
+
+from collections.abc import Callable
+
+from beartype import BeartypeConf, BeartypeStrategy, beartype
+
+from skillmodels.exceptions import (
+ DiagnosticsCallError,
+ EstimationCallError,
+ InferenceCallError,
+ ModelSpecInitializationError,
+ OptionsInitializationError,
+ SimulationCallError,
+)
+
+
+def _conf(exc: type[Exception]) -> BeartypeConf:
+ """Build a `BeartypeConf` that raises `exc` on parameter-type violations.
+
+ `On` strategy: full O(n) container validation so every bad entry in
+ a mapping/sequence is reported, not just one sampled element. The
+ decorated entry points are called rarely (construction, estimate,
+ simulate, plot), so per-call cost is invisible compared to the
+ JIT-compiled hot path each one kicks off.
+
+ `is_pep484_tower=True`: respect the PEP-484 numeric tower so `int`
+ satisfies `float`-typed parameters (matches the implicit numeric
+ conversion that Python and ruff's PYI041 both assume).
+ """
+ return BeartypeConf(
+ violation_param_type=exc,
+ strategy=BeartypeStrategy.On,
+ is_pep484_tower=True,
+ )
+
+
+def beartype_init(conf: BeartypeConf) -> Callable[[type], type]:
+ """Class decorator that wraps only `__init__` with `@beartype(conf=conf)`.
+
+ Bare `@beartype` on a class wraps every method, which surfaces
+ non-public annotation drift on instance methods that has nothing
+ to do with parameter validation at construction time (e.g. a
+ helper method that takes a JAX array typed loosely as `Any`). The
+ only annotations we actively curate at the perimeter are the
+ public-facing `__init__` parameters; restrict to those.
+ """
+
+ def wrap(cls: type) -> type:
+ cls.__init__ = beartype(conf=conf)(cls.__init__) # ty: ignore[invalid-assignment]
+ return cls
+
+ return wrap
+
+
+# Construction of the four user-facing model-spec dataclasses.
+MODEL_SPEC_CONF = _conf(ModelSpecInitializationError)
+
+# Construction of CHSEstimationOptions, AFEstimationOptions,
+# AMNEstimationOptions.
+OPTIONS_CONF = _conf(OptionsInitializationError)
+
+# `get_maximization_inputs`, `get_individual_states`, `estimate_af`,
+# `estimate_amn`, `get_af_posterior_states`,
+# `get_amn_posterior_states`.
+ESTIMATION_CONF = _conf(EstimationCallError)
+
+# `compute_af_standard_errors`, `compute_amn_standard_errors`.
+INFERENCE_CONF = _conf(InferenceCallError)
+
+# `simulate_dataset`, `simulate_policy_effect`.
+SIMULATION_CONF = _conf(SimulationCallError)
+
+# Diagnostics + visualisation entry points.
+DIAGNOSTICS_CONF = _conf(DiagnosticsCallError)
diff --git a/src/skillmodels/af/__init__.py b/src/skillmodels/af/__init__.py
new file mode 100644
index 00000000..319ff8a9
--- /dev/null
+++ b/src/skillmodels/af/__init__.py
@@ -0,0 +1,23 @@
+"""Antweiler-Freyberger estimator for latent factor models.
+
+Iterative period-by-period MLE with Halton quadrature for numerical
+integration, following Antweiler and Freyberger (2025).
+"""
+
+from skillmodels.af.estimate import estimate_af
+from skillmodels.af.inference import (
+ AFInferenceResult,
+ compute_af_standard_errors,
+)
+from skillmodels.af.posterior_states import get_af_posterior_states
+from skillmodels.af.types import AFEstimationOptions, AFEstimationResult, AFPeriodResult
+
+__all__ = [
+ "AFEstimationOptions",
+ "AFEstimationResult",
+ "AFInferenceResult",
+ "AFPeriodResult",
+ "compute_af_standard_errors",
+ "estimate_af",
+ "get_af_posterior_states",
+]
diff --git a/src/skillmodels/af/batching.py b/src/skillmodels/af/batching.py
new file mode 100644
index 00000000..72070cdf
--- /dev/null
+++ b/src/skillmodels/af/batching.py
@@ -0,0 +1,100 @@
+"""Auto-sizing helpers for the AF likelihood's memory-aware batching.
+
+The AF likelihood replaces the outermost ``jax.vmap`` over observations
+with ``jax.lax.map`` when ``n_obs_per_batch`` is smaller than ``n_obs``.
+This module provides a simple heuristic that picks an ``n_obs_per_batch``
+from a target-bytes budget, mirroring pylcm's approach (see
+``pylcm/src/lcm/simulation/initial_conditions.py:547-560``).
+
+The heuristic is intentionally crude: it multiplies the per-observation
+Halton grid footprint by a safety factor and divides a budget (256 MB by
+default, overridable via the ``SKILLMODELS_AF_TARGET_BATCH_BYTES``
+environment variable) by that product. No GPU-specific probing is done;
+users who need tighter control can set ``n_obs_per_batch`` explicitly on
+``AFEstimationOptions``.
+"""
+
+import logging
+import os
+
+_DEFAULT_TARGET_BATCH_BYTES = 2**28 # 256 MB
+_ENV_VAR_TARGET = "SKILLMODELS_AF_TARGET_BATCH_BYTES"
+_BYTES_PER_FLOAT64 = 8
+
+# Empirical multiplier reflecting that a single observation's forward +
+# backward tape at full state/shock/inv_shock resolution retains several
+# copies of the integrand footprint. This sized conservatively high: a
+# smaller batch is always safe, a larger batch can OOM.
+_SAFETY_FACTOR = 16
+
+logger = logging.getLogger(__name__)
+
+
+def target_batch_bytes() -> int:
+ """Return the bytes budget per observation batch.
+
+ Honours ``SKILLMODELS_AF_TARGET_BATCH_BYTES`` when set to a positive
+ integer, otherwise returns the default 256 MB budget.
+ """
+ override = os.environ.get(_ENV_VAR_TARGET)
+ if override is None:
+ return _DEFAULT_TARGET_BATCH_BYTES
+ try:
+ parsed = int(override)
+ except ValueError:
+ logger.warning(
+ "Ignoring %s=%r: not a valid integer.",
+ _ENV_VAR_TARGET,
+ override,
+ )
+ return _DEFAULT_TARGET_BATCH_BYTES
+ if parsed <= 0:
+ logger.warning("Ignoring %s=%r: must be positive.", _ENV_VAR_TARGET, override)
+ return _DEFAULT_TARGET_BATCH_BYTES
+ return parsed
+
+
+def auto_n_obs_per_batch(
+ *,
+ n_obs: int,
+ n_halton_points: int,
+ n_halton_points_shock: int, # noqa: ARG001
+ n_latent: int,
+ n_endogenous: int,
+ target_bytes: int | None = None,
+) -> int:
+ """Pick ``n_obs_per_batch`` from a target-bytes budget.
+
+ The AF transition-period likelihood forms a joint Halton draw of
+ size ``(n_halton_points, 2 * n_latent + n_endogenous)`` rather than
+ an outer product of per-axis grids, so per-observation memory is
+ linear in ``n_halton_points``. The per-observation footprint is
+ estimated as
+
+ ``n_halton_points * (n_latent + n_endogenous + 1) * 8 * SAFETY_FACTOR``.
+
+ ``n_halton_points_shock`` is retained in the signature for API
+ compatibility with the earlier per-axis layout but is unused now
+ that draws are joint.
+
+ Args:
+ n_obs: Total number of observations.
+ n_halton_points: Halton grid size (joint dimension count unused here).
+ n_halton_points_shock: Legacy shock Halton count, ignored.
+ n_latent: Latent factor count.
+ n_endogenous: Endogenous (investment) factor count.
+ target_bytes: Budget per batch. Defaults to `target_batch_bytes()`.
+
+ Return:
+ A positive integer no larger than ``n_obs``.
+ """
+ budget = target_bytes if target_bytes is not None else target_batch_bytes()
+ per_obs_bytes = (
+ n_halton_points
+ * (n_latent + n_endogenous + 1)
+ * _BYTES_PER_FLOAT64
+ * _SAFETY_FACTOR
+ )
+ per_obs_bytes = max(per_obs_bytes, 1)
+ batch = max(1, budget // per_obs_bytes)
+ return min(batch, n_obs)
diff --git a/src/skillmodels/af/estimate.py b/src/skillmodels/af/estimate.py
new file mode 100644
index 00000000..9e0befff
--- /dev/null
+++ b/src/skillmodels/af/estimate.py
@@ -0,0 +1,405 @@
+"""Main driver for the AF estimation procedure."""
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pandas as pd
+from beartype import beartype
+from jax import Array
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.af.initial_period import estimate_initial_period
+from skillmodels.af.params import get_measurements_per_factor
+from skillmodels.af.transition_period import estimate_transition_period
+from skillmodels.af.types import (
+ AFEstimationOptions,
+ AFEstimationResult,
+ AFPeriodResult,
+ ConditionalDistribution,
+)
+from skillmodels.af.validate import (
+ fail_if_unsupported_kappa_params,
+ validate_af_model,
+)
+from skillmodels.amn.estimate import estimate_amn
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+
+
+@beartype(conf=ESTIMATION_CONF)
+def estimate_af(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ options: AFEstimationOptions | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+) -> AFEstimationResult:
+ """Estimate a latent factor model using the Antweiler-Freyberger method.
+
+ Sequential period-by-period MLE with Halton quadrature for numerical
+ integration, following Antweiler and Freyberger (2025).
+
+ The procedure estimates one period at a time:
+ - Step 0: Fit initial distribution and measurement params for period 0
+ - Step t (t >= 1): Estimate transition and measurement params using the
+ estimated distribution from previous periods
+
+ Args:
+ model_spec: Model specification (same as for CHS estimation).
+ data: Dataset in long format with MultiIndex (id, period).
+ options: AF-specific estimation options. If None, uses defaults.
+ start_params: Optional starting parameter values. If provided, any
+ matching index entries override the heuristic defaults. Uses the
+ same 4-level MultiIndex as CHS params (category, period, name1,
+ name2). Unmatched entries keep their heuristic values.
+ fixed_params: Optional DataFrame with a "value" column pinning
+ specified parameters to fixed values. Bounds are clamped equal
+ to the value so the optimizer excludes them. Used, e.g., to pin
+ time-invariant latent factors to identity transitions with zero
+ shocks (same convention as CHS augmented periods).
+ constraints: Optional list of optimagic Constraint objects. Only
+ `om.EqualityConstraint` entries that select via
+ `skillmodels.common.constraints.select_by_loc` are honoured.
+ Two regimes:
+ * **Cross-period**: members straddle multiple AF steps. Once
+ any member is estimated in an earlier step, every other
+ member (in not-yet-estimated periods) is pinned to that
+ value via `fixed_params`.
+ * **Within-step**: all members lie in the same step's
+ params index (e.g. `investment_sds` at period t-1 and
+ `meas_sds` at period t both live in step t). The constraint
+ is forwarded verbatim to that step's `om.minimize` so the
+ optimizer enforces equality during fitting.
+ Other constraint types are ignored (AF's per-period MLE
+ handles model-implied within-period constraints internally).
+
+ Return:
+ AFEstimationResult with per-period results and combined parameters.
+
+ Scope:
+ The investment equation is supported, but production shocks are
+ assumed independent of investment shocks (kappa_t = 0 in the
+ control-function form eta_theta,t = kappa_t*eta_I,t + eps_C,t).
+ Endogenous investment (kappa_t != 0) is not implemented; passing
+ parameters in a "kappa"/"kappa_t" category raises
+ NotImplementedError.
+
+ """
+ jax.config.update("jax_enable_x64", val=True)
+
+ if options is None:
+ options = AFEstimationOptions()
+ af_options = options
+
+ validate_af_model(model_spec, fixed_params, constraints)
+ fail_if_unsupported_kappa_params(start_params, fixed_params, constraints)
+ processed_model = process_model(model_spec)
+
+ # If AMN-based starts are requested, run the full AMN three-stage
+ # estimator upfront and overlay its parameter estimates onto the
+ # caller-supplied `start_params` (user values win on overlap).
+ # After this the per-period MLE proceeds with `start_params_strategy
+ # = "constant"` internally so the within-period Spearman pre-pass is
+ # skipped (AMN's values are already in the optimizer's starting
+ # neighbourhood).
+ if af_options.start_params_strategy == "amn":
+ amn_result = estimate_amn(
+ model_spec=model_spec, data=data, for_start_values=True
+ )
+ amn_start = amn_result.params[["value"]]
+ if start_params is not None:
+ user_idx = start_params.index
+ amn_start = amn_start.drop(
+ index=amn_start.index.intersection(user_idx),
+ errors="ignore",
+ )
+ start_params = pd.concat([amn_start, start_params]).sort_index()
+ else:
+ start_params = amn_start
+ af_options = AFEstimationOptions(
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ optimizer_algorithm=af_options.optimizer_algorithm,
+ optimizer_options=dict(af_options.optimizer_options),
+ two_stage=af_options.two_stage,
+ coarse_fraction=af_options.coarse_fraction,
+ stability_floor=af_options.stability_floor,
+ n_obs_per_batch=af_options.n_obs_per_batch,
+ start_params_strategy="constant",
+ keep_conditional_distributions=(af_options.keep_conditional_distributions),
+ n_halton_points_posterior_summary=(
+ af_options.n_halton_points_posterior_summary
+ ),
+ )
+
+ # Extract data arrays per period
+ n_periods = processed_model.dimensions.n_periods
+ factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ observed_factors = processed_model.labels.observed_factors
+
+ # Identify endogenous (investment) factors
+ endog_info = processed_model.endogenous_factors_info
+ endogenous_factors = tuple(
+ f
+ for f in factors
+ if f in endog_info.factor_info and endog_info.factor_info[f].is_endogenous
+ )
+ state_factors = tuple(f for f in factors if f not in endogenous_factors)
+
+ period_data = _extract_period_data(
+ data,
+ n_periods,
+ factors,
+ controls_names,
+ model_spec,
+ observed_factors=observed_factors,
+ )
+
+ equality_groups = _extract_equality_groups(constraints)
+ step_constraints = constraints
+
+ # Step 0: Initial period
+ period_0_result, cond_dist = estimate_initial_period(
+ model_spec=model_spec,
+ processed_model=processed_model,
+ measurements=period_data[0]["measurements"],
+ controls=period_data[0]["controls"],
+ af_options=af_options,
+ state_factors=state_factors,
+ start_params=start_params,
+ fixed_params=fixed_params,
+ observed_factors=observed_factors,
+ observed_factor_values=period_data[0].get("observed_factors"),
+ user_constraints=step_constraints,
+ )
+
+ period_results: list[AFPeriodResult] = [period_0_result]
+ conditional_dists: list[ConditionalDistribution] = [cond_dist]
+ fixed_params = _propagate_equality_groups(
+ period_results=period_results,
+ fixed_params=fixed_params,
+ equality_groups=equality_groups,
+ )
+
+ # Steps 1..T-1: Transition periods
+ for t in range(1, n_periods):
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=t)
+ if not measurements_pt:
+ break
+
+ prev_period_params = period_results[-1].params
+
+ period_t_result, cond_dist = estimate_transition_period(
+ period=t,
+ model_spec=model_spec,
+ processed_model=processed_model,
+ measurements=period_data[t]["measurements"],
+ controls=period_data[t]["controls"],
+ prev_measurements=period_data[t - 1]["measurements"],
+ prev_controls=period_data[t - 1]["controls"],
+ prev_period_params=prev_period_params,
+ prev_distribution=cond_dist,
+ af_options=af_options,
+ endogenous_factors=endogenous_factors,
+ observed_factors=observed_factors,
+ observed_factor_data=period_data.get(t - 1, {}).get(
+ "observed_factors", None
+ ),
+ start_params=start_params,
+ fixed_params=fixed_params,
+ user_constraints=step_constraints,
+ )
+ period_results.append(period_t_result)
+ conditional_dists.append(cond_dist)
+ fixed_params = _propagate_equality_groups(
+ period_results=period_results,
+ fixed_params=fixed_params,
+ equality_groups=equality_groups,
+ )
+
+ # Combine parameters from all periods
+ all_params = pd.concat([r.params for r in period_results])
+
+ # Return arrays on-device so a subsequent call to `estimate_af` can
+ # reuse the JAX/XLA compilation cache (otherwise every sim in a
+ # sweep recompiles every per-period likelihood + gradient).
+ # Callers that need host residency (pickling, plotting, sending
+ # across processes) should call `result.to_numpy()`, which drops
+ # `samples_per_component` and clears caches as a side effect.
+ if af_options.keep_conditional_distributions:
+ conditional_dists_out = tuple(conditional_dists)
+ else:
+ conditional_dists_out = ()
+
+ return AFEstimationResult(
+ period_results=tuple(period_results),
+ params=all_params,
+ model_spec=model_spec,
+ conditional_distributions=conditional_dists_out,
+ success=all(r.success for r in period_results),
+ loglikelihood=float(sum(r.loglikelihood for r in period_results)),
+ )
+
+
+def _extract_period_data(
+ data: pd.DataFrame,
+ n_periods: int,
+ _factors: tuple[str, ...],
+ controls_names: tuple[str, ...],
+ model_spec: ModelSpec,
+ observed_factors: tuple[str, ...] = (),
+) -> dict[int, dict[str, Array]]:
+ """Extract measurement, control, and observed factor arrays per period.
+
+ Return:
+ Dict mapping period -> {"measurements": Array, "controls": Array,
+ "observed_factors": Array (if any)}.
+
+ """
+ period_data: dict[int, dict[str, Array]] = {}
+
+ idx_names = data.index.names
+ period_col = str(idx_names[1])
+
+ for t in range(n_periods):
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=t)
+ if not measurements_pt:
+ continue
+
+ all_measures: list[str] = []
+ seen: set[str] = set()
+ for measures in measurements_pt.values():
+ for m in measures:
+ if m not in seen:
+ seen.add(m)
+ all_measures.append(m)
+
+ period_mask = data.index.get_level_values(period_col) == t
+ period_df = data.loc[period_mask]
+
+ meas_cols = [c for c in all_measures if c in period_df.columns]
+ meas_array = jnp.array(
+ period_df[meas_cols].to_numpy(dtype=np.float64, na_value=np.nan),
+ )
+
+ ctrl_arrays = []
+ for ctrl in controls_names:
+ if ctrl == "constant":
+ ctrl_arrays.append(np.ones(len(period_df)))
+ elif ctrl in period_df.columns:
+ ctrl_arrays.append(period_df[ctrl].to_numpy(dtype=np.float64))
+ else:
+ ctrl_arrays.append(np.zeros(len(period_df)))
+ ctrl_array = jnp.array(np.column_stack(ctrl_arrays))
+
+ entry: dict[str, Array] = {
+ "measurements": meas_array,
+ "controls": ctrl_array,
+ }
+
+ if observed_factors:
+ entry["observed_factors"] = _extract_observed_factors(
+ period_df, observed_factors
+ )
+
+ period_data[t] = entry
+
+ return period_data
+
+
+def _extract_observed_factors(
+ period_df: pd.DataFrame,
+ observed_factors: tuple[str, ...],
+) -> Array:
+ """Extract observed factor values from a period's DataFrame."""
+ obs_arrays = [
+ period_df[of].to_numpy(dtype=np.float64)
+ if of in period_df.columns
+ else np.zeros(len(period_df))
+ for of in observed_factors
+ ]
+ return jnp.array(np.column_stack(obs_arrays))
+
+
+def _extract_equality_groups(
+ constraints: list[om.constraints.Constraint] | None,
+) -> list[pd.MultiIndex]:
+ """Pull cross-period equality groups out of an optimagic constraints list.
+
+ Honours `om.EqualityConstraint` instances whose selector is built via
+ `functools.partial(skillmodels.common.constraints.select_by_loc, loc=...)`.
+ The `loc` keyword carries the `pd.MultiIndex` of params that must be
+ equal — those are the equality groups returned here.
+ """
+ if not constraints:
+ return []
+ groups: list[pd.MultiIndex] = []
+ for c in constraints:
+ if not isinstance(c, om.EqualityConstraint):
+ continue
+ selector = c.selector
+ keywords = getattr(selector, "keywords", None)
+ if not keywords or "loc" not in keywords:
+ continue
+ loc = keywords["loc"]
+ if isinstance(loc, pd.MultiIndex) and len(loc) > 1:
+ groups.append(loc)
+ return groups
+
+
+def _propagate_equality_groups(
+ *,
+ period_results: list[AFPeriodResult],
+ fixed_params: pd.DataFrame | None,
+ equality_groups: list[pd.MultiIndex],
+) -> pd.DataFrame | None:
+ """Propagate just-estimated values to all members of cross-period equality groups.
+
+ For each equality group: if any member is in the union of
+ `period_results[*].params`, pin every other member of the group
+ (that is not already pinned by `fixed_params`) to that member's
+ estimated value via additions to `fixed_params`. Subsequent
+ periods' MLEs see those entries as fixed, enforcing equality
+ across the chain.
+ """
+ if not equality_groups:
+ return fixed_params
+
+ estimated = pd.concat([r.params for r in period_results])
+ if "value" in estimated.columns:
+ estimated_series = estimated["value"]
+ else:
+ estimated_series = estimated.iloc[:, 0]
+
+ if fixed_params is None or len(fixed_params) == 0:
+ index_names = ["category", "period", "name1", "name2"]
+ running = pd.DataFrame(
+ {"value": []},
+ index=pd.MultiIndex.from_tuples([], names=index_names),
+ )
+ else:
+ running = fixed_params.copy()
+
+ new_locs: list[tuple] = []
+ new_values: list[float] = []
+ for group in equality_groups:
+ in_estimated = [loc for loc in group if loc in estimated_series.index]
+ if not in_estimated:
+ continue
+ anchor_value = float(estimated_series.loc[in_estimated[0]])
+ for loc in group:
+ if loc in running.index:
+ continue
+ new_locs.append(loc)
+ new_values.append(anchor_value)
+ if not new_locs:
+ return running
+
+ addition = pd.DataFrame(
+ {"value": new_values},
+ index=pd.MultiIndex.from_tuples(new_locs, names=running.index.names),
+ )
+ return pd.concat([running, addition])
diff --git a/src/skillmodels/af/halton.py b/src/skillmodels/af/halton.py
new file mode 100644
index 00000000..bbd77dd4
--- /dev/null
+++ b/src/skillmodels/af/halton.py
@@ -0,0 +1,92 @@
+"""Halton quasi-random sequence generation for numerical quadrature."""
+
+import jax.numpy as jnp
+import numpy as np
+from jax import Array
+from scipy.stats import qmc
+
+
+def create_halton_nodes_and_weights(
+ n_points: int,
+ n_dim: int,
+ *,
+ seed: int = 0,
+) -> tuple[Array, Array]:
+ """Create Halton quadrature nodes transformed to standard normal.
+
+ Generate a low-discrepancy Halton sequence in [0, 1]^d, then transform
+ to standard normal quantiles via the inverse CDF. Weights are uniform
+ (1/n_points) since the Halton sequence provides quasi-uniform coverage.
+
+ Args:
+ n_points: Number of quadrature points.
+ n_dim: Dimensionality of the sequence.
+ seed: Seed for scrambled Halton sequence (for reproducibility).
+
+ Return:
+ Tuple of (nodes, weights) where:
+ - nodes: shape (n_points, n_dim), standard normal quantiles
+ - weights: shape (n_points,), uniform weights summing to 1
+
+ """
+ sampler = qmc.Halton(d=n_dim, scramble=True, seed=seed)
+ # Generate uniform [0, 1] samples, skip first point (often degenerate)
+ uniform_samples = sampler.random(n=n_points + 1)[1:]
+
+ # Clip to avoid infinite values at 0 and 1
+ uniform_samples = np.clip(uniform_samples, 1e-10, 1 - 1e-10)
+
+ # Transform to standard normal via inverse CDF
+ from scipy.stats import norm # noqa: PLC0415
+
+ normal_nodes = norm.ppf(uniform_samples)
+
+ nodes = jnp.array(normal_nodes, dtype=jnp.float64)
+ weights = jnp.ones(n_points, dtype=jnp.float64) / n_points
+
+ return nodes, weights
+
+
+def transform_nodes_to_conditional(
+ standard_nodes: Array,
+ mean: Array,
+ chol_cov: Array,
+) -> Array:
+ """Transform standard normal nodes to a conditional distribution.
+
+ Apply the affine transformation: x = mean + chol_cov @ z where z are
+ standard normal nodes.
+
+ Args:
+ standard_nodes: Shape (n_points, n_dim), standard normal quantiles.
+ mean: Shape (n_dim,), mean of the target distribution.
+ chol_cov: Shape (n_dim, n_dim), lower Cholesky of the target covariance.
+
+ Return:
+ Transformed nodes, shape (n_points, n_dim).
+
+ """
+ return mean + standard_nodes @ chol_cov.T
+
+
+def create_shock_nodes_and_weights(
+ n_points: int,
+ n_shocks: int,
+ *,
+ seed: int = 42,
+) -> tuple[Array, Array]:
+ """Create quadrature nodes for production shocks.
+
+ Separate Halton sequence for the shock integration dimension, using
+ a different seed to avoid correlation with the state nodes.
+
+ Args:
+ n_points: Number of quadrature points per shock dimension.
+ n_shocks: Number of independent shock dimensions.
+ seed: Seed for the Halton sequence.
+
+ Return:
+ Tuple of (nodes, weights) with nodes shape (n_points, n_shocks).
+
+ """
+ return create_halton_nodes_and_weights(n_points, n_shocks, seed=seed)
diff --git a/src/skillmodels/af/inference.py b/src/skillmodels/af/inference.py
new file mode 100644
index 00000000..222a0237
--- /dev/null
+++ b/src/skillmodels/af/inference.py
@@ -0,0 +1,1136 @@
+"""Score-bootstrap standard errors for the AF estimator.
+
+Implements the score bootstrap procedure prescribed in Antweiler &
+Freyberger (2025) §4.2 (inspired by Armstrong, Bertanha & Hong 2014).
+The AF estimator is a sequential multi-step MLE; its asymptotic variance
+includes terms that propagate the estimation uncertainty of earlier
+steps, which makes the analytical sandwich
+
+ V = A^{-1} Omega A^{-T} / n
+
+incorrect when computed without those cross-step terms. AF §4.2 puts
+this directly:
+
+ "this asymptotic variance is incorrect because it ignores the
+ estimation errors of tau_{t-1}, ..., tau_1, which is the second
+ term in the expansion above. To account for those, we would have
+ to calculate ... which is very difficult because the likelihood is
+ (partly) simulated and not available in closed form. To avoid
+ these calculations, we use a score bootstrap procedure inspired by
+ Armstrong, Bertanha, and Hong (2014)."
+
+This module exposes a single inference entry point,
+:func:`compute_af_standard_errors`, which implements that score
+bootstrap. It avoids re-estimating the model B times: a single
+per-observation influence matrix is computed once at the optimum (each
+period block is a one-step Newton update of the period's full-chain
+score that also carries the earlier periods' influence via the
+cross-period blocks of the full-chain Hessian), then for each of
+``n_boot`` replicates we draw ONE shared caseid index, resample the rows
+of that influence matrix with it, and shift the estimate by the negated
+resample mean. The shared index makes the cross-period covariances in
+the bootstrap distribution non-zero and correct. The empirical standard
+deviation of the resulting parameter draws is the bootstrap standard
+error.
+
+"""
+
+from collections.abc import Callable, Mapping
+from dataclasses import dataclass, field
+from types import MappingProxyType
+from typing import Any, NamedTuple
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pandas as pd
+from beartype import beartype
+from jax import Array
+
+from skillmodels._beartype_conf import INFERENCE_CONF
+from skillmodels.af.batching import auto_n_obs_per_batch
+from skillmodels.af.estimate import _extract_period_data
+from skillmodels.af.halton import create_halton_nodes_and_weights
+from skillmodels.af.initial_period import (
+ _build_loading_mask,
+ _get_ordered_measures,
+)
+from skillmodels.af.likelihood import (
+ _parse_initial_params,
+ _parse_transition_params,
+ af_per_obs_loglike_initial,
+ af_per_obs_loglike_transition,
+)
+from skillmodels.af.params import (
+ build_optimagic_inputs,
+ get_measurements_per_factor,
+)
+from skillmodels.af.transition_period import (
+ _extract_prev_measurement_params,
+ _get_raw_transition_functions,
+ _prepare_transition_inputs,
+)
+from skillmodels.af.types import (
+ AFEstimationOptions,
+ AFEstimationResult,
+ ChainLink,
+ ConditionalDistribution,
+)
+from skillmodels.common.constraints import FixedConstraintWithValue
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import ProcessedModel
+
+
+@dataclass(frozen=True)
+class AFInferenceResult:
+ """Score-bootstrap inference result for the AF estimator.
+
+ See :func:`compute_af_standard_errors` for the procedure (AF 2025
+ §4.2 / Armstrong-Bertanha-Hong 2014).
+ """
+
+ standard_errors: pd.Series
+ """Bootstrap standard errors indexed by ``all_params.index``.
+
+ SEs are the empirical standard deviation across bootstrap
+ replicates of each parameter's one-step Newton shift from the
+ point estimate. Fixed-parameter and constrained-direction entries
+ are reported as zero (or NaN where the period's information matrix
+ is singular on that direction).
+ """
+
+ vcov: pd.DataFrame
+ """Variance-covariance matrix, rows and columns share
+ ``all_params.index``. Computed from
+ ``replicate_params.cov(ddof=1)`` so SEs and vcov are internally
+ consistent.
+ """
+
+ replicate_params: pd.DataFrame
+ """``(n_boot, n_params)`` DataFrame of bootstrap parameter draws.
+
+ Each row is ``theta_hat + delta_b`` where ``delta_b = -A^{-1} *
+ bar_g_b``, ``bar_g_b`` is the mean per-cluster score in bootstrap
+ replicate ``b``, and ``A`` is the period's information matrix at
+ the optimum. Columns share ``all_params.index``; pinned-parameter
+ columns are constant at the point estimate.
+ """
+
+ n_clusters: int
+ """Number of caseids resampled per replicate (= number of unique
+ caseids in the data).
+ """
+
+ n_boot: int
+ """Number of bootstrap replicates drawn."""
+
+
+@beartype(conf=INFERENCE_CONF)
+def compute_af_standard_errors(
+ result: AFEstimationResult,
+ data: pd.DataFrame,
+ af_options: AFEstimationOptions | None = None,
+ *,
+ n_boot: int = 10_000,
+ seed: int = 0,
+) -> AFInferenceResult:
+ """Score-resampling cluster bootstrap for the AF estimator.
+
+ Implements Antweiler & Freyberger (2025) §4.2 (Armstrong-Bertanha-Hong
+ score bootstrap) in its sequential-estimator INFLUENCE-FUNCTION form.
+ A single per-observation influence matrix ``PSI`` (shape
+ ``(n_obs, P_free)``) is computed once at the optimum by
+ :func:`_build_influence_matrix`: each period block is a one-step
+ Newton update of the period's full-chain score that ALSO carries the
+ earlier periods' influence via the cross-period blocks of the
+ full-chain Hessian,
+
+ psi_t,i = A_t^{-1}(s_t,i + sum_{r= 1. The influence-function score
+ bootstrap captures this propagation.
+
+ For ``n_boot=10000`` and ``n_caseids=1500`` this typically takes
+ seconds rather than days (no re-estimation per replicate).
+
+ Args:
+ result: Output of ``estimate_af``.
+ data: The dataset used for estimation; the caseid level of its
+ MultiIndex defines the bootstrap clusters.
+ af_options: Options used at estimation time.
+ n_boot: Number of bootstrap replicates.
+ seed: Seed for the resampling RNG.
+
+ Return:
+ :class:`AFInferenceResult` with bootstrap SEs, vcov computed
+ from the replicate distribution, and the full
+ replicate-by-parameter DataFrame.
+
+ """
+ if af_options is None:
+ af_options = AFEstimationOptions()
+
+ jax.config.update("jax_enable_x64", val=True)
+
+ model_spec = result.model_spec
+ processed_model = process_model(model_spec)
+
+ n_periods = processed_model.dimensions.n_periods
+ latent_factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ observed_factors = processed_model.labels.observed_factors
+
+ endog_info = processed_model.endogenous_factors_info
+ endogenous_factors = tuple(
+ f
+ for f in latent_factors
+ if f in endog_info.factor_info and endog_info.factor_info[f].is_endogenous
+ )
+
+ period_data = _extract_period_data(
+ data,
+ n_periods,
+ latent_factors,
+ controls_names,
+ model_spec,
+ observed_factors=observed_factors,
+ )
+
+ metas = _build_period_metas(
+ result=result,
+ period_data=period_data,
+ model_spec=model_spec,
+ processed_model=processed_model,
+ af_options=af_options,
+ observed_factors=observed_factors,
+ endogenous_factors=endogenous_factors,
+ )
+
+ rng = np.random.default_rng(seed)
+ all_params = result.params
+ replicate_values = np.tile(all_params["value"].to_numpy()[None, :], (n_boot, 1))
+
+ pos_lookup = {tuple(loc): i for i, loc in enumerate(all_params.index)}
+
+ n_clusters = int(metas[0].loglike_kwargs["measurements"].shape[0])
+
+ # Per-obs influence matrix PSI (n_obs, P_free), computed ONCE at the
+ # optimum. PSI propagates earlier-period estimation uncertainty into
+ # each period's influence via the cross-period blocks of the full-chain
+ # Hessian (AF §4.2). The bootstrap then resamples caseid ROWS of PSI
+ # with a single SHARED index per replicate, so cross-period covariances
+ # in the resulting vcov are non-zero and correct.
+ psi, free_global_cols = _build_influence_matrix(result, metas, pos_lookup)
+ psi = np.asarray(psi)
+ free_global_cols_arr = np.asarray(free_global_cols, dtype=np.int64)
+
+ idx = rng.integers(0, n_clusters, size=(n_boot, n_clusters))
+ delta = -psi[idx].mean(axis=1) # (n_boot, P_free); one-step shift
+ replicate_values[:, free_global_cols_arr] += delta
+
+ replicate_params = pd.DataFrame(replicate_values, columns=all_params.index)
+ standard_errors = pd.Series(
+ replicate_params.std(axis=0, ddof=1).to_numpy(),
+ index=all_params.index,
+ name="standard_error",
+ )
+ # Variance-covariance from the replicate distribution. Pinned-parameter
+ # rows/columns are zero (constant column → zero variance/covariance).
+ vcov_values = replicate_params.cov(ddof=1).to_numpy()
+ vcov = pd.DataFrame(
+ vcov_values,
+ index=all_params.index,
+ columns=all_params.index,
+ )
+
+ return AFInferenceResult(
+ standard_errors=standard_errors,
+ vcov=vcov,
+ replicate_params=replicate_params,
+ n_clusters=n_clusters,
+ n_boot=n_boot,
+ )
+
+
+# ---------------------------------------------------------------------------
+# Period metadata: all the static info we need for both sandwich modes.
+# ---------------------------------------------------------------------------
+
+
+@dataclass(frozen=True)
+class _PeriodMeta:
+ """Precomputed static metadata for one period's likelihood.
+
+ Pure-Python dataclass; JAX arrays live in ``loglike_kwargs`` and
+ ``propagation``.
+ """
+
+ period: int
+ is_initial: bool
+ slice_start: int
+ slice_stop: int
+ params_df: pd.DataFrame
+ loglike_kwargs: MappingProxyType[str, Any]
+ """Keyword arguments forwarded to ``af_per_obs_loglike_initial`` (if
+ ``is_initial``) or ``af_per_obs_loglike_transition`` otherwise.
+ """
+ parse_kwargs: MappingProxyType[str, Any]
+ """Keyword arguments forwarded to ``_parse_initial_params`` or
+ ``_parse_transition_params`` respectively. Used by the Phase 2 chain.
+ """
+ n_components: int
+ n_factors_joint: int
+ """Joint factor count in the initial mixture (state_latent + observed).
+ Only meaningful for the initial period; zero otherwise.
+ """
+ n_state: int
+ """State-factor count (``n_state_latent`` in the initial period;
+ ``n_state_factors`` in transition periods).
+ """
+ n_endog: int
+ n_shock: int
+ n_observed_factors: int
+ state_factor_indices_in_joint: tuple[int, ...]
+ """Integer positions within the joint factor vector at which state
+ factors live (the complement is observed factors). Used to marginalise
+ the joint cond-dist to its state-factor sub-block.
+ """
+ target_idx_in_joint: tuple[int, ...] = ()
+ """Initial-period only: positions of the *target* state factors (the
+ ones whose marginal we want carry-over samples for) within
+ `joint_factors`. Differs from ``state_factor_indices_in_joint`` when
+ the joint includes an endogenous factor with ``has_initial_distribution=True``
+ that should be excluded from the carry-over.
+ """
+ obs_idx_in_joint: tuple[int, ...] = ()
+ """Initial-period only: positions of observed factors within
+ `joint_factors`. Empty for transition-period metas.
+ """
+ propagation: MappingProxyType[str, Any] = field(
+ default_factory=lambda: MappingProxyType({})
+ )
+ """Extra JAX-pure bits for propagation of the conditional distribution
+ through this period's transition. Only populated for transition
+ periods. Keys: ``joint_nodes``, ``combined_transition``,
+ ``obs_factor_values``, ``shock_factor_indices``.
+ """
+
+
+def _build_period_metas(
+ *,
+ result: AFEstimationResult,
+ period_data: dict[int, dict[str, Array]],
+ model_spec: ModelSpec,
+ processed_model: ProcessedModel,
+ af_options: AFEstimationOptions,
+ observed_factors: tuple[str, ...],
+ endogenous_factors: tuple[str, ...],
+) -> tuple[_PeriodMeta, ...]:
+ """Build per-period metadata objects for both inference modes."""
+ metas: list[_PeriodMeta] = []
+ offset = 0
+ for period_result in result.period_results:
+ t = period_result.period
+ params_df = period_result.params
+ length = len(params_df)
+
+ if t == 0:
+ meta = _build_initial_period_meta(
+ period_result_params=params_df,
+ slice_start=offset,
+ slice_stop=offset + length,
+ model_spec=model_spec,
+ processed_model=processed_model,
+ af_options=af_options,
+ data_at_period=period_data[0],
+ observed_factors=observed_factors,
+ endogenous_factors=endogenous_factors,
+ )
+ else:
+ prev_period_params = result.period_results[t - 1].params
+ prev_cond_dist = result.conditional_distributions[t - 1]
+ meta = _build_transition_period_meta(
+ period=t,
+ period_result_params=params_df,
+ slice_start=offset,
+ slice_stop=offset + length,
+ prev_period_params=prev_period_params,
+ prev_cond_dist=prev_cond_dist,
+ model_spec=model_spec,
+ processed_model=processed_model,
+ af_options=af_options,
+ data_at_period=period_data[t],
+ prev_data_at_period=period_data[t - 1],
+ endogenous_factors=endogenous_factors,
+ observed_factors=observed_factors,
+ )
+ metas.append(meta)
+ offset += length
+ return tuple(metas)
+
+
+def _build_initial_period_meta(
+ *,
+ period_result_params: pd.DataFrame,
+ slice_start: int,
+ slice_stop: int,
+ model_spec: ModelSpec,
+ processed_model: ProcessedModel,
+ af_options: AFEstimationOptions,
+ data_at_period: Mapping[str, Array],
+ observed_factors: tuple[str, ...],
+ endogenous_factors: tuple[str, ...] = (),
+) -> _PeriodMeta:
+ factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ n_components = processed_model.dimensions.n_mixtures
+
+ reconstructed_factors = tuple(
+ f for f in factors if not model_spec.factors[f].has_initial_distribution
+ )
+ state_latent_factors = tuple(f for f in factors if f not in reconstructed_factors)
+ n_state_latent = len(state_latent_factors)
+ n_obs_factors = len(observed_factors)
+ n_joint = n_state_latent + n_obs_factors
+ state_factor_indices_in_joint = tuple(range(n_state_latent))
+
+ # Target factors for the carry-over sample = state_latent minus
+ # endogenous (matches what `estimate_initial_period` does in the
+ # estimation path).
+ joint_factors = state_latent_factors + observed_factors
+ target_factors = tuple(
+ f for f in state_latent_factors if f not in endogenous_factors
+ )
+ target_idx_in_joint = tuple(joint_factors.index(f) for f in target_factors)
+ obs_idx_in_joint = tuple(joint_factors.index(f) for f in observed_factors)
+ n_state_target = len(target_factors)
+
+ measurements_p0 = get_measurements_per_factor(model_spec.factors, period=0)
+ measurements_p0_filtered = {
+ f: m for f, m in measurements_p0.items() if f in state_latent_factors
+ }
+ all_measures_full = _get_ordered_measures(measurements_p0)
+ all_measures = _get_ordered_measures(measurements_p0_filtered)
+
+ measurements = data_at_period["measurements"]
+ if len(all_measures) != len(all_measures_full):
+ col_indices = jnp.array(
+ [all_measures_full.index(m) for m in all_measures], dtype=jnp.int32
+ )
+ measurements = measurements[:, col_indices]
+
+ loading_mask = _build_loading_mask(
+ all_measures, state_latent_factors, measurements_p0_filtered
+ )
+
+ nodes, weights = create_halton_nodes_and_weights(
+ af_options.n_halton_points, n_state_latent
+ )
+
+ obs_values = data_at_period.get(
+ "observed_factors",
+ jnp.zeros((int(measurements.shape[0]), 0)),
+ )
+
+ n_obs_per_batch = af_options.n_obs_per_batch
+ if n_obs_per_batch is None:
+ n_obs_per_batch = auto_n_obs_per_batch(
+ n_obs=int(measurements.shape[0]),
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ n_latent=n_joint,
+ n_endogenous=0,
+ )
+
+ loglike_kwargs = {
+ "n_factors": n_joint,
+ "n_latent_factors": n_state_latent,
+ "n_mixture_components": n_components,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ "measurements": measurements,
+ "controls": data_at_period["controls"],
+ "observed_factor_values": obs_values,
+ "loading_mask": jnp.array(loading_mask),
+ "nodes": nodes,
+ "weights": weights,
+ "stability_floor": af_options.stability_floor,
+ "n_obs_per_batch": n_obs_per_batch,
+ }
+
+ parse_kwargs = {
+ "n_factors": n_joint,
+ "n_mixture_components": n_components,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ }
+
+ return _PeriodMeta(
+ period=0,
+ is_initial=True,
+ slice_start=slice_start,
+ slice_stop=slice_stop,
+ params_df=period_result_params,
+ loglike_kwargs=MappingProxyType(loglike_kwargs),
+ parse_kwargs=MappingProxyType(parse_kwargs),
+ n_components=n_components,
+ n_factors_joint=n_joint,
+ n_state=n_state_target,
+ n_endog=0,
+ n_shock=0,
+ n_observed_factors=n_obs_factors,
+ state_factor_indices_in_joint=state_factor_indices_in_joint,
+ target_idx_in_joint=target_idx_in_joint,
+ obs_idx_in_joint=obs_idx_in_joint,
+ propagation=MappingProxyType({}),
+ )
+
+
+def _build_transition_period_meta(
+ *,
+ period: int,
+ period_result_params: pd.DataFrame,
+ slice_start: int,
+ slice_stop: int,
+ prev_period_params: pd.DataFrame,
+ prev_cond_dist: ConditionalDistribution,
+ model_spec: ModelSpec,
+ processed_model: ProcessedModel,
+ af_options: AFEstimationOptions,
+ data_at_period: Mapping[str, Array],
+ prev_data_at_period: Mapping[str, Array],
+ endogenous_factors: tuple[str, ...],
+ observed_factors: tuple[str, ...],
+) -> _PeriodMeta:
+ factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ transition_info = processed_model.transition_info
+
+ state_factors = tuple(f for f in factors if f not in endogenous_factors)
+ n_state = len(state_factors)
+ n_endog = len(endogenous_factors)
+ shock_factors = tuple(
+ f for f in state_factors if model_spec.factors[f].has_production_shock
+ )
+ n_shock = len(shock_factors)
+ shock_factor_indices = jnp.array(
+ [state_factors.index(f) for f in shock_factors], dtype=jnp.int32
+ )
+ state_factor_indices_in_latent = jnp.array(
+ [factors.index(f) for f in state_factors], dtype=jnp.int32
+ )
+
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=period)
+ all_measures = _get_ordered_measures(measurements_pt)
+ loading_mask = _build_loading_mask(all_measures, factors, measurements_pt)
+
+ # Match transition_period.py: a single joint Halton at every step
+ # covers (z_state for theta_0) + (n_chain) prior chain shocks
+ # (z_inv, z_P) + current step's (z_inv, z_P).
+ n_chain = period - 1
+ z_block = n_shock + n_endog
+ joint_dim = n_state + n_chain * z_block + z_block
+ joint_nodes, joint_weights = create_halton_nodes_and_weights(
+ af_options.n_halton_points, joint_dim, seed=period
+ )
+
+ measurements = data_at_period["measurements"]
+ controls = data_at_period["controls"]
+ prev_measurements = prev_data_at_period["measurements"]
+ prev_controls = prev_data_at_period["controls"]
+
+ prev_dist_arrays, total_n_transition_params = _prepare_transition_inputs(
+ prev_cond_dist,
+ transition_info,
+ state_factors,
+ int(measurements.shape[0]),
+ )
+
+ raw_funcs = _get_raw_transition_functions(
+ model_spec,
+ state_factors,
+ all_factors=processed_model.labels.all_factors,
+ param_names=transition_info.param_names,
+ )
+ param_counts = tuple(len(transition_info.param_names[f]) for f in state_factors)
+
+ def combined_transition(full_states: Array, params: Array) -> Array:
+ out = jnp.zeros(n_state)
+ p_idx = 0
+ for i in range(n_state):
+ n_p = param_counts[i]
+ factor_params = params[p_idx : p_idx + n_p]
+ out = out.at[i].set(raw_funcs[i](full_states, factor_params)) # noqa: PD008
+ p_idx += n_p
+ return out
+
+ n_inv_eq_params_per = 1 + n_state + len(observed_factors) if n_endog > 0 else 0
+ total_n_inv_params = n_endog * n_inv_eq_params_per
+
+ obs_factor_values = prev_data_at_period.get(
+ "observed_factors",
+ jnp.zeros((int(measurements.shape[0]), len(observed_factors))),
+ )
+
+ chain_links = prev_cond_dist.chain_links
+ if len(chain_links) == 0:
+ obs_factor_values_chain = jnp.zeros(
+ (int(measurements.shape[0]), 0, len(observed_factors))
+ )
+ else:
+ obs_factor_values_chain = jnp.stack(
+ [link.obs_factor_values for link in chain_links], axis=1
+ )
+
+ prev_meas_info = _extract_prev_measurement_params(
+ prev_period_params,
+ model_spec,
+ factors,
+ period - 1,
+ )
+
+ n_obs_per_batch = af_options.n_obs_per_batch
+ if n_obs_per_batch is None:
+ n_obs_per_batch = auto_n_obs_per_batch(
+ n_obs=int(measurements.shape[0]),
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ n_latent=n_state,
+ n_endogenous=n_endog,
+ )
+
+ loglike_kwargs = {
+ "n_state_factors": n_state,
+ "n_endogenous_factors": n_endog,
+ "n_shock_factors": n_shock,
+ "shock_factor_indices": shock_factor_indices,
+ "state_factor_indices_in_latent": state_factor_indices_in_latent,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ "measurements": measurements,
+ "controls": controls,
+ "loading_mask": jnp.array(loading_mask),
+ "prev_measurements": prev_measurements,
+ "prev_controls": prev_controls,
+ "prev_loading_mask": prev_meas_info["loading_mask"],
+ "prev_control_params": prev_meas_info["control_params"],
+ "prev_loadings_flat": prev_meas_info["loadings_flat"],
+ "prev_meas_sds": prev_meas_info["meas_sds"],
+ "prev_distribution": prev_dist_arrays,
+ "chain_links": chain_links,
+ "obs_factor_values_chain": obs_factor_values_chain,
+ "joint_nodes": joint_nodes,
+ "joint_weights": joint_weights,
+ "transition_func": combined_transition,
+ "total_n_transition_params": total_n_transition_params,
+ "total_n_inv_params": total_n_inv_params,
+ "n_inv_eq_params_per": n_inv_eq_params_per,
+ "observed_factor_values": obs_factor_values,
+ "stability_floor": af_options.stability_floor,
+ "n_obs_per_batch": n_obs_per_batch,
+ }
+
+ parse_kwargs = {
+ "n_state_factors": n_state,
+ "n_endogenous_factors": n_endog,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ "total_n_transition_params": total_n_transition_params,
+ "total_n_inv_params": total_n_inv_params,
+ "n_inv_eq_params_per": n_inv_eq_params_per,
+ "n_shock_factors": n_shock,
+ }
+
+ # For propagating the cond-dist forward to the next period: marginal
+ # state grid (same convention as ``_update_conditional_distribution``).
+ propagation_nodes, propagation_weights = create_halton_nodes_and_weights(
+ af_options.n_halton_points, n_state
+ )
+
+ propagation = {
+ "state_nodes": propagation_nodes,
+ "state_weights": propagation_weights,
+ "combined_transition": combined_transition,
+ "obs_factor_values": obs_factor_values,
+ "shock_factor_indices": shock_factor_indices,
+ }
+
+ return _PeriodMeta(
+ period=period,
+ is_initial=False,
+ slice_start=slice_start,
+ slice_stop=slice_stop,
+ params_df=period_result_params,
+ loglike_kwargs=MappingProxyType(loglike_kwargs),
+ parse_kwargs=MappingProxyType(parse_kwargs),
+ n_components=len(prev_cond_dist.components),
+ n_factors_joint=0,
+ n_state=n_state,
+ n_endog=n_endog,
+ n_shock=n_shock,
+ n_observed_factors=len(observed_factors),
+ state_factor_indices_in_joint=tuple(range(n_state)),
+ propagation=MappingProxyType(propagation),
+ )
+
+
+# ---------------------------------------------------------------------------
+# Free-parameter bookkeeping.
+# ---------------------------------------------------------------------------
+
+
+def _free_positions_for_period(
+ params_df: pd.DataFrame,
+) -> tuple[list[int], list[tuple[Any, ...]]]:
+ """Return positions and locs of free (unpinned, non-simplex) params."""
+ _, fixed_constraints = build_optimagic_inputs(params_df, None)
+ fixed_locs: set[Any] = set()
+ for constraint in fixed_constraints:
+ if isinstance(constraint, FixedConstraintWithValue):
+ loc = constraint.loc
+ fixed_locs.add(tuple(loc) if isinstance(loc, tuple) else loc)
+
+ all_locs = list(params_df.index)
+ positions: list[int] = []
+ locs: list[tuple[Any, ...]] = []
+ for i, loc in enumerate(all_locs):
+ loc_t = tuple(loc)
+ if loc_t in fixed_locs or loc[0] == "mixture_weights":
+ continue
+ positions.append(i)
+ locs.append(loc_t)
+ return positions, locs
+
+
+# ---------------------------------------------------------------------------
+# Block-diagonal sandwich (Phase 1 behaviour).
+# ---------------------------------------------------------------------------
+
+
+class _PeriodScoreInfo(NamedTuple):
+ """Per-period score and information matrices at the optimum.
+
+ Internal carrier used by :func:`compute_af_standard_errors` to feed
+ the score bootstrap. Not part of the public API.
+ """
+
+ period: int
+ free_param_locs: tuple[tuple[Any, ...], ...]
+ score_matrix: Array
+ information_matrix: Array
+
+
+def _compute_block_diagonal_sandwich(
+ _result: AFEstimationResult,
+ metas: tuple[_PeriodMeta, ...],
+) -> list[_PeriodScoreInfo]:
+ """Compute per-period score and information matrices for the bootstrap."""
+ results: list[_PeriodScoreInfo] = []
+ for meta in metas:
+ per_obs_fn = (
+ af_per_obs_loglike_initial
+ if meta.is_initial
+ else af_per_obs_loglike_transition
+ )
+ info = _block_diagonal_sandwich_single(
+ meta=meta,
+ per_obs_loglike_fn=per_obs_fn,
+ )
+ results.append(info)
+ return results
+
+
+def _block_diagonal_sandwich_single(
+ *,
+ meta: _PeriodMeta,
+ per_obs_loglike_fn: Callable[..., Array],
+) -> _PeriodScoreInfo:
+ """Compute the per-period score matrix and information matrix at theta_hat.
+
+ These feed the score bootstrap. The information matrix is the
+ Hessian of the scalar negative-mean log-likelihood; the score
+ matrix has one row per caseid and one column per free parameter.
+ """
+ positions, locs = _free_positions_for_period(meta.params_df)
+ free_positions_array = jnp.array(positions, dtype=jnp.int32)
+ flat_values = jnp.array(meta.params_df["value"].to_numpy())
+ kwargs = dict(meta.loglike_kwargs)
+
+ def per_obs_loglike_full(flat_params: Array) -> Array:
+ return per_obs_loglike_fn(flat_params, **kwargs)
+
+ def neg_mean_loglike_full(flat_params: Array) -> Array:
+ return -jnp.mean(per_obs_loglike_full(flat_params))
+
+ jac_full = jax.jacfwd(per_obs_loglike_full)(flat_values)
+ hess_full = jax.hessian(neg_mean_loglike_full)(flat_values)
+
+ score_matrix = jac_full[:, free_positions_array]
+ information_matrix = hess_full[free_positions_array][:, free_positions_array]
+
+ return _PeriodScoreInfo(
+ period=meta.period,
+ free_param_locs=tuple(locs),
+ score_matrix=score_matrix,
+ information_matrix=information_matrix,
+ )
+
+
+# ---------------------------------------------------------------------------
+# Full cross-period sandwich (Phase 2).
+#
+# Reconstruct ``prev_distribution`` and ``prev_meas_info`` as JAX-pure
+# functions of a single concatenated ``flat_super`` parameter vector, so
+# ``jax.jacfwd`` captures the full chain of dependencies.
+# ---------------------------------------------------------------------------
+
+
+def _build_initial_state_cond_dist_jax(
+ flat_params_0: Array,
+ meta: _PeriodMeta,
+) -> tuple[Array, Array, Array, Array]:
+ """JAX-pure analytical reconstruction of the period-0 conditional payload.
+
+ Mirrors ``initial_period._extract_conditional_distribution``: parse
+ initial-period params, compute per-component / per-obs Schur-conditional
+ means and per-component Cholesky factors. Returns the inputs the
+ transition likelihood needs to rebuild θ_0 from a joint Halton inside
+ its integrand (no chained-sample materialisation here).
+
+ Return:
+ Tuple of (cond_means, cond_chols, log_unnorms, mixture_weights):
+ * cond_means: (n_components, n_obs, n_state)
+ * cond_chols: (n_components, n_state, n_state)
+ * log_unnorms: (n_components, n_obs); softmaxes to per-obs Bayes
+ posterior mixture weights when observed factors are present.
+ * mixture_weights: (n_components,) prior mixture weights.
+ """
+ parsed = _parse_initial_params(
+ flat_params_0,
+ meta.parse_kwargs["n_factors"],
+ meta.parse_kwargs["n_mixture_components"],
+ meta.parse_kwargs["n_measures"],
+ meta.parse_kwargs["n_controls"],
+ )
+ joint_means = parsed["mixture_means"] # (K, n_joint)
+ joint_chols = parsed["mixture_chol_covs"] # (K, n_joint, n_joint)
+ mixture_weights = parsed["mixture_weights"]
+
+ obs_values = meta.loglike_kwargs["observed_factor_values"]
+ n_obs = int(obs_values.shape[0])
+ n_obs_factors = meta.n_observed_factors
+ n_state = meta.n_state
+ target_idx = jnp.asarray(meta.target_idx_in_joint, dtype=jnp.int32)
+
+ if n_obs_factors == 0:
+
+ def _per_component(
+ joint_mean: Array, joint_chol: Array
+ ) -> tuple[Array, Array, Array]:
+ joint_cov = joint_chol @ joint_chol.T
+ mu_t = joint_mean[target_idx]
+ cov_tt = joint_cov[target_idx[:, None], target_idx[None, :]]
+ sub_chol = jnp.linalg.cholesky(cov_tt + 1e-10 * jnp.eye(n_state))
+ cond_mean = jnp.broadcast_to(mu_t[None, :], (n_obs, n_state))
+ log_unnorm = jnp.zeros(n_obs)
+ return cond_mean, sub_chol, log_unnorm
+
+ cond_means, cond_chols, log_unnorms = jax.vmap(_per_component)(
+ joint_means, joint_chols
+ )
+ log_unnorms = log_unnorms + jnp.log(mixture_weights + 1e-300)[:, None]
+ else:
+ obs_idx = jnp.asarray(meta.obs_idx_in_joint, dtype=jnp.int32)
+
+ def _per_component(
+ joint_mean: Array, joint_chol: Array
+ ) -> tuple[Array, Array, Array]:
+ joint_cov = joint_chol @ joint_chol.T
+ mu_t = joint_mean[target_idx]
+ mu_y = joint_mean[obs_idx]
+ cov_tt = joint_cov[target_idx[:, None], target_idx[None, :]]
+ cov_ty = joint_cov[target_idx[:, None], obs_idx[None, :]]
+ cov_yy = joint_cov[obs_idx[:, None], obs_idx[None, :]]
+ chol_yy = jnp.linalg.cholesky(cov_yy)
+ solve_tt = jax.scipy.linalg.cho_solve((chol_yy, True), cov_ty.T)
+ cond_cov = cov_tt - cov_ty @ solve_tt + 1e-10 * jnp.eye(n_state)
+ cond_chol = jnp.linalg.cholesky(cond_cov)
+
+ def _per_obs(y_i: Array) -> tuple[Array, Array]:
+ alpha = jax.scipy.linalg.cho_solve((chol_yy, True), y_i - mu_y)
+ cond_mean = mu_t + cov_ty @ alpha
+ k = y_i.shape[0]
+ sol = jax.scipy.linalg.solve_triangular(chol_yy, y_i - mu_y, lower=True)
+ log_marg = (
+ -0.5 * k * jnp.log(2 * jnp.pi)
+ - jnp.sum(jnp.log(jnp.diag(chol_yy)))
+ - 0.5 * jnp.dot(sol, sol)
+ )
+ return cond_mean, log_marg
+
+ cond_means_per_obs, log_margs = jax.vmap(_per_obs)(obs_values)
+ return cond_means_per_obs, cond_chol, log_margs
+
+ cond_means, cond_chols, log_marg_y = jax.vmap(_per_component)(
+ joint_means, joint_chols
+ )
+ log_unnorms = log_marg_y + jnp.log(mixture_weights + 1e-300)[:, None]
+
+ return cond_means, cond_chols, log_unnorms, mixture_weights
+
+
+def _extract_chain_link_jax(
+ flat_params_t: Array,
+ meta: _PeriodMeta,
+) -> ChainLink:
+ """JAX-pure construction of a ChainLink from period ``t``'s flat params.
+
+ Mirrors ``transition_period._build_chain_link`` but parses the flat
+ params directly so the chain link's leaves are differentiable
+ components of ``flat_super``. Used by the inference sandwich code to
+ rebuild the chained sample on-demand inside the period-`t` likelihood,
+ keeping the autodiff DAG intact across periods.
+ """
+ parsed = _parse_transition_params(
+ flat_params_t,
+ meta.parse_kwargs["n_state_factors"],
+ meta.parse_kwargs["n_endogenous_factors"],
+ meta.parse_kwargs["n_measures"],
+ meta.parse_kwargs["n_controls"],
+ meta.parse_kwargs["total_n_transition_params"],
+ meta.parse_kwargs["total_n_inv_params"],
+ meta.parse_kwargs["n_inv_eq_params_per"],
+ n_shock_factors=meta.parse_kwargs["n_shock_factors"],
+ )
+ return ChainLink(
+ period=meta.period,
+ transition_func=meta.propagation["combined_transition"],
+ transition_params=parsed["transition_params"],
+ shock_sds=parsed["shock_sds"],
+ shock_factor_indices=meta.propagation["shock_factor_indices"],
+ inv_eq_params=parsed["inv_eq_params"],
+ inv_sds=parsed["inv_sds"],
+ n_inv_eq_params_per=meta.parse_kwargs["n_inv_eq_params_per"],
+ obs_factor_values=meta.propagation["obs_factor_values"],
+ )
+
+
+def _extract_prev_meas_info_jax(
+ flat_params_prev: Array,
+ meta: _PeriodMeta,
+) -> dict[str, Array]:
+ """JAX-pure extraction of ``prev_meas_info`` from a period's flat params."""
+ if meta.is_initial:
+ parsed = _parse_initial_params(
+ flat_params_prev,
+ meta.parse_kwargs["n_factors"],
+ meta.parse_kwargs["n_mixture_components"],
+ meta.parse_kwargs["n_measures"],
+ meta.parse_kwargs["n_controls"],
+ )
+ return {
+ "loadings_flat": parsed["loadings"],
+ "control_params": parsed["control_params"],
+ "meas_sds": parsed["meas_sds"],
+ }
+ parsed = _parse_transition_params(
+ flat_params_prev,
+ meta.parse_kwargs["n_state_factors"],
+ meta.parse_kwargs["n_endogenous_factors"],
+ meta.parse_kwargs["n_measures"],
+ meta.parse_kwargs["n_controls"],
+ meta.parse_kwargs["total_n_transition_params"],
+ meta.parse_kwargs["total_n_inv_params"],
+ meta.parse_kwargs["n_inv_eq_params_per"],
+ n_shock_factors=meta.parse_kwargs["n_shock_factors"],
+ )
+ return {
+ "loadings_flat": parsed["loadings_flat"],
+ "control_params": parsed["control_params"],
+ "meas_sds": parsed["meas_sds"],
+ }
+
+
+def _build_prev_dist_arrays(
+ flat_super: Array,
+ target_t: int,
+ metas: tuple[_PeriodMeta, ...],
+ cond_weights_override: Array | None = None,
+) -> tuple[dict[str, Array], tuple[ChainLink, ...], Array]:
+ """Build the period-0 conditional payload and chain history for period ``t``.
+
+ Replaces the previous static-sample carry-over with the joint-Halton
+ chain rebuild contract: the period-`t` likelihood expects
+ ``prev_dist_arrays`` (with cond_weights / cond_means / cond_chols),
+ a tuple of `ChainLink`s for the prior transition steps, and a
+ per-obs ``obs_factor_values_chain`` tensor. The chain rebuild
+ happens inside the integrand from a single joint Halton design.
+
+ The autodiff DAG flows through each `ChainLink`'s leaves
+ (transition_params, shock_sds, inv_eq_params, inv_sds) which are
+ parsed from `flat_super`'s per-period slices.
+ """
+ meta0 = metas[0]
+ flat_params_0 = flat_super[meta0.slice_start : meta0.slice_stop]
+ cond_means, cond_chols, log_unnorms, mixture_weights = (
+ _build_initial_state_cond_dist_jax(flat_params_0, meta0)
+ )
+
+ chain_links: list[ChainLink] = []
+ for s in range(1, target_t):
+ meta_s = metas[s]
+ flat_params_s = flat_super[meta_s.slice_start : meta_s.slice_stop]
+ chain_links.append(_extract_chain_link_jax(flat_params_s, meta_s))
+
+ if cond_weights_override is not None:
+ cond_weights = cond_weights_override
+ elif meta0.n_observed_factors > 0:
+ cond_weights = jax.nn.softmax(log_unnorms, axis=0).T
+ else:
+ meta_target = metas[target_t]
+ n_obs = int(meta_target.loglike_kwargs["measurements"].shape[0])
+ n_components = metas[0].n_components
+ cond_weights = jnp.broadcast_to(mixture_weights[None, :], (n_obs, n_components))
+
+ prev_dist_arrays = {
+ "cond_weights": cond_weights,
+ "cond_means": cond_means,
+ "cond_chols": cond_chols,
+ }
+
+ # Per-obs observed factor values at each chain link's source period.
+ meta_target = metas[target_t]
+ n_obs = int(meta_target.loglike_kwargs["measurements"].shape[0])
+ n_obs_factors = meta0.n_observed_factors
+ if not chain_links:
+ obs_factor_values_chain = jnp.zeros((n_obs, 0, n_obs_factors))
+ else:
+ obs_factor_values_chain = jnp.stack(
+ [link.obs_factor_values for link in chain_links], axis=1
+ )
+
+ return prev_dist_arrays, tuple(chain_links), obs_factor_values_chain
+
+
+def _period_t_per_obs_loglike_full(
+ flat_super: Array,
+ t: int,
+ metas: tuple[_PeriodMeta, ...],
+) -> Array:
+ """Per-obs loglike for period ``t`` as a function of the full flat vector."""
+ meta_t = metas[t]
+ flat_params_t = flat_super[meta_t.slice_start : meta_t.slice_stop]
+ if meta_t.is_initial:
+ return af_per_obs_loglike_initial(flat_params_t, **meta_t.loglike_kwargs)
+
+ # Reuse the baked cond_weights from the meta (it was built via the same
+ # ``_prepare_transition_inputs`` path as estimation and already honours
+ # any stored ``conditional_weights``; when ``conditional_weights`` is
+ # ``None`` it is a broadcast of the initial-period mixture weights).
+ stored_cond_weights = meta_t.loglike_kwargs["prev_distribution"]["cond_weights"]
+ prev_dist_arrays, chain_links, obs_factor_values_chain = _build_prev_dist_arrays(
+ flat_super, t, metas, cond_weights_override=stored_cond_weights
+ )
+ meta_prev = metas[t - 1]
+ flat_params_prev = flat_super[meta_prev.slice_start : meta_prev.slice_stop]
+ prev_meas = _extract_prev_meas_info_jax(flat_params_prev, meta_prev)
+
+ kwargs = dict(meta_t.loglike_kwargs)
+ kwargs["prev_distribution"] = prev_dist_arrays
+ kwargs["chain_links"] = chain_links
+ kwargs["obs_factor_values_chain"] = obs_factor_values_chain
+ kwargs["prev_loadings_flat"] = prev_meas["loadings_flat"]
+ kwargs["prev_control_params"] = prev_meas["control_params"]
+ kwargs["prev_meas_sds"] = prev_meas["meas_sds"]
+ return af_per_obs_loglike_transition(flat_params_t, **kwargs)
+
+
+def _build_influence_matrix(
+ result: AFEstimationResult,
+ metas: tuple[_PeriodMeta, ...],
+ pos_lookup: Mapping[tuple[Any, ...], int],
+) -> tuple[np.ndarray, list[int]]:
+ """Build the per-observation influence matrix PSI for the AF score bootstrap.
+
+ Implements the sequential-estimator influence-function form of the AF
+ (2025) §4.2 score bootstrap. Partition the free parameters into period
+ blocks tau_0, ..., tau_{T-1}. Evaluate once at the optimum:
+
+ * ``s_t``: per-obs score of the period-``t`` FULL-CHAIN loglike w.r.t. all
+ free params, via ``jax.jacfwd(_period_t_per_obs_loglike_full)``;
+ * ``H_t``: hessian of the neg-mean full-chain period-``t`` loglike
+ restricted to free columns, whose own block ``H_t[own, own] = A_t`` and
+ earlier-block columns ``H_t[own, own_r] = -B_{t,r}`` for ``r < t``.
+
+ The per-obs influence matrix is built by forward substitution over
+ periods:
+
+ psi_own_0,i = A_0^{-1} s_0,i[own_0]
+ psi_own_t,i = A_t^{-1}(s_t,i[own_t] + sum_{r Array:
+ return _period_t_per_obs_loglike_full(fs, _t, metas)
+
+ jac = np.asarray(jax.jacfwd(per_obs)(flat_super)[:, free_positions_arr])
+
+ def neg_mean(fs: Array, _t: int = t) -> Array:
+ return -jnp.mean(_period_t_per_obs_loglike_full(fs, _t, metas))
+
+ hess_full = jax.hessian(neg_mean)(flat_super)
+ hess = np.asarray(hess_full[free_positions_arr][:, free_positions_arr])
+
+ own = period_own_cols[t]
+ a_inv = np.linalg.pinv(hess[np.ix_(own, own)]) # A_t^{-1}
+ rhs = jac[:, own] # s_t own block, (n_obs, |own|)
+ for r in range(t):
+ own_r = period_own_cols[r]
+ b_tr = -hess[np.ix_(own, own_r)] # B_{t,r}
+ rhs = rhs + psi[:, own_r] @ b_tr.T
+ psi[:, own] = rhs @ a_inv.T
+
+ free_global_cols = [pos_lookup[loc] for loc in free_locs]
+ return psi, free_global_cols
+
+
+__all__ = [
+ "AFInferenceResult",
+ "compute_af_standard_errors",
+]
diff --git a/src/skillmodels/af/initial_period.py b/src/skillmodels/af/initial_period.py
new file mode 100644
index 00000000..3dee3fa0
--- /dev/null
+++ b/src/skillmodels/af/initial_period.py
@@ -0,0 +1,704 @@
+"""Step 0 of the AF estimator: initial period estimation.
+
+Estimate the joint distribution of latent factors at period 0 and the
+measurement system parameters, using a mixture-of-normals model with
+Halton quadrature for numerical integration.
+"""
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pandas as pd
+from jax import Array
+
+from skillmodels.af.batching import auto_n_obs_per_batch
+from skillmodels.af.halton import create_halton_nodes_and_weights
+from skillmodels.af.likelihood import (
+ _log_mvn_pdf_chol,
+ af_loglike_initial,
+ create_loglike_and_gradient,
+)
+from skillmodels.af.params import (
+ apply_fixed_params,
+ apply_start_params,
+ build_optimagic_inputs,
+ create_af_params_template,
+ get_initial_period_params_index,
+ get_measurements_per_factor,
+ get_normalizations_for_period,
+)
+from skillmodels.af.types import (
+ AFEstimationOptions,
+ AFPeriodResult,
+ ConditionalDistribution,
+ MixtureComponent,
+)
+from skillmodels.amn.moments import spearman_factor_moments
+from skillmodels.common.constraints import (
+ filter_within_step_constraints,
+ reconcile_start_to_equality,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import ProcessedModel, to_plain_dict
+
+
+def estimate_initial_period( # noqa: PLR0915
+ model_spec: ModelSpec,
+ processed_model: ProcessedModel,
+ measurements: Array,
+ controls: Array,
+ af_options: AFEstimationOptions,
+ state_factors: tuple[str, ...] | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ observed_factors: tuple[str, ...] = (),
+ observed_factor_values: Array | None = None,
+ user_constraints: list[om.constraints.Constraint] | None = None,
+) -> tuple[AFPeriodResult, ConditionalDistribution]:
+ """Estimate the initial period (Step 0) of the AF procedure.
+
+ Fit a mixture-of-normals distribution for the joint vector of latent
+ factors (and, optionally, observed factors) at period 0, together with
+ the measurement system parameters, via MLE with Halton quadrature.
+
+ When `observed_factors` is non-empty, the joint distribution is modelled
+ over (latent, observed) and per-individual observed values are used to
+ condition the Halton draws via the Schur complement. This concentrates
+ nodes on the region of latent space consistent with each individual's
+ observed data, improving quadrature precision.
+
+ Args:
+ model_spec: Model specification.
+ processed_model: Processed model from `process_model()`.
+ measurements: Shape (n_obs, n_measures), period 0 measurement values.
+ controls: Shape (n_obs, n_controls), period 0 control values.
+ af_options: AF estimation options.
+ state_factors: Subset of latent factors used as state factors for
+ AF propagation. If `None`, all latent factors are used.
+ start_params: Optional starting values. Matching index entries
+ override heuristic defaults.
+ fixed_params: Optional DataFrame with a "value" column pinning
+ specified parameters (value + bounds both clamped to the value).
+ observed_factors: Names of observed factors included in the joint
+ initial distribution. Defaults to empty.
+ observed_factor_values: Shape (n_obs, n_observed_factors) array of
+ observed factor values. Required iff `observed_factors` is
+ non-empty.
+ user_constraints: Optional optimagic constraint list forwarded
+ from `estimate_af(constraints=...)`. Entries whose members
+ all sit in this step's params index are appended to the
+ step's `om.minimize` call (within-step equalities).
+
+ Return:
+ Tuple of (AFPeriodResult, ConditionalDistribution) where the
+ distribution represents the estimated f(theta_0 | data_0), restricted
+ to latent (or `state_factors`) coordinates.
+
+ """
+ n_components = processed_model.dimensions.n_mixtures
+ factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ n_obs_factors = len(observed_factors)
+
+ reconstructed_factors = tuple(
+ f for f in factors if not model_spec.factors[f].has_initial_distribution
+ )
+ state_latent_factors = tuple(f for f in factors if f not in reconstructed_factors)
+ n_state_latent = len(state_latent_factors)
+ n_joint = n_state_latent + n_obs_factors
+
+ if n_obs_factors > 0 and observed_factor_values is None:
+ msg = "observed_factor_values required when observed_factors is non-empty."
+ raise ValueError(msg)
+ obs_values = (
+ observed_factor_values
+ if observed_factor_values is not None
+ else jnp.zeros((measurements.shape[0], 0))
+ )
+
+ # Build parameter index and template
+ measurements_p0 = get_measurements_per_factor(model_spec.factors, period=0)
+ params_index = get_initial_period_params_index(
+ n_mixture_components=n_components,
+ latent_factors=factors,
+ measurements_period_0=measurements_p0,
+ controls=controls_names,
+ observed_factors=observed_factors,
+ reconstructed_factors=reconstructed_factors,
+ )
+ normalizations = get_normalizations_for_period(model_spec.factors, period=0)
+ params_template = create_af_params_template(
+ params_index,
+ normalizations,
+ period=0,
+ )
+
+ # Initialize parameters via simple heuristics
+ params_template = _initialize_params_heuristic(
+ params_template,
+ measurements,
+ controls,
+ n_state_latent,
+ n_components,
+ observed_factors=observed_factors,
+ observed_factor_values=obs_values,
+ )
+
+ # Optionally override SDs / loadings / Cholesky diagonals via Spearman
+ # moments. This places the optimizer near the strongly-identified MLE
+ # neighborhood instead of at the static default 0.5 / obs_sd*0.5; for
+ # parameters on weakly-identified ridges (notably sigma_inv vs sigma_meas) the
+ # moment-based seed is the difference between converging at truth and
+ # drifting to the boundary.
+ if af_options.start_params_strategy == "spearman":
+ all_measures_full = _get_ordered_measures(measurements_p0)
+ params_template = _apply_moment_based_overrides_initial(
+ params_template,
+ measurements,
+ measurements_per_factor=measurements_p0,
+ all_measures=all_measures_full,
+ normalizations=normalizations,
+ n_components=n_components,
+ )
+
+ # Override with user-supplied starting values where available
+ if start_params is not None:
+ apply_start_params(params_template, start_params)
+
+ # Align template values with user-supplied fixes (bounds are not clamped;
+ # pinning happens via FixedConstraintWithValue further below).
+ if fixed_params is not None:
+ apply_fixed_params(params_template, fixed_params)
+
+ # Period-0 measurements and loading mask cover state-latent factors only.
+ # Reconstructed factors' period-0 measurements are handled in the
+ # transition step 0->1.
+ measurements_p0_filtered = {
+ f: m for f, m in measurements_p0.items() if f in state_latent_factors
+ }
+ all_measures_full = _get_ordered_measures(measurements_p0)
+ all_measures = _get_ordered_measures(measurements_p0_filtered)
+ if len(all_measures) != len(all_measures_full):
+ col_indices = jnp.array(
+ [all_measures_full.index(m) for m in all_measures], dtype=jnp.int32
+ )
+ measurements = measurements[:, col_indices]
+ loading_mask = _build_loading_mask(
+ all_measures, state_latent_factors, measurements_p0_filtered
+ )
+
+ # Halton quadrature nodes: dimension equals the state-latent count
+ # (observed factors are conditioned on, not integrated over, via the
+ # Schur complement).
+ nodes, weights = create_halton_nodes_and_weights(
+ af_options.n_halton_points,
+ n_state_latent,
+ )
+
+ # Translate normalization fixes and user-supplied fixes into FixedConstraints
+ # so they compose with other constraints (e.g. ProbabilityConstraint).
+ full_params_df, fixed_constraints = build_optimagic_inputs(
+ params_template, fixed_params
+ )
+
+ n_obs_per_batch = af_options.n_obs_per_batch
+ if n_obs_per_batch is None:
+ n_obs_per_batch = auto_n_obs_per_batch(
+ n_obs=int(measurements.shape[0]),
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ n_latent=n_joint,
+ n_endogenous=0,
+ )
+
+ loglike_kwargs = {
+ "n_factors": n_joint,
+ "n_latent_factors": n_state_latent,
+ "n_mixture_components": n_components,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ "measurements": measurements,
+ "controls": controls,
+ "observed_factor_values": obs_values,
+ "loading_mask": jnp.array(loading_mask),
+ "nodes": nodes,
+ "weights": weights,
+ "stability_floor": af_options.stability_floor,
+ "n_obs_per_batch": n_obs_per_batch,
+ }
+
+ loglike_and_grad = create_loglike_and_gradient(
+ af_loglike_initial,
+ **loglike_kwargs,
+ )
+
+ def fun(params_df: pd.DataFrame) -> float:
+ val, _grad = loglike_and_grad(jnp.array(params_df["value"].to_numpy()))
+ return float(val)
+
+ def fun_and_jac(params_df: pd.DataFrame) -> tuple[float, np.ndarray]:
+ val, grad = loglike_and_grad(jnp.array(params_df["value"].to_numpy()))
+ return float(val), np.array(grad)
+
+ within_step_constraints = filter_within_step_constraints(
+ user_constraints, full_params_df.index
+ )
+ combined_constraints = list(fixed_constraints) + within_step_constraints
+ full_params_df = reconcile_start_to_equality(
+ full_params_df, within_step_constraints
+ )
+
+ opt_res = om.minimize(
+ fun=fun,
+ params=full_params_df[["value"]],
+ algorithm=af_options.optimizer_algorithm,
+ bounds=om.Bounds(
+ lower=full_params_df["lower_bound"],
+ upper=full_params_df["upper_bound"],
+ ),
+ constraints=combined_constraints or None,
+ fun_and_jac=fun_and_jac,
+ **to_plain_dict(af_options.optimizer_options),
+ )
+
+ # Write optimized values back into full template
+ result_params = params_template.copy()
+ result_params["value"] = opt_res.params["value"].to_numpy()
+
+ # Extract conditional distribution (state factors only for AF propagation),
+ # building the per-obs importance sample of skills_0 from the same Halton
+ # design used for the optimization.
+ sf = state_factors if state_factors is not None else factors
+ cond_dist = _extract_conditional_distribution(
+ result_params,
+ len(sf),
+ n_components,
+ sf,
+ nodes=nodes,
+ observed_factor_values=obs_values,
+ n_summary_halton=af_options.n_halton_points_posterior_summary,
+ )
+
+ period_result = AFPeriodResult(
+ period=0,
+ params=result_params,
+ loglikelihood=-float(opt_res.fun),
+ success=bool(opt_res.success),
+ optimize_result=opt_res,
+ )
+
+ return period_result, cond_dist
+
+
+def _get_ordered_measures(
+ measurements_per_factor: dict[str, tuple[str, ...]],
+) -> list[str]:
+ """Get all measurement variables in a deterministic order."""
+ seen: set[str] = set()
+ result: list[str] = []
+ for measures in measurements_per_factor.values():
+ for m in measures:
+ if m not in seen:
+ seen.add(m)
+ result.append(m)
+ return result
+
+
+def _build_loading_mask(
+ all_measures: list[str],
+ factors: tuple[str, ...],
+ measurements_per_factor: dict[str, tuple[str, ...]],
+) -> np.ndarray:
+ """Build boolean mask for which (measure, factor) pairs have loadings."""
+ n_measures = len(all_measures)
+ n_factors = len(factors)
+ mask = np.zeros((n_measures, n_factors), dtype=bool)
+ meas_idx = {m: i for i, m in enumerate(all_measures)}
+ fac_idx = {f: i for i, f in enumerate(factors)}
+ for factor, measures in measurements_per_factor.items():
+ fi = fac_idx[factor]
+ for m in measures:
+ mi = meas_idx[m]
+ mask[mi, fi] = True
+ return mask
+
+
+def _initialize_params_heuristic(
+ params_template: pd.DataFrame,
+ measurements: Array,
+ _controls: Array,
+ _n_factors: int,
+ n_components: int,
+ observed_factors: tuple[str, ...] = (),
+ observed_factor_values: Array | None = None,
+) -> pd.DataFrame:
+ """Initialize parameters using simple heuristics.
+
+ Use measurement means and variances to set reasonable starting values
+ for mixture means, variances, loadings, and measurement SDs. When
+ observed factors are present, their means come from sample means and
+ their Cholesky diagonals from sample SDs.
+ """
+ params = params_template.copy()
+ meas_np = np.array(measurements)
+
+ # Overall mean and SD of first measurement as proxy for latent factor distribution
+ meas_mean = float(np.nanmean(meas_np[:, 0]))
+ meas_sd = float(np.nanstd(meas_np[:, 0]))
+ if meas_sd < 1e-8:
+ meas_sd = 1.0
+
+ obs_means, obs_sds = _observed_factor_stats(
+ observed_factors, observed_factor_values, n_rows=meas_np.shape[0]
+ )
+
+ # Set mixture weights to uniform
+ weight_mask = params.index.get_level_values("category") == "mixture_weights"
+ params.loc[weight_mask, "value"] = 1.0 / n_components
+
+ _set_initial_mixture_means(
+ params, n_components, meas_mean, meas_sd, obs_means, obs_sds
+ )
+ _set_initial_cholcov_diagonals(params, meas_sd, obs_sds)
+
+ # Set measurement SDs to half the observed SD
+ sd_mask = params.index.get_level_values("category") == "meas_sds"
+ for i, idx in enumerate(params.index[sd_mask]):
+ obs_sd = float(np.nanstd(meas_np[:, i])) if i < meas_np.shape[1] else 1.0
+ params.loc[idx, "value"] = max(obs_sd * 0.5, 0.01)
+
+ # Set loadings to 1.0 (where not fixed)
+ load_mask = params.index.get_level_values("category") == "loadings"
+ for idx in params.index[load_mask]:
+ if params.loc[idx, "lower_bound"] != params.loc[idx, "upper_bound"]:
+ params.loc[idx, "value"] = 1.0
+
+ # Set control intercepts to measurement means (where not fixed)
+ ctrl_mask = params.index.get_level_values("category") == "controls"
+ for idx in params.index[ctrl_mask]:
+ if (
+ idx[3] == "constant"
+ and params.loc[idx, "lower_bound"] != params.loc[idx, "upper_bound"]
+ ):
+ params.loc[idx, "value"] = 0.0
+
+ return params
+
+
+def _set_initial_mixture_means(
+ params: pd.DataFrame,
+ n_components: int,
+ meas_mean: float,
+ meas_sd: float,
+ obs_means: dict[str, float],
+ obs_sds: dict[str, float],
+) -> None:
+ """Set initial_states values in place: spread components around sample means."""
+ mean_mask = params.index.get_level_values("category") == "initial_states"
+ mean_vals = params.loc[mean_mask, "value"].copy()
+ for idx in mean_vals.index:
+ comp = idx[2]
+ factor = idx[3]
+ component_offset = (int(comp.split("_")[1]) - (n_components - 1) / 2) * 0.5
+ if factor in obs_means:
+ mean_vals.loc[idx] = obs_means[factor] + component_offset * obs_sds[factor]
+ else:
+ mean_vals.loc[idx] = meas_mean + component_offset * meas_sd
+ params.loc[mean_mask, "value"] = mean_vals
+
+
+def _set_initial_cholcov_diagonals(
+ params: pd.DataFrame,
+ meas_sd: float,
+ obs_sds: dict[str, float],
+) -> None:
+ """Set initial_cholcovs diagonals to factor sample SD, off-diags to 0."""
+ chol_mask = params.index.get_level_values("category") == "initial_cholcovs"
+ for idx in params.index[chol_mask]:
+ parts = idx[3].split("-")
+ if len(parts) == 2 and parts[0] == parts[1]:
+ params.loc[idx, "value"] = obs_sds.get(parts[0], meas_sd * 0.5)
+ else:
+ params.loc[idx, "value"] = 0.0
+
+
+def _observed_factor_stats(
+ observed_factors: tuple[str, ...],
+ observed_factor_values: Array | None,
+ n_rows: int,
+) -> tuple[dict[str, float], dict[str, float]]:
+ """Return per-observed-factor sample means and SDs (SDs clipped to >= 0.01)."""
+ obs_vals_np = (
+ np.array(observed_factor_values)
+ if observed_factor_values is not None
+ else np.zeros((n_rows, 0))
+ )
+ obs_means = {
+ factor: float(np.nanmean(obs_vals_np[:, i]))
+ for i, factor in enumerate(observed_factors)
+ }
+ obs_sds = {
+ factor: max(float(np.nanstd(obs_vals_np[:, i])), 0.01)
+ for i, factor in enumerate(observed_factors)
+ }
+ return obs_means, obs_sds
+
+
+def _extract_conditional_distribution( # noqa: PLR0915
+ params: pd.DataFrame,
+ _n_factors: int,
+ n_components: int,
+ factors: tuple[str, ...],
+ nodes: Array,
+ observed_factor_values: Array,
+ n_summary_halton: int | None = None,
+) -> ConditionalDistribution:
+ """Extract the initial distribution and build the period-0 importance sample.
+
+ For each mixture component l, build a per-obs importance sample of
+ skills_0 of shape ``(n_halton, n_obs, n_state)``, conditional (where
+ applicable) on the observed factor values via the Schur complement.
+ Per-obs mixture weights `p(l | Y_i)` are computed by Bayes' rule from
+ the marginal density of Y_i under each component.
+
+ These samples are propagated forward across periods (rather than being
+ re-collapsed to a Gaussian mixture and re-drawn freshly) so the
+ non-Gaussian shape of skills_t survives transitions through the CES
+ production function.
+ """
+ # Mixture weights
+ weight_mask = params.index.get_level_values("category") == "mixture_weights"
+ weights_raw = jnp.array(params.loc[weight_mask, "value"].to_numpy())
+ weights = weights_raw / weights_raw.sum()
+
+ # Determine joint factor ordering from the stored initial_states entries
+ joint_factors = _get_joint_factors_in_order(params, n_components)
+ n_state = len(factors)
+ n_obs = int(observed_factor_values.shape[0])
+ n_obs_factors = int(observed_factor_values.shape[1])
+
+ # Indices into joint_factors:
+ # - target_idx: positions of `factors` (the state factors we want samples for).
+ # - obs_idx: positions of observed factors at the joint's tail.
+ # Joint stores (state_latent_factors, observed_factors) in that order.
+ target_idx = jnp.array([joint_factors.index(f) for f in factors], dtype=jnp.int32)
+ obs_idx = jnp.array(
+ [
+ joint_factors.index(joint_factors[len(joint_factors) - n_obs_factors + k])
+ for k in range(n_obs_factors)
+ ],
+ dtype=jnp.int32,
+ )
+
+ # `samples_per_component` is only used for the posterior-state
+ # summary (mean / chol_cov per mixture component); the transition
+ # likelihood rebuilds the chain on-demand from `chain_links` at the
+ # full `n_halton_points`. Subsample the Halton design here so the
+ # persistent `(n_summary, n_obs, n_state)` tensor stays small.
+ n_full = int(nodes.shape[0])
+ n_summary = n_full if n_summary_halton is None else min(n_full, n_summary_halton)
+ summary_nodes = nodes[:n_summary]
+
+ components: list[MixtureComponent] = []
+ samples_per_component: list[Array] = []
+ log_unnorm_weights_per_component: list[Array] = []
+ cond_means_per_component: list[Array] = []
+ cond_chols_per_component: list[Array] = []
+
+ for m in range(n_components):
+ joint_mean = jnp.array(
+ [
+ float(params.loc[("initial_states", 0, f"mixture_{m}", fac), "value"]) # ty: ignore[invalid-argument-type]
+ for fac in joint_factors
+ ]
+ )
+ joint_chol = _assemble_joint_chol(params, joint_factors, m)
+ joint_cov = joint_chol @ joint_chol.T
+
+ mu_theta = joint_mean[target_idx]
+ cov_tt = joint_cov[target_idx[:, None], target_idx[None, :]]
+
+ if n_obs_factors == 0:
+ sub_mean = mu_theta
+ sub_chol = jnp.linalg.cholesky(cov_tt + 1e-10 * jnp.eye(n_state))
+ z_for_state = summary_nodes[:, :n_state]
+ per_node = sub_mean[None, :] + z_for_state @ sub_chol.T
+ samples = jnp.broadcast_to(
+ per_node[:, None, :], (n_summary, n_obs, n_state)
+ )
+ log_unnorm = jnp.full((n_obs,), float(jnp.log(weights[m] + 1e-300)))
+ # Per-obs cond_means broadcast (n_obs, n_state); shared chol.
+ cond_means_obs = jnp.broadcast_to(sub_mean[None, :], (n_obs, n_state))
+ cond_chol_comp = sub_chol
+ else:
+ mu_y = joint_mean[obs_idx]
+ cov_ty = joint_cov[target_idx[:, None], obs_idx[None, :]]
+ cov_yy = joint_cov[obs_idx[:, None], obs_idx[None, :]]
+
+ chol_yy = jnp.linalg.cholesky(cov_yy)
+ solve_tt = jax.scipy.linalg.cho_solve((chol_yy, True), cov_ty.T)
+ cond_cov = cov_tt - cov_ty @ solve_tt + 1e-10 * jnp.eye(n_state)
+ cond_chol = jnp.linalg.cholesky(cond_cov)
+
+ def _per_obs(
+ y_i: Array,
+ chol_yy: Array = chol_yy,
+ mu_y: Array = mu_y,
+ mu_theta: Array = mu_theta,
+ cov_ty: Array = cov_ty,
+ ) -> tuple[Array, Array]:
+ alpha = jax.scipy.linalg.cho_solve((chol_yy, True), y_i - mu_y)
+ cond_mean = mu_theta + cov_ty @ alpha
+ log_marg_y = _log_mvn_pdf_chol(y_i, mu_y, chol_yy)
+ return cond_mean, log_marg_y
+
+ cond_means, log_margs = jax.vmap(_per_obs)(observed_factor_values)
+ z_for_state = summary_nodes[:, :n_state]
+ samples = cond_means[None, :, :] + (z_for_state @ cond_chol.T)[:, None, :]
+ sub_mean = mu_theta
+ sub_chol = cond_chol
+ log_unnorm = jnp.log(weights[m] + 1e-300) + log_margs
+ cond_means_obs = cond_means
+ cond_chol_comp = cond_chol
+
+ components.append(MixtureComponent(mean=sub_mean, chol_cov=sub_chol))
+ samples_per_component.append(samples)
+ log_unnorm_weights_per_component.append(log_unnorm)
+ cond_means_per_component.append(cond_means_obs)
+ cond_chols_per_component.append(cond_chol_comp)
+
+ if n_obs_factors > 0:
+ log_w_stack = jnp.stack(
+ log_unnorm_weights_per_component, axis=-1
+ ) # (n_obs, n_components)
+ cond_weights = jax.nn.softmax(log_w_stack, axis=-1)
+ else:
+ cond_weights = jnp.broadcast_to(weights[None, :], (n_obs, n_components))
+
+ return ConditionalDistribution(
+ mixture_weights=weights,
+ components=tuple(components),
+ samples_per_component=tuple(samples_per_component),
+ conditional_weights=cond_weights,
+ cond_means=jnp.stack(cond_means_per_component, axis=0),
+ cond_chols=jnp.stack(cond_chols_per_component, axis=0),
+ )
+
+
+def _get_joint_factors_in_order(
+ params: pd.DataFrame,
+ n_components: int,
+) -> tuple[str, ...]:
+ """Return the joint factor ordering used in initial_states entries."""
+ mask = (params.index.get_level_values("category") == "initial_states") & (
+ params.index.get_level_values("name1") == f"mixture_{n_components - 1}"
+ )
+ del n_components
+ return tuple(params.loc[mask].index.get_level_values("name2"))
+
+
+def _assemble_joint_chol(
+ params: pd.DataFrame,
+ joint_factors: tuple[str, ...],
+ component: int,
+) -> Array:
+ """Build the lower-triangular joint Cholesky matrix for one component."""
+ n = len(joint_factors)
+ chol = jnp.zeros((n, n))
+ for row, f1 in enumerate(joint_factors):
+ for col, f2 in enumerate(joint_factors):
+ if col <= row:
+ loc = ("initial_cholcovs", 0, f"mixture_{component}", f"{f1}-{f2}")
+ val = float(params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ chol = chol.at[row, col].set(val) # noqa: PD008
+ return chol
+
+
+def _apply_moment_based_overrides_initial( # noqa: C901, PLR0912
+ params: pd.DataFrame,
+ measurements: Array,
+ measurements_per_factor: dict[str, tuple[str, ...]],
+ all_measures: list[str],
+ normalizations: dict[str, dict[tuple[str, str], float]],
+ n_components: int,
+) -> pd.DataFrame:
+ """Override static initialization with Spearman cross-cov moments.
+
+ For each latent factor with at least two period-0 measurements, apply
+ `spearman_factor_moments` to the corresponding columns of
+ `measurements` and write the recovered loadings, sigma_meas, and per-component
+ Cholesky-diagonal sqrt(Var(F)) values into `params`. Skip rows where
+ `lower_bound == upper_bound` (i.e. user normalizations or fixed
+ constraints).
+
+ The anchor measurement is determined from `normalizations["loadings"]`
+ when a loading is pinned for the factor; otherwise the first measurement
+ is the anchor.
+ """
+ out = params.copy()
+ meas_np = np.array(measurements)
+ n_obs = meas_np.shape[0]
+ if n_obs == 0:
+ return out
+ meas_index = {m: i for i, m in enumerate(all_measures)}
+ loading_norms = normalizations.get("loadings", {})
+
+ for factor, factor_meas in measurements_per_factor.items():
+ if len(factor_meas) < 2:
+ continue
+ cols = [meas_index[m] for m in factor_meas if m in meas_index]
+ if len(cols) < 2:
+ continue
+ sub = meas_np[:, cols]
+
+ # Anchor: pick the measurement whose loading is pinned for this
+ # factor, falling back to the first measurement.
+ anchor_loading = 1.0
+ anchor_local = 0
+ for local_idx, meas_name in enumerate(factor_meas):
+ if (meas_name, factor) in loading_norms:
+ anchor_local = local_idx
+ anchor_loading = float(loading_norms[(meas_name, factor)])
+ break
+
+ result = spearman_factor_moments(
+ sub,
+ anchor_idx=anchor_local,
+ anchor_loading=anchor_loading,
+ )
+ if not result.valid:
+ continue
+
+ # Override loadings (skip pinned rows).
+ for local_idx, meas_name in enumerate(factor_meas):
+ loc = ("loadings", 0, meas_name, factor)
+ if loc not in out.index:
+ continue
+ if out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]:
+ out.loc[loc, "value"] = float(result.loadings[local_idx])
+
+ # Override measurement SDs (skip pinned rows).
+ for local_idx, meas_name in enumerate(factor_meas):
+ loc = ("meas_sds", 0, meas_name, "-")
+ if loc not in out.index:
+ continue
+ if out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]:
+ out.loc[loc, "value"] = float(result.meas_sds[local_idx])
+
+ # Override per-component Cholesky diagonal for this factor with
+ # sqrt(Var(F)). Off-diagonals stay at 0 (set by the heuristic).
+ sd_factor = float(np.sqrt(max(result.latent_var, 1e-12)))
+ for comp in range(n_components):
+ loc = (
+ "initial_cholcovs",
+ 0,
+ f"mixture_{comp}",
+ f"{factor}-{factor}",
+ )
+ if loc not in out.index:
+ continue
+ if out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]:
+ out.loc[loc, "value"] = sd_factor
+
+ return out
diff --git a/src/skillmodels/af/likelihood.py b/src/skillmodels/af/likelihood.py
new file mode 100644
index 00000000..1eb537c2
--- /dev/null
+++ b/src/skillmodels/af/likelihood.py
@@ -0,0 +1,1307 @@
+"""JAX-based likelihood functions for AF estimation.
+
+All functions are JAX-compatible (jittable, differentiable via jax.grad).
+"""
+
+import functools
+from collections.abc import Callable, Mapping
+from typing import Any
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+from jax import Array
+
+from skillmodels.af.types import ChainLink
+
+
+def af_per_obs_loglike_initial(
+ params: Array,
+ *,
+ n_factors: int,
+ n_mixture_components: int,
+ n_measures: int,
+ n_controls: int,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ nodes: Array,
+ weights: Array,
+ stability_floor: float,
+ n_latent_factors: int | None = None,
+ observed_factor_values: Array | None = None,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Per-observation log-likelihood for the initial period (Step 0).
+
+ Same inputs as `af_loglike_initial`; returns the shape-``(n_obs,)``
+ vector of per-observation log-likelihoods instead of the aggregated
+ negative mean. Used for score-based inference.
+ """
+ n_latent = n_factors if n_latent_factors is None else n_latent_factors
+ n_obs_factors = n_factors - n_latent
+
+ parsed = _parse_initial_params(
+ params,
+ n_factors,
+ n_mixture_components,
+ n_measures,
+ n_controls,
+ )
+
+ if n_obs_factors == 0:
+ return _initial_loglike_per_obs(
+ mixture_weights=parsed["mixture_weights"],
+ mixture_means=parsed["mixture_means"],
+ mixture_chol_covs=parsed["mixture_chol_covs"],
+ control_params=parsed["control_params"],
+ loadings=parsed["loadings"],
+ meas_sds=parsed["meas_sds"],
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ nodes=nodes,
+ weights=weights,
+ stability_floor=stability_floor,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+ assert observed_factor_values is not None # noqa: S101
+ return _initial_loglike_per_obs_conditional(
+ mixture_weights=parsed["mixture_weights"],
+ mixture_means=parsed["mixture_means"],
+ mixture_chol_covs=parsed["mixture_chol_covs"],
+ control_params=parsed["control_params"],
+ loadings=parsed["loadings"],
+ meas_sds=parsed["meas_sds"],
+ measurements=measurements,
+ controls=controls,
+ observed_factor_values=observed_factor_values,
+ loading_mask=loading_mask,
+ nodes=nodes,
+ weights=weights,
+ n_latent=n_latent,
+ stability_floor=stability_floor,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+
+
+def af_loglike_initial(
+ params: Array,
+ *,
+ n_factors: int,
+ n_mixture_components: int,
+ n_measures: int,
+ n_controls: int,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ nodes: Array,
+ weights: Array,
+ stability_floor: float,
+ n_latent_factors: int | None = None,
+ observed_factor_values: Array | None = None,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Negative log-likelihood for the initial period (Step 0).
+
+ Integrate over latent factors using Halton quadrature.
+
+ When `n_latent_factors == n_factors` (no observed factors in the joint
+ distribution), the likelihood reduces to::
+
+ L_i = sum_q w_q * sum_l pi_l
+ * prod_m N(Z_{0,m,i} | c_m + lam_m' theta_q,l, sd_m)
+
+ where theta_q,l = mu_l + L_l @ z_q.
+
+ When `n_latent_factors < n_factors` (joint distribution over
+ (latent, observed)), for each individual i::
+
+ L_i = p(Y_i) * sum_q w_q * sum_l pi_{l|Y_i}
+ * prod_m N(Z_{0,m,i} | c_m + lam_m' theta_{q,l|Y_i}, sd_m)
+
+ where theta_{q,l|Y_i} is drawn from the conditional N(mu_{theta|Y,l,i},
+ Sigma_{theta|Y,l}) via the Schur complement, and pi_{l|Y_i} are the
+ posterior component weights given Y_i.
+
+ Estimand and assumption (observed factors present):
+ With observed factors this objective is the JOINT maximum
+ likelihood of (Z_theta,0, Y_0) under a single finite Gaussian
+ mixture for the joint (theta_0, Y_0). Concretely::
+
+ L_i = sum_l pi_l N(Y_i | mu_Y,l, Sigma_YY,l)
+ * integral p(Z_i | theta) p(theta | Y_i, l) dtheta
+ = p(Z_i, Y_i).
+
+ This is NOT the conditional likelihood f(Z_theta,0 | Y_0); the two
+ differ by the additive term log p(Y_i) = log sum_l pi_l
+ N(Y_i | mu_Y,l, Sigma_YY,l). The joint formulation requires the
+ stronger (and here deliberate) assumption that the mixture also
+ models the MARGINAL distribution of Y correctly. This is
+ intentional: the marginal-Y parameters (mu_Y, Sigma_YY,
+ Sigma_theta,Y) it identifies are reused to build the
+ Schur-complement conditional f(theta_0 | Y_0) and posterior
+ weights p(l | Y_i) that are propagated forward by the transition
+ step. Switching to a conditional MLE (subtracting log p(Y_i))
+ would leave those parameters under-identified and is therefore not
+ done here.
+
+ Args:
+ params: Full parameter vector in template order. Fixed entries are
+ held constant by optimagic `FixedConstraint`s attached outside.
+ n_factors: Number of factors in the joint initial distribution
+ (state latents + observed). Reconstructed factors
+ (``has_initial_distribution=False``) are excluded from this
+ count; their period-0 measurements are estimated in the
+ period 0->1 transition step instead.
+ n_mixture_components: Number of mixture components.
+ n_measures: Number of measurement variables in period 0.
+ n_controls: Number of control variables (including constant).
+ measurements: Shape (n_obs, n_measures), observed measurements.
+ controls: Shape (n_obs, n_controls), control variable values.
+ loading_mask: Shape (n_measures, n_state_latent), True where loading
+ exists.
+ nodes: Shape (n_nodes, n_state_latent), standard normal quadrature
+ nodes.
+ weights: Shape (n_nodes,), quadrature weights.
+ stability_floor: Small constant added for numerical stability.
+ n_latent_factors: Number of state latent factors in the mixture.
+ Defaults to ``n_factors`` when no observed factors are present.
+ observed_factor_values: Shape (n_obs, n_obs_factors), observed factor
+ values used for Schur-complement conditioning. Required when
+ ``n_latent_factors < n_factors``.
+ n_obs_per_batch: Observations per reverse-mode autodiff chunk.
+ ``None`` falls back to ``jax.vmap`` (single kernel); a positive
+ integer uses ``jax.lax.map`` so the backward-pass tape only
+ retains one chunk at a time.
+
+ Return:
+ Scalar negative log-likelihood.
+
+ """
+ log_likes = af_per_obs_loglike_initial(
+ params,
+ n_factors=n_factors,
+ n_mixture_components=n_mixture_components,
+ n_measures=n_measures,
+ n_controls=n_controls,
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ nodes=nodes,
+ weights=weights,
+ stability_floor=stability_floor,
+ n_latent_factors=n_latent_factors,
+ observed_factor_values=observed_factor_values,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+ return -jnp.mean(log_likes)
+
+
+def _parse_initial_params(
+ params: Array,
+ n_factors: int,
+ n_mixture_components: int,
+ n_measures: int,
+ n_controls: int,
+) -> dict[str, Array]:
+ """Parse flat parameter vector into structured initial-period params."""
+ idx = 0
+
+ # Mixture weights
+ mixture_weights = params[idx : idx + n_mixture_components]
+ mixture_weights = mixture_weights / mixture_weights.sum()
+ idx += n_mixture_components
+
+ # Mixture means: (n_components, n_factors)
+ n_mean = n_mixture_components * n_factors
+ mixture_means = params[idx : idx + n_mean].reshape(n_mixture_components, n_factors)
+ idx += n_mean
+
+ # Mixture Cholesky covariances: (n_components, n_factors, n_factors) lower tri
+ n_chol = n_factors * (n_factors + 1) // 2
+ mixture_chol_covs = jnp.zeros((n_mixture_components, n_factors, n_factors))
+ for m in range(n_mixture_components):
+ chol_flat = params[idx : idx + n_chol]
+ idx += n_chol
+ chol = jnp.zeros((n_factors, n_factors))
+ chol = chol.at[jnp.tril_indices(n_factors)].set(chol_flat)
+ mixture_chol_covs = mixture_chol_covs.at[m].set(chol)
+
+ # Control params: (n_measures, n_controls)
+ n_ctrl = n_measures * n_controls
+ control_params = params[idx : idx + n_ctrl].reshape(n_measures, n_controls)
+ idx += n_ctrl
+
+ # Loadings: (n_measures, n_factors) -- sparse, packed
+ n_loadings = int(params.shape[0]) - idx - n_measures
+ loadings_flat = params[idx : idx + n_loadings]
+ idx += n_loadings
+
+ # Measurement SDs
+ meas_sds = params[idx : idx + n_measures]
+
+ return {
+ "mixture_weights": mixture_weights,
+ "mixture_means": mixture_means,
+ "mixture_chol_covs": mixture_chol_covs,
+ "control_params": control_params,
+ "loadings": loadings_flat,
+ "meas_sds": meas_sds,
+ }
+
+
+def _map_over_obs(
+ f: Callable,
+ *xs: Array | np.ndarray,
+ n_obs_per_batch: int | None,
+) -> Array:
+ """Map ``f`` over the leading axis of ``xs``, optionally in batches.
+
+ When ``n_obs_per_batch`` is ``None`` or at least as large as the
+ leading axis, falls back to ``jax.vmap`` (single kernel). Otherwise
+ uses ``jax.lax.map`` so the reverse-mode autodiff tape only needs to
+ retain one chunk at a time. Combined with ``jax.checkpoint`` on
+ ``f``, this makes reverse-mode memory proportional to
+ ``n_obs_per_batch`` rather than to the full ``n_obs``.
+ """
+ n_obs = xs[0].shape[0]
+ if n_obs_per_batch is None or n_obs_per_batch >= n_obs:
+ return jax.vmap(f)(*xs)
+
+ def _tupled(args: tuple[Array, ...]) -> Array:
+ return f(*args)
+
+ return jax.lax.map(_tupled, xs, batch_size=n_obs_per_batch)
+
+
+def _initial_loglike_per_obs(
+ *,
+ mixture_weights: Array,
+ mixture_means: Array,
+ mixture_chol_covs: Array,
+ control_params: Array,
+ loadings: Array,
+ meas_sds: Array,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ nodes: Array,
+ weights: Array,
+ n_obs_per_batch: int | None = None,
+ stability_floor: float,
+) -> Array:
+ """Compute log-likelihood for each observation at the initial period.
+
+ Return:
+ Shape (n_obs,) log-likelihood per observation.
+
+ """
+ # Expand loadings into full matrix using mask
+ n_measures, n_factors = loading_mask.shape
+ full_loadings = jnp.zeros((n_measures, n_factors))
+ full_loadings = full_loadings.at[loading_mask].set(loadings)
+
+ # NaN-safety: build per-obs measurement mask and replace NaN entries
+ # with 0 so residuals stay finite. The mask is used inside the
+ # integral to zero out missing-measurement contributions.
+ meas_mask = jnp.isfinite(measurements)
+ safe_measurements = jnp.where(meas_mask, measurements, 0.0)
+
+ # Control contribution: (n_obs, n_measures)
+ control_contrib = controls @ control_params.T
+
+ # Residuals before factor contribution: (n_obs, n_measures)
+ residuals_base = safe_measurements - control_contrib
+
+ @jax.checkpoint
+ def _single_obs_loglike(residual_base: Array, mask_i: Array) -> Array:
+ """Log-likelihood for a single observation, integrated over factors.
+
+ `jax.checkpoint` keeps the forward pass small: the per-observation
+ quadrature tape is discarded and recomputed during the backward
+ pass, so reverse-mode autodiff memory scales with the per-obs
+ parameter footprint instead of ``n_obs * n_quadrature_nodes``.
+ """
+ return _integrate_initial_single_obs(
+ residual_base=residual_base,
+ meas_mask=mask_i,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ mixture_weights=mixture_weights,
+ mixture_means=mixture_means,
+ mixture_chol_covs=mixture_chol_covs,
+ nodes=nodes,
+ weights=weights,
+ stability_floor=stability_floor,
+ )
+
+ return _map_over_obs(
+ _single_obs_loglike,
+ residuals_base,
+ meas_mask,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+
+
+def _initial_loglike_per_obs_conditional(
+ *,
+ mixture_weights: Array,
+ mixture_means: Array,
+ mixture_chol_covs: Array,
+ control_params: Array,
+ loadings: Array,
+ meas_sds: Array,
+ measurements: Array,
+ controls: Array,
+ observed_factor_values: Array,
+ loading_mask: Array,
+ nodes: Array,
+ weights: Array,
+ n_latent: int,
+ stability_floor: float,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Per-observation log-likelihood with Schur-complement conditioning.
+
+ For each individual i with observed factors Y_i, the likelihood is::
+
+ L_i = p(Y_i) * integral p(Z_i | theta) p(theta | Y_i) dtheta
+ = sum_l pi_l N(Y_i | mu_Y_l, Sigma_YY_l)
+ * sum_q w_q prod_m N(residual_m | 0, sd_m)
+
+ where theta is drawn from p(theta | Y_i, component l) using the
+ conditional mean and Cholesky factor derived from the joint
+ (latent, observed) covariance matrix via the Schur complement.
+
+ Note the identity: combining the log-mixture over components l with
+ the measurement density gives an equivalent formulation where each
+ component's contribution is weighted by pi_l * N(Y_i | mu_Y_l, Sigma_YY_l).
+
+ The `N(Y_i | mu_Y_l, Sigma_YY_l)` factor is an intentional JOINT-density
+ term: the objective is the joint MLE of (Z_theta,0, Y_0), not the
+ conditional f(Z|Y). See `af_loglike_initial` for the assumption this
+ encodes.
+
+ """
+ n_measures = loading_mask.shape[0]
+ full_loadings = jnp.zeros((n_measures, n_latent))
+ full_loadings = full_loadings.at[loading_mask].set(loadings)
+
+ # NaN-safety for measurements (see `_initial_loglike_per_obs`).
+ meas_mask = jnp.isfinite(measurements)
+ safe_measurements = jnp.where(meas_mask, measurements, 0.0)
+
+ control_contrib = controls @ control_params.T
+ residuals_base = safe_measurements - control_contrib
+
+ @jax.checkpoint
+ def _single_obs_loglike(residual_base: Array, y_i: Array, mask_i: Array) -> Array:
+ return _integrate_initial_single_obs_conditional(
+ residual_base=residual_base,
+ y_i=y_i,
+ meas_mask=mask_i,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ mixture_weights=mixture_weights,
+ mixture_means=mixture_means,
+ mixture_chol_covs=mixture_chol_covs,
+ nodes=nodes,
+ weights=weights,
+ n_latent=n_latent,
+ stability_floor=stability_floor,
+ )
+
+ return _map_over_obs(
+ _single_obs_loglike,
+ residuals_base,
+ observed_factor_values,
+ meas_mask,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+
+
+def _integrate_initial_single_obs_conditional(
+ *,
+ residual_base: Array,
+ y_i: Array,
+ meas_mask: Array,
+ full_loadings: Array,
+ meas_sds: Array,
+ mixture_weights: Array,
+ mixture_means: Array,
+ mixture_chol_covs: Array,
+ nodes: Array,
+ weights: Array,
+ n_latent: int,
+ stability_floor: float,
+) -> Array:
+ """Quadrature integration for one individual with observed-factor conditioning.
+
+ Per component l:
+ - Split joint (mu, L) into latent and observed blocks.
+ - Compute marginal p(Y_i | l) from (mu_Y_l, L_Y_l).
+ - Compute conditional mean mu_{theta | Y_i, l} and Cholesky L_{theta | Y, l}
+ via Schur complement.
+ - Transform nodes: theta_q = mu_{theta|Y,l} + L_{theta|Y,l} @ z_q.
+ - Evaluate measurement density at theta_q, sum over quadrature.
+
+ Aggregate with log-sum-exp over components.
+ """
+ n_components = mixture_weights.shape[0]
+
+ def _component_log_kernel(l_idx: Array) -> Array:
+ mu_full = mixture_means[l_idx]
+ chol_full = mixture_chol_covs[l_idx]
+ cov_full = chol_full @ chol_full.T
+
+ mu_theta = mu_full[:n_latent]
+ mu_y = mu_full[n_latent:]
+ cov_tt = cov_full[:n_latent, :n_latent]
+ cov_ty = cov_full[:n_latent, n_latent:]
+ cov_yy = cov_full[n_latent:, n_latent:]
+
+ # Marginal density of Y_i under component l.
+ # `log_marg_y` is an intentional JOINT-density term: the objective is
+ # the joint MLE of (Z_theta,0, Y_0), not the conditional f(Z|Y).
+ # See `af_loglike_initial` for the assumption this encodes.
+ chol_yy = jnp.linalg.cholesky(cov_yy)
+ log_marg_y = _log_mvn_pdf_chol(y_i, mu_y, chol_yy)
+
+ # Conditional mean and Cholesky of theta | Y_i
+ alpha = jax.scipy.linalg.cho_solve((chol_yy, True), (y_i - mu_y))
+ cond_mean = mu_theta + cov_ty @ alpha
+ # Sigma_{theta|Y} = Sigma_tt - Sigma_ty Sigma_yy^{-1} Sigma_yt
+ solve_tt = jax.scipy.linalg.cho_solve((chol_yy, True), cov_ty.T)
+ cond_cov = cov_tt - cov_ty @ solve_tt
+ # Jitter for numerical stability before Cholesky
+ cond_cov = cond_cov + 1e-10 * jnp.eye(n_latent)
+ cond_chol = jnp.linalg.cholesky(cond_cov)
+
+ def _log_node(z_q: Array) -> Array:
+ theta_q = cond_mean + cond_chol @ z_q
+ residuals = residual_base - full_loadings @ theta_q
+ log_pdf = _log_normal_pdf(residuals, jnp.zeros_like(residuals), meas_sds)
+ return jnp.sum(jnp.where(meas_mask, log_pdf, 0.0))
+
+ log_meas = jax.vmap(_log_node)(nodes)
+ log_integral = jax.scipy.special.logsumexp(log_meas + jnp.log(weights))
+
+ return (
+ jnp.log(mixture_weights[l_idx] + stability_floor)
+ + log_marg_y
+ + log_integral
+ )
+
+ comp_log = jax.vmap(_component_log_kernel)(jnp.arange(n_components))
+ return jax.scipy.special.logsumexp(comp_log)
+
+
+def _log_mvn_pdf_chol(x: Array, mean: Array, chol: Array) -> Array:
+ """Log pdf of multivariate normal given the lower-triangular Cholesky."""
+ diff = x - mean
+ sol = jax.scipy.linalg.solve_triangular(chol, diff, lower=True)
+ log_det = jnp.sum(jnp.log(jnp.diag(chol)))
+ k = x.shape[0]
+ return -0.5 * k * jnp.log(2 * jnp.pi) - log_det - 0.5 * jnp.dot(sol, sol)
+
+
+def _integrate_initial_single_obs(
+ *,
+ residual_base: Array,
+ meas_mask: Array,
+ full_loadings: Array,
+ meas_sds: Array,
+ mixture_weights: Array,
+ mixture_means: Array,
+ mixture_chol_covs: Array,
+ nodes: Array,
+ weights: Array,
+ stability_floor: float,
+) -> Array:
+ """Quadrature integration for one observation at the initial period.
+
+ For each quadrature node z_q and mixture component l::
+
+ theta_q,l = mu_l + L_l @ z_q
+ kernel = pi_l * N(theta_q,l | mu_l, Sigma_l)
+ * prod_m N(obs_m | loading_m' theta_q,l, sd_m^2)
+
+ Since z_q is standard normal and we transform
+ theta = mu_l + L_l @ z_q, the density of the mixture at theta is
+ already accounted for by the quadrature (importance sampling with
+ the mixture as proposal). So we just need::
+
+ kernel = sum_l pi_l * |L_l|
+ * prod_m N(obs_m | loading_m' (mu_l + L_l @ z_q),
+ sd_m^2)
+
+ But with Halton nodes from N(0,I), the correct formula is::
+
+ L_i = sum_q w_q * sum_l pi_l
+ * prod_m N(residual_m
+ - loading_m' (mu_l + L_l z_q), 0, sd_m)
+
+ """
+ n_components = mixture_weights.shape[0]
+
+ def _node_contribution(z_q: Array) -> Array:
+ """Contribution from one quadrature node."""
+ total = jnp.array(0.0)
+
+ for l_idx in range(n_components):
+ # Transform node to factor space for component l
+ theta_q = mixture_means[l_idx] + mixture_chol_covs[l_idx] @ z_q
+
+ # Measurement residuals: obs - control_contrib - loadings @ theta
+ residuals = residual_base - full_loadings @ theta_q
+
+ # Log measurement density: sum of log N(residual_m, 0, sd_m),
+ # masking out missing measurements (NaN replaced by 0 upstream).
+ log_pdf = _log_normal_pdf(residuals, jnp.zeros_like(residuals), meas_sds)
+ log_meas_density = jnp.sum(jnp.where(meas_mask, log_pdf, 0.0))
+
+ total = total + mixture_weights[l_idx] * jnp.exp(log_meas_density)
+
+ return total
+
+ # Integrate over quadrature nodes
+ contributions = jax.vmap(_node_contribution)(nodes)
+ integrated = jnp.dot(weights, contributions)
+
+ return jnp.log(integrated + stability_floor)
+
+
+def af_per_obs_loglike_transition(
+ params: Array,
+ *,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+ n_measures: int,
+ n_controls: int,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ prev_measurements: Array,
+ prev_controls: Array,
+ prev_loading_mask: Array,
+ prev_control_params: Array,
+ prev_loadings_flat: Array,
+ prev_meas_sds: Array,
+ prev_distribution: Mapping[str, Array | np.ndarray],
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_chain: Array,
+ joint_nodes: Array,
+ joint_weights: Array,
+ transition_func: Callable,
+ total_n_transition_params: int,
+ total_n_inv_params: int,
+ n_inv_eq_params_per: int,
+ observed_factor_values: Array,
+ stability_floor: float,
+ state_factor_indices_in_latent: Array | None = None,
+ n_shock_factors: int | None = None,
+ shock_factor_indices: Array | None = None,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Per-observation log-likelihood for a transition period (Step t).
+
+ Same inputs as `af_loglike_transition`; returns the shape-``(n_obs,)``
+ vector of per-observation log-likelihoods instead of the aggregated
+ negative mean. Used for score-based inference.
+ """
+ effective_n_shock = n_state_factors if n_shock_factors is None else n_shock_factors
+ if shock_factor_indices is None:
+ shock_factor_indices = jnp.arange(effective_n_shock)
+ if state_factor_indices_in_latent is None:
+ # Default: assume state factors precede endogenous factors in the
+ # latent-factor ordering (the existing convention). Callers that
+ # don't follow that convention must pass explicit indices.
+ state_factor_indices_in_latent = jnp.arange(n_state_factors)
+
+ parsed = _parse_transition_params(
+ params,
+ n_state_factors,
+ n_endogenous_factors,
+ n_measures,
+ n_controls,
+ total_n_transition_params,
+ total_n_inv_params,
+ n_inv_eq_params_per,
+ n_shock_factors=effective_n_shock,
+ )
+
+ n_prev_measures = prev_loading_mask.shape[0]
+ n_prev_factors = prev_loading_mask.shape[1]
+ prev_full_loadings = jnp.zeros((n_prev_measures, n_prev_factors))
+ prev_full_loadings = prev_full_loadings.at[prev_loading_mask].set(
+ prev_loadings_flat
+ )
+ prev_control_contrib = prev_controls @ prev_control_params.T
+ # NaN-safety for prev-period measurements (see `_initial_loglike_per_obs`).
+ prev_meas_mask = jnp.isfinite(prev_measurements)
+ safe_prev_measurements = jnp.where(prev_meas_mask, prev_measurements, 0.0)
+ prev_residuals_base = safe_prev_measurements - prev_control_contrib
+
+ return _transition_loglike_per_obs(
+ transition_params=parsed["transition_params"],
+ shock_sds=parsed["shock_sds"],
+ inv_eq_params=parsed["inv_eq_params"],
+ inv_sds=parsed["inv_sds"],
+ control_params=parsed["control_params"],
+ loadings_flat=parsed["loadings_flat"],
+ meas_sds=parsed["meas_sds"],
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ prev_residuals_base=prev_residuals_base,
+ prev_meas_mask=prev_meas_mask,
+ prev_full_loadings=prev_full_loadings,
+ prev_meas_sds=prev_meas_sds,
+ prev_distribution=prev_distribution,
+ chain_links=chain_links,
+ obs_factor_values_chain=obs_factor_values_chain,
+ joint_nodes=joint_nodes,
+ joint_weights=joint_weights,
+ transition_func=transition_func,
+ n_state_factors=n_state_factors,
+ n_endogenous_factors=n_endogenous_factors,
+ n_shock_factors=effective_n_shock,
+ shock_factor_indices=shock_factor_indices,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ observed_factor_values=observed_factor_values,
+ stability_floor=stability_floor,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+
+
+def af_loglike_transition(
+ params: Array,
+ *,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+ n_measures: int,
+ n_controls: int,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ prev_measurements: Array,
+ prev_controls: Array,
+ prev_loading_mask: Array,
+ prev_control_params: Array,
+ prev_loadings_flat: Array,
+ prev_meas_sds: Array,
+ prev_distribution: Mapping[str, Array | np.ndarray],
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_chain: Array,
+ joint_nodes: Array,
+ joint_weights: Array,
+ transition_func: Callable,
+ total_n_transition_params: int,
+ total_n_inv_params: int,
+ n_inv_eq_params_per: int,
+ observed_factor_values: Array,
+ stability_floor: float,
+ state_factor_indices_in_latent: Array | None = None,
+ n_shock_factors: int | None = None,
+ shock_factor_indices: Array | None = None,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Negative log-likelihood for a transition period (Step t).
+
+ Integrate over latent factors at period t-1 and production shocks
+ via a single joint Halton design covering ALL randomness needed at
+ this step (mirroring MATLAB's ``create_nodes_weights_01/12``):
+
+ * the period-0 latent draw ``z_state`` (shared across mixture comps)
+ * one ``z_inv`` and one ``z_P`` per prior chain step (periods 1..t-1)
+ * one ``z_inv`` and one ``z_P`` for the current step (t-1)→t
+
+ The chained sample θ_0 → θ_{t-1} is rebuilt on-demand inside the
+ integrand from this joint Halton via ``_rebuild_chain_at_period``.
+ The likelihood conditions on individual data via re-evaluation of
+ previous-period state-factor measurements at each Halton draw::
+
+ L_i = sum_j w_j * sum_l pi_{l,i}
+ * [prod_m N(Z_{t-1,m,i} | c~_m + lam~_m' th_{t-1}_j, sd~_m)]
+ * [prod_m N(Z_{t,m,i} | c_m + lam_m' th_t_j, sd_m)]
+
+ where ``th_{t-1}_j = chain_rebuild(joint_z_j)`` and
+ ``th_t_j = f(th_{t-1}_j; delta) + sd_shock * z_shock_curr_j``.
+ Tildes denote already-estimated parameters from previous steps.
+
+ Args:
+ params: Full parameter vector in template order. Fixed entries are
+ held constant by optimagic `FixedConstraint`s attached outside.
+ n_state_factors: Number of state factors with transition equations.
+ n_endogenous_factors: Number of endogenous (investment) factors.
+ n_measures: Number of measurements at period t.
+ n_controls: Number of controls at period t.
+ measurements: Shape (n_obs, n_measures), measurements at period t.
+ controls: Shape (n_obs, n_controls), controls at period t.
+ loading_mask: Shape (n_measures, n_state_factors), loading mask.
+ prev_measurements: Shape (n_obs, n_prev_measures), measurements t-1.
+ prev_controls: Shape (n_obs, n_prev_controls), controls at t-1.
+ prev_loading_mask: Shape (n_prev_measures, n_factors), prev loadings.
+ prev_control_params: Shape (n_prev_measures, n_prev_controls), fixed.
+ prev_loadings_flat: Packed loadings from previous period, fixed.
+ prev_meas_sds: Shape (n_prev_measures,), fixed from previous step.
+ prev_distribution: Dict with keys "cond_weights", "means", "chol_covs".
+ joint_nodes: Shape (n_halton, n_state + n_shock + n_endogenous),
+ standard-normal Halton draws partitioned into state, production
+ shock, and investment shock components. `n_shock` equals
+ `n_shock_factors` (defaults to `n_state_factors`).
+ joint_weights: Shape (n_halton,) quadrature weights (uniform
+ 1/n_halton for Halton integration).
+ transition_func: Combined transition f(states, params) -> new_states.
+ total_n_transition_params: Total transition params across all factors.
+ total_n_inv_params: Total investment equation parameters.
+ n_inv_eq_params_per: Investment equation parameters per endogenous factor.
+ observed_factor_values: Shape (n_obs, n_obs_factors), observed factor data.
+ stability_floor: Numerical stability floor.
+ chain_links: Tuple of `ChainLink` objects, one per prior transition
+ step (length `period - 1` for the (period-1)→period step).
+ Empty for the 0→1 step. Carries each prior period's just-fitted
+ parameters so the chain replays from period 0 inside this
+ step's joint-Halton chain rebuild.
+ obs_factor_values_chain: Per-obs observed factor values at each
+ chain link's source period, shape `(n_obs, n_chain,
+ n_observed_factors)`. The current step's observed factors are
+ passed via `observed_factor_values`.
+ state_factor_indices_in_latent: Shape (n_state_factors,) int array
+ mapping each state factor to its column index in the
+ previous-period loading mask (which is in `latent_factors` order
+ = state + endogenous, possibly interleaved). Used to restrict
+ the prev-meas factor to state-factor loadings, mirroring
+ MATLAB's `create_nodes_weights_12` (which omits prev-period
+ inv measurements from the chained-sample importance weight).
+ Defaults to `arange(n_state_factors)` (assuming state factors
+ precede endogenous in the latent ordering).
+ n_shock_factors: Number of state factors that get a production shock.
+ Defaults to `n_state_factors`. Factors without a shock are
+ integrated deterministically (their shock dimension is dropped
+ from the joint Halton draw).
+ shock_factor_indices: Shape (n_shock_factors,) int array mapping each
+ shock slot to its position in the state-factor ordering. Required
+ when `n_shock_factors < n_state_factors`.
+ n_obs_per_batch: Observations per reverse-mode autodiff chunk.
+ ``None`` falls back to ``jax.vmap`` (single kernel); a positive
+ integer uses ``jax.lax.map`` so the backward-pass tape only
+ retains one chunk at a time.
+
+ Return:
+ Scalar negative log-likelihood.
+
+ """
+ log_likes = af_per_obs_loglike_transition(
+ params,
+ n_state_factors=n_state_factors,
+ n_endogenous_factors=n_endogenous_factors,
+ n_measures=n_measures,
+ n_controls=n_controls,
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ prev_measurements=prev_measurements,
+ prev_controls=prev_controls,
+ prev_loading_mask=prev_loading_mask,
+ prev_control_params=prev_control_params,
+ prev_loadings_flat=prev_loadings_flat,
+ prev_meas_sds=prev_meas_sds,
+ prev_distribution=prev_distribution,
+ chain_links=chain_links,
+ obs_factor_values_chain=obs_factor_values_chain,
+ joint_nodes=joint_nodes,
+ joint_weights=joint_weights,
+ transition_func=transition_func,
+ total_n_transition_params=total_n_transition_params,
+ total_n_inv_params=total_n_inv_params,
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ observed_factor_values=observed_factor_values,
+ stability_floor=stability_floor,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ n_shock_factors=n_shock_factors,
+ shock_factor_indices=shock_factor_indices,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+ return -jnp.mean(log_likes)
+
+
+def _parse_transition_params(
+ params: Array,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+ n_measures: int,
+ n_controls: int,
+ total_n_transition_params: int,
+ total_n_inv_params: int,
+ _n_inv_eq_params_per: int,
+ *,
+ n_shock_factors: int | None = None,
+) -> dict[str, Array]:
+ """Parse flat parameter vector for a transition period."""
+ effective_n_shock = n_state_factors if n_shock_factors is None else n_shock_factors
+ idx = 0
+
+ # Transition parameters (flat, for state factors only)
+ transition_params = params[idx : idx + total_n_transition_params]
+ idx += total_n_transition_params
+
+ # Shock SDs per shock-bearing state factor (subset of state factors).
+ shock_sds = params[idx : idx + effective_n_shock]
+ idx += effective_n_shock
+
+ # Investment equation params (if any endogenous factors)
+ inv_eq_params = params[idx : idx + total_n_inv_params]
+ idx += total_n_inv_params
+
+ # Investment shock SDs
+ inv_sds = params[idx : idx + n_endogenous_factors]
+ idx += n_endogenous_factors
+
+ # Control params: (n_measures, n_controls)
+ n_ctrl = n_measures * n_controls
+ control_params = params[idx : idx + n_ctrl].reshape(n_measures, n_controls)
+ idx += n_ctrl
+
+ # Packed loadings
+ n_loadings = int(params.shape[0]) - idx - n_measures
+ loadings_flat = params[idx : idx + n_loadings]
+ idx += n_loadings
+
+ # Measurement SDs
+ meas_sds = params[idx : idx + n_measures]
+
+ return {
+ "transition_params": transition_params,
+ "shock_sds": shock_sds,
+ "inv_eq_params": inv_eq_params,
+ "inv_sds": inv_sds,
+ "control_params": control_params,
+ "loadings_flat": loadings_flat,
+ "meas_sds": meas_sds,
+ }
+
+
+def _transition_loglike_per_obs(
+ *,
+ transition_params: Array,
+ shock_sds: Array,
+ inv_eq_params: Array,
+ inv_sds: Array,
+ control_params: Array,
+ loadings_flat: Array,
+ meas_sds: Array,
+ measurements: Array,
+ controls: Array,
+ loading_mask: Array,
+ prev_residuals_base: Array,
+ prev_meas_mask: Array,
+ prev_full_loadings: Array,
+ prev_meas_sds: Array,
+ prev_distribution: Mapping[str, Array | np.ndarray],
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_chain: Array,
+ joint_nodes: Array,
+ joint_weights: Array,
+ transition_func: Callable,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+ n_shock_factors: int,
+ shock_factor_indices: Array,
+ state_factor_indices_in_latent: Array,
+ observed_factor_values: Array,
+ stability_floor: float,
+ n_obs_per_batch: int | None = None,
+) -> Array:
+ """Compute per-observation log-likelihood for a transition period.
+
+ Uses the joint-Halton chain rebuild scheme: at every transition step,
+ a single joint Halton design covers (z_state, z_inv_chain,
+ z_shock_chain, z_inv_t, z_shock_t). The chained sample θ_0 → θ_{t-1}
+ is rebuilt on-demand inside the integrand from this single joint
+ Halton, mirroring MATLAB's ``create_nodes_weights_01/12``.
+
+ Scope / Assumptions:
+ Production shocks (eta_theta,t) and investment shocks (eta_I,t)
+ are integrated as INDEPENDENT Halton coordinate blocks
+ (z_shock_curr and z_inv_shock). This implements the
+ exogenous-investment special case kappa_t = 0 of the
+ control-function decomposition eta_theta,t = kappa_t * eta_I,t
+ + eps_C,t (Antweiler-Freyberger Assumption 1(g)): production and
+ investment shocks are uncorrelated, cov(eta_theta,t, eta_I,t)=0.
+ A nonzero kappa_t (endogenous investment) is NOT implemented.
+ """
+ n_measures, n_loading_factors = loading_mask.shape
+ full_loadings = jnp.zeros((n_measures, n_loading_factors))
+ full_loadings = full_loadings.at[loading_mask].set(loadings_flat)
+
+ # NaN-safety for current-period measurements (see `_initial_loglike_per_obs`).
+ meas_mask = jnp.isfinite(measurements)
+ safe_measurements = jnp.where(meas_mask, measurements, 0.0)
+
+ control_contrib = controls @ control_params.T
+ residuals_base = safe_measurements - control_contrib
+
+ cond_weights = prev_distribution["cond_weights"]
+ cond_means = prev_distribution["cond_means"]
+ cond_chols = prev_distribution["cond_chols"]
+ # cond_means shape (n_components, n_obs, n_state). Re-shape to
+ # (n_obs, n_components, n_state) so we can map per-obs.
+ cond_means_by_obs = jnp.transpose(cond_means, (1, 0, 2))
+
+ @jax.checkpoint
+ def _single_obs(
+ residual_base: Array,
+ prev_residual_base: Array,
+ obs_cond_weights: Array,
+ obs_factor_values: Array,
+ obs_cond_means: Array,
+ obs_factor_values_chain_i: Array,
+ meas_mask_i: Array,
+ prev_meas_mask_i: Array,
+ ) -> Array:
+ return _integrate_transition_single_obs(
+ residual_base=residual_base,
+ meas_mask=meas_mask_i,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ prev_residual_base=prev_residual_base,
+ prev_meas_mask=prev_meas_mask_i,
+ prev_full_loadings=prev_full_loadings,
+ prev_meas_sds=prev_meas_sds,
+ obs_cond_weights=obs_cond_weights,
+ obs_cond_means=obs_cond_means,
+ cond_chols=cond_chols,
+ chain_links=chain_links,
+ obs_factor_values_chain=obs_factor_values_chain_i,
+ joint_nodes=joint_nodes,
+ joint_weights=joint_weights,
+ transition_func=transition_func,
+ transition_params=transition_params,
+ shock_sds=shock_sds,
+ inv_eq_params=inv_eq_params,
+ inv_sds=inv_sds,
+ n_state_factors=n_state_factors,
+ n_endogenous_factors=n_endogenous_factors,
+ n_shock_factors=n_shock_factors,
+ shock_factor_indices=shock_factor_indices,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ obs_factor_values=obs_factor_values,
+ stability_floor=stability_floor,
+ )
+
+ return _map_over_obs(
+ _single_obs,
+ residuals_base,
+ prev_residuals_base,
+ cond_weights,
+ observed_factor_values,
+ cond_means_by_obs,
+ obs_factor_values_chain,
+ meas_mask,
+ prev_meas_mask,
+ n_obs_per_batch=n_obs_per_batch,
+ )
+
+
+def _compute_investment(
+ theta_prev: Array,
+ obs_factor_values: Array,
+ inv_eq_params: Array | np.ndarray,
+ inv_sds: Array | np.ndarray,
+ eps_i: Array,
+ n_endogenous_factors: int,
+ n_state_factors: int,
+) -> Array:
+ """Compute investment from the AF investment equation.
+
+ I_j = beta_0 + beta_k @ theta + beta_y @ Y + sigma_I * eps_I
+
+ """
+ n_obs_factors = obs_factor_values.shape[0]
+ n_per = 1 + n_state_factors + n_obs_factors
+ result = jnp.zeros(n_endogenous_factors)
+ for j in range(n_endogenous_factors):
+ beta = inv_eq_params[j * n_per : (j + 1) * n_per]
+ intercept = beta[0]
+ state_coeffs = beta[1 : 1 + n_state_factors]
+ obs_coeffs = beta[1 + n_state_factors :]
+ inv_j = (
+ intercept
+ + jnp.dot(state_coeffs, theta_prev)
+ + jnp.dot(obs_coeffs, obs_factor_values)
+ + inv_sds[j] * eps_i[j]
+ )
+ result = result.at[j].set(inv_j)
+ return result
+
+
+def _rebuild_chain_at_period(
+ *,
+ z_state: Array,
+ z_inv_per_step: Array,
+ z_shock_per_step: Array,
+ initial_mean: Array | np.ndarray,
+ initial_chol: Array | np.ndarray,
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_at_obs_per_step: Array,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+) -> Array:
+ """Forward-iterate θ_0 → θ_{t-1} from one joint-Halton draw.
+
+ Mirrors MATLAB's `create_nodes_weights_12`: rebuild the chained sample
+ on-demand inside the transition likelihood from a single joint Halton
+ draw, so the (z_state, z_inv_per_step, z_shock_per_step) triple is
+ quasi-uniformly distributed in joint space at each index `j` (rather
+ than paired across two independent Halton sequences as the previous
+ static `samples_per_component` carry-over did).
+
+ Args:
+ z_state: Shape (n_state_factors,). Standard-normal sample driving
+ the period-0 latent state for one (j, i, l).
+ z_inv_per_step: Shape (n_chain, n_endogenous_factors). One row
+ per prior chain step (period 1 .. period t-1). Standard-normal
+ inv shocks.
+ z_shock_per_step: Shape (n_chain, n_shock_factors). Standard-normal
+ production shocks per prior chain step.
+ initial_mean: Shape (n_state_factors,). Schur-conditional mean of
+ the period-0 state for one (i, l).
+ initial_chol: Shape (n_state_factors, n_state_factors). Cholesky
+ of the period-0 conditional covariance, shared across i.
+ chain_links: Tuple of ChainLink objects, one per prior transition
+ step (period 1 → period 2 → ...). Length n_chain.
+ obs_factor_values_at_obs_per_step: Shape (n_chain, n_obs_factors).
+ Observed factor values at the *source* period of each chain
+ step (i.e. period 0 for the first link, period 1 for the
+ second, etc.) for one observation.
+ n_state_factors: Number of state factors.
+ n_endogenous_factors: Number of endogenous factors (investment).
+
+ Return:
+ theta at period t-1 (= start period of the current likelihood
+ step), shape (n_state_factors,). When `chain_links` is empty,
+ returns the period-0 state directly.
+ """
+ theta = jnp.asarray(initial_mean + initial_chol @ z_state)
+ for step_idx, link in enumerate(chain_links):
+ z_inv = z_inv_per_step[step_idx]
+ z_shock = z_shock_per_step[step_idx]
+ obs_y = obs_factor_values_at_obs_per_step[step_idx]
+ inv = _compute_investment(
+ theta,
+ obs_y,
+ link.inv_eq_params,
+ link.inv_sds,
+ z_inv,
+ n_endogenous_factors,
+ n_state_factors,
+ )
+ full_with_obs = jnp.concatenate([theta, inv, obs_y])
+ state_shock_contrib = (
+ jnp.zeros(n_state_factors)
+ .at[link.shock_factor_indices]
+ .set(link.shock_sds * z_shock)
+ )
+ theta = (
+ link.transition_func(full_with_obs, link.transition_params)
+ + state_shock_contrib
+ )
+ return theta
+
+
+def _integrate_transition_single_obs(
+ *,
+ residual_base: Array,
+ meas_mask: Array,
+ full_loadings: Array,
+ meas_sds: Array,
+ prev_residual_base: Array,
+ prev_meas_mask: Array,
+ prev_full_loadings: Array,
+ prev_meas_sds: Array,
+ obs_cond_weights: Array | np.ndarray,
+ obs_cond_means: Array | np.ndarray,
+ cond_chols: Array | np.ndarray,
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_chain: Array,
+ joint_nodes: Array,
+ joint_weights: Array,
+ transition_func: Callable,
+ transition_params: Array,
+ shock_sds: Array,
+ inv_eq_params: Array,
+ inv_sds: Array,
+ n_state_factors: int,
+ n_endogenous_factors: int,
+ n_shock_factors: int,
+ shock_factor_indices: Array,
+ state_factor_indices_in_latent: Array,
+ obs_factor_values: Array,
+ stability_floor: float,
+) -> Array:
+ """Joint-Halton importance integration for one obs at a transition step.
+
+ Rebuilds the chained sample theta_0 -> theta_{t-1} on-demand from a
+ single joint Halton design at every transition step (matching MATLAB's
+ ``create_nodes_weights_01/12``). At index j, the joint Halton draw
+ couples (z_state, z_inv_chain, z_shock_chain, z_inv_t, z_shock_t) in
+ a quasi-uniform 3D+ space, replacing the previous broken scheme that
+ paired a period-0-seeded chained-sample's z_state[j] with a
+ period-t-seeded shock z[j] across two independent Halton sequences at
+ the same index. The split scheme aliased into sigma_prod optimization
+ (see commit message and ``sigma-prod-collapse-2026-05-07.md``).
+
+ The non-trivial inputs:
+
+ * ``obs_cond_means``: per-component Schur-conditional means for this
+ obs at period 0, shape ``(n_components, n_state_factors)``.
+ * ``cond_chols``: per-component Schur-conditional Cholesky factors at
+ period 0, shape ``(n_components, n_state_factors, n_state_factors)``.
+ Shared across observations.
+ * ``chain_links``: tuple of `ChainLink` objects, one per prior
+ transition step (length ``period - 1`` for the (period-1)->period
+ step). Empty for the 0->1 step.
+ * ``obs_factor_values_chain``: observed factor values at the source
+ period of each prior chain step for this observation, shape
+ ``(n_chain, n_obs_factors)``. The current step's observed factors
+ are passed via ``obs_factor_values``.
+
+ The joint Halton design has dimension
+ ``n_state_factors + n_chain * (n_shock_factors + n_endogenous_factors)
+ + (n_shock_factors + n_endogenous_factors)``. Layout per draw j:
+
+ * ``[:n_state_factors]``: z_state for theta_0 (shared across comps)
+ * for s in 0..n_chain-1: per-step ``z_shock`` followed by ``z_inv``
+ * tail: current step's ``z_shock`` followed by ``z_inv``.
+
+ The previous-period measurement density factor is restricted to
+ state-factor loadings (matches MATLAB's deliberate omission of
+ ``Z_inv_est_0`` from the chained-sample importance weight at
+ ``create_nodes_weights_12``).
+ """
+ n_components = obs_cond_weights.shape[0]
+ n_chain = len(chain_links)
+ z_block = n_shock_factors + n_endogenous_factors
+
+ def _log_draw_contribution(j_idx: Array) -> Array:
+ """Per-draw log kernel at Halton index j, LogSumExp over mixture comps."""
+ z_at_j = joint_nodes[j_idx]
+ z_state = z_at_j[:n_state_factors]
+ # Chain shocks at indices [n_state, n_state + n_chain*z_block).
+ chain_block_start = n_state_factors
+ chain_block_end = chain_block_start + n_chain * z_block
+ if n_chain > 0:
+ z_chain = z_at_j[chain_block_start:chain_block_end].reshape(
+ n_chain, z_block
+ )
+ z_shock_chain = z_chain[:, :n_shock_factors]
+ z_inv_chain = z_chain[:, n_shock_factors:]
+ else:
+ z_shock_chain = jnp.zeros((0, n_shock_factors))
+ z_inv_chain = jnp.zeros((0, n_endogenous_factors))
+ # Current step shocks at the tail.
+ # Exogenous-investment case (kappa_t = 0): the production shock
+ # z_shock_curr and the investment shock z_inv_shock are independent
+ # Halton coordinates; theta_t receives only shock_sds * z_shock_curr
+ # (see _compute_investment for z_inv_shock). cov(eta_theta, eta_I)=0.
+ z_shock_curr = z_at_j[chain_block_end : chain_block_end + n_shock_factors]
+ z_inv_shock = z_at_j[chain_block_end + n_shock_factors :]
+
+ log_component_vals = []
+ for l_idx in range(n_components):
+ # Rebuild θ_{t-1} from the joint Halton.
+ theta_prev = _rebuild_chain_at_period(
+ z_state=z_state,
+ z_inv_per_step=z_inv_chain,
+ z_shock_per_step=z_shock_chain,
+ initial_mean=obs_cond_means[l_idx],
+ initial_chol=cond_chols[l_idx],
+ chain_links=chain_links,
+ obs_factor_values_at_obs_per_step=obs_factor_values_chain,
+ n_state_factors=n_state_factors,
+ n_endogenous_factors=n_endogenous_factors,
+ )
+ inv = _compute_investment(
+ theta_prev,
+ obs_factor_values,
+ inv_eq_params,
+ inv_sds,
+ z_inv_shock,
+ n_endogenous_factors,
+ n_state_factors,
+ )
+ full_prev_with_obs = jnp.concatenate([theta_prev, inv, obs_factor_values])
+
+ # Previous-period measurement density: state-factor (skill)
+ # measurements at theta_prev only. Endogenous-factor (inv)
+ # measurements at t-1 are NOT re-evaluated here -- they were
+ # already used as current-period measurements at the (t-2)->(t-1)
+ # step (matches MATLAB's likelihood_12, which omits Z_inv_est_0
+ # from the chained-sample importance weight). For rows that load
+ # only on endogenous factors, the slice picks zero loadings and
+ # the residual reduces to the centered measurement, contributing
+ # a per-obs constant that is invariant under the parameters.
+ prev_state_loadings = prev_full_loadings[:, state_factor_indices_in_latent]
+ prev_residuals = prev_residual_base - prev_state_loadings @ theta_prev
+ prev_log_pdf = _log_normal_pdf(
+ prev_residuals,
+ jnp.zeros_like(prev_residuals),
+ prev_meas_sds,
+ )
+ log_prev_inv_meas = jnp.sum(jnp.where(prev_meas_mask, prev_log_pdf, 0.0))
+
+ # Current-period measurement density. Shocks only apply to
+ # factors with has_production_shock=True; scatter them into the
+ # state-factor ordering and leave deterministic factors as is.
+ state_shock_contrib = (
+ jnp.zeros(n_state_factors)
+ .at[shock_factor_indices]
+ .set(shock_sds * z_shock_curr)
+ )
+ theta_t = (
+ transition_func(full_prev_with_obs, transition_params)
+ + state_shock_contrib
+ )
+ all_factors_t = jnp.concatenate([theta_t, inv])
+ residuals = residual_base - full_loadings @ all_factors_t
+ log_pdf = _log_normal_pdf(residuals, jnp.zeros_like(residuals), meas_sds)
+ log_meas = jnp.sum(jnp.where(meas_mask, log_pdf, 0.0))
+
+ log_kernel = (
+ jnp.log(obs_cond_weights[l_idx] + stability_floor)
+ + log_prev_inv_meas
+ + log_meas
+ )
+ log_component_vals.append(log_kernel)
+
+ return jax.scipy.special.logsumexp(jnp.array(log_component_vals))
+
+ n_halton = joint_nodes.shape[0]
+ log_contribs = jax.vmap(_log_draw_contribution)(jnp.arange(n_halton))
+ return jax.scipy.special.logsumexp(log_contribs + jnp.log(joint_weights))
+
+
+def _log_normal_pdf(x: Array, mean: Array, sd: Array) -> Array:
+ """Log of normal PDF, element-wise."""
+ return -0.5 * jnp.log(2 * jnp.pi) - jnp.log(sd) - 0.5 * ((x - mean) / sd) ** 2
+
+
+def create_loglike_and_gradient(
+ loglike_fn: Callable,
+ **kwargs: Any, # noqa: ANN401
+) -> Callable:
+ """Create a jitted function returning (loglike, gradient).
+
+ Args:
+ loglike_fn: The negative log-likelihood function.
+ **kwargs: Keyword arguments to partially apply (data, nodes, etc.).
+
+ Return:
+ Function mapping free_params -> (neg_loglike, gradient).
+
+ """
+ partial_fn = functools.partial(loglike_fn, **kwargs)
+ value_and_grad_fn = jax.value_and_grad(partial_fn)
+ return jax.jit(value_and_grad_fn)
diff --git a/src/skillmodels/af/params.py b/src/skillmodels/af/params.py
new file mode 100644
index 00000000..45a00a08
--- /dev/null
+++ b/src/skillmodels/af/params.py
@@ -0,0 +1,477 @@
+"""Parameter index construction and parsing for AF estimation."""
+
+from types import MappingProxyType
+from typing import Any
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+
+from skillmodels.common.constraints import FixedConstraintWithValue
+from skillmodels.common.types import Normalizations, TransitionInfo
+
+
+def get_initial_period_params_index(
+ *,
+ n_mixture_components: int,
+ latent_factors: tuple[str, ...],
+ measurements_period_0: dict[str, tuple[str, ...]],
+ controls: tuple[str, ...],
+ observed_factors: tuple[str, ...] = (),
+ reconstructed_factors: tuple[str, ...] = (),
+) -> pd.MultiIndex:
+ """Build parameter index for the initial period (Step 0).
+
+ Parameters estimated in Step 0:
+ - Mixture weights, means, Cholesky covariances for the joint distribution
+ of the *state* latent factors (those with
+ ``has_initial_distribution=True``) and observed factors at period 0.
+ - Investment equation parameters (one block per ``reconstructed_factor``)
+ and an investment shock SD per reconstructed factor. These pin the
+ period-0 value of each reconstructed factor as a deterministic
+ function of the state latents plus a shock.
+ - Measurement loadings, intercepts, SDs for period 0.
+
+ When ``observed_factors`` is non-empty, the initial distribution is
+ modelled over the joint vector (state_latent, observed). Per-individual
+ observed values let the likelihood condition on them via the Schur
+ complement, which concentrates Halton draws and improves estimation
+ precision.
+
+ Args:
+ n_mixture_components: Number of Gaussian mixture components.
+ latent_factors: Names of *all* latent factors (including reconstructed
+ ones). Used for loading entries in the measurement block so
+ reconstructed factors can still load on period-0 measurements.
+ measurements_period_0: Factor name -> tuple of measurement variable names.
+ controls: Control variable names (includes "constant").
+ observed_factors: Names of observed factors included in the joint
+ initial distribution.
+ reconstructed_factors: Latent factors with
+ ``has_initial_distribution=False``. These are excluded from the
+ mixture and receive their own investment-equation block at
+ period 0 instead.
+
+ Return:
+ MultiIndex with levels (category, period, name1, name2).
+
+ """
+ ind_tups: list[tuple[str, int, str, str]] = []
+ state_latent_factors = tuple(
+ f for f in latent_factors if f not in reconstructed_factors
+ )
+ joint_factors = (*state_latent_factors, *observed_factors)
+
+ # Measurements for the initial step exclude those that only load on
+ # reconstructed factors; their period-0 measurement params are
+ # estimated in the transition step 0->1 instead (matching MATLAB's
+ # transition_01 block convention).
+ measurements_period_0_filtered = {
+ f: m for f, m in measurements_period_0.items() if f in state_latent_factors
+ }
+
+ # Mixture weights
+ for m in range(n_mixture_components):
+ ind_tups.append(("mixture_weights", 0, f"mixture_{m}", "-"))
+
+ # Initial means per component per joint factor (state latent + observed)
+ for m in range(n_mixture_components):
+ for factor in joint_factors:
+ ind_tups.append(("initial_states", 0, f"mixture_{m}", factor))
+
+ # Initial Cholesky covariances per component (lower triangular) over joint factors
+ for m in range(n_mixture_components):
+ for row, f1 in enumerate(joint_factors):
+ for col, f2 in enumerate(joint_factors):
+ if col <= row:
+ ind_tups.append(
+ (
+ "initial_cholcovs",
+ 0,
+ f"mixture_{m}",
+ f"{f1}-{f2}",
+ )
+ )
+
+ # Measurement params for period 0 over state-latent factors only.
+ # Reconstructed factors' period-0 measurement params live in the
+ # transition step 0->1 params index.
+ ind_tups.extend(
+ _measurement_index_tuples(
+ period=0,
+ latent_factors=state_latent_factors,
+ measurements=measurements_period_0_filtered,
+ controls=controls,
+ )
+ )
+
+ return pd.MultiIndex.from_tuples(
+ ind_tups,
+ names=["category", "period", "name1", "name2"],
+ )
+
+
+def get_transition_period_params_index(
+ *,
+ period: int,
+ latent_factors: tuple[str, ...],
+ transition_info: TransitionInfo,
+ measurements_at_period: dict[str, tuple[str, ...]],
+ controls: tuple[str, ...],
+ endogenous_factors: tuple[str, ...] = (),
+ observed_factors: tuple[str, ...] = (),
+ shock_factors: tuple[str, ...] | None = None,
+) -> pd.MultiIndex:
+ """Build parameter index for a transition period (Step t, t >= 1).
+
+ Parameters estimated in Step t:
+ - Transition parameters and shock SDs for period t-1 -> t
+ - Measurement loadings, intercepts, SDs for period t
+ - Investment equation params for each endogenous factor (if any)
+
+ Args:
+ period: Calendar period (t >= 1).
+ latent_factors: Names of latent (non-endogenous) state factors.
+ transition_info: Transition function info from ProcessedModel.
+ measurements_at_period: Factor name -> measurement variables at period t.
+ controls: Control variable names.
+ endogenous_factors: Names of endogenous (investment) factors.
+ observed_factors: Names of observed factors.
+ shock_factors: Subset of `latent_factors` for which a production shock
+ SD is estimated. Factors omitted here get no shock SD parameter
+ and are integrated deterministically (dropping their shock
+ dimension from the Halton draw). Defaults to `latent_factors`.
+
+ Return:
+ MultiIndex with levels (category, period, name1, name2).
+
+ """
+ if shock_factors is None:
+ shock_factors = latent_factors
+ ind_tups: list[tuple[str, int, str, str]] = []
+
+ # Transition parameters (for t-1 -> t)
+ for factor in latent_factors:
+ if factor in transition_info.param_names:
+ for name in transition_info.param_names[factor]:
+ ind_tups.append(("transition", period - 1, factor, name))
+
+ # Shock SDs (for t-1 -> t): only factors that have a production shock
+ for factor in shock_factors:
+ ind_tups.append(("shock_sds", period - 1, factor, "-"))
+
+ # Investment equation parameters (for t-1)
+ for endog_factor in endogenous_factors:
+ # Intercept
+ ind_tups.append(("investment_eq", period - 1, endog_factor, "constant"))
+ # Coefficients on each state factor
+ for factor in latent_factors:
+ ind_tups.append(("investment_eq", period - 1, endog_factor, factor))
+ # Coefficients on observed factors
+ for obs_factor in observed_factors:
+ ind_tups.append(("investment_eq", period - 1, endog_factor, obs_factor))
+ # Investment shock SD
+ ind_tups.append(("investment_sds", period - 1, endog_factor, "-"))
+
+ # Measurement params for period t (loadings for ALL factors, not just state)
+ all_factor_measurements = dict(measurements_at_period)
+ all_latent = (*latent_factors, *endogenous_factors)
+ ind_tups.extend(
+ _measurement_index_tuples(
+ period=period,
+ latent_factors=all_latent,
+ measurements=all_factor_measurements,
+ controls=controls,
+ )
+ )
+
+ return pd.MultiIndex.from_tuples(
+ ind_tups,
+ names=["category", "period", "name1", "name2"],
+ )
+
+
+def _measurement_index_tuples(
+ *,
+ period: int,
+ latent_factors: tuple[str, ...],
+ measurements: dict[str, tuple[str, ...]],
+ controls: tuple[str, ...],
+) -> list[tuple[str, int, str, str]]:
+ """Generate index tuples for measurement system parameters.
+
+ Includes controls (intercept/control coefficients), loadings, and
+ measurement error SDs for all measurements in the given period.
+
+ """
+ ind_tups: list[tuple[str, int, str, str]] = []
+
+ # Collect all unique measurement variables for this period, preserving order
+ all_measures: list[str] = []
+ measure_to_factors: dict[str, list[str]] = {}
+ for factor, measures in measurements.items():
+ for m in measures:
+ if m not in measure_to_factors:
+ all_measures.append(m)
+ measure_to_factors[m] = []
+ measure_to_factors[m].append(factor)
+
+ # Controls (intercept + control variables) per measurement
+ for meas in all_measures:
+ for ctrl in controls:
+ ind_tups.append(("controls", period, meas, ctrl))
+
+ # Loadings: one per (measurement, factor) pair
+ for meas in all_measures:
+ for factor in latent_factors:
+ if factor in measure_to_factors.get(meas, []):
+ ind_tups.append(("loadings", period, meas, factor))
+
+ # Measurement error SDs
+ for meas in all_measures:
+ ind_tups.append(("meas_sds", period, meas, "-"))
+
+ return ind_tups
+
+
+def get_measurements_per_factor(
+ factors: MappingProxyType[str, Any],
+ period: int,
+) -> dict[str, tuple[str, ...]]:
+ """Extract measurement variable names per factor for a given period.
+
+ Args:
+ factors: ModelSpec.factors mapping.
+ period: Calendar period index.
+
+ Return:
+ Dict mapping factor name to tuple of measurement variable names.
+
+ """
+ result: dict[str, tuple[str, ...]] = {}
+ for name, spec in factors.items():
+ if period < len(spec.measurements) and len(spec.measurements[period]) > 0:
+ result[name] = spec.measurements[period]
+ return result
+
+
+def get_normalizations_for_period(
+ factors: MappingProxyType[str, Any],
+ period: int,
+) -> dict[str, dict[tuple[str, str], float]]:
+ """Extract normalization constraints for a given period.
+
+ Return:
+ Dict of category ("loadings" or "intercepts") to dict of
+ (measurement, factor_or_control) -> fixed value.
+
+ """
+ loading_fixes: dict[tuple[str, str], float] = {}
+ intercept_fixes: dict[tuple[str, str], float] = {}
+
+ for factor_name, spec in factors.items():
+ norms: Normalizations | None = spec.normalizations
+ if norms is None:
+ continue
+
+ if norms.loadings is not None and period < len(norms.loadings):
+ for meas, value in norms.loadings[period].items():
+ loading_fixes[(meas, factor_name)] = value
+
+ if norms.intercepts is not None and period < len(norms.intercepts):
+ for meas, value in norms.intercepts[period].items():
+ # intercept normalizations fix the constant control
+ intercept_fixes[(meas, "constant")] = value
+
+ return {"loadings": loading_fixes, "intercepts": intercept_fixes}
+
+
+def create_af_params_template(
+ params_index: pd.MultiIndex,
+ normalizations: dict[str, dict[tuple[str, str], float]],
+ period: int,
+ *,
+ bounds_distance: float = 0.001,
+) -> pd.DataFrame:
+ """Create parameter template DataFrame with bounds and fixed values.
+
+ Args:
+ params_index: Parameter MultiIndex for this period.
+ normalizations: Loading and intercept normalizations.
+ period: Calendar period.
+ bounds_distance: Minimum distance from zero for SD parameters.
+
+ Return:
+ DataFrame with columns: value, lower_bound, upper_bound.
+
+ """
+ params = pd.DataFrame(
+ index=params_index,
+ data={
+ "value": np.nan,
+ "lower_bound": -np.inf,
+ "upper_bound": np.inf,
+ },
+ )
+
+ # Set bounds for SD parameters
+ sd_categories = ("meas_sds", "shock_sds", "investment_sds")
+ for cat in sd_categories:
+ mask = params.index.get_level_values("category") == cat
+ params.loc[mask, "lower_bound"] = bounds_distance
+ params.loc[mask, "value"] = 0.5
+
+ # Set bounds for mixture weights
+ weight_mask = params.index.get_level_values("category") == "mixture_weights"
+ params.loc[weight_mask, "lower_bound"] = 0.001
+ params.loc[weight_mask, "upper_bound"] = 0.999
+
+ # Bound the log_ces substitution parameter phi from above. Without
+ # an upper bound the optimizer can drift phi to large positive
+ # values where exp(states * phi) overflows and the gradient turns
+ # to NaN. The lower side is well-behaved (phi -> -inf collapses to
+ # a finite minimum via logsumexp), so leave it unbounded to match
+ # MATLAB's (-inf, 1 - c) convention.
+ phi_mask = (params.index.get_level_values("category") == "transition") & (
+ params.index.get_level_values("name2") == "phi"
+ )
+ params.loc[phi_mask, "upper_bound"] = 1.0 - bounds_distance
+
+ # Set bounds for Cholesky diagonals (must be positive)
+ chol_mask = params.index.get_level_values("category") == "initial_cholcovs"
+ for idx in params.index[chol_mask]:
+ # Diagonal entries have matching factor names (e.g., "fac1-fac1")
+ pair = idx[3] # name2 level
+ parts = pair.split("-")
+ if len(parts) == 2 and parts[0] == parts[1]:
+ params.loc[idx, "lower_bound"] = bounds_distance
+
+ # Apply normalization fixes
+ loading_fixes = normalizations.get("loadings", {})
+ for (meas, factor), val in loading_fixes.items():
+ loc = ("loadings", period, meas, factor)
+ if loc in params.index:
+ params.loc[loc, "value"] = val
+ params.loc[loc, "lower_bound"] = val
+ params.loc[loc, "upper_bound"] = val
+
+ intercept_fixes = normalizations.get("intercepts", {})
+ for (meas, ctrl), val in intercept_fixes.items():
+ loc = ("controls", period, meas, ctrl)
+ if loc in params.index:
+ params.loc[loc, "value"] = val
+ params.loc[loc, "lower_bound"] = val
+ params.loc[loc, "upper_bound"] = val
+
+ # Default values for parameters still NaN
+ still_nan = params["value"].isna()
+ params.loc[still_nan, "value"] = 0.5
+
+ return params
+
+
+def apply_start_params(
+ params_template: pd.DataFrame,
+ start_params: pd.DataFrame,
+) -> None:
+ """Override heuristic defaults with user-supplied starting values.
+
+ Match on the 4-level MultiIndex. Only free (non-fixed) parameters whose
+ index appears in `start_params` are updated. Fixed parameters and
+ parameters not in `start_params` are left unchanged. Modifies
+ `params_template` in place.
+ """
+ common = params_template.index.intersection(start_params.index)
+ if common.empty:
+ return
+ free = (
+ params_template.loc[common, "lower_bound"]
+ != params_template.loc[common, "upper_bound"]
+ )
+ to_update = common[free]
+ if not to_update.empty:
+ params_template.loc[to_update, "value"] = start_params.loc[to_update, "value"]
+
+
+def apply_fixed_params(
+ params_template: pd.DataFrame,
+ fixed_params: pd.DataFrame,
+) -> None:
+ """Set template values to match user-provided fixed values.
+
+ Used to pin parameters that would otherwise be free -- e.g., identity
+ transitions and zero shock SDs for time-invariant latent factors. The
+ pinning itself is enforced through `FixedConstraintWithValue` objects
+ emitted by `build_optimagic_inputs`; this helper only aligns the
+ template's starting values with the fixes so early likelihood evaluations
+ use the correct values. Modifies `params_template` in place.
+ """
+ common = params_template.index.intersection(fixed_params.index)
+ if common.empty:
+ return
+ params_template.loc[common, "value"] = fixed_params.loc[common, "value"]
+
+
+def build_optimagic_inputs(
+ params_template: pd.DataFrame,
+ fixed_params: pd.DataFrame | None,
+) -> tuple[pd.DataFrame, list[om.constraints.Constraint]]:
+ """Prepare the params DataFrame and fixed-constraint list for `om.minimize`.
+
+ The AF template encodes normalization fixes by clamping
+ ``lower_bound == upper_bound`` on affected rows. User-provided
+ `fixed_params` add further pinned rows. Both are translated into
+ `FixedConstraintWithValue` objects so optimagic can treat them uniformly
+ -- in particular so fixes that overlap a `ProbabilityConstraint` selector
+ get folded correctly. The returned DataFrame has infinite bounds on every
+ row that is pinned by a constraint, since optimagic rejects finite bounds
+ on probability selectors.
+
+ Args:
+ params_template: AF parameter template with value/lower_bound/upper_bound.
+ fixed_params: Optional user-provided fixes (DataFrame with a "value"
+ column and the same 4-level MultiIndex as the template).
+
+ Return:
+ Tuple of (full_params_df, fixed_constraints) where full_params_df
+ carries the template values plus any user fixes on all rows, and
+ fixed_constraints is a list of `FixedConstraintWithValue` objects
+ covering every pinned row (normalisation and user fixes alike).
+
+ """
+ params = params_template.copy()
+
+ if fixed_params is not None:
+ common = params.index.intersection(fixed_params.index)
+ if not common.empty:
+ params.loc[common, "value"] = fixed_params.loc[common, "value"]
+
+ fixed_from_bounds = (
+ params["lower_bound"].to_numpy() == params["upper_bound"].to_numpy()
+ )
+ fixed_from_user: np.ndarray
+ if fixed_params is not None:
+ common = params.index.intersection(fixed_params.index)
+ fixed_from_user = np.asarray(params.index.isin(common))
+ else:
+ fixed_from_user = np.zeros(len(params), dtype=bool)
+
+ pinned = fixed_from_bounds | fixed_from_user
+
+ constraints: list[om.constraints.Constraint] = []
+ for idx in params.index[pinned]:
+ constraints.append(
+ FixedConstraintWithValue(
+ loc=idx,
+ value=float(params.loc[idx, "value"]),
+ )
+ )
+
+ # Relax bounds on pinned rows: optimagic rejects finite bounds that
+ # overlap a probability selector, and the FixedConstraint now does the
+ # pinning.
+ pinned_idx = params.index[pinned]
+ params.loc[pinned_idx, "lower_bound"] = -np.inf
+ params.loc[pinned_idx, "upper_bound"] = np.inf
+
+ return params, constraints
diff --git a/src/skillmodels/af/posterior_states.py b/src/skillmodels/af/posterior_states.py
new file mode 100644
index 00000000..599f25f0
--- /dev/null
+++ b/src/skillmodels/af/posterior_states.py
@@ -0,0 +1,266 @@
+"""Compute posterior state estimates from AF estimation results.
+
+For each individual and period, compute E[theta_t | Z_{0:t,i}] using
+Halton quadrature and the estimated conditional distributions.
+"""
+
+from typing import Any
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pandas as pd
+from beartype import beartype
+from jax import Array
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.af.initial_period import _build_loading_mask, _get_ordered_measures
+from skillmodels.af.likelihood import _log_normal_pdf
+from skillmodels.af.params import get_measurements_per_factor
+from skillmodels.af.types import AFEstimationResult, ConditionalDistribution
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.state_ranges import create_state_ranges
+
+
+@beartype(conf=ESTIMATION_CONF)
+def get_af_posterior_states(
+ af_result: AFEstimationResult,
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ n_halton_points: int = 100, # noqa: ARG001
+) -> dict[str, dict[str, Any]]:
+ """Compute posterior state means from AF estimation results.
+
+ For each individual i and period t, compute the posterior mean
+ E[theta_t | Z_{0:t,i}] against the per-observation, income-conditioned
+ chained importance sample carried by the estimator
+ (`ConditionalDistribution.samples_per_component`). Each stored sample is
+ a prior draw already encoding the period-0 income conditioning; it is
+ weighted by the per-observation prior mixture weights
+ (`conditional_weights`) and reweighted by the current-period measurement
+ likelihood, then the posterior mean is the weighted average of the
+ samples.
+
+ Args:
+ af_result: Result from `estimate_af()`. Must NOT have gone through
+ `to_numpy()`, which drops the per-obs chained sample this
+ computation needs.
+ model_spec: Model specification.
+ data: Dataset in long format with MultiIndex (id, period).
+ n_halton_points: Retained for API/backward compatibility only; no
+ longer used (posterior means are computed from the carried
+ chained sample, not from freshly drawn Halton nodes).
+
+ Return:
+ Dict with "unanchored_states" containing "states" DataFrame
+ (columns: id, period, factor1, ...) and "state_ranges".
+
+ """
+ jax.config.update("jax_enable_x64", val=True)
+
+ idx_names = data.index.names
+ id_col = str(idx_names[0])
+ period_col = str(idx_names[1])
+
+ # Identify state factors from the conditional distribution dimension
+ n_state = af_result.conditional_distributions[0].components[0].mean.shape[0]
+ state_factors = tuple(
+ f for f in model_spec.factors if not model_spec.factors[f].is_endogenous
+ )[:n_state]
+
+ rows: list[dict[str, float | int]] = []
+
+ for t, (period_result, cond_dist) in enumerate(
+ zip(
+ af_result.period_results,
+ af_result.conditional_distributions,
+ strict=True,
+ )
+ ):
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=t)
+ if not measurements_pt:
+ continue
+
+ meas_info = _extract_period_measurement_info(
+ period_result.params,
+ model_spec,
+ state_factors,
+ t,
+ )
+
+ period_mask = data.index.get_level_values(period_col) == t
+ period_df = data.loc[period_mask]
+ ids = period_df.index.get_level_values(id_col)
+
+ all_measures = _get_ordered_measures(measurements_pt)
+ meas_cols = [c for c in all_measures if c in period_df.columns]
+ measurements = jnp.array(
+ period_df[meas_cols].to_numpy(dtype=np.float64, na_value=np.nan),
+ )
+
+ # Build per-observation control contribution
+ ctrl_arrays = []
+ for ctrl in meas_info["control_names"]:
+ if ctrl == "constant":
+ ctrl_arrays.append(np.ones(len(period_df)))
+ elif ctrl in period_df.columns:
+ ctrl_arrays.append(period_df[ctrl].to_numpy(dtype=np.float64))
+ else:
+ ctrl_arrays.append(np.zeros(len(period_df)))
+ controls = jnp.array(np.column_stack(ctrl_arrays))
+ control_contrib = controls @ meas_info["control_params"].T
+
+ posterior_means = _compute_posterior_means(
+ cond_dist=cond_dist,
+ measurements=measurements,
+ control_contrib=control_contrib,
+ full_loadings=meas_info["full_loadings"],
+ meas_sds=meas_info["meas_sds"],
+ )
+
+ for idx_i, obs_id in enumerate(ids):
+ row: dict[str, float | int] = {id_col: obs_id, "period": t}
+ for f_idx, factor in enumerate(state_factors):
+ row[factor] = float(posterior_means[idx_i, f_idx])
+ rows.append(row)
+
+ states_df = pd.DataFrame(rows)
+ state_ranges = create_state_ranges(
+ filtered_states=states_df,
+ factors=state_factors,
+ )
+
+ return {
+ "unanchored_states": {
+ "states": states_df,
+ "state_ranges": state_ranges,
+ },
+ }
+
+
+def _extract_period_measurement_info(
+ period_params: pd.DataFrame,
+ model_spec: ModelSpec,
+ factors: tuple[str, ...],
+ period: int,
+) -> dict[str, Any]:
+ """Extract measurement loadings, control contribution, and SDs."""
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=period)
+ all_measures = _get_ordered_measures(measurements_pt)
+ loading_mask = _build_loading_mask(all_measures, factors, measurements_pt)
+
+ loadings_list = []
+ for mi, meas in enumerate(all_measures):
+ for fi, factor in enumerate(factors):
+ if loading_mask[mi, fi]:
+ loc = ("loadings", period, meas, factor)
+ if loc in period_params.index:
+ loadings_list.append(
+ float(period_params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ )
+
+ full_loadings = jnp.zeros((len(all_measures), len(factors)))
+ full_loadings = full_loadings.at[jnp.array(loading_mask)].set( # noqa: PD008
+ jnp.array(loadings_list)
+ )
+
+ # Extract ALL control coefficients (not just "constant")
+ ctrl_entries = period_params.loc[
+ period_params.index.get_level_values("category") == "controls"
+ ]
+ ctrl_names = (
+ sorted(set(ctrl_entries.index.get_level_values("name2")))
+ if len(ctrl_entries) > 0
+ else ["constant"]
+ )
+ ctrl_params_list = []
+ for meas in all_measures:
+ for ctrl in ctrl_names:
+ loc = ("controls", period, meas, ctrl)
+ if loc in period_params.index:
+ ctrl_params_list.append(float(period_params.loc[loc, "value"]))
+ else:
+ ctrl_params_list.append(0.0)
+ control_params = jnp.array(ctrl_params_list).reshape(
+ len(all_measures), len(ctrl_names)
+ )
+
+ sd_list = [
+ float(period_params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ if (loc := ("meas_sds", period, meas, "-")) in period_params.index
+ else 0.5
+ for meas in all_measures
+ ]
+
+ return {
+ "full_loadings": full_loadings,
+ "control_params": control_params,
+ "control_names": ctrl_names,
+ "meas_sds": jnp.array(sd_list),
+ }
+
+
+def _compute_posterior_means(
+ *,
+ cond_dist: ConditionalDistribution,
+ measurements: Array,
+ full_loadings: Array,
+ control_contrib: Array,
+ meas_sds: Array,
+) -> Array:
+ """Compute posterior means for all individuals at one period.
+
+ Use the per-observation, income-conditioned chained importance sample
+ (`samples_per_component`) carried by the estimator, weighted by the
+ per-observation prior mixture weights (`conditional_weights`), and
+ reweight each sample by the current-period measurement likelihood.
+
+ Return shape (n_obs, n_factors).
+ """
+ if not cond_dist.samples_per_component:
+ msg = (
+ "get_af_posterior_states needs the per-observation chained "
+ "importance sample (`samples_per_component`). It is dropped by "
+ "AFEstimationResult.to_numpy(); call get_af_posterior_states on "
+ "the estimation result BEFORE to_numpy()."
+ )
+ raise ValueError(msg)
+
+ # Stack to shape n_components by n_summary by n_obs by n_state.
+ samples = jnp.stack([jnp.asarray(s) for s in cond_dist.samples_per_component])
+ n_components, n_summary, n_obs = (
+ samples.shape[0],
+ samples.shape[1],
+ samples.shape[2],
+ )
+
+ if cond_dist.conditional_weights is not None:
+ cond_weights = jnp.asarray(cond_dist.conditional_weights)
+ else:
+ cond_weights = jnp.broadcast_to(
+ jnp.asarray(cond_dist.mixture_weights)[None, :], (n_obs, n_components)
+ )
+
+ residuals_base = measurements - control_contrib # (n_obs, n_meas)
+ # obs-major samples for vmap: (n_obs, n_components, n_summary, n_state)
+ samples_obs_major = jnp.transpose(samples, (2, 0, 1, 3))
+
+ def _single_obs(
+ residual_base: Array, # (n_meas,)
+ obs_samples: Array, # (n_components, n_summary, n_state)
+ obs_weights: Array, # (n_components,)
+ ) -> Array:
+ def _per_sample(theta: Array) -> Array: # (n_state,) -> scalar
+ residuals = residual_base - full_loadings @ theta
+ return jnp.sum(
+ _log_normal_pdf(residuals, jnp.zeros_like(residuals), meas_sds)
+ )
+
+ log_lik = jax.vmap(jax.vmap(_per_sample))(obs_samples) # (n_comp, n_summary)
+ log_prior = jnp.log(obs_weights + 1e-300)[:, None] - jnp.log(n_summary)
+ log_post = (log_prior + log_lik).reshape(-1)
+ post_weights = jax.nn.softmax(log_post)
+ flat_theta = obs_samples.reshape(-1, obs_samples.shape[-1])
+ return jnp.sum(post_weights[:, None] * flat_theta, axis=0)
+
+ return jax.vmap(_single_obs)(residuals_base, samples_obs_major, cond_weights)
diff --git a/src/skillmodels/af/transition_period.py b/src/skillmodels/af/transition_period.py
new file mode 100644
index 00000000..37eaab8b
--- /dev/null
+++ b/src/skillmodels/af/transition_period.py
@@ -0,0 +1,1271 @@
+"""Step t (t >= 1) of the AF estimator: transition period estimation.
+
+Estimate transition function parameters and measurement system parameters
+using Halton quadrature over the latent factor distribution from the
+previous period.
+
+Assumption (income non-informativeness): the carried state distribution is
+conditioned on period-0 observed factors (income) Y_0 only. Later-period
+income Y_t (t > 0) enters the investment and transition equations but does
+NOT re-condition the state distribution -- there is no filtering update for
+f(theta_t | Y_{0:t}). This is valid iff Y_t adds no information about
+theta_t once Y_0 and the modeled transition history are conditioned on.
+"""
+
+import inspect
+from collections.abc import Callable, Mapping
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pandas as pd
+from jax import Array
+
+from skillmodels.af.batching import auto_n_obs_per_batch
+from skillmodels.af.halton import create_halton_nodes_and_weights
+from skillmodels.af.initial_period import _build_loading_mask, _get_ordered_measures
+from skillmodels.af.likelihood import af_loglike_transition, create_loglike_and_gradient
+from skillmodels.af.params import (
+ apply_fixed_params,
+ apply_start_params,
+ build_optimagic_inputs,
+ create_af_params_template,
+ get_measurements_per_factor,
+ get_normalizations_for_period,
+ get_transition_period_params_index,
+)
+from skillmodels.af.types import (
+ AFEstimationOptions,
+ AFPeriodResult,
+ ChainLink,
+ ConditionalDistribution,
+ MixtureComponent,
+)
+from skillmodels.amn.moments import (
+ SpearmanResult,
+ seed_beta_from_ols,
+ spearman_factor_moments,
+)
+from skillmodels.common.constraints import (
+ filter_within_step_constraints,
+ reconcile_start_to_equality,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import ProcessedModel, TransitionInfo, to_plain_dict
+
+
+def estimate_transition_period(
+ period: int,
+ model_spec: ModelSpec,
+ processed_model: ProcessedModel,
+ measurements: Array,
+ controls: Array,
+ prev_measurements: Array,
+ prev_controls: Array,
+ prev_period_params: pd.DataFrame,
+ prev_distribution: ConditionalDistribution,
+ af_options: AFEstimationOptions,
+ endogenous_factors: tuple[str, ...] = (),
+ observed_factors: tuple[str, ...] = (),
+ observed_factor_data: Array | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ user_constraints: list[om.constraints.Constraint] | None = None,
+) -> tuple[AFPeriodResult, ConditionalDistribution]:
+ """Estimate a transition period (Step t, t >= 1) of the AF procedure.
+
+ Given the estimated distribution of latent factors from previous periods,
+ estimate the transition function parameters and measurement system
+ parameters for the current period via MLE with Halton quadrature.
+
+ Args:
+ period: Calendar period index (t >= 1).
+ model_spec: Model specification.
+ processed_model: Processed model from `process_model()`.
+ measurements: Shape (n_obs, n_measures), period t measurement values.
+ controls: Shape (n_obs, n_controls), period t control values.
+ prev_measurements: Shape (n_obs, n_prev_measures), period t-1 measurements.
+ prev_controls: Shape (n_obs, n_prev_controls), period t-1 controls.
+ prev_period_params: Estimated params DataFrame from period t-1.
+ prev_distribution: Estimated conditional distribution from period t-1.
+ af_options: AF estimation options.
+ endogenous_factors: Names of endogenous (investment) factors.
+ observed_factors: Names of observed (non-latent) factors.
+ observed_factor_data: Shape (n_obs, n_obs_factors), observed factor
+ values. Required when `observed_factors` is non-empty.
+ start_params: Optional starting values. Matching index entries
+ override heuristic defaults.
+ fixed_params: Optional DataFrame with a "value" column pinning
+ specified parameters (value + bounds both clamped to the value).
+ user_constraints: Optional optimagic constraint list forwarded
+ from `estimate_af(constraints=...)`. Entries whose members
+ all sit in this step's params index are appended to the
+ step's `om.minimize` call (within-step equalities).
+
+ Return:
+ Tuple of (AFPeriodResult, ConditionalDistribution). The returned
+ distribution is the conditional state distribution
+ f(theta_t | Z_{0:t}, Y_0), i.e. conditioned on all measurements
+ through period t and on the *period-0* observed factors (income)
+ Y_0 via the Schur complement carried from the initial period. It
+ is NOT conditioned on later-period income Y_1, ..., Y_t: those
+ enter only the investment and transition equations, never a
+ re-conditioning/filtering update of the state distribution.
+ Treating this as the correct period-t state distribution requires
+ the assumption that, given Y_0 and the modeled transition history,
+ Y_t carries no further information about theta_t (sequential
+ non-informativeness of income). The Monte Carlo designs with
+ Y_t == Y_0 satisfy this by construction; with serially varying,
+ skill-correlated income it is a substantive restriction.
+
+ """
+ factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=period)
+ all_measures = _get_ordered_measures(measurements_pt)
+
+ transition_info = processed_model.transition_info
+
+ state_factors = tuple(f for f in factors if f not in endogenous_factors)
+ n_state = len(state_factors)
+ n_endog = len(endogenous_factors)
+ shock_factors = tuple(
+ f for f in state_factors if model_spec.factors[f].has_production_shock
+ )
+ n_shock = len(shock_factors)
+ shock_factor_indices = jnp.array(
+ [state_factors.index(f) for f in shock_factors], dtype=jnp.int32
+ )
+ # Indices of the state factors within the full latent-factor ordering.
+ # `prev_full_loadings` has columns in `factors` order (state +
+ # endogenous, possibly interleaved); the prev-meas factor restricts to
+ # state-factor columns to mirror MATLAB's likelihood_12 (which omits
+ # period-(t-1) inv measurements from the chained-sample importance
+ # weight). Build the mapping explicitly rather than relying on
+ # state-before-endogenous ordering.
+ state_factor_indices_in_latent = jnp.array(
+ [factors.index(f) for f in state_factors], dtype=jnp.int32
+ )
+
+ params_index = get_transition_period_params_index(
+ period=period,
+ latent_factors=state_factors,
+ transition_info=transition_info,
+ measurements_at_period=measurements_pt,
+ controls=controls_names,
+ endogenous_factors=endogenous_factors,
+ observed_factors=observed_factors,
+ shock_factors=shock_factors,
+ )
+ normalizations = get_normalizations_for_period(model_spec.factors, period=period)
+ params_template = create_af_params_template(
+ params_index,
+ normalizations,
+ period=period,
+ )
+
+ params_template = _initialize_transition_params(
+ params_template,
+ measurements,
+ start_params,
+ fixed_params,
+ period=period,
+ model_spec=model_spec,
+ state_factors=state_factors,
+ endogenous_factors=endogenous_factors,
+ observed_factors=observed_factors,
+ observed_factor_data=observed_factor_data,
+ prev_measurements=prev_measurements,
+ af_options=af_options,
+ normalizations=normalizations,
+ )
+
+ # Collect transition function constraints (only for state factors' transitions)
+ transition_constraints = _collect_transition_constraints(
+ transition_info,
+ state_factors,
+ processed_model.labels.all_factors,
+ period,
+ )
+
+ _seed_probability_start_values(
+ params_template, transition_constraints, fixed_params
+ )
+
+ # Build loading mask
+ loading_mask = _build_loading_mask(all_measures, factors, measurements_pt)
+
+ # JOINT Halton design covering ALL randomness needed at this step,
+ # mirroring MATLAB's `create_nodes_weights_01/12`. The chained sample
+ # θ_0 → θ_{period-1} is rebuilt on-demand inside the integrand from
+ # this single joint sequence (see `_rebuild_chain_at_period` in
+ # `af/likelihood.py` and the obsidian note
+ # `sigma-prod-collapse-2026-05-07.md` for why this matters).
+ #
+ # Layout of joint_nodes[j]:
+ # [:n_state] -- z_state for θ_0
+ # for s in 0..period-2: -- prior chain steps
+ # [n_state+s*zb : n_state+s*zb+n_shock] -- z_P at period s+1
+ # [...n_shock+n_endog] -- z_inv at period s+1
+ # [tail: n_shock] -- z_P at current step (period)
+ # [tail: n_endog] -- z_inv at current step (period)
+ #
+ # Seed the Halton design with the period index. Each step draws an
+ # independent low-discrepancy sequence; the joint structure within a
+ # step delivers proper quasi-uniform 3D+ coverage (vs. the previous
+ # split scheme which paired two independent sequences at the same j).
+ n_chain = period - 1 # number of prior transition steps already estimated
+ z_block = n_shock + n_endog
+ joint_dim = n_state + n_chain * z_block + z_block
+ joint_nodes, joint_weights = create_halton_nodes_and_weights(
+ af_options.n_halton_points,
+ joint_dim,
+ seed=period,
+ )
+
+ prev_dist_arrays, total_n_transition_params = _prepare_transition_inputs(
+ prev_distribution,
+ transition_info,
+ state_factors,
+ measurements.shape[0],
+ )
+
+ # Build combined transition from raw transition functions.
+ # Only state factors have transitions; endogenous factors use the investment eq.
+ raw_funcs = _get_raw_transition_functions(
+ model_spec,
+ state_factors,
+ all_factors=processed_model.labels.all_factors,
+ param_names=transition_info.param_names,
+ )
+ param_counts = tuple(len(transition_info.param_names[f]) for f in state_factors)
+
+ def combined_transition(
+ full_states: Array,
+ params: Array,
+ ) -> Array:
+ """Apply per-factor transitions."""
+ result = jnp.zeros(n_state)
+ p_idx = 0
+ for i in range(n_state):
+ n_p = param_counts[i]
+ factor_params = params[p_idx : p_idx + n_p]
+ result = result.at[i].set( # noqa: PD008
+ raw_funcs[i](full_states, factor_params)
+ )
+ p_idx += n_p
+ return result
+
+ # Count investment equation params (per endogenous factor: intercept + state + obs)
+ n_inv_eq_params_per = 1 + n_state + len(observed_factors) if n_endog > 0 else 0
+ total_n_inv_params = n_endog * n_inv_eq_params_per
+
+ # Observed factor values for investment equation (from previous period)
+ n_obs_fac = len(observed_factors)
+ obs_factor_values = (
+ observed_factor_data
+ if observed_factor_data is not None
+ else jnp.zeros((measurements.shape[0], n_obs_fac))
+ )
+
+ # Carry forward chain links from prior transition steps for the
+ # joint-Halton chain rebuild. The period-0→1 step has chain_links == ().
+ chain_links = prev_distribution.chain_links
+
+ # Per-obs observed factors at the source period of each chain link
+ # (period 0 for link 0, period 1 for link 1, ...). Stack across
+ # links into shape (n_obs, n_chain, n_obs_factors). Each ChainLink
+ # already carries its own period's `obs_factor_values` internally;
+ # extract them here in obs-major order to match the per-obs map in
+ # `_transition_loglike_per_obs`.
+ if len(chain_links) == 0:
+ obs_factor_values_chain = jnp.zeros((measurements.shape[0], 0, n_obs_fac))
+ else:
+ obs_factor_values_chain = jnp.stack(
+ [link.obs_factor_values for link in chain_links], axis=1
+ )
+
+ result_params, opt_res = _run_transition_optimization(
+ params_template=params_template,
+ prev_period_params=prev_period_params,
+ model_spec=model_spec,
+ factors=factors,
+ period=period,
+ n_state=n_state,
+ n_endog=n_endog,
+ n_shock=n_shock,
+ shock_factor_indices=shock_factor_indices,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ all_measures=all_measures,
+ controls_names=controls_names,
+ measurements=measurements,
+ controls=controls,
+ prev_measurements=prev_measurements,
+ prev_controls=prev_controls,
+ loading_mask=loading_mask,
+ prev_dist_arrays=prev_dist_arrays,
+ chain_links=chain_links,
+ obs_factor_values_chain=obs_factor_values_chain,
+ joint_nodes=joint_nodes,
+ joint_weights=joint_weights,
+ combined_transition=combined_transition,
+ total_n_transition_params=total_n_transition_params,
+ total_n_inv_params=total_n_inv_params,
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ obs_factor_values=obs_factor_values,
+ af_options=af_options,
+ transition_constraints=transition_constraints,
+ fixed_params=fixed_params,
+ user_constraints=user_constraints,
+ )
+
+ # Build the next ChainLink from the just-fitted period parameters and
+ # append it to the chain history. Future transition steps will replay
+ # this link as part of their joint-Halton chain rebuild.
+ new_link = _build_chain_link(
+ period=period,
+ result_params=result_params,
+ combined_transition=combined_transition,
+ shock_factor_indices=shock_factor_indices,
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ obs_factor_values=obs_factor_values,
+ )
+ new_chain_links = (*chain_links, new_link)
+
+ # Build the importance-sample SUMMARY (mean, chol_cov per component)
+ # for posterior-state extraction. This path is no longer load-bearing
+ # for the transition likelihood (rebuilt on-demand from joint Halton),
+ # but `posterior_states.py` still consumes the per-component summary
+ # statistics derived from the chained sample.
+ updated_dist = _update_conditional_distribution(
+ prev_distribution=prev_distribution,
+ result_params=result_params,
+ combined_transition=combined_transition,
+ joint_nodes=joint_nodes,
+ n_state=n_state,
+ n_endog=n_endog,
+ n_shock=n_shock,
+ shock_factor_indices=shock_factor_indices,
+ observed_factor_values=obs_factor_values,
+ n_observed_factors=len(observed_factors),
+ )
+ # Carry the accumulated chain history forward.
+ updated_dist = _replace_chain_links(updated_dist, new_chain_links)
+
+ period_result = AFPeriodResult(
+ period=period,
+ params=result_params,
+ loglikelihood=-float(opt_res.fun),
+ success=bool(opt_res.success),
+ optimize_result=opt_res,
+ )
+
+ return period_result, updated_dist
+
+
+def _run_transition_optimization(
+ *,
+ params_template: pd.DataFrame,
+ prev_period_params: pd.DataFrame,
+ model_spec: ModelSpec,
+ factors: tuple[str, ...],
+ period: int,
+ n_state: int,
+ n_endog: int,
+ n_shock: int,
+ shock_factor_indices: Array,
+ state_factor_indices_in_latent: Array,
+ all_measures: list[str],
+ controls_names: tuple[str, ...],
+ measurements: Array,
+ controls: Array,
+ prev_measurements: Array,
+ prev_controls: Array,
+ loading_mask: np.ndarray,
+ prev_dist_arrays: dict[str, Array | np.ndarray],
+ chain_links: tuple[ChainLink, ...],
+ obs_factor_values_chain: Array,
+ joint_nodes: Array,
+ joint_weights: Array,
+ combined_transition: Callable,
+ total_n_transition_params: int,
+ total_n_inv_params: int,
+ n_inv_eq_params_per: int,
+ obs_factor_values: Array,
+ af_options: AFEstimationOptions,
+ transition_constraints: list[om.constraints.Constraint],
+ fixed_params: pd.DataFrame | None,
+ user_constraints: list[om.constraints.Constraint] | None = None,
+) -> tuple[pd.DataFrame, om.OptimizeResult]:
+ """Build likelihood, run the optimizer, and return updated params.
+
+ Handle the mechanical optimization setup: construct the log-likelihood
+ keyword arguments, create the jitted value-and-gradient function, build
+ the params DataFrame + constraint list, and call `om.minimize`.
+
+ Return:
+ Tuple of (result_params DataFrame, OptimizeResult).
+
+ """
+ full_params_df, fixed_constraints = build_optimagic_inputs(
+ params_template, fixed_params
+ )
+
+ prev_meas_info = _extract_prev_measurement_params(
+ prev_period_params,
+ model_spec,
+ factors,
+ period - 1,
+ )
+
+ n_obs_per_batch = af_options.n_obs_per_batch
+ if n_obs_per_batch is None:
+ n_obs_per_batch = auto_n_obs_per_batch(
+ n_obs=int(measurements.shape[0]),
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ n_latent=n_state,
+ n_endogenous=n_endog,
+ )
+
+ loglike_kwargs = {
+ "n_state_factors": n_state,
+ "n_endogenous_factors": n_endog,
+ "n_shock_factors": n_shock,
+ "shock_factor_indices": shock_factor_indices,
+ "state_factor_indices_in_latent": state_factor_indices_in_latent,
+ "n_measures": len(all_measures),
+ "n_controls": len(controls_names),
+ "measurements": measurements,
+ "controls": controls,
+ "loading_mask": jnp.array(loading_mask),
+ "prev_measurements": prev_measurements,
+ "prev_controls": prev_controls,
+ "prev_loading_mask": prev_meas_info["loading_mask"],
+ "prev_control_params": prev_meas_info["control_params"],
+ "prev_loadings_flat": prev_meas_info["loadings_flat"],
+ "prev_meas_sds": prev_meas_info["meas_sds"],
+ "prev_distribution": prev_dist_arrays,
+ "chain_links": chain_links,
+ "obs_factor_values_chain": obs_factor_values_chain,
+ "joint_nodes": joint_nodes,
+ "joint_weights": joint_weights,
+ "transition_func": combined_transition,
+ "total_n_transition_params": total_n_transition_params,
+ "total_n_inv_params": total_n_inv_params,
+ "n_inv_eq_params_per": n_inv_eq_params_per,
+ "observed_factor_values": obs_factor_values,
+ "stability_floor": af_options.stability_floor,
+ "n_obs_per_batch": n_obs_per_batch,
+ }
+
+ loglike_and_grad = create_loglike_and_gradient(
+ af_loglike_transition,
+ **loglike_kwargs,
+ )
+
+ def fun(params_df: pd.DataFrame) -> float:
+ val, _grad = loglike_and_grad(jnp.array(params_df["value"].to_numpy()))
+ return float(val)
+
+ def fun_and_jac(params_df: pd.DataFrame) -> tuple[float, np.ndarray]:
+ val, grad = loglike_and_grad(jnp.array(params_df["value"].to_numpy()))
+ return float(val), np.array(grad)
+
+ within_step_constraints = filter_within_step_constraints(
+ user_constraints, full_params_df.index
+ )
+ combined_constraints = (
+ list(transition_constraints) + list(fixed_constraints) + within_step_constraints
+ )
+ full_params_df = reconcile_start_to_equality(
+ full_params_df, within_step_constraints
+ )
+
+ opt_res = om.minimize(
+ fun=fun,
+ params=full_params_df[["value"]],
+ algorithm=af_options.optimizer_algorithm,
+ bounds=om.Bounds(
+ lower=full_params_df["lower_bound"],
+ upper=full_params_df["upper_bound"],
+ ),
+ constraints=combined_constraints or None,
+ fun_and_jac=fun_and_jac,
+ **to_plain_dict(af_options.optimizer_options),
+ )
+
+ result_params = params_template.copy()
+ result_params["value"] = opt_res.params["value"].to_numpy()
+
+ return result_params, opt_res
+
+
+def _collect_transition_constraints(
+ transition_info: TransitionInfo,
+ factors: tuple[str, ...],
+ all_factors: tuple[str, ...],
+ period: int,
+) -> list[om.constraints.Constraint]:
+ """Collect transition function constraints for the AF optimizer.
+
+ Look for `constraints_{function_name}()` in `transition_functions.py`,
+ mirroring how CHS collects them in `constraints.py`.
+ """
+ import skillmodels.common.transition_functions as tf_mod # noqa: PLC0415
+
+ constraints: list[om.constraints.Constraint] = []
+ for factor in factors:
+ if factor not in transition_info.function_names:
+ continue
+ fname = transition_info.function_names[factor]
+ constraint_fn = getattr(tf_mod, f"constraints_{fname}", None)
+ if constraint_fn is not None:
+ constraints.append(
+ constraint_fn(
+ factor=factor,
+ factors=all_factors,
+ aug_period=period - 1,
+ )
+ )
+ return constraints
+
+
+def _extract_prev_measurement_params(
+ prev_params: pd.DataFrame,
+ model_spec: ModelSpec,
+ factors: tuple[str, ...],
+ prev_period: int,
+) -> dict[str, Array]:
+ """Extract estimated measurement params from the previous period.
+
+ These are used as fixed (known) values when conditioning the transition
+ likelihood on individual-specific previous-period data.
+ """
+ measurements_prev = get_measurements_per_factor(
+ model_spec.factors, period=prev_period
+ )
+ all_prev_measures = _get_ordered_measures(measurements_prev)
+ loading_mask = _build_loading_mask(all_prev_measures, factors, measurements_prev)
+
+ # Extract loadings (packed, in order of the mask)
+ loadings_list = []
+ for mi, meas in enumerate(all_prev_measures):
+ for fi, factor in enumerate(factors):
+ if loading_mask[mi, fi]:
+ loc = ("loadings", prev_period, meas, factor)
+ if loc in prev_params.index:
+ loadings_list.append(
+ float(prev_params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ )
+
+ # Extract control params
+ ctrl_entries = prev_params.loc[
+ prev_params.index.get_level_values("category") == "controls"
+ ]
+ ctrl_names = (
+ sorted(set(ctrl_entries.index.get_level_values("name2")))
+ if len(ctrl_entries) > 0
+ else ["constant"]
+ )
+ ctrl_params_list = _collect_ctrl_params(
+ prev_params,
+ all_prev_measures,
+ ctrl_names,
+ prev_period,
+ )
+ control_params = jnp.array(ctrl_params_list).reshape(
+ len(all_prev_measures), len(ctrl_names)
+ )
+
+ # Extract measurement SDs
+ meas_sds_list = []
+ for meas in all_prev_measures:
+ loc = ("meas_sds", prev_period, meas, "-")
+ if loc in prev_params.index:
+ meas_sds_list.append(
+ float(prev_params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ )
+
+ return {
+ "loading_mask": jnp.array(loading_mask),
+ "loadings_flat": jnp.array(loadings_list),
+ "control_params": control_params,
+ "meas_sds": jnp.array(meas_sds_list),
+ }
+
+
+def _collect_ctrl_params(
+ prev_params: pd.DataFrame,
+ measures: list[str],
+ ctrl_names: list[str],
+ prev_period: int,
+) -> list[float]:
+ """Collect control parameter values from the previous period's estimate."""
+ result = []
+ for meas in measures:
+ for ctrl in ctrl_names:
+ loc = ("controls", prev_period, meas, ctrl)
+ if loc in prev_params.index:
+ result.append(
+ float(prev_params.loc[loc, "value"]) # ty: ignore[invalid-argument-type]
+ )
+ else:
+ result.append(0.0)
+ return result
+
+
+def _get_raw_transition_functions(
+ model_spec: ModelSpec,
+ factors: tuple[str, ...],
+ *,
+ all_factors: tuple[str, ...],
+ param_names: Mapping[str, tuple[str, ...]],
+) -> tuple[Callable, ...]:
+ """Get the raw (non-vmapped) transition functions for each factor.
+
+ Returns callables with a uniform `(states, params_array) -> scalar`
+ signature for use inside JIT-compiled code. Built-in transitions
+ from `transition_functions.py` already match that signature;
+ `@register_params`-decorated user functions take individual factor
+ arguments plus a `params` dict, so they are wrapped here to convert
+ from AF's packed representation.
+ """
+ import skillmodels.common.transition_functions as tf_mod # noqa: PLC0415
+
+ funcs: list[Callable] = []
+ for factor in factors:
+ spec = model_spec.factors[factor]
+ tf = spec.transition_function
+ if isinstance(tf, str):
+ funcs.append(getattr(tf_mod, tf))
+ elif callable(tf):
+ if hasattr(tf, "__registered_params__"):
+ funcs.append(
+ _wrap_registered_transition_function(
+ tf,
+ all_factors=all_factors,
+ param_names=tuple(param_names[factor]),
+ )
+ )
+ else:
+ funcs.append(tf)
+ else:
+ msg = f"Factor '{factor}': no transition function specified."
+ raise TypeError(msg)
+ return tuple(funcs)
+
+
+def _wrap_registered_transition_function(
+ user_func: Callable,
+ *,
+ all_factors: tuple[str, ...],
+ param_names: tuple[str, ...],
+) -> Callable:
+ """Bridge `@register_params` user functions to AF's `(states, params)` convention.
+
+ A user-defined transition function takes one positional argument
+ per factor it consumes (matching factor names in `all_factors`)
+ plus a final `params` dict keyed by `__registered_params__`. AF's
+ `combined_transition`, in contrast, supplies a packed state vector
+ and a flat parameter slice. This wrapper looks up each consumed
+ factor's position in `all_factors`, slices `states` accordingly,
+ rebuilds the `params` dict, and forwards the call.
+ """
+ sig = inspect.signature(user_func)
+ arg_names = [name for name in sig.parameters if name != "params"]
+ arg_positions = tuple(all_factors.index(name) for name in arg_names)
+
+ def wrapped(states: Array, factor_params: Array) -> Array:
+ kwargs: dict[str, Array | dict[str, Array]] = {
+ name: states[pos]
+ for name, pos in zip(arg_names, arg_positions, strict=True)
+ }
+ kwargs["params"] = dict(zip(param_names, factor_params, strict=True))
+ return user_func(**kwargs)
+
+ return wrapped
+
+
+def _prepare_transition_inputs(
+ prev_distribution: ConditionalDistribution,
+ transition_info: TransitionInfo,
+ factors: tuple[str, ...],
+ n_obs: int,
+) -> tuple[dict[str, Array | np.ndarray], int]:
+ """Pack the period-0 conditional distribution payload for the likelihood.
+
+ Returns a dict the transition likelihood reads to seed its on-demand
+ chain rebuild from a joint Halton draw. The chain is rebuilt fresh at
+ every likelihood call from the period-0 cond_means/cond_chols plus
+ the carried `chain_links` (handled separately); no static
+ chained-sample carry-over is consumed here.
+
+ Return:
+ Tuple of (prev_dist_arrays dict, n_transition_params). The dict
+ contains keys "cond_weights" (per-obs Bayes-posterior mixture
+ weights), "cond_means" (per-component, per-obs Schur-conditional
+ means at period 0), and "cond_chols" (per-component
+ Schur-conditional Cholesky factors at period 0).
+
+ """
+ n_components = len(prev_distribution.components)
+
+ if prev_distribution.conditional_weights is not None:
+ cond_weights = prev_distribution.conditional_weights
+ else:
+ cond_weights = jnp.broadcast_to(
+ prev_distribution.mixture_weights[None, :],
+ (n_obs, n_components),
+ )
+
+ if prev_distribution.cond_means is None or prev_distribution.cond_chols is None:
+ msg = (
+ "prev_distribution must carry cond_means and cond_chols (the "
+ "period-0 Schur-conditional payload). Initial period must be "
+ "estimated before any transition step."
+ )
+ raise ValueError(msg)
+
+ prev_dist_arrays = {
+ "cond_weights": cond_weights,
+ "cond_means": prev_distribution.cond_means,
+ "cond_chols": prev_distribution.cond_chols,
+ }
+
+ total_n_transition_params = sum(
+ len(transition_info.param_names[f])
+ for f in factors
+ if f in transition_info.param_names
+ )
+
+ return prev_dist_arrays, total_n_transition_params
+
+
+def _seed_probability_start_values(
+ params_template: pd.DataFrame,
+ transition_constraints: list[om.constraints.Constraint],
+ fixed_params: pd.DataFrame | None,
+) -> None:
+ """Seed start values for probability-constrained selectors.
+
+ Distribute ``1 - sum(fixed_values)`` uniformly over the unfixed entries
+ so the simplex sums to one before optimization.
+ """
+ fixed_loc = set(fixed_params.index) if fixed_params is not None else set()
+ for constr in transition_constraints:
+ if not isinstance(constr, om.ProbabilityConstraint):
+ continue
+ prob_idx = constr.selector(params_template[["value"]]).index
+ fixed_mask = prob_idx.isin(fixed_loc)
+ fixed_sum = (
+ float(params_template.loc[prob_idx[fixed_mask], "value"].sum())
+ if fixed_mask.any()
+ else 0.0
+ )
+ free_prob_idx = prob_idx[~fixed_mask]
+ if len(free_prob_idx) > 0:
+ params_template.loc[free_prob_idx, "value"] = (1.0 - fixed_sum) / len(
+ free_prob_idx
+ )
+
+
+def _initialize_transition_params(
+ params_template: pd.DataFrame,
+ measurements: Array,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ *,
+ period: int | None = None,
+ model_spec: ModelSpec | None = None,
+ state_factors: tuple[str, ...] = (),
+ endogenous_factors: tuple[str, ...] = (),
+ observed_factors: tuple[str, ...] = (),
+ observed_factor_data: Array | None = None,
+ prev_measurements: Array | None = None,
+ af_options: AFEstimationOptions | None = None,
+ normalizations: dict[str, dict[tuple[str, str], float]] | None = None,
+) -> pd.DataFrame:
+ """Initialize transition period parameters with reasonable defaults.
+
+ If `start_params` is provided, matching entries override the defaults.
+ If `fixed_params` is provided, matching entries are pinned (value +
+ bounds clamped).
+
+ When ``af_options.start_params_strategy == "spearman"``, run
+ Spearman cross-covariance estimation per factor at the current period
+ and seed loadings, sigma_meas, sigma_shock, sigma_inv, and inv-equation β from
+ those moments. Falls back to the static defaults below for any factor
+ with fewer than two measurements or where Spearman identification is
+ degenerate.
+ """
+ params = params_template.copy()
+ meas_np = np.array(measurements)
+
+ # Transition params: small values (near identity)
+ trans_mask = params.index.get_level_values("category") == "transition"
+ for idx in params.index[trans_mask]:
+ if params.loc[idx, "lower_bound"] != params.loc[idx, "upper_bound"]:
+ # Set linear terms close to identity
+ params.loc[idx, "value"] = 0.5
+
+ # Shock SDs: moderate
+ shock_mask = params.index.get_level_values("category") == "shock_sds"
+ params.loc[shock_mask, "value"] = 0.5
+
+ # Measurement SDs from data
+ sd_mask = params.index.get_level_values("category") == "meas_sds"
+ for i, idx in enumerate(params.index[sd_mask]):
+ if i < meas_np.shape[1]:
+ obs_sd = float(np.nanstd(meas_np[:, i]))
+ params.loc[idx, "value"] = max(obs_sd * 0.5, 0.01)
+
+ # Loadings to 1.0 where free
+ load_mask = params.index.get_level_values("category") == "loadings"
+ for idx in params.index[load_mask]:
+ if params.loc[idx, "lower_bound"] != params.loc[idx, "upper_bound"]:
+ params.loc[idx, "value"] = 1.0
+
+ # Optional moment-based override: seed loadings / sigma_meas / sigma_shock /
+ # sigma_inv from Spearman cross-covariances of the current-period
+ # measurements. This puts the optimizer near the strongly-identified
+ # MLE neighborhood; for sigma_inv_0 specifically, this is the difference
+ # between converging at truth and drifting to the lower bound along
+ # the sigma_inv / sigma_meas constant-Var ridge.
+ if (
+ af_options is not None
+ and af_options.start_params_strategy == "spearman"
+ and model_spec is not None
+ and period is not None
+ ):
+ params = _apply_moment_based_overrides_transition(
+ params,
+ measurements,
+ prev_measurements=prev_measurements,
+ observed_factor_data=observed_factor_data,
+ model_spec=model_spec,
+ period=period,
+ state_factors=state_factors,
+ endogenous_factors=endogenous_factors,
+ observed_factors=observed_factors,
+ normalizations=normalizations or {},
+ )
+
+ if start_params is not None:
+ apply_start_params(params, start_params)
+
+ if fixed_params is not None:
+ apply_fixed_params(params, fixed_params)
+
+ return params
+
+
+def _apply_moment_based_overrides_transition( # noqa: C901, PLR0912, PLR0915
+ params: pd.DataFrame,
+ measurements: Array,
+ *,
+ prev_measurements: Array | None,
+ observed_factor_data: Array | None,
+ model_spec: ModelSpec,
+ period: int,
+ state_factors: tuple[str, ...],
+ endogenous_factors: tuple[str, ...],
+ observed_factors: tuple[str, ...],
+ normalizations: dict[str, dict[tuple[str, str], float]],
+) -> pd.DataFrame:
+ """Override transition-period params with Spearman cross-cov moments.
+
+ For each factor with at least two measurements at the current period,
+ run `spearman_factor_moments` and write back loadings, sigma_meas, and
+ derive a starting sigma_shock (state factors) or sigma_inv (endogenous factors)
+ from the latent variance. Investment-equation β coefficients are seeded
+ via OLS of the endogenous-factor anchor measurement on the prev-period
+ state anchor measurements plus the observed factors.
+ """
+ out = params.copy()
+ meas_np = np.array(measurements)
+ measurements_pt = get_measurements_per_factor(model_spec.factors, period=period)
+ all_measures = _get_ordered_measures(measurements_pt)
+ meas_index = {m: i for i, m in enumerate(all_measures)}
+ loading_norms = normalizations.get("loadings", {})
+
+ spearman_results: dict[str, SpearmanResult] = {}
+
+ for factor, factor_meas in measurements_pt.items():
+ if len(factor_meas) < 2:
+ continue
+ cols = [meas_index[m] for m in factor_meas if m in meas_index]
+ if len(cols) < 2:
+ continue
+ if max(cols) >= meas_np.shape[1]:
+ continue
+ sub = meas_np[:, cols]
+
+ anchor_loading = 1.0
+ anchor_local = 0
+ for local_idx, meas_name in enumerate(factor_meas):
+ if (meas_name, factor) in loading_norms:
+ anchor_local = local_idx
+ anchor_loading = float(loading_norms[(meas_name, factor)])
+ break
+
+ result = spearman_factor_moments(
+ sub,
+ anchor_idx=anchor_local,
+ anchor_loading=anchor_loading,
+ )
+ if not result.valid:
+ continue
+ spearman_results[factor] = result
+
+ # Override loadings (skip pinned rows).
+ for local_idx, meas_name in enumerate(factor_meas):
+ loc = ("loadings", period, meas_name, factor)
+ if loc not in out.index:
+ continue
+ if out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]:
+ out.loc[loc, "value"] = float(result.loadings[local_idx])
+
+ # Override measurement SDs (skip pinned rows).
+ for local_idx, meas_name in enumerate(factor_meas):
+ loc = ("meas_sds", period, meas_name, "-")
+ if loc not in out.index:
+ continue
+ if out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]:
+ out.loc[loc, "value"] = float(result.meas_sds[local_idx])
+
+ # Seed shock_sds (state factors) and investment_sds (endogenous
+ # factors), and the investment equation's β coefficients, via OLS of
+ # the current-period anchor measurement on the prev-period state
+ # anchors plus observed factors. The OLS residual variance gives
+ # sigma_shock² + sigma_meas² (state) or sigma_inv² + sigma_meas² (endogenous);
+ # subtracting sigma_meas² gives a clean starting point for the latent
+ # shock SD that correctly accounts for variance explained by
+ # observed factors and the prev state. (Without this subtraction
+ # the seed is dominated by observed-factor variance, which can make
+ # sigma_inv start orders of magnitude above truth.)
+ if prev_measurements is not None and len(state_factors) > 0:
+ prev_meas_np = np.array(prev_measurements)
+ prev_measurements_pt = get_measurements_per_factor(
+ model_spec.factors, period=period - 1
+ )
+ prev_all_measures = _get_ordered_measures(prev_measurements_pt)
+ prev_meas_index = {m: i for i, m in enumerate(prev_all_measures)}
+
+ state_anchor_cols: list[int] = []
+ for sf in state_factors:
+ sf_meas = prev_measurements_pt.get(sf, ())
+ if not sf_meas or sf_meas[0] not in prev_meas_index:
+ state_anchor_cols.append(-1)
+ continue
+ state_anchor_cols.append(prev_meas_index[sf_meas[0]])
+
+ obs_data = (
+ np.array(observed_factor_data)
+ if observed_factor_data is not None and len(observed_factors) > 0
+ else np.zeros((prev_meas_np.shape[0], 0))
+ )
+
+ anchors_ok = all(c >= 0 for c in state_anchor_cols)
+
+ # Seed sigma_shock for each state factor: residual variance of
+ # OLS(Z_state_anchor_t ~ Z_state_anchor_{t-1}, observed) minus
+ # sigma_meas².
+ if anchors_ok:
+ state_anchor_data = prev_meas_np[:, state_anchor_cols]
+ regressors_state = np.column_stack([state_anchor_data, obs_data])
+ for sf in state_factors:
+ if sf not in spearman_results:
+ continue
+ sf_meas = measurements_pt.get(sf, ())
+ if not sf_meas:
+ continue
+ anchor_idx = meas_index.get(sf_meas[0])
+ if anchor_idx is None:
+ continue
+ response = meas_np[:, anchor_idx]
+ if response.shape[0] != regressors_state.shape[0]:
+ continue
+ beta_hat = seed_beta_from_ols(response, regressors_state)
+ if not np.all(np.isfinite(beta_hat)):
+ continue
+ fitted = regressors_state @ beta_hat
+ resid = response - fitted
+ resid_finite = resid[np.isfinite(resid)]
+ if resid_finite.size < 2:
+ continue
+ resid_var = float(np.var(resid_finite, ddof=1))
+ sigma_meas_anchor = float(spearman_results[sf].meas_sds[0])
+ seed_sd = float(np.sqrt(max(resid_var - sigma_meas_anchor**2, 1e-6)))
+ loc = ("shock_sds", period - 1, sf, "-")
+ if (
+ loc in out.index
+ and out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]
+ ):
+ out.loc[loc, "value"] = seed_sd
+
+ # Seed sigma_inv and inv-equation β for each endogenous factor. β goes
+ # from OLS coefs (the same regression used for the sigma_inv residual).
+ if anchors_ok and len(endogenous_factors) > 0:
+ state_anchor_data = prev_meas_np[:, state_anchor_cols]
+ regressors_inv = np.column_stack([state_anchor_data, obs_data])
+ for ef in endogenous_factors:
+ if ef not in spearman_results:
+ continue
+ ef_meas = measurements_pt.get(ef, ())
+ if not ef_meas:
+ continue
+ ef_anchor_idx = meas_index.get(ef_meas[0])
+ if ef_anchor_idx is None:
+ continue
+ response = meas_np[:, ef_anchor_idx]
+ if response.shape[0] != regressors_inv.shape[0]:
+ continue
+ beta_hat = seed_beta_from_ols(response, regressors_inv)
+ if not np.all(np.isfinite(beta_hat)):
+ continue
+ fitted = regressors_inv @ beta_hat
+ resid = response - fitted
+ resid_finite = resid[np.isfinite(resid)]
+ if resid_finite.size < 2:
+ continue
+ resid_var = float(np.var(resid_finite, ddof=1))
+ sigma_meas_anchor = float(spearman_results[ef].meas_sds[0])
+ seed_sd = float(np.sqrt(max(resid_var - sigma_meas_anchor**2, 1e-6)))
+ loc = ("investment_sds", period - 1, ef, "-")
+ if (
+ loc in out.index
+ and out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]
+ ):
+ out.loc[loc, "value"] = seed_sd
+
+ # Write β into inv_eq rows.
+ state_betas = beta_hat[: len(state_factors)]
+ obs_betas = beta_hat[len(state_factors) :]
+ for sf, b in zip(state_factors, state_betas, strict=True):
+ loc = ("investment_eq", period - 1, ef, sf)
+ if (
+ loc in out.index
+ and out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]
+ ):
+ out.loc[loc, "value"] = float(b)
+ for of, b in zip(observed_factors, obs_betas, strict=True):
+ loc = ("investment_eq", period - 1, ef, of)
+ if (
+ loc in out.index
+ and out.loc[loc, "lower_bound"] != out.loc[loc, "upper_bound"]
+ ):
+ out.loc[loc, "value"] = float(b)
+
+ return out
+
+
+def _replace_chain_links(
+ cond_dist: ConditionalDistribution,
+ chain_links: tuple[ChainLink, ...],
+) -> ConditionalDistribution:
+ """Return a new ConditionalDistribution with `chain_links` replaced.
+
+ Used by `estimate_transition_period` to carry the accumulated chain
+ history forward (one extra `ChainLink` per estimated transition).
+ """
+ return ConditionalDistribution(
+ mixture_weights=cond_dist.mixture_weights,
+ components=cond_dist.components,
+ samples_per_component=cond_dist.samples_per_component,
+ conditional_weights=cond_dist.conditional_weights,
+ cond_means=cond_dist.cond_means,
+ cond_chols=cond_dist.cond_chols,
+ chain_links=chain_links,
+ )
+
+
+def _build_chain_link(
+ *,
+ period: int,
+ result_params: pd.DataFrame,
+ combined_transition: Callable,
+ shock_factor_indices: Array,
+ n_inv_eq_params_per: int,
+ obs_factor_values: Array,
+) -> ChainLink:
+ """Pack a freshly-fitted period's parameters into a ChainLink.
+
+ The resulting `ChainLink` is appended to the carried `chain_links` so
+ that downstream transition periods can replay this period inside their
+ joint-Halton chain rebuild (see `_rebuild_chain_at_period`).
+ """
+ transition_mask = result_params.index.get_level_values("category") == "transition"
+ transition_params = jnp.array(
+ result_params.loc[transition_mask, "value"].to_numpy()
+ )
+
+ shock_mask = result_params.index.get_level_values("category") == "shock_sds"
+ shock_sds = jnp.array(result_params.loc[shock_mask, "value"].to_numpy())
+
+ inv_eq_mask = result_params.index.get_level_values("category") == "investment_eq"
+ inv_eq_params = jnp.array(result_params.loc[inv_eq_mask, "value"].to_numpy())
+
+ inv_sd_mask = result_params.index.get_level_values("category") == "investment_sds"
+ inv_sds = jnp.array(result_params.loc[inv_sd_mask, "value"].to_numpy())
+
+ return ChainLink(
+ period=period,
+ transition_func=combined_transition,
+ transition_params=transition_params,
+ shock_sds=shock_sds,
+ shock_factor_indices=shock_factor_indices,
+ inv_eq_params=inv_eq_params,
+ inv_sds=inv_sds,
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ obs_factor_values=obs_factor_values,
+ )
+
+
+def _update_conditional_distribution(
+ prev_distribution: ConditionalDistribution,
+ result_params: pd.DataFrame,
+ combined_transition: Callable,
+ joint_nodes: Array,
+ n_state: int,
+ n_endog: int,
+ n_shock: int,
+ shock_factor_indices: Array,
+ observed_factor_values: Array,
+ n_observed_factors: int,
+) -> ConditionalDistribution:
+ """Build the next-period importance sample by chaining forward.
+
+ For each mixture component l, each Halton index j, and each observation
+ i:
+
+ 1. ``theta_prev = prev_samples[l][j, i, :]`` (no fresh draw).
+ 2. ``inv = beta_0 + beta_state @ theta_prev + beta_obs @ Y_i +
+ sigma_inv * z_inv[j]`` (current-period investment equation,
+ evaluated at the just-estimated parameters and the same z_inv that
+ the period-t likelihood used).
+ 3. ``theta_t = transition(full_prev_with_obs, trans_params) +
+ sigma_prod * z_prod[j]``.
+
+ The result is a per-component array of shape
+ ``(n_halton, n_obs, n_state)`` which we hand to the next period's
+ likelihood. Per-component summary stats (mean, chol_cov) are computed
+ from each new sample for use by `posterior_states` and `inference`.
+
+ This mirrors MATLAB's `create_nodes_weights_12` style: the previous
+ period's Halton-driven samples are propagated through the just-fitted
+ chain, and that chained sample becomes the next period's importance
+ distribution.
+ """
+ # Extract estimated transition params, shock SDs, investment-equation
+ # params, and investment-shock SDs.
+ trans_mask = result_params.index.get_level_values("category") == "transition"
+ shock_mask = result_params.index.get_level_values("category") == "shock_sds"
+ inv_eq_mask = result_params.index.get_level_values("category") == "investment_eq"
+ inv_sd_mask = result_params.index.get_level_values("category") == "investment_sds"
+
+ trans_params = jnp.array(result_params.loc[trans_mask, "value"].to_numpy())
+ shock_sds = jnp.array(result_params.loc[shock_mask, "value"].to_numpy())
+ inv_eq_params = (
+ jnp.array(result_params.loc[inv_eq_mask, "value"].to_numpy())
+ if inv_eq_mask.any()
+ else jnp.zeros(0)
+ )
+ inv_sds = (
+ jnp.array(result_params.loc[inv_sd_mask, "value"].to_numpy())
+ if inv_sd_mask.any()
+ else jnp.zeros(0)
+ )
+
+ n_per_inv_eq = 1 + n_state + n_observed_factors if n_endog > 0 else 0
+
+ # The joint Halton design has a larger dimension than just the
+ # current step's shocks (it also covers the chain rebuild's z_state
+ # and prior-step shocks; see `estimate_transition_period`). The
+ # current-step shocks live in the LAST `n_shock + n_endog` columns.
+ # The chain rebuild below iterates only over `prev_sample.shape[0]`
+ # leading rows (the summary-halton subset), not over all
+ # `joint_nodes.shape[0]` rows.
+ z_block_curr = n_shock + n_endog
+
+ def _chain_one_component(prev_sample: Array | np.ndarray) -> Array:
+ """Map (j, i) -> theta_t given prev_sample (n_halton, n_obs, n_state)."""
+
+ def _at_node(j_idx: int | Array, i_idx: int | Array) -> Array:
+ theta_prev = prev_sample[j_idx, i_idx]
+ obs_y = (
+ observed_factor_values[i_idx]
+ if n_observed_factors > 0
+ else jnp.zeros(0)
+ )
+ z_at_j_full = joint_nodes[j_idx]
+ z_at_j = z_at_j_full[-z_block_curr:]
+ z_shock = z_at_j[:n_shock]
+ z_inv_shock = z_at_j[n_shock:]
+
+ # Investment equation at the just-estimated params.
+ inv = jnp.zeros(n_endog)
+ for k in range(n_endog):
+ beta = inv_eq_params[k * n_per_inv_eq : (k + 1) * n_per_inv_eq]
+ intercept = beta[0]
+ state_coeffs = beta[1 : 1 + n_state]
+ obs_coeffs = beta[1 + n_state :]
+ inv_k = (
+ intercept
+ + jnp.dot(state_coeffs, theta_prev)
+ + jnp.dot(obs_coeffs, obs_y)
+ + inv_sds[k] * z_inv_shock[k]
+ )
+ inv = inv.at[k].set(inv_k) # noqa: PD008
+
+ full_prev_with_obs = jnp.concatenate([theta_prev, inv, obs_y])
+ state_shock_contrib = (
+ jnp.zeros(n_state) # noqa: PD008
+ .at[shock_factor_indices]
+ .set(shock_sds * z_shock)
+ )
+ return combined_transition(full_prev_with_obs, trans_params) + (
+ state_shock_contrib
+ )
+
+ # Iterate over `prev_sample`'s leading axis (the retained
+ # summary draws, controlled by
+ # `AFEstimationOptions.n_halton_points_posterior_summary`) so
+ # the rebuilt sample stays at the summary size. The summary
+ # count is bounded by the joint Halton size, so the
+ # `joint_nodes[j_idx]` indexing inside `_at_node` is valid.
+ n_halton_summary, n_obs = prev_sample.shape[0], prev_sample.shape[1]
+ return jax.vmap(
+ jax.vmap(_at_node, in_axes=(None, 0)),
+ in_axes=(0, None),
+ )(jnp.arange(n_halton_summary), jnp.arange(n_obs))
+
+ new_samples_per_component: list[Array] = []
+ new_components: list[MixtureComponent] = []
+ for prev_sample in prev_distribution.samples_per_component:
+ new_sample = _chain_one_component(prev_sample)
+ new_samples_per_component.append(new_sample)
+ # Summary stats: per-Halton mean across obs for posterior_states
+ # consumption. (Mean is also taken across obs to give a population-
+ # level summary; the actual likelihood uses the per-obs sample.)
+ flat = new_sample.reshape(-1, n_state)
+ new_mean = jnp.mean(flat, axis=0)
+ centered = flat - new_mean[None, :]
+ new_cov = (centered.T @ centered) / flat.shape[0] + 1e-8 * jnp.eye(n_state)
+ new_chol = jnp.linalg.cholesky(new_cov)
+ new_components.append(MixtureComponent(mean=new_mean, chol_cov=new_chol))
+
+ return ConditionalDistribution(
+ mixture_weights=prev_distribution.mixture_weights,
+ components=tuple(new_components),
+ samples_per_component=tuple(new_samples_per_component),
+ conditional_weights=prev_distribution.conditional_weights,
+ # Carry the period-0 Schur conditional payload AND the chain
+ # history forward; downstream transition steps replay the chain
+ # from period 0, not from this period's chained samples.
+ cond_means=prev_distribution.cond_means,
+ cond_chols=prev_distribution.cond_chols,
+ chain_links=prev_distribution.chain_links,
+ )
diff --git a/src/skillmodels/af/types.py b/src/skillmodels/af/types.py
new file mode 100644
index 00000000..4b3be319
--- /dev/null
+++ b/src/skillmodels/af/types.py
@@ -0,0 +1,410 @@
+"""Frozen dataclass definitions for the AF estimator."""
+
+import dataclasses
+import gc
+from collections.abc import Callable, Mapping
+from dataclasses import dataclass, field
+from types import MappingProxyType
+from typing import Any, Literal
+
+import jax
+import numpy as np
+import pandas as pd
+from jax import Array
+
+from skillmodels._beartype_conf import OPTIONS_CONF, beartype_init
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import ensure_containers_are_immutable
+
+
+@beartype_init(OPTIONS_CONF)
+@dataclass(frozen=True, init=False)
+class AFEstimationOptions:
+ """Configuration options for the AF estimator."""
+
+ n_halton_points: int
+ """Halton quadrature nodes per dimension."""
+
+ n_halton_points_shock: int
+ """Quadrature nodes for production shock integration."""
+
+ optimizer_algorithm: str
+ """Optimization algorithm for each period's MLE.
+
+ Passed to `optimagic.minimize(algorithm=...)`.
+ """
+
+ optimizer_options: MappingProxyType[str, Any]
+ """Additional options passed to `optimagic.minimize(**optimizer_options)`."""
+
+ two_stage: bool
+ """Whether to use coarse-then-fine grid strategy."""
+
+ coarse_fraction: float
+ """Fraction of quadrature points for coarse stage (if two_stage is True)."""
+
+ stability_floor: float
+ """Floor added to likelihood for numerical stability."""
+
+ n_obs_per_batch: int | None
+ """Observations per reverse-mode autodiff chunk.
+
+ When `None` (default), an auto-detected value is derived from the
+ available GPU/CPU memory in `estimate_af`. Setting this to a small
+ integer trades compile time and throughput for lower peak VRAM; the
+ likelihood value is unchanged.
+ """
+
+ start_params_strategy: Literal["none", "constant", "spearman", "amn"]
+ """Strategy for seeding optimizer start values.
+
+ Canonical name shared with `CHSEstimationOptions`; the literal set is
+ unified across the two likelihood estimators.
+
+ `"amn"` (default) runs the full AMN 2020 three-stage estimator
+ upfront and uses its parameter estimates as start values for the
+ per-period MLE. `"spearman"` uses Spearman cross-covariance
+ moments per period (factor-analysis identification) to seed
+ loadings, sigma_meas, sigma_shock, and sigma_inv. `"constant"`
+ reproduces the legacy 0.5 / 0.5*obs_sd defaults; provided for
+ regression testing and pre-fix reproducibility. `"none"` is accepted
+ for cross-estimator symmetry and behaves identically to `"constant"`
+ (AF always needs concrete per-period starts, so there is no NaN-leave
+ mode; the static defaults stand and the caller's `start_params`
+ overlay them).
+ """
+
+ keep_conditional_distributions: bool
+ """If True (default), the result's `conditional_distributions` field
+ holds the per-period filtered state distributions, materialised on
+ host as numpy. Set to False to skip the device→host transfer of
+ these arrays entirely and return an empty tuple; useful on small
+ GPUs (e.g. P100 12 GB) where the final materialisation OOMs even
+ after the per-period optimiser has finished.
+ """
+
+ n_halton_points_posterior_summary: int
+ """Halton draws kept per period for `samples_per_component`, the
+ posterior-state summary tensor.
+
+ `samples_per_component` is an `(n, n_obs, n_state)` array per mixture
+ component used only by `posterior_states.py` and the inference
+ sandwich to compute summary statistics; it is NOT consumed by the
+ transition likelihood (which rebuilds the chain on-demand from a
+ joint Halton via `_rebuild_chain_at_period`). The likelihood always
+ uses `n_halton_points`; this knob only controls the persistent
+ summary tensor's size.
+
+ Defaults to 256, which keeps the per-period summary tensor under
+ a few MB even at `n_obs = 50_000`. Bump higher (e.g. 2_000) if
+ posterior-state summary precision matters for downstream analysis.
+ """
+
+ def __init__( # noqa: D107
+ self,
+ n_halton_points: int = 50,
+ n_halton_points_shock: int = 30,
+ optimizer_algorithm: str = "fides",
+ optimizer_options: Mapping[str, Any] | None = None,
+ *,
+ two_stage: bool = False,
+ coarse_fraction: float = 0.5,
+ stability_floor: float = 1e-217,
+ n_obs_per_batch: int | None = None,
+ start_params_strategy: Literal["none", "constant", "spearman", "amn"] = "amn",
+ keep_conditional_distributions: bool = True,
+ n_halton_points_posterior_summary: int = 256,
+ ) -> None:
+ if n_halton_points_posterior_summary < 1:
+ msg = (
+ "n_halton_points_posterior_summary must be >= 1, "
+ f"got {n_halton_points_posterior_summary}."
+ )
+ raise ValueError(msg)
+ object.__setattr__(self, "n_halton_points", n_halton_points)
+ object.__setattr__(self, "n_halton_points_shock", n_halton_points_shock)
+ object.__setattr__(self, "optimizer_algorithm", optimizer_algorithm)
+ object.__setattr__(
+ self,
+ "optimizer_options",
+ ensure_containers_are_immutable(optimizer_options or {}),
+ )
+ object.__setattr__(self, "two_stage", two_stage)
+ object.__setattr__(self, "coarse_fraction", coarse_fraction)
+ object.__setattr__(self, "stability_floor", stability_floor)
+ object.__setattr__(self, "n_obs_per_batch", n_obs_per_batch)
+ object.__setattr__(self, "start_params_strategy", start_params_strategy)
+ object.__setattr__(
+ self, "keep_conditional_distributions", keep_conditional_distributions
+ )
+ object.__setattr__(
+ self,
+ "n_halton_points_posterior_summary",
+ n_halton_points_posterior_summary,
+ )
+
+
+@dataclass(frozen=True)
+class MixtureComponent:
+ """Single component of a Gaussian mixture distribution."""
+
+ mean: Array | np.ndarray
+ """Mean vector, shape (n_factors,)."""
+
+ chol_cov: Array | np.ndarray
+ """Lower-triangular Cholesky factor of covariance, shape (n_factors, n_factors)."""
+
+
+@dataclass(frozen=True)
+class ChainLink:
+ """Frozen-period parameters for one prior step in the θ_0→θ_{t-1} chain.
+
+ Used by the AF transition likelihood to rebuild the chained importance
+ sample on-demand from a single joint Halton design at every transition
+ step (mirroring MATLAB's ``create_nodes_weights_01/12``). Each
+ `ChainLink` carries the just-fitted parameters of one prior transition
+ so the chain can be replayed inside the next step's likelihood call.
+ """
+
+ period: int
+ """Calendar period at which this link applies (1-indexed; the link
+ transforms θ_{period-1} → θ_period)."""
+
+ transition_func: Callable
+ """Combined per-factor transition function f(full_states, params)."""
+
+ transition_params: Array | np.ndarray
+ """Flat transition parameter vector for this period, shape
+ ``(total_n_transition_params,)``."""
+
+ shock_sds: Array | np.ndarray
+ """Production shock SDs for shock-bearing state factors, shape
+ ``(n_shock_factors,)``."""
+
+ shock_factor_indices: Array | np.ndarray
+ """Mapping each shock slot to its position in the state-factor
+ ordering, shape ``(n_shock_factors,)`` int."""
+
+ inv_eq_params: Array | np.ndarray
+ """Flat investment-equation parameters, shape
+ ``(n_endogenous * n_inv_eq_params_per,)``."""
+
+ inv_sds: Array | np.ndarray
+ """Investment shock SDs, shape ``(n_endogenous,)``."""
+
+ n_inv_eq_params_per: int
+ """Investment equation parameters per endogenous factor (1 + n_state +
+ n_observed_factors when n_endogenous > 0; 0 otherwise)."""
+
+ obs_factor_values: Array | np.ndarray
+ """Observed factor values at this link's source period (i.e. period -
+ 1), shape ``(n_obs, n_observed_factors)``. Used in the chain rebuild
+ for the inv equation and the transition function."""
+
+
+# Register ChainLink as a JAX pytree so tuples of ChainLinks can be passed
+# through `jax.jit` in the AF transition likelihood. Array fields are
+# leaves; the period index, transition function, and per-link int counts
+# are static metadata baked into the trace.
+jax.tree_util.register_dataclass(
+ ChainLink,
+ data_fields=[
+ "transition_params",
+ "shock_sds",
+ "shock_factor_indices",
+ "inv_eq_params",
+ "inv_sds",
+ "obs_factor_values",
+ ],
+ meta_fields=["period", "transition_func", "n_inv_eq_params_per"],
+)
+
+
+@dataclass(frozen=True)
+class ConditionalDistribution:
+ """Estimated conditional distribution of latent factors at a given period.
+
+ Holds two things that downstream code consumes:
+
+ * Per-component summary statistics (`mean`, `chol_cov`) of the chained
+ sample at this period — used by `posterior_states.py` and the
+ inference sandwich code.
+ * The chain history (`chain_links`) needed to rebuild the chained
+ sample on-demand inside the next transition step's likelihood (joint
+ Halton design — see `_rebuild_chain_at_period` in
+ `af.likelihood`).
+
+ For the period-0 distribution: per-obs `cond_means` / `cond_chols`
+ encode the Schur conditional of latent factors given observed factors
+ (`Y_0`); `conditional_weights` are the Bayes posterior mixture weights
+ given `Y_0`. These period-0 quantities are carried forward UNCHANGED
+ across every transition step (the chain replays from period 0), so the
+ state distribution at any later period is conditioned on `Y_0` only.
+ Later-period observed factors (income `Y_t`, t > 0) enter solely the
+ investment and transition equations; they never re-condition the state
+ distribution. Interpreting the carried distribution as the period-t
+ conditional state density therefore rests on a sequential
+ non-informativeness assumption for income (given `Y_0` and the modeled
+ transition history, `Y_t` adds no information about `theta_t`).
+
+ Note: `samples_per_component` is retained for backward compatibility
+ and posterior-state-summary computation, but is no longer load-bearing
+ inside the transition likelihood (which rebuilds the chain on-demand).
+ """
+
+ mixture_weights: Array | np.ndarray
+ """Mixture weights, shape (n_components,)."""
+
+ components: tuple[MixtureComponent, ...]
+ """Per-component summary statistics (mean, chol_cov) derived from the
+ importance sample. Used by `posterior_states` and `inference`; not used
+ in the transition likelihood itself."""
+
+ samples_per_component: tuple[Array | np.ndarray, ...]
+ """One importance-sample array per mixture component, each shape
+ ``(n_halton, n_obs, n_state)``. Retained for posterior-state summary
+ statistics; not consumed by the transition likelihood (which rebuilds
+ the chain on-demand from a joint Halton). May use a smaller Halton
+ count than the likelihood's `n_halton_points`."""
+
+ conditional_weights: Array | np.ndarray | None = None
+ """Individual-specific conditional mixture weights, shape (n_obs, n_components).
+
+ When not None, these override `mixture_weights` for each observation (computed
+ from Bayes' rule using data from previous periods).
+ """
+
+ cond_means: Array | np.ndarray | None = None
+ """Per-obs Schur-conditional means of the latent state given observed
+ factors at period 0, shape ``(n_components, n_obs, n_state)``. Built
+ by the initial period only. None for transition-period distributions.
+ """
+
+ cond_chols: Array | np.ndarray | None = None
+ """Per-component Schur-conditional Cholesky factors at period 0, shape
+ ``(n_components, n_state, n_state)``. Shared across observations
+ because the conditional covariance does not depend on Y_i (it's the
+ prior cov_yy minus a Schur term). None for transition-period
+ distributions."""
+
+ chain_links: tuple[ChainLink, ...] = field(default_factory=tuple)
+ """Sequence of frozen prior-period parameter packages, one per
+ transition already estimated. Empty before period 1; one entry after
+ period 1 estimation; two entries after period 2; etc. Used by the
+ transition likelihood to rebuild the chained sample on-demand from a
+ single joint Halton."""
+
+
+@dataclass(frozen=True)
+class AFPeriodResult:
+ """Result from estimating a single period."""
+
+ period: int
+ """Calendar period index."""
+
+ params: pd.DataFrame
+ """Estimated parameters with 4-level MultiIndex (category, period, name1, name2)."""
+
+ loglikelihood: float
+ """Log-likelihood value at the optimum."""
+
+ success: bool
+ """Whether optimization converged."""
+
+ optimize_result: Any
+ """Raw optimagic result object."""
+
+
+@dataclass(frozen=True)
+class AFEstimationResult:
+ """Complete result from AF estimation across all periods."""
+
+ period_results: tuple[AFPeriodResult, ...]
+ """Per-period estimation results, ordered by period."""
+
+ params: pd.DataFrame
+ """Combined parameters from all periods with standard 4-level MultiIndex."""
+
+ model_spec: ModelSpec
+ """The ModelSpec used for estimation."""
+
+ conditional_distributions: tuple[ConditionalDistribution, ...]
+ """Estimated conditional distributions per period (for filtered states)."""
+
+ success: bool
+ """AND across the per-period optimiser convergence flags. Conforms to
+ `skillmodels.common.estimation.CommonEstimationResult`."""
+
+ loglikelihood: float
+ """Sum of the per-period log-likelihoods at the optimum (AF maximises a
+ sequence of per-period likelihoods)."""
+
+ md_criterion: float | None = None
+ """Always `None` for AF; present to satisfy the common result Protocol."""
+
+ def to_numpy(self) -> AFEstimationResult:
+ """Return a copy with all device arrays materialised as numpy.
+
+ Drops `samples_per_component` (per-period
+ `(n_halton, n_obs, n_state)` importance buffers, typically
+ multi-GB) and replaces every `jax.Array` inside the conditional
+ distributions with a host-side `np.ndarray`.
+
+ Call this before pickling the result or when device memory needs
+ to be released. `estimate_af` itself returns arrays on-device so
+ repeated calls can reuse the JAX/XLA compilation cache; that
+ cache is freed here (the side effect is necessary because the
+ host-staging buffer for the GPU→host copy must fit, and on a
+ device loaded with compiled per-period likelihoods + gradients
+ it routinely OOMs without this).
+ """
+ # Free compiled executables + unreferenced device buffers so the
+ # host staging copy below has room.
+ jax.clear_caches()
+ gc.collect()
+ new_cds = tuple(
+ _conditional_distribution_to_numpy(cd)
+ for cd in self.conditional_distributions
+ )
+ return dataclasses.replace(self, conditional_distributions=new_cds)
+
+
+def _array_to_numpy(value: Array | np.ndarray | None) -> np.ndarray | None:
+ if value is None:
+ return None
+ return np.asarray(jax.device_get(value))
+
+
+def _chain_link_to_numpy(link: ChainLink) -> ChainLink:
+ return dataclasses.replace(
+ link,
+ transition_params=_array_to_numpy(link.transition_params),
+ shock_sds=_array_to_numpy(link.shock_sds),
+ shock_factor_indices=_array_to_numpy(link.shock_factor_indices),
+ inv_eq_params=_array_to_numpy(link.inv_eq_params),
+ inv_sds=_array_to_numpy(link.inv_sds),
+ obs_factor_values=_array_to_numpy(link.obs_factor_values),
+ )
+
+
+def _conditional_distribution_to_numpy(
+ cond_dist: ConditionalDistribution,
+) -> ConditionalDistribution:
+ new_components = tuple(
+ MixtureComponent(
+ mean=_array_to_numpy(c.mean), # ty: ignore[invalid-argument-type]
+ chol_cov=_array_to_numpy(c.chol_cov), # ty: ignore[invalid-argument-type]
+ )
+ for c in cond_dist.components
+ )
+ new_chain_links = tuple(_chain_link_to_numpy(cl) for cl in cond_dist.chain_links)
+ return dataclasses.replace(
+ cond_dist,
+ mixture_weights=_array_to_numpy(cond_dist.mixture_weights),
+ components=new_components,
+ samples_per_component=(),
+ conditional_weights=_array_to_numpy(cond_dist.conditional_weights),
+ cond_means=_array_to_numpy(cond_dist.cond_means),
+ cond_chols=_array_to_numpy(cond_dist.cond_chols),
+ chain_links=new_chain_links,
+ )
diff --git a/src/skillmodels/af/validate.py b/src/skillmodels/af/validate.py
new file mode 100644
index 00000000..79555775
--- /dev/null
+++ b/src/skillmodels/af/validate.py
@@ -0,0 +1,280 @@
+"""AF-specific ModelSpec validation."""
+
+import warnings
+
+import optimagic as om
+import pandas as pd
+
+from skillmodels.common.identification import check_identification
+from skillmodels.common.model_spec import FactorSpec, ModelSpec
+
+# Transition functions compatible with AF estimation (parametric, differentiable).
+_AF_COMPATIBLE_TRANSITIONS = frozenset(
+ {
+ "linear",
+ "translog",
+ "translog_af",
+ "robust_translog",
+ "log_ces",
+ "log_ces_af",
+ "log_ces_with_constant",
+ "log_ces_general",
+ "linear_and_squares",
+ }
+)
+
+# Built-in production transition functions that enumerate parameters over
+# `all_factors` (latent + observed). When such a function is used for a
+# (non-endogenous) production factor and observed factors are present, the
+# observed factors (e.g. income) receive free linear / square / interaction /
+# CES-weight coefficients and silently enter the production function — which
+# changes the AF estimand (income must affect skills only through the
+# investment equation). `translog_af` / `log_ces_af` are deliberately NOT in
+# this set because they are documented to receive production factors only.
+_LEAKY_BUILTIN_PRODUCTION = frozenset(
+ {
+ "linear",
+ "linear_and_squares",
+ "translog",
+ "robust_translog",
+ "log_ces",
+ "log_ces_with_constant",
+ "log_ces_general",
+ }
+)
+
+# Hard minimum: 2 measurements + a loading normalization just-identify the
+# per-period measurement system (3 moments — Var(Z1), Var(Z2), Cov(Z1,Z2) —
+# vs 1 free loading + 2 sigma_meas) given Var(F) pinned by the chain.
+_MIN_MEASURES_PER_FACTOR = 2
+# Recommended minimum: the AF paper's identification arguments assume 3
+# indicators per factor per period (over-identified Spearman moments).
+# Below this, Stage-B Spearman is noisy and cross-period equality
+# constraints on loadings / sigma_meas become load-bearing for ID.
+_RECOMMENDED_MEASURES_PER_FACTOR = 3
+
+
+def validate_af_model(
+ model_spec: ModelSpec,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+) -> None:
+ """Validate that a ModelSpec is compatible with AF estimation.
+
+ Check:
+ - At least 3 measurements per factor in each period where the factor is measured
+ - Transition functions are parametric (built-in or registered)
+ - Normalizations are present for each factor
+ - Each factor's period-0 (initial-distribution) affine orbit is anchored:
+ the initial distribution is not produced by any transition, so its scale
+ and location must be pinned directly by a loading/intercept normalization,
+ a `fixed_params` pin, or an equality constraint. A `Normalizations` object
+ with empty period-0 maps would otherwise leave the trans-log model
+ under-identified. Periods t>0 are not checked here -- the transition can
+ legitimately propagate the anchor, so verifying their identification needs
+ a transition-aware diagnostic (tracked separately).
+
+ The optional `fixed_params` and `constraints` (the same objects passed to
+ `estimate_af`) supply the alternative anchors. They default to None so the
+ measurement-system and transition checks can be run on a bare ModelSpec.
+
+ Also emit a loud `UserWarning` (not an error) when a built-in production
+ transition function would silently absorb observed factors (income).
+ Built-in transitions enumerate parameters over ALL factors (latent +
+ observed), so an observed factor enters the production function with free
+ coefficients. The AF model assumes observed factors (e.g. income) affect
+ skills ONLY through the investment equation; using a built-in transition
+ on a production factor while observed factors are present violates that
+ assumption. The warning (rather than a hard error) keeps existing models
+ runnable while surfacing the wrong-estimand risk so it is an explicit
+ choice; use `translog_af` / `log_ces_af` (production-factors only) to
+ avoid the leakage entirely.
+
+ Raise:
+ ValueError: If validation fails, with a detailed error message.
+ NotImplementedError: If the model declares a control-function correction
+ (`FactorSpec.correction`), which AF does not implement.
+
+ """
+ corrected = [
+ name for name, spec in model_spec.factors.items() if spec.correction is not None
+ ]
+ if corrected:
+ msg = (
+ "AF estimation does not implement the control-function correction "
+ f"(kappa != 0) declared by FactorSpec.correction on {corrected}. AF "
+ "covers only the kappa=0 (exogenous-investment) special case. Use "
+ "estimate_chs for the correction, or strip it with "
+ "ModelSpec.without_correction()."
+ )
+ raise NotImplementedError(msg)
+
+ errors: list[str] = []
+ for factor_name, factor_spec in model_spec.factors.items():
+ errors.extend(_validate_factor(factor_name, factor_spec))
+
+ errors.extend(check_identification(model_spec, fixed_params, constraints))
+
+ _warn_on_observed_factor_leakage(model_spec)
+
+ if errors:
+ msg = "ModelSpec is not compatible with AF estimation:\n" + "\n".join(
+ f" - {e}" for e in errors
+ )
+ raise ValueError(msg)
+
+
+def _validate_factor(factor_name: str, factor_spec: FactorSpec) -> list[str]:
+ """Return a list of error messages for a single factor."""
+ errors: list[str] = []
+
+ # Check measurements: need >= 2 per factor in each active period; warn
+ # below 3 (the recommended count from the AF paper).
+ for period, measures in enumerate(factor_spec.measurements):
+ if len(measures) == 0:
+ continue
+ if len(measures) < _MIN_MEASURES_PER_FACTOR:
+ errors.append(
+ f"Factor '{factor_name}' period {period}: AF requires at least "
+ f"{_MIN_MEASURES_PER_FACTOR} measurements, got {len(measures)}."
+ )
+ elif len(measures) < _RECOMMENDED_MEASURES_PER_FACTOR:
+ warnings.warn(
+ f"Factor '{factor_name}' period {period}: only {len(measures)} "
+ f"measurements (AF paper assumes at least "
+ f"{_RECOMMENDED_MEASURES_PER_FACTOR}). Identification of "
+ f"loadings + sigma_meas at this period relies on "
+ f"cross-period equality constraints across the AF MLE chain; "
+ f"supply explicit `fixed_params` for the loading if needed.",
+ stacklevel=3,
+ )
+
+ # Check transition function is parametric
+ tf = factor_spec.transition_function
+ if tf is not None and isinstance(tf, str) and tf not in _AF_COMPATIBLE_TRANSITIONS:
+ errors.append(
+ f"Factor '{factor_name}': transition function '{tf}' is not in the "
+ f"set of AF-compatible functions: {sorted(_AF_COMPATIBLE_TRANSITIONS)}."
+ )
+ # Custom callables are accepted if they have __registered_params__
+ if callable(tf) and not hasattr(tf, "__registered_params__"):
+ errors.append(
+ f"Factor '{factor_name}': custom transition function must be decorated "
+ f"with @register_params to be used with AF estimation."
+ )
+
+ # Check normalizations exist. The required pattern is transition-specific
+ # (audit F7a): trans-log needs a per-factor affine anchor (loading=1 and
+ # intercept=0) at the initial period; restricted CES (psi=1) needs only a
+ # SINGLE scale anchor (lambda_theta,0,1=1) -- CES identifies the remaining
+ # loadings -- with location supplied by the simplex (plain log_ces) or a
+ # pinned intercept (log_ces_with_constant). So do not prescribe the trans-log
+ # "one per period" pattern for every factor.
+ if factor_spec.normalizations is None:
+ errors.append(
+ f"Factor '{factor_name}': AF requires explicit normalizations. "
+ f"Provide a scale anchor (a finite nonzero loading=1) for one "
+ f"measurement, plus a finite period-0 measurement-intercept (or "
+ f"equivalent latent-location pin) as the absolute initial location "
+ f"anchor mu_theta,0,1=0. The CES simplex and the free constant of "
+ f"log_ces_with_constant do NOT supply that initial location anchor. "
+ f"Trans-log needs the affine anchor at the initial period; restricted "
+ f"CES needs only the single scale anchor lambda_theta,0,1=1 (the "
+ f"later loadings are then identified)."
+ )
+
+ # has_initial_distribution=False requires is_endogenous=True so the
+ # factor can be reconstructed via the investment equation at period 0.
+ if not factor_spec.has_initial_distribution and not factor_spec.is_endogenous:
+ errors.append(
+ f"Factor '{factor_name}': has_initial_distribution=False is only "
+ f"supported for endogenous factors (set is_endogenous=True)."
+ )
+
+ # Factors without an initial distribution must also not be measured at
+ # period 0: their value at period 0 is not drawn from any mixture, so a
+ # measurement density there would have no latent value to hit.
+ if (
+ not factor_spec.has_initial_distribution
+ and len(factor_spec.measurements) > 0
+ and len(factor_spec.measurements[0]) > 0
+ ):
+ errors.append(
+ f"Factor '{factor_name}': has_initial_distribution=False requires "
+ f"empty measurements at period 0 (got "
+ f"{factor_spec.measurements[0]!r}). Drop them from the FactorSpec; "
+ f"their contribution would typically be absorbed into the "
+ f"transition step 0->1 in a MATLAB-style reproduction."
+ )
+
+ return errors
+
+
+def _warn_on_observed_factor_leakage(model_spec: ModelSpec) -> None:
+ """Warn when a built-in production function silently absorbs observed factors.
+
+ Built-in transition functions enumerate parameters over `all_factors`
+ (latent + observed), so observed factors (e.g. income) get FREE linear /
+ square / interaction / CES-weight coefficients in the production function.
+ The AF model assumes income affects skills ONLY through the investment
+ equation. Emit a loud `UserWarning` so the wrong-estimand risk is an
+ explicit, visible choice rather than a silent default. Use a
+ production-factors-only transition (`translog_af` / `log_ces_af`, or a
+ custom `@register_params` callable consuming only production factors) to
+ remove the leakage. The warning is deliberately NOT an error: it must not
+ break existing, intentionally-leaky models, and `validate_af_model` has no
+ access to `fixed_params` to detect an explicit opt-out (pinned-zero
+ observed-factor coefficients).
+ """
+ observed = tuple(model_spec.observed_factors)
+ if not observed:
+ return
+ for fac, fspec in model_spec.factors.items():
+ if fspec.is_endogenous:
+ # The investment equation legitimately uses observed factors.
+ continue
+ tf = fspec.transition_function
+ if isinstance(tf, str) and tf in _LEAKY_BUILTIN_PRODUCTION:
+ warnings.warn(
+ f"Factor '{fac}': built-in transition '{tf}' enumerates "
+ f"parameters over ALL factors including observed factors "
+ f"{observed}, so they enter the production function with free "
+ f"coefficients. The AF model assumes observed factors affect "
+ f"skills only through the investment equation. Use a "
+ f"production-factors-only transition ('translog_af' or "
+ f"'log_ces_af'), or pin every observed-factor transition "
+ f"coefficient to 0.0 via `fixed_params`, to avoid changing "
+ f"the production estimand.",
+ stacklevel=3,
+ )
+
+
+def fail_if_unsupported_kappa_params(
+ start_params: pd.DataFrame | None,
+ fixed_params: pd.DataFrame | None,
+ constraints: list | None, # noqa: ARG001
+) -> None:
+ """Raise if any supplied params reference an unimplemented kappa category.
+
+ AF integrates production and investment shocks as independent draws
+ (kappa_t = 0). A nonzero kappa_t control-function term is not
+ implemented; fail loudly rather than silently dropping such entries.
+ Unknown parameter categories never enter any period index and would
+ otherwise vanish without error, letting a caller believe endogenous
+ coupling is being estimated.
+ """
+ bad = {"kappa", "kappa_t"}
+
+ def _has_kappa(df: pd.DataFrame | None) -> bool:
+ if df is None or df.index.nlevels < 1:
+ return False
+ cats = df.index.get_level_values(0)
+ return any(c in bad for c in cats)
+
+ if _has_kappa(start_params) or _has_kappa(fixed_params):
+ msg = (
+ "AF estimation does not implement endogenous investment "
+ "(kappa_t != 0): production and investment shocks are assumed "
+ "independent (kappa_t = 0). Remove 'kappa'/'kappa_t' parameters."
+ )
+ raise NotImplementedError(msg)
diff --git a/src/skillmodels/amn/__init__.py b/src/skillmodels/amn/__init__.py
new file mode 100644
index 00000000..cfe07022
--- /dev/null
+++ b/src/skillmodels/amn/__init__.py
@@ -0,0 +1,79 @@
+"""AMN: Attanasio-Meghir-Nix (2020) latent factor estimator (and start values).
+
+This package exposes two distinct surfaces:
+
+1. **Start-value helpers** -- the Spearman cross-covariance moments
+ (`spearman_factor_moments`) and Bartlett-score OLS
+ (`seed_beta_from_ols`) that seed every estimator's starting values
+ (`get_spearman_start_params`, used by CHS and AF).
+
+2. **Full AMN estimator** -- a three-stage mixture-EM /
+ minimum-distance / simulate-and-regress procedure mirroring AMN 2020,
+ plus bootstrap inference and a per-observation posterior-state helper
+ for diagnostic plots.
+
+Public API:
+
+* Start-value helpers: `spearman_factor_moments`, `derive_unexplained_sd`,
+ `seed_beta_from_ols`, `SpearmanResult`, `get_spearman_start_params`,
+ `pool_equality_groups`.
+* AMN estimator: `estimate_amn`, `compute_amn_standard_errors`,
+ `get_amn_posterior_states`, `AMNEstimationOptions`,
+ `AMNEstimationResult`, `AMNInferenceResult`, `AMNStageResults`.
+* Stage 1 building blocks (for testing / advanced use):
+ `fit_mixture_em`, `build_augmented_measure_layout`,
+ `build_augmented_measure_matrix`, `MixtureFitResult`,
+ `AugmentedMeasureLayout`.
+"""
+
+from skillmodels.amn.estimate import estimate_amn
+from skillmodels.amn.inference import compute_amn_standard_errors
+from skillmodels.amn.mixture_em import (
+ build_augmented_measure_layout,
+ build_augmented_measure_matrix,
+ fit_mixture_em,
+)
+from skillmodels.amn.moments import (
+ SpearmanResult,
+ derive_unexplained_sd,
+ seed_beta_from_ols,
+ spearman_factor_moments,
+)
+from skillmodels.amn.posterior_states import get_amn_posterior_states
+from skillmodels.amn.start_values import (
+ get_spearman_start_params,
+ pool_equality_groups,
+)
+from skillmodels.amn.types import (
+ AMNEstimationOptions,
+ AMNEstimationResult,
+ AMNInferenceResult,
+ AMNStageResults,
+ AugmentedMeasureLayout,
+ MinimumDistanceResult,
+ MixtureFitResult,
+ ProductionFitResult,
+)
+
+__all__ = [
+ "AMNEstimationOptions",
+ "AMNEstimationResult",
+ "AMNInferenceResult",
+ "AMNStageResults",
+ "AugmentedMeasureLayout",
+ "MinimumDistanceResult",
+ "MixtureFitResult",
+ "ProductionFitResult",
+ "SpearmanResult",
+ "build_augmented_measure_layout",
+ "build_augmented_measure_matrix",
+ "compute_amn_standard_errors",
+ "derive_unexplained_sd",
+ "estimate_amn",
+ "fit_mixture_em",
+ "get_amn_posterior_states",
+ "get_spearman_start_params",
+ "pool_equality_groups",
+ "seed_beta_from_ols",
+ "spearman_factor_moments",
+]
diff --git a/src/skillmodels/amn/ces_recovery.py b/src/skillmodels/amn/ces_recovery.py
new file mode 100644
index 00000000..75123c11
--- /dev/null
+++ b/src/skillmodels/amn/ces_recovery.py
@@ -0,0 +1,174 @@
+"""Freyberger's restricted-CES primitive scale recovery (audit F2).
+
+AMN fits the restricted-CES production function in *transformed* (tilde)
+coordinates: it estimates the joint distribution of the transformed factors
+under the internal anchors lambda~_{theta,t,1}=lambda~_{I,t,1}=1, then fits the
+transformed production function (Freyberger eq prod_fn_ces_norm, with psi_t=1)
+
+ ln theta~_{t+1} = (lambda_{theta,t+1,1}/sigma_t)
+ * ln( gamma~_1t theta~_t^{sigma_t/lambda_{theta,t,1}}
+ + gamma~_2t I~_t^{sigma_t/lambda_{I,t,1}} )
+ + kappa~_t eta~_{I,t}.
+
+This is exactly the functional form of `log_ces_general`
+(`tfp * log(sum_i gamma_i * state_i^{sigma_i})`), with the per-period
+coefficients
+
+ outside (tfp) = lambda_{theta,t+1,1} / sigma_t
+ theta_exponent = sigma_t / lambda_{theta,t,1}
+ inv_exponent = sigma_t / lambda_{I,t,1}.
+
+The single-rho form previously used by AMN's `_fit_log_ces` (delta + (1/rho) *
+log(sum gamma_i exp(X_i rho)), one rho inside and out) CANNOT represent this
+when lambda_{theta,t,1} != lambda_{I,t,1}: the audit's counterexample
+(lambda_theta=2, lambda_inv=1, lambda_next=1, sigma=-0.5) has best-fit max abs
+error ~0.544. Hence restricted CES must be fit through the `log_ces_general`
+functional form.
+
+Given a `log_ces_general` fit in transformed coordinates and the *single* scale
+anchor lambda_{theta,0,1}=1 (with psi_t=1; paper line 831), this module recovers
+the primitive sigma_t, lambda_{theta,t,1} and lambda_{I,t,1} recursively
+(paper lines 1357-1366):
+
+ sigma_t = theta_exponent_t * lambda_{theta,t,1}
+ lambda_{I,t,1} = sigma_t / inv_exponent_t
+ lambda_{theta,t+1,1} = outside_t * sigma_t (carried into period t+1)
+
+The remaining recovery rescalings (paper 1357-1366), which are applied by the
+integrator once the scales are known, are:
+
+ lambda_{theta,t,m} = lambda~_{theta,t,m} * lambda_{theta,t,1}
+ lambda_{I,t,m} = lambda~_{I,t,m} * lambda_{I,t,1}
+ beta_0t = beta~_0t / lambda_{I,t,1}
+ beta_1t = beta~_1t * lambda_{theta,t,1} / lambda_{I,t,1}
+ beta_2t = beta~_2t / lambda_{I,t,1}
+ rho_0 = rho~_0
+ rho_1 = rho~_1 * lambda_{theta,T,1} (TERMINAL skill scale; see below)
+ ln theta_t = ln theta~_t / lambda_{theta,t,1}
+ ln I_t = ln I~_t / lambda_{I,t,1}
+
+and, with the same scales, the scale-dependent shock and control categories
+(Pro F9):
+
+ sigma_{eta_I,t} = sigma_{eta~_I,t} / abs(lambda_{I,t,1})
+ sigma_{eta_theta,t} = sigma_{eta~_theta,t} / abs(lambda_{theta,t+1,1})
+ kappa_t = kappa~_t * lambda_{I,t,1} / lambda_{theta,t+1,1}
+
+and the Stage-2 joint mixture: with the block-diagonal map A whose latent
+entries are the reciprocal scales 1/lambda_{*,t,1} and whose observed (income,
+outcome) entries are 1, every component transforms as m_k = A m~_k and
+Sigma_k = A Sigma~_k A^T (this handles latent-latent AND latent-observed
+cross-covariances); the mixture weights are unchanged. gamma~ = gamma when all
+first-measure locations mu are zero (eq 751).
+
+rho_1 (Pro F10/T1): the paper's recovery paragraph writes a generic t, but the
+anchor Q = rho_0 + rho_1 ln(theta_T) is on the TERMINAL skill, and
+rho~_1 = rho_1 / lambda_{theta,T,1}, so rho_1 = rho~_1 * lambda_{theta,T,1}. The
+generic t is a source transcription artifact; the forward recursion below
+correctly produces lambda_{theta,T,1} as its last carried scale.
+
+Scope (Pro T2/F9): this module implements ONLY the scale recursion (unit-tested,
+randomized-inversion verified by the reviewer to ~9e-16). The downstream
+rescalings above -- including the shock SDs, kappa, and the full joint-mixture
+transform -- are NOT yet wired into the AMN pipeline, so a standalone restricted-
+CES result would still mix coordinate systems. Because AMN is start-values-only
+in production (CHS/AF re-fit every parameter) the standalone guard is KEPT until
+the complete affine transformation is implemented and verified; the reviewer
+agreed (returning transformed-coordinate parameters in the primitive params
+schema would be misleading and is acceptable only behind a separately named API).
+"""
+
+import math
+from collections.abc import Sequence
+from dataclasses import dataclass
+
+
+def _require_nonzero_finite(value: float, what: str) -> None:
+ """Raise ValueError unless `value` is finite and nonzero (psi_t=1 domain)."""
+ if not math.isfinite(value) or value == 0.0:
+ msg = (
+ f"recover_primitive_ces_scales requires a nonzero, finite {what} "
+ f"(got {value}); the restricted-CES recovery assumes psi_t=1 with "
+ "nonzero scales and exponents. The exact Cobb-Douglas limit sigma_t=0 "
+ "is outside this parameterization and needs a separate limit form."
+ )
+ raise ValueError(msg)
+
+
+@dataclass(frozen=True)
+class CESTransformedCoeffs:
+ """Per-period coefficients of the transformed CES (a `log_ces_general` fit)."""
+
+ outside: float
+ """`tfp` = lambda_{theta,t+1,1} / sigma_t (the outside coefficient)."""
+ theta_exponent: float
+ """`sigma_skills` = sigma_t / lambda_{theta,t,1} (the skills exponent)."""
+ inv_exponent: float
+ """`sigma_investment` = sigma_t / lambda_{I,t,1} (the investment exponent)."""
+
+
+@dataclass(frozen=True)
+class CESPrimitiveScales:
+ """Recovered primitive scales for one transition period t."""
+
+ sigma: float
+ """The CES elasticity sigma_t."""
+ lambda_theta: float
+ """The skills scale lambda_{theta,t,1} at period t."""
+ lambda_inv: float
+ """The investment scale lambda_{I,t,1} at period t."""
+ lambda_theta_next: float
+ """The skills scale lambda_{theta,t+1,1} carried into period t+1."""
+
+
+def recover_primitive_ces_scales(
+ coeffs: Sequence[CESTransformedCoeffs],
+ *,
+ lambda_theta_0: float = 1.0,
+) -> list[CESPrimitiveScales]:
+ """Recover primitive CES scales from transformed-form coefficients.
+
+ Walks the periods forward from the scale anchor `lambda_theta_0`
+ (= lambda_{theta,0,1}, normally 1), inverting the transformed-form map at
+ each period and carrying the implied lambda_{theta,t+1,1} into the next.
+
+ Args:
+ coeffs: Per-period transformed-CES coefficients, period 0 first.
+ lambda_theta_0: The single primitive scale anchor lambda_{theta,0,1}.
+
+ Return:
+ One `CESPrimitiveScales` per period, in order.
+ """
+ _require_nonzero_finite(lambda_theta_0, "lambda_theta_0 anchor")
+ lambda_theta = lambda_theta_0
+ recovered: list[CESPrimitiveScales] = []
+ for coeff in coeffs:
+ _require_nonzero_finite(coeff.theta_exponent, "theta_exponent")
+ _require_nonzero_finite(coeff.inv_exponent, "inv_exponent")
+ _require_nonzero_finite(coeff.outside, "outside coefficient")
+ # Forward recursion (paper 1357-1366), confirmed faithful by the Pro
+ # review (randomized inversion of 1000 systems, max err ~9e-16):
+ # theta_exp = sigma/lambda_theta => sigma = theta_exp * lambda_theta;
+ # inv_exp = sigma/lambda_inv => lambda_inv = sigma/inv_exp;
+ # outside = lambda_theta_next/sigma => lambda_theta_next = outside*sigma.
+ # Anchor is lambda_theta,0,1 (psi_t=1, paper line 831). The domain
+ # checks above exclude the sigma_t -> 0 Cobb-Douglas limit (separate
+ # parameterization needed).
+ sigma = coeff.theta_exponent * lambda_theta
+ lambda_inv = sigma / coeff.inv_exponent
+ lambda_theta_next = coeff.outside * sigma
+ # Validate the DERIVED values too (Pro F5): finite nonzero inputs can
+ # still overflow/underflow their products and ratios.
+ _require_nonzero_finite(sigma, "derived sigma_t")
+ _require_nonzero_finite(lambda_inv, "derived lambda_I,t,1")
+ _require_nonzero_finite(lambda_theta_next, "derived lambda_theta,t+1,1")
+ recovered.append(
+ CESPrimitiveScales(
+ sigma=sigma,
+ lambda_theta=lambda_theta,
+ lambda_inv=lambda_inv,
+ lambda_theta_next=lambda_theta_next,
+ )
+ )
+ lambda_theta = lambda_theta_next
+ return recovered
diff --git a/src/skillmodels/amn/estimate.py b/src/skillmodels/amn/estimate.py
new file mode 100644
index 00000000..092111c1
--- /dev/null
+++ b/src/skillmodels/amn/estimate.py
@@ -0,0 +1,285 @@
+"""Top-level orchestration for the three-stage AMN estimator.
+
+Chains the three stages:
+
+1. `mixture_em.fit_mixture_em` -> reduced-form Pi, Psi
+2. `minimum_distance.solve_minimum_distance` -> structural Lambda, A, Sigma, mu, Omega
+3. `simulate_and_regress.simulate_and_regress` -> production-function params
+
+and merges the resulting parameter pieces into a single skillmodels
+params DataFrame.
+"""
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.amn.minimum_distance import (
+ _STAGE2_FIXED_CATEGORIES,
+ solve_minimum_distance,
+)
+from skillmodels.amn.mixture_em import (
+ build_augmented_measure_layout,
+ build_augmented_measure_matrix,
+ fit_mixture_em,
+)
+from skillmodels.amn.simulate_and_regress import simulate_and_regress
+from skillmodels.amn.types import (
+ AMNEstimationOptions,
+ AMNEstimationResult,
+ AMNStageResults,
+ MinimumDistanceResult,
+ MixtureFitResult,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import ProcessedModel
+
+# Parameter categories whose pins estimate_amn can honour in Stage 3 (the
+# simulate-and-regress production step). The production regression holds these
+# coefficients at their pinned values while fitting the remaining ones.
+_STAGE3_FIXED_CATEGORIES = frozenset({"transition"})
+
+# All fixed_params categories estimate_amn can route to the stage that fits
+# them: Stage 2 (structural measurement system) plus Stage 3 (production).
+_SUPPORTED_FIXED_CATEGORIES = _STAGE2_FIXED_CATEGORIES | _STAGE3_FIXED_CATEGORIES
+
+# Restricted-CES transitions AMN cannot consistently estimate standalone: the
+# Stage-3 CES regression omits Freyberger's primitive-scale recovery. The
+# generalized form `log_ces_general` is fine (it can express the transformed CES),
+# and custom `@register_params` transitions are out of scope for this guard.
+_RESTRICTED_CES_TRANSITIONS = frozenset(
+ {"log_ces", "log_ces_af", "log_ces_with_constant"}
+)
+
+
+def _fail_if_standalone_unsupported(
+ processed_model: ProcessedModel,
+ *,
+ for_start_values: bool,
+) -> None:
+ """Refuse standalone AMN on a model it cannot consistently estimate.
+
+ AMN's restricted-CES (`log_ces` / `log_ces_with_constant`) Stage-3 regression
+ does not perform Freyberger's primitive-scale recovery, so the returned CES
+ parameters are not consistent estimates. That is acceptable only when AMN is
+ producing start values for another estimator that re-fits every parameter
+ (`estimate_chs` and `estimate_af` both seed from AMN); `for_start_values=True`
+ flags that context, so the guard is skipped there. Standalone use (the
+ default) raises.
+ """
+ if for_start_values:
+ return
+ info = processed_model.transition_info
+ if info is None:
+ return
+ bad = sorted(
+ factor
+ for factor, name in info.function_names.items()
+ if name in _RESTRICTED_CES_TRANSITIONS
+ )
+ if bad:
+ msg = (
+ f"estimate_amn cannot consistently estimate the restricted-CES "
+ f"transition on factor(s) {bad}: AMN's Stage-3 CES regression omits the "
+ "primitive-scale recovery (Freyberger 2025), so the standalone result "
+ "would be inconsistent. Use 'log_ces_general', or use AMN only to seed "
+ "estimate_chs (which re-fits every parameter)."
+ )
+ raise NotImplementedError(msg)
+
+
+def _measurement_params_dataframe(
+ structural: MinimumDistanceResult,
+) -> pd.DataFrame:
+ """Translate Stage 2 outputs into rows of the standard params DataFrame."""
+ rows: list[tuple[str, int, str, str, float]] = []
+ for idx, row in structural.loadings.iterrows():
+ period, meas, factor = idx # ty: ignore[not-iterable]
+ rows.append(
+ ("loadings", int(period), str(meas), str(factor), float(row["loading"]))
+ )
+ for idx, row in structural.measurement_intercepts.iterrows():
+ period, meas = idx # ty: ignore[not-iterable]
+ rows.append(
+ ("controls", int(period), str(meas), "constant", float(row["intercept"]))
+ )
+ for idx, row in structural.measurement_sds.iterrows():
+ period, meas = idx # ty: ignore[not-iterable]
+ rows.append(("meas_sds", int(period), str(meas), "-", float(row["sd"])))
+ if not rows:
+ return pd.DataFrame(
+ {"value": []},
+ index=pd.MultiIndex.from_tuples(
+ [], names=["category", "aug_period", "name1", "name2"]
+ ),
+ )
+ index = pd.MultiIndex.from_tuples(
+ [(c, p, n1, n2) for c, p, n1, n2, _ in rows],
+ names=["category", "aug_period", "name1", "name2"],
+ )
+ values = [v for *_, v in rows]
+ return pd.DataFrame({"value": values}, index=index)
+
+
+def _fit_stage1_mixture(
+ processed_model: ProcessedModel,
+ data: pd.DataFrame,
+ amn_options: AMNEstimationOptions,
+) -> MixtureFitResult:
+ """Fit the Stage-1 mixture on the augmented measure vector.
+
+ The EM method is taken verbatim from `amn_options.mixture_em_method`:
+ `"complete_case"` (the default) raises `InsufficientCompleteCasesError` on an
+ unbalanced panel with too few complete rows, while `"missing_data"`
+ marginalises over each row's missing entries. An optional
+ `mixture_em_max_rows` cap subsamples rows first so the per-restart cost stays
+ bounded (used by CHS seeding); standalone estimation keeps the full sample.
+ """
+ n_components = processed_model.dimensions.n_mixtures
+ layout = build_augmented_measure_layout(processed_model)
+ augmented = build_augmented_measure_matrix(data, processed_model, layout)
+
+ max_rows = amn_options.mixture_em_max_rows
+ if max_rows is not None and augmented.shape[0] > max_rows:
+ rng = np.random.default_rng(amn_options.seed)
+ keep = rng.choice(augmented.shape[0], max_rows, replace=False)
+ augmented = augmented[keep]
+
+ return fit_mixture_em(
+ augmented,
+ n_components=n_components,
+ max_iter=amn_options.em_max_iter,
+ tol=amn_options.em_tol,
+ n_init=amn_options.em_n_init,
+ reg_covar=amn_options.em_reg_covar,
+ seed=amn_options.seed,
+ layout=layout,
+ method=amn_options.mixture_em_method,
+ allow_never_observed=amn_options.allow_never_observed_measurements,
+ )
+
+
+@beartype(conf=ESTIMATION_CONF)
+def estimate_amn(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ options: AMNEstimationOptions | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+ *,
+ linearize_control_function: bool = False,
+ for_start_values: bool = False,
+) -> AMNEstimationResult:
+ """Estimate a latent factor model using the Attanasio-Meghir-Nix method.
+
+ Args:
+ model_spec: Same model spec used by CHS and AF.
+ data: Panel dataset in long format with MultiIndex (id, period).
+ options: AMN-specific options. If None, uses defaults.
+ start_params: Not honoured -- raises `NotImplementedError` when
+ non-null. The three-stage estimator has no single free
+ optimisation to warm-start.
+ fixed_params: Pins for parameters AMN can hold in the stage that fits
+ them. Currently the `transition` category (production-function
+ coefficients) is honoured: each pinned coefficient is held at its
+ value inside the Stage-3 production regression while the remaining
+ coefficients are fit conditional on the pins, so the reported
+ params stay consistent with the criterion. Pins for other
+ categories raise `NotImplementedError` -- pin them on the returned
+ params yourself, or pass them to `estimate_chs` when seeding it.
+ constraints: Not honoured -- raises `NotImplementedError` when a
+ non-empty list is passed. The AMN stages have no optimiser in
+ which to impose equality/other constraints.
+ linearize_control_function: When True, fit only the linear `cf` term
+ of any `CorrectionSpec` and skip the higher-order
+ `NotImplementedError` gate. Used when AMN seeds `estimate_chs`:
+ the higher-order `kappa_terms` then fall back to small start
+ defaults rather than being estimated here.
+ for_start_values: When True, the result is consumed only as start values
+ for an estimator that re-fits every parameter (`estimate_chs` and
+ `estimate_af` both seed from AMN), so the standalone guard against
+ models AMN cannot consistently estimate (restricted CES) is skipped.
+ Standalone callers leave this False.
+
+ Return:
+ AMNEstimationResult containing per-stage outputs and the combined
+ params DataFrame.
+
+ """
+ if start_params is not None or constraints:
+ raise NotImplementedError(
+ "estimate_amn does not honour start_params or constraints. The "
+ "three-stage estimator has no single free optimisation in which to "
+ "warm-start or impose cross-parameter constraints. Use fixed_params "
+ "to pin individual parameters, or pass start_params / constraints to "
+ "estimate_chs when seeding it from AMN."
+ )
+ if fixed_params is not None and not fixed_params.empty:
+ # Pins are honoured inside the stage that fits each parameter, so they
+ # stay consistent with the criterion (unlike overlaying them on the
+ # result). Stage 2 (minimum distance) owns the structural measurement
+ # categories; Stage 3 (production regression) owns `transition`.
+ categories = set(fixed_params.index.get_level_values(0))
+ unsupported = categories - _SUPPORTED_FIXED_CATEGORIES
+ if unsupported:
+ raise NotImplementedError(
+ "estimate_amn honours fixed_params for the "
+ f"{sorted(_SUPPORTED_FIXED_CATEGORIES)} categories (held in the "
+ "stage that fits each: Stage 2 for the measurement system, "
+ "Stage 3 for production). Pins for "
+ f"{sorted(unsupported)} are not supported (they are derived "
+ "outputs, not free parameters); pin them on the returned params "
+ "yourself, or pass them to estimate_chs when seeding it from AMN."
+ )
+ if options is None:
+ options = AMNEstimationOptions()
+ amn_options = options
+
+ processed_model = process_model(model_spec)
+ _fail_if_standalone_unsupported(processed_model, for_start_values=for_start_values)
+ mixture = _fit_stage1_mixture(processed_model, data, amn_options)
+
+ structural = solve_minimum_distance(
+ mixture,
+ processed_model,
+ weighting=amn_options.minimum_distance_weighting,
+ algorithm=amn_options.optimizer_algorithm,
+ allow_overnormalization=amn_options.allow_ces_overnormalization,
+ algo_options=dict(amn_options.optimizer_options) or None,
+ fixed_params=fixed_params,
+ )
+
+ production = simulate_and_regress(
+ structural,
+ processed_model,
+ model_spec,
+ mixture_weights=mixture.weights,
+ n_draws=amn_options.n_simulation_draws,
+ seed=amn_options.seed,
+ linearize_control_function=linearize_control_function,
+ fixed_params=fixed_params,
+ )
+
+ measurement = _measurement_params_dataframe(structural)
+ all_params = pd.concat(
+ [measurement, production.production_params, production.investment_params]
+ ).sort_index()
+
+ success = structural.success and mixture.converged
+
+ return AMNEstimationResult(
+ model_spec=model_spec,
+ stages=AMNStageResults(
+ mixture=mixture,
+ structural=structural,
+ production=production,
+ ),
+ params=all_params,
+ success=success,
+ md_criterion=float(structural.objective_value),
+ synthetic_panel=None,
+ )
diff --git a/src/skillmodels/amn/inference.py b/src/skillmodels/amn/inference.py
new file mode 100644
index 00000000..98ed2e62
--- /dev/null
+++ b/src/skillmodels/amn/inference.py
@@ -0,0 +1,146 @@
+"""Bootstrap inference for the AMN estimator.
+
+Cluster (caseid-level) nonparametric bootstrap that re-runs all three
+estimation stages on each replicate, mirroring AMN 2020 p. 2523:
+
+ "To estimate confidence intervals and obtain critical values for
+ test statistics, we use the non-parametric bootstrap over all three
+ steps."
+
+Each bootstrap replicate:
+
+1. Resamples caseids with replacement (size = n_clusters).
+2. Calls `estimate_amn` on the resampled panel with the same options.
+3. Stores the resulting `all_params` row.
+
+After `n_boot` replicates, the standard errors are the column-wise std
+across replicate parameter vectors, and the covariance is the
+column-wise covariance. The first replicate inherits the original
+fit's params (resampling is i.i.d.; no need to recompute the point
+estimate).
+"""
+
+import dataclasses
+import warnings
+
+import numpy as np
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import INFERENCE_CONF
+from skillmodels.amn.estimate import estimate_amn
+from skillmodels.amn.types import (
+ AMNEstimationOptions,
+ AMNEstimationResult,
+ AMNInferenceResult,
+)
+
+
+def _resample_by_caseid(data: pd.DataFrame, rng: np.random.Generator) -> pd.DataFrame:
+ """Draw a caseid bootstrap sample with replacement."""
+ case_level = str(data.index.names[0])
+ caseids = data.index.get_level_values(case_level).unique()
+ n = len(caseids)
+ sampled = caseids[rng.integers(0, n, size=n)]
+ # Rebuild the panel with fresh sequential caseids so duplicates from
+ # the bootstrap survive the (caseid, period) uniqueness assumed by
+ # build_augmented_measure_matrix.
+ pieces = []
+ for new_id, original_id in enumerate(sampled):
+ block = data.xs(original_id, level=case_level, drop_level=False).copy()
+ old_periods = block.index.get_level_values(1)
+ block.index = pd.MultiIndex.from_arrays(
+ [np.full(len(block), new_id), old_periods],
+ names=data.index.names,
+ )
+ pieces.append(block)
+ return pd.concat(pieces)
+
+
+@beartype(conf=INFERENCE_CONF)
+def compute_amn_standard_errors(
+ result: AMNEstimationResult,
+ data: pd.DataFrame,
+ amn_options: AMNEstimationOptions | None = None,
+ *,
+ n_boot: int = 1_000,
+ seed: int = 0,
+) -> AMNInferenceResult:
+ """Cluster-bootstrap standard errors for AMN parameter estimates.
+
+ Args:
+ result: A fitted `AMNEstimationResult` (used to determine the
+ parameter index and as a fallback when a replicate fails).
+ data: Panel dataset used for the original fit.
+ amn_options: AMN options for replicate estimation. If None,
+ uses defaults (same as `estimate_amn`).
+ n_boot: Number of bootstrap replicates.
+ seed: RNG seed.
+
+ Return:
+ AMNInferenceResult with replicate-level params, std errors, and
+ covariance.
+
+ """
+ if amn_options is None:
+ amn_options = AMNEstimationOptions()
+
+ rng = np.random.default_rng(seed)
+ case_level = str(data.index.names[0])
+ caseids = data.index.get_level_values(case_level).unique()
+ n_clusters = len(caseids)
+
+ base_index = result.params.index
+ replicate_rows: list[pd.Series] = []
+ n_failed = 0
+ for b in range(n_boot):
+ replicate_seed = int(rng.integers(0, 2**32 - 1))
+ boot_data = _resample_by_caseid(data, rng)
+ boot_options = dataclasses.replace(amn_options, seed=replicate_seed)
+ try:
+ boot_result = estimate_amn(
+ result.model_spec,
+ boot_data,
+ boot_options,
+ )
+ if not boot_result.success:
+ n_failed += 1
+ warnings.warn(
+ f"AMN bootstrap replicate {b} did not converge; "
+ "excluding it from the bootstrap distribution.",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+ row = pd.Series(np.nan, index=base_index)
+ else:
+ row = boot_result.params.reindex(base_index)["value"]
+ except (np.linalg.LinAlgError, ValueError, RuntimeError) as exc:
+ n_failed += 1
+ warnings.warn(
+ f"AMN bootstrap replicate {b} failed: {exc}",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+ row = pd.Series(np.nan, index=base_index)
+ replicate_rows.append(row)
+
+ replicate_df = pd.DataFrame(replicate_rows).reset_index(drop=True)
+ replicate_df.columns = base_index
+ standard_errors = replicate_df.std(axis=0, ddof=1)
+ vcov = replicate_df.cov(ddof=1)
+
+ if n_failed > 0:
+ warnings.warn(
+ f"{n_failed}/{n_boot} AMN bootstrap replicates failed; "
+ "standard errors may be biased.",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+
+ return AMNInferenceResult(
+ standard_errors=standard_errors,
+ vcov=vcov,
+ replicate_params=replicate_df,
+ n_clusters=n_clusters,
+ n_boot=n_boot,
+ )
diff --git a/src/skillmodels/amn/minimum_distance.py b/src/skillmodels/amn/minimum_distance.py
new file mode 100644
index 00000000..8791dab1
--- /dev/null
+++ b/src/skillmodels/amn/minimum_distance.py
@@ -0,0 +1,916 @@
+"""Stage 2 of the AMN estimator: structural recovery via minimum distance.
+
+Takes the reduced-form mixture parameters (Pi_k, Psi_k) from Stage 1
+(`skillmodels.amn.mixture_em`) and recovers the structural parameters
+(Lambda, A, Sigma, mu_k, Omega_k) subject to the AMN-paper constraint
+structure (eq. 12-13): factor-measurement zero pattern in Lambda,
+age-invariance for time-invariant factors, scale normalization
+(lambda=1 on the reference measure per factor), and the period-0
+mean-zero restriction.
+
+Mirrors `STEP2_func.R` from the AMN 2020 supplementary archive: a
+packed-parameter L-BFGS-B optimizer over the sum-of-squares distance
+between the EM-fitted moments (Pi_m, Psi_m) and the model-implied
+moments parameterized by structural quantities.
+"""
+
+# The JAX objective below uses `.at[idx].set(...)` functional array updates, which
+# ruff's pandas-vet rule misreads as pandas `.at` scalar access. This module has
+# no pandas `.at` usage, so the rule is disabled file-wide.
+# ruff: noqa: PD008
+
+from collections.abc import Callable, Mapping
+from dataclasses import dataclass
+from typing import Any
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pandas as pd
+
+from skillmodels.amn.types import (
+ AugmentedMeasureLayout,
+ MinimumDistanceResult,
+ MixtureFitResult,
+)
+from skillmodels.common.types import ProcessedModel
+
+_CES_TRANSITION_NAMES = frozenset(
+ {"log_ces", "log_ces_with_constant", "log_ces_general"}
+)
+
+
+def _validate_ces_stage2_anchors(
+ processed_model: ProcessedModel,
+ layout: AugmentedMeasureLayout,
+ *,
+ allow_overnormalization: bool,
+) -> None:
+ """Check the per-period CES anchors of AMN's Stage-2 transformed factors.
+
+ This is NOT a primitive Freyberger-minimal normalization check (audit F1).
+ For the restricted CES with psi=1, Freyberger requires only ONE primitive
+ scale anchor (e.g. lambda_theta,0,1=1); the later skill and investment
+ loadings are then identified through the CES restrictions, so pinning one
+ loading per factor-period over-restricts the primitive model. AMN instead
+ works in *transformed* (tilde) factor coordinates in Stages 1-2, where one
+ anchor per factor-period is the correct scale normalization of those
+ internal coordinates. This guard enforces exactly that internal anchoring;
+ it does not certify the returned loadings as primitive estimates.
+
+ Restricted `log_ces` / `log_ces_with_constant` are rejected upstream
+ (`estimate_amn` standalone guard) because the primitive scale-recovery step
+ is not implemented, so in practice this runs for `log_ces_general` (which
+ can express the transformed CES) and for the CHS/AF seeding path. One anchor
+ per factor-period pins the transformed scale; more than one over-normalizes
+ those internal coordinates (raise unless `allow_overnormalization`); zero
+ leaves the transformed scale unidentified.
+
+ Known gap (P4): the check examines only factors whose own transition is CES,
+ so a normalized investment loading is not flagged when investment has a
+ linear transition.
+ """
+ labels = processed_model.labels
+ transition_info = processed_model.transition_info
+ if transition_info is None:
+ return
+ func_names = transition_info.function_names
+ normalizations = processed_model.normalizations
+ aug_to_period = labels.aug_periods_to_periods
+ for factor in labels.latent_factors:
+ if func_names.get(factor) not in _CES_TRANSITION_NAMES:
+ continue
+ norm = normalizations.get(factor)
+ for period in labels.periods:
+ has_meas = any(
+ p == int(period) and f == factor
+ for (p, f, _m) in layout.measurement_meta
+ )
+ if not has_meas:
+ continue
+ aug_periods = [a for a, p in aug_to_period.items() if int(p) == int(period)]
+ n_norm = 0
+ if norm is not None:
+ for a in aug_periods:
+ n_norm += len(norm.loadings[a])
+ if n_norm == 0:
+ msg = (
+ f"CES factor '{factor}' has no loading normalization in "
+ f"period {period}; the Stage-2 transformed-factor scale is "
+ "unidentified. Pin exactly one measurement loading per "
+ "period."
+ )
+ raise ValueError(msg)
+ if n_norm > 1 and not allow_overnormalization:
+ msg = (
+ f"CES factor '{factor}' has {n_norm} loading normalizations "
+ f"in period {period}, but one anchor per factor-period "
+ "already pins the Stage-2 transformed-factor scale. Extra "
+ "anchors over-normalize those internal coordinates. Pin "
+ "exactly one loading per period, or pass "
+ "allow_ces_overnormalization=True for a deliberate "
+ "fixed-loadings analysis."
+ )
+ raise ValueError(msg)
+
+
+@dataclass(frozen=True)
+class _Structure:
+ """Pre-computed structural layout for minimum-distance recovery.
+
+ Carries the slot-to-factor-period mapping plus all the
+ free/normalized/zero masks needed by the optimizer.
+ """
+
+ factor_period_slots: tuple[tuple[int, str], ...]
+ """Ordered (period, factor_name) for the structural mu / Omega columns.
+ Latent and observed-factor / control slots are all included."""
+
+ n_factor_slots: int
+ """``len(factor_period_slots)``."""
+
+ n_aug: int
+ """Number of rows in the augmented measure vector."""
+
+ lambda_value: np.ndarray
+ """Initial Lambda matrix (zeros + normalized 1s where pinned)."""
+
+ lambda_free_mask: np.ndarray
+ """Boolean (n_aug, n_factor_slots): True where Lambda is free."""
+
+ intercept_value: np.ndarray
+ """Initial intercept vector (zeros + normalized values where pinned)."""
+
+ intercept_free_mask: np.ndarray
+ """Boolean (n_aug,): True where the intercept is free."""
+
+ sigma2_free_mask: np.ndarray
+ """Boolean (n_aug,): True where the measurement-error variance is free.
+ False for observed-factor / control slots (zero by construction)."""
+
+ baseline_mean_zero_slots: tuple[int, ...]
+ """Indices into ``factor_period_slots`` for which the K-th mixture's
+ mean is determined by the tau-weighted sum-to-zero constraint
+ (AMN eq. 13). Typically the period-0 latent-factor slots."""
+
+
+def _build_structure( # noqa: C901, PLR0912, PLR0915
+ layout: AugmentedMeasureLayout,
+ processed_model: ProcessedModel,
+) -> _Structure:
+ """Translate the augmented layout into per-Lambda/A/Sigma constraint masks.
+
+ For each augmented slot, decides which structural factor-period column
+ it loads on, and whether its Lambda / A / Sigma entries are free
+ (estimated) or pinned (normalized or zero by construction).
+ """
+ n_aug = len(layout.columns)
+ normalizations = processed_model.normalizations
+ aug_to_period = processed_model.labels.aug_periods_to_periods
+ observed_factor_names = processed_model.labels.observed_factors
+
+ # Collect factor-period slots: one per (period, factor) that actually
+ # has at least one row loading on it (latent measurements) OR is the
+ # "self-slot" of an observed factor / control augmented row.
+ slots: list[tuple[int, str]] = []
+ slot_index: dict[tuple[int, str], int] = {}
+ for _slot, (period, factor, _meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ key = (period, factor)
+ if key not in slot_index:
+ slot_index[key] = len(slots)
+ slots.append(key)
+ for _slot, (period, of_name) in zip(
+ layout.observed_factor_slots, layout.observed_factor_meta, strict=True
+ ):
+ key = (period, of_name)
+ if key not in slot_index:
+ slot_index[key] = len(slots)
+ slots.append(key)
+ for ctrl in layout.control_meta:
+ # Controls collapse to a single period (-1 = time-invariant marker).
+ key = (-1, ctrl)
+ if key not in slot_index:
+ slot_index[key] = len(slots)
+ slots.append(key)
+
+ n_slots = len(slots)
+ lambda_value = np.zeros((n_aug, n_slots))
+ lambda_free_mask = np.zeros((n_aug, n_slots), dtype=bool)
+ intercept_value = np.zeros(n_aug)
+ intercept_free_mask = np.zeros(n_aug, dtype=bool)
+ sigma2_free_mask = np.zeros(n_aug, dtype=bool)
+
+ # Latent-factor measurement slots.
+ for aug_idx, (period, factor, meas_name) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ sigma2_free_mask[aug_idx] = True
+ col = slot_index[(period, factor)]
+ # Determine whether the loading at this (period, factor, meas) is
+ # normalized (typically the "first" measurement per factor) or
+ # free. Skillmodels stores normalizations per aug_period; walk the
+ # aug_periods that map to this calendar period and inspect them.
+ loading_normalized = False
+ intercept_normalized = False
+ loading_norm_value = 1.0
+ intercept_norm_value = 0.0
+ if factor in normalizations:
+ for aug_period, cal_period in aug_to_period.items():
+ if int(cal_period) != int(period):
+ continue
+ load_map = normalizations[factor].loadings[aug_period]
+ int_map = normalizations[factor].intercepts[aug_period]
+ if meas_name in load_map:
+ loading_normalized = True
+ loading_norm_value = float(load_map[meas_name])
+ if meas_name in int_map:
+ intercept_normalized = True
+ intercept_norm_value = float(int_map[meas_name])
+ if loading_normalized:
+ lambda_value[aug_idx, col] = loading_norm_value
+ else:
+ lambda_free_mask[aug_idx, col] = True
+ if intercept_normalized:
+ intercept_value[aug_idx] = intercept_norm_value
+ else:
+ intercept_free_mask[aug_idx] = True
+
+ # Observed-factor slots: load on their own column with lambda=1,
+ # sigma=0 (perfectly observed); intercept pinned to zero so the
+ # factor mean carries the observed level.
+ for aug_idx, (period, of_name) in zip(
+ layout.observed_factor_slots, layout.observed_factor_meta, strict=True
+ ):
+ col = slot_index[(period, of_name)]
+ lambda_value[aug_idx, col] = 1.0
+ # sigma2 stays False (pinned to zero by construction).
+ # Intercept pinned to zero: with lambda=1 and sigma2=0 the slot's
+ # reduced-form level Pi_k = intercept + mu_k is otherwise split
+ # arbitrarily between the (free) intercept and the (free) factor
+ # mean mu_k. Pin intercept=0 so the factor mean carries the full
+ # observed level -- the level Stage 3 draws and the posterior uses.
+ intercept_value[aug_idx] = 0.0
+
+ # Control slots: same pattern as observed factors (lambda=1, sigma=0).
+ for aug_idx, ctrl in zip(layout.control_slots, layout.control_meta, strict=True):
+ col = slot_index[(-1, ctrl)]
+ lambda_value[aug_idx, col] = 1.0
+ # Intercept pinned to zero (see observed-factor block): the
+ # control's factor-mean slot carries its full observed level.
+ intercept_value[aug_idx] = 0.0
+
+ del observed_factor_names
+
+ # Mean-zero baseline: period-0 latent-factor slots get pinned by the
+ # tau-weighted sum-to-zero constraint. Observed factors / controls
+ # have free means (no normalization needed; they're directly
+ # observed).
+ latent_factor_names = set(processed_model.labels.latent_factors)
+ baseline_slot_ids = tuple(
+ slot_index[(p, f)] for (p, f) in slots if p == 0 and f in latent_factor_names
+ )
+
+ return _Structure(
+ factor_period_slots=tuple(slots),
+ n_factor_slots=n_slots,
+ n_aug=n_aug,
+ lambda_value=lambda_value,
+ lambda_free_mask=lambda_free_mask,
+ intercept_value=intercept_value,
+ intercept_free_mask=intercept_free_mask,
+ sigma2_free_mask=sigma2_free_mask,
+ baseline_mean_zero_slots=baseline_slot_ids,
+ )
+
+
+def _pack_layout(struct: _Structure, n_components: int) -> tuple[int, dict[str, slice]]:
+ """Decide the layout of the flat optimizer parameter vector.
+
+ Returns:
+ -------
+ n_total
+ Total length of the parameter vector.
+ slices
+ Mapping from parameter section name to a `slice` into the flat
+ vector. Sections:
+
+ - ``"sigma2"`` -- free entries of the measurement-error
+ variances.
+ - ``"chol_"`` for ``m`` in 0..n_components-1 -- lower-tri
+ Cholesky elements of Omega_m, packed row-major.
+ - ``"mu_"`` for ``m`` in 0..n_components-2 -- the free
+ entries of mu_m (i.e. excluding the K-th mixture, which is
+ determined by the mean-zero constraint at baseline slots
+ and by free params elsewhere... actually we still free
+ mu_K at non-baseline slots; only the baseline slots of
+ mu_K are derived).
+ """
+ slices: dict[str, slice] = {}
+ cursor = 0
+
+ n_sigma2_free = int(struct.sigma2_free_mask.sum())
+ slices["sigma2"] = slice(cursor, cursor + n_sigma2_free)
+ cursor += n_sigma2_free
+
+ n_factor = struct.n_factor_slots
+ n_chol_per = n_factor * (n_factor + 1) // 2
+ for m in range(n_components):
+ slices[f"chol_{m}"] = slice(cursor, cursor + n_chol_per)
+ cursor += n_chol_per
+
+ n_baseline = len(struct.baseline_mean_zero_slots)
+ # mu has shape (n_components, n_factor); for the K-th mixture, the
+ # baseline_mean_zero_slots are determined => those are excluded.
+ n_mu_free = n_components * n_factor - n_baseline
+ slices["mu"] = slice(cursor, cursor + n_mu_free)
+ cursor += n_mu_free
+
+ n_lambda_free = int(struct.lambda_free_mask.sum())
+ slices["lambda"] = slice(cursor, cursor + n_lambda_free)
+ cursor += n_lambda_free
+
+ n_intercept_free = int(struct.intercept_free_mask.sum())
+ slices["intercept"] = slice(cursor, cursor + n_intercept_free)
+ cursor += n_intercept_free
+
+ return cursor, slices
+
+
+def _unpack(
+ flat: np.ndarray,
+ struct: _Structure,
+ slices: dict[str, slice],
+ *,
+ n_components: int,
+ mixture_weights: np.ndarray,
+) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
+ """Decode a flat parameter vector into (sigma2, Omega, mu, Lambda, A).
+
+ Applies the tau-weighted mean-zero constraint to mu_K at the
+ baseline_mean_zero_slots.
+ """
+ n_factor = struct.n_factor_slots
+
+ sigma2 = np.zeros(struct.n_aug)
+ sigma2[struct.sigma2_free_mask] = flat[slices["sigma2"]]
+
+ omegas = np.zeros((n_components, n_factor, n_factor))
+ tril_rows, tril_cols = np.tril_indices(n_factor)
+ for m in range(n_components):
+ chol = np.zeros((n_factor, n_factor))
+ chol[tril_rows, tril_cols] = flat[slices[f"chol_{m}"]]
+ omegas[m] = chol @ chol.T
+
+ mu = np.zeros((n_components, n_factor))
+ baseline_set = set(struct.baseline_mean_zero_slots)
+ free_mu_positions: list[tuple[int, int]] = []
+ for m in range(n_components):
+ is_last = m == n_components - 1
+ for j in range(n_factor):
+ if is_last and j in baseline_set:
+ continue
+ free_mu_positions.append((m, j))
+ mu_values = flat[slices["mu"]]
+ for (m, j), val in zip(free_mu_positions, mu_values, strict=True):
+ mu[m, j] = val
+ # Enforce mean-zero at baseline slots for the last mixture.
+ if baseline_set and n_components > 1:
+ for j in struct.baseline_mean_zero_slots:
+ num = -np.sum(mixture_weights[:-1] * mu[:-1, j])
+ mu[-1, j] = num / mixture_weights[-1]
+
+ lambda_mat = struct.lambda_value.copy()
+ lambda_mat[struct.lambda_free_mask] = flat[slices["lambda"]]
+
+ intercept = struct.intercept_value.copy()
+ intercept[struct.intercept_free_mask] = flat[slices["intercept"]]
+
+ return sigma2, omegas, mu, lambda_mat, intercept
+
+
+def _model_implied_moments(
+ sigma2: np.ndarray,
+ omegas: np.ndarray,
+ mu: np.ndarray,
+ lambda_mat: np.ndarray,
+ intercept: np.ndarray,
+) -> tuple[np.ndarray, np.ndarray]:
+ """Compute (per-component mean, cov) implied by the structural params.
+
+ Returns shapes ``(K, n_aug)`` and ``(K, n_aug, n_aug)`` respectively.
+ """
+ n_components = omegas.shape[0]
+ n_aug = intercept.shape[0]
+ means = np.empty((n_components, n_aug))
+ covs = np.empty((n_components, n_aug, n_aug))
+ diag_sigma2 = np.diag(sigma2)
+ for m in range(n_components):
+ means[m] = intercept + lambda_mat @ mu[m]
+ covs[m] = lambda_mat @ omegas[m] @ lambda_mat.T + diag_sigma2
+ return means, covs
+
+
+def _objective(
+ flat: np.ndarray,
+ struct: _Structure,
+ slices: dict[str, slice],
+ *,
+ n_components: int,
+ mixture_weights: np.ndarray,
+ target_means: np.ndarray,
+ target_covs: np.ndarray,
+) -> float:
+ sigma2, omegas, mu, lam, inter = _unpack(
+ flat,
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture_weights,
+ )
+ pred_means, pred_covs = _model_implied_moments(sigma2, omegas, mu, lam, inter)
+ diff_mean = pred_means - target_means
+ diff_cov = pred_covs - target_covs
+ # Identity-metric minimum-distance criterion (AMN 2020 step 2 default).
+ # NOTE: this is an UNWEIGHTED sum of squares over per-component means and
+ # the FULL covariance matrices. Off-diagonal covariance moments are thus
+ # implicitly weighted twice (the matrices are symmetric) and every mixture
+ # component is weighted equally irrespective of its weight tau_k. This is
+ # consistent under correct specification and full identification (the
+ # criterion is minimised at zero moment discrepancy) but is not the
+ # efficient / optimal-weighted or tau-weighted MD criterion and selects a
+ # different pseudo-true value under misspecification. A vech-packed and/or
+ # tau-/Avar-weighted variant is intentionally NOT applied here to preserve
+ # the existing estimand; it should be added as a separate opt-in weighting.
+ return float(np.sum(diff_mean**2) + np.sum(diff_cov**2))
+
+
+def _make_objective_and_grad(
+ struct: _Structure,
+ slices: dict[str, slice],
+ *,
+ n_components: int,
+ mixture_weights: np.ndarray,
+ target_means: np.ndarray,
+ target_covs: np.ndarray,
+) -> tuple[Callable[[np.ndarray], float], Callable[[np.ndarray], np.ndarray]]:
+ """Build jitted (value, gradient) of the identity-metric MD criterion.
+
+ The criterion is identical to `_objective`, but written in JAX so the
+ optimizer receives an *exact* analytical gradient (one backward pass) rather
+ than a finite-difference gradient that costs `n_params` objective
+ evaluations. With a large factor-period block the parameter vector runs to
+ thousands of entries, so the finite-difference cost per L-BFGS-B step is the
+ difference between seconds and hours.
+
+ Every scatter target (free-entry indices, the lower-triangular Cholesky
+ pattern, the baseline mean-zero constraint) is a static function of the model
+ structure, so the only traced input is the flat parameter vector.
+ """
+ n_factor = struct.n_factor_slots
+ n_aug = struct.n_aug
+ # Flat (single-axis) scatter indices throughout: a 2-axis `.at[rows, cols]`
+ # reads to ruff as a pandas `.at` scalar access (PD008); linear indices keep
+ # the functional update unambiguous and equally differentiable.
+ sigma2_idx = jnp.asarray(np.nonzero(struct.sigma2_free_mask)[0])
+ chol_slices = [slices[f"chol_{m}"] for m in range(n_components)]
+ tr_rows, tr_cols = np.tril_indices(n_factor)
+ tril_lin = jnp.asarray(tr_rows * n_factor + tr_cols)
+
+ baseline_set = set(struct.baseline_mean_zero_slots)
+ free_mu_positions = [
+ m * n_factor + j
+ for m in range(n_components)
+ for j in range(n_factor)
+ if not (m == n_components - 1 and j in baseline_set)
+ ]
+ mu_lin = jnp.asarray(free_mu_positions)
+ baseline_cols = jnp.asarray(list(struct.baseline_mean_zero_slots), dtype=int)
+ has_baseline = bool(struct.baseline_mean_zero_slots) and n_components > 1
+
+ lam_r, lam_c = np.nonzero(struct.lambda_free_mask)
+ lam_lin = jnp.asarray(lam_r * n_factor + lam_c)
+ inter_idx = jnp.asarray(np.nonzero(struct.intercept_free_mask)[0])
+
+ lambda_flat = jnp.asarray(struct.lambda_value).reshape(-1)
+ intercept_value = jnp.asarray(struct.intercept_value)
+ weights_j = jnp.asarray(mixture_weights)
+ tmeans = jnp.asarray(target_means)
+ tcovs = jnp.asarray(target_covs)
+
+ s_sig, s_mu = slices["sigma2"], slices["mu"]
+ s_lam, s_int = slices["lambda"], slices["intercept"]
+
+ def _value(flat: jax.Array) -> jax.Array:
+ sigma2 = jnp.zeros(n_aug).at[sigma2_idx].set(flat[s_sig.start : s_sig.stop])
+
+ omega_list = []
+ for sl in chol_slices:
+ chol = jnp.zeros(n_factor * n_factor).at[tril_lin].set(flat[sl])
+ chol = chol.reshape(n_factor, n_factor)
+ omega_list.append(chol @ chol.T)
+ omegas = jnp.stack(omega_list)
+
+ mu_flat = jnp.zeros(n_components * n_factor)
+ mu_flat = mu_flat.at[mu_lin].set(flat[s_mu.start : s_mu.stop])
+ if has_baseline:
+ mu_grid = mu_flat.reshape(n_components, n_factor)
+ num = -(weights_j[:-1] @ mu_grid[:-1][:, baseline_cols])
+ base_lin = (n_components - 1) * n_factor + baseline_cols
+ mu_flat = mu_flat.at[base_lin].set(num / weights_j[-1])
+ mu = mu_flat.reshape(n_components, n_factor)
+
+ lam = lambda_flat.at[lam_lin].set(flat[s_lam.start : s_lam.stop])
+ lam = lam.reshape(n_aug, n_factor)
+ inter = intercept_value.at[inter_idx].set(flat[s_int.start : s_int.stop])
+
+ means = inter[None, :] + mu @ lam.T # (K, n_aug)
+ covs = jnp.einsum("af,kfg,bg->kab", lam, omegas, lam) + jnp.diag(sigma2)[None]
+ return jnp.sum((means - tmeans) ** 2) + jnp.sum((covs - tcovs) ** 2)
+
+ value_jit = jax.jit(_value)
+ grad_jit = jax.jit(jax.grad(_value))
+
+ def value_fn(flat: np.ndarray) -> float:
+ return float(value_jit(jnp.asarray(flat, dtype=float)))
+
+ def grad_fn(flat: np.ndarray) -> np.ndarray:
+ return np.asarray(grad_jit(jnp.asarray(flat, dtype=float)), dtype=float)
+
+ return value_fn, grad_fn
+
+
+def _initial_guess(
+ struct: _Structure,
+ slices: dict[str, slice],
+ *,
+ n_components: int,
+ n_total: int,
+ target_means: np.ndarray, # noqa: ARG001
+ target_covs: np.ndarray,
+) -> np.ndarray:
+ """Build a sensible starting vector from the EM moments.
+
+ Seeds sigma^2 from the average diagonal of the EM covariances scaled
+ down by 0.5 (so factors keep at least half the explained variance);
+ seeds each Omega Cholesky from the cholesky of the average EM
+ covariance restricted to the factor-period block; seeds mu_m from
+ the EM means at the corresponding slot identities.
+ """
+ flat = np.zeros(n_total)
+
+ diag_avg = np.mean(np.diagonal(target_covs, axis1=1, axis2=2), axis=0)
+ sigma2_guess = 0.25 * np.clip(diag_avg, 1e-3, None)
+ flat[slices["sigma2"]] = sigma2_guess[struct.sigma2_free_mask]
+
+ # Project the average EM covariance onto a roughly diagonal Omega in
+ # the factor-period basis. For v0 we use the identity rescaled by
+ # the average non-error variance trace; this is a safe, well-defined
+ # start.
+ avg_factor_var = np.maximum(diag_avg.mean() * 0.5, 1e-2)
+ n_factor = struct.n_factor_slots
+ init_chol = np.sqrt(avg_factor_var) * np.eye(n_factor)
+ tril_rows, tril_cols = np.tril_indices(n_factor)
+ init_chol_vec = init_chol[tril_rows, tril_cols]
+ for m in range(n_components):
+ flat[slices[f"chol_{m}"]] = init_chol_vec
+
+ # Seed mu_m from each EM component's projection onto the slot space
+ # via least-squares (lambda_value pseudo-inverse on the centered
+ # means). For v0 use a simpler heuristic: spread the EM means across
+ # mixtures using a small dispersion around zero.
+ flat[slices["mu"]] = 0.0
+
+ flat[slices["lambda"]] = 1.0
+ flat[slices["intercept"]] = 0.0
+ return flat
+
+
+def _lower_bounds(
+ struct: _Structure, # noqa: ARG001
+ slices: dict[str, slice],
+ n_total: int,
+) -> np.ndarray:
+ bounds = np.full(n_total, -np.inf)
+ bounds[slices["sigma2"]] = 1e-8
+ return bounds
+
+
+# Parameter categories whose pins solve_minimum_distance can hold: the
+# structural measurement system fit in Stage 2. Each maps to a free entry of
+# the packed optimiser vector (loadings -> Lambda, controls -> intercepts,
+# meas_sds -> sqrt of the measurement variances).
+_STAGE2_FIXED_CATEGORIES = frozenset({"loadings", "controls", "meas_sds"})
+
+
+def _free_flat_index(
+ rank: int,
+ slice_start: int,
+ label: object,
+ what: str,
+ *,
+ is_free: bool,
+) -> int:
+ """Return the packed-vector index of a free structural entry, or raise.
+
+ ``is_free`` / ``rank`` come from the entry's free-mask and its cumulative
+ rank among free entries; ``slice_start`` is the start of the owning vector
+ section. A non-free entry is normalized or pinned by the model spec and so
+ cannot be pinned again.
+ """
+ if not is_free:
+ msg = (
+ f"Cannot pin {what} {label!r}: it is normalized or fixed by the model "
+ "spec, so it is not a free Stage-2 parameter."
+ )
+ raise ValueError(msg)
+ return slice_start + int(rank)
+
+
+def _stage2_fixed_indices(
+ fixed_params: pd.DataFrame | None,
+ struct: _Structure,
+ layout: AugmentedMeasureLayout,
+ slices: dict[str, slice],
+) -> list[tuple[int, float]]:
+ """Map Stage-2 ``fixed_params`` rows to ``(flat_index, value)`` pairs.
+
+ Handles the structural measurement categories: ``loadings`` (a free entry
+ of the Lambda matrix), ``controls`` (a free measurement intercept), and
+ ``meas_sds`` (a free measurement-error SD; stored internally as the
+ variance, so the squared value is pinned). Rows of other categories are
+ ignored -- they belong to other stages. Raises if a row targets a
+ measurement that does not exist or a parameter the model spec already
+ normalizes/pins (hence not a free Stage-2 parameter).
+ """
+ if fixed_params is None or fixed_params.empty:
+ return []
+
+ meas_slot = {
+ (int(period), meas): aug
+ for aug, (period, _factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ )
+ }
+ slot_col = {pf: i for i, pf in enumerate(struct.factor_period_slots)}
+ n_slots = struct.n_factor_slots
+ lambda_flat_mask = struct.lambda_free_mask.ravel()
+ lambda_rank = np.cumsum(lambda_flat_mask) - 1
+ intercept_rank = np.cumsum(struct.intercept_free_mask) - 1
+ sigma2_rank = np.cumsum(struct.sigma2_free_mask) - 1
+
+ out: list[tuple[int, float]] = []
+ for label, value in fixed_params["value"].items():
+ category, period, name1, name2 = label # ty: ignore[not-iterable]
+ if category not in _STAGE2_FIXED_CATEGORIES:
+ continue
+ period = int(period)
+ meas = str(name1)
+ aug = meas_slot.get((period, meas))
+ if aug is None:
+ msg = (
+ f"fixed_params row {label!r} targets measurement '{meas}' at "
+ f"period {period}, which is not in the model's measurement system."
+ )
+ raise ValueError(msg)
+ if category == "loadings":
+ factor = str(name2)
+ col = slot_col.get((period, factor))
+ if col is None:
+ msg = (
+ f"fixed_params row {label!r} targets factor '{factor}', which "
+ f"has no structural slot at period {period}."
+ )
+ raise ValueError(msg)
+ pos = aug * n_slots + col
+ flat_i = _free_flat_index(
+ int(lambda_rank[pos]),
+ slices["lambda"].start,
+ label,
+ "loading",
+ is_free=bool(lambda_flat_mask[pos]),
+ )
+ out.append((flat_i, float(value)))
+ elif category == "controls":
+ flat_i = _free_flat_index(
+ int(intercept_rank[aug]),
+ slices["intercept"].start,
+ label,
+ "intercept",
+ is_free=bool(struct.intercept_free_mask[aug]),
+ )
+ out.append((flat_i, float(value)))
+ else: # meas_sds: stored as a variance, so pin the squared value.
+ flat_i = _free_flat_index(
+ int(sigma2_rank[aug]),
+ slices["sigma2"].start,
+ label,
+ "measurement SD",
+ is_free=bool(struct.sigma2_free_mask[aug]),
+ )
+ out.append((flat_i, float(value) ** 2))
+ return out
+
+
+def solve_minimum_distance(
+ mixture: MixtureFitResult,
+ processed_model: ProcessedModel,
+ *,
+ weighting: str = "identity",
+ algorithm: str = "scipy_lbfgsb",
+ allow_overnormalization: bool = False,
+ algo_options: Mapping[str, Any] | None = None,
+ fixed_params: pd.DataFrame | None = None,
+) -> MinimumDistanceResult:
+ """Recover structural parameters from the reduced-form mixture.
+
+ Args:
+ mixture: Stage 1 fit (reduced-form Pi, Psi per component).
+ processed_model: Skillmodels processed model (provides normalization
+ and constraint structure).
+ weighting: ``"identity"`` (default; the AMN paper's choice). This is
+ an unweighted identity-metric criterion over per-component means
+ and the full covariance matrices, so off-diagonal moments are
+ implicitly counted twice and components are weighted equally
+ regardless of tau_k. ``"optimal"`` is reserved for a future
+ Avar-weighted criterion and currently raises
+ ``NotImplementedError``.
+ algorithm: optimagic algorithm name (default ``scipy_lbfgsb``).
+ allow_overnormalization: Opt out of the CES minimal-normalization
+ guard. When True, extra normalized CES loadings are treated as a
+ deliberate fixed-loadings analysis instead of an error.
+ algo_options: Optional optimagic ``algo_options`` for the L-BFGS-B
+ solver (e.g. ``{"stopping_maxiter": 500}``). CHS seeding caps the
+ iterations here so a rough structural seed stays fast on a large
+ factor-period block; standalone estimation leaves it unbounded.
+ fixed_params: optional params frame whose structural measurement rows
+ (``loadings`` / ``controls`` / ``meas_sds``) pin the corresponding
+ free entries of the packed optimiser vector. The pinned entries are
+ seeded to their values and held there via an optimagic
+ ``FixedConstraint`` so the remaining structural parameters are fit
+ conditional on the pins. Rows of other categories are ignored.
+
+ Return:
+ MinimumDistanceResult with structural Lambda, A, Sigma, and the
+ per-component factor means and covariances.
+
+ """
+ if weighting not in ("identity", "optimal"):
+ msg = f"Unknown weighting '{weighting}'."
+ raise ValueError(msg)
+ if weighting == "optimal":
+ msg = (
+ "weighting='optimal' is documented but not yet implemented; "
+ "only weighting='identity' is currently supported."
+ )
+ raise NotImplementedError(msg)
+
+ layout = mixture.layout
+ if not layout.measurement_slots and not layout.observed_factor_slots:
+ msg = "Mixture layout has no slots; cannot run minimum distance."
+ raise ValueError(msg)
+
+ _validate_ces_stage2_anchors(
+ processed_model, layout, allow_overnormalization=allow_overnormalization
+ )
+
+ struct = _build_structure(layout, processed_model)
+ n_components = mixture.weights.shape[0]
+ n_total, slices = _pack_layout(struct, n_components)
+
+ target_means = mixture.means.copy()
+ target_covs = mixture.covariances.copy()
+
+ flat0 = _initial_guess(
+ struct,
+ slices,
+ n_components=n_components,
+ n_total=n_total,
+ target_means=target_means,
+ target_covs=target_covs,
+ )
+ lower = _lower_bounds(struct, slices, n_total)
+
+ # Pass an exact JAX gradient: with a large factor-period block the parameter
+ # vector has thousands of entries, so a finite-difference gradient would cost
+ # thousands of dense objective evaluations per L-BFGS-B step (hours at panel
+ # scale). The analytical gradient is one backward pass.
+ fun, jac = _make_objective_and_grad(
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture.weights,
+ target_means=target_means,
+ target_covs=target_covs,
+ )
+
+ fixed_idx = _stage2_fixed_indices(fixed_params, struct, layout, slices)
+ constraints: list[om.constraints.Constraint] | None = None
+ if fixed_idx:
+ for flat_i, value in fixed_idx:
+ flat0[flat_i] = value
+ fixed_positions = np.array([i for i, _ in fixed_idx], dtype=int)
+ constraints = [om.FixedConstraint(selector=lambda x, p=fixed_positions: x[p])]
+
+ result = om.minimize(
+ fun=fun,
+ jac=jac,
+ params=flat0,
+ algorithm=algorithm,
+ bounds=om.Bounds(lower=lower),
+ constraints=constraints,
+ algo_options=dict(algo_options) if algo_options else None,
+ )
+ success = bool(result.success)
+ flat_opt = np.asarray(result.params, dtype=float)
+ sigma2, omegas, mu, lambda_mat, intercept = _unpack(
+ flat_opt,
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture.weights,
+ )
+
+ loadings_df = _loadings_dataframe(struct, layout, lambda_mat)
+ intercepts_df = _intercepts_dataframe(layout, intercept)
+ meas_sds_df = _meas_sds_dataframe(layout, np.sqrt(np.clip(sigma2, 0.0, None)))
+
+ return MinimumDistanceResult(
+ loadings=loadings_df,
+ measurement_intercepts=intercepts_df,
+ measurement_sds=meas_sds_df,
+ factor_mixture_means=mu,
+ factor_mixture_covariances=omegas,
+ factor_period_slots=struct.factor_period_slots,
+ objective_value=float(result.fun),
+ success=success,
+ )
+
+
+def _loadings_dataframe(
+ struct: _Structure,
+ layout: AugmentedMeasureLayout,
+ lambda_mat: np.ndarray,
+) -> pd.DataFrame:
+ """Return a long-format Lambda DataFrame, one row per nonzero entry."""
+ rows = []
+ aug_idx_to_meta: dict[int, tuple[int, str, str]] = dict(
+ zip(layout.measurement_slots, layout.measurement_meta, strict=True)
+ )
+ slot_to_id = {sp: i for i, sp in enumerate(struct.factor_period_slots)}
+ for slot, meta in aug_idx_to_meta.items():
+ period, factor, meas = meta
+ col = slot_to_id[(period, factor)]
+ rows.append(
+ {
+ "period": period,
+ "measurement": meas,
+ "factor": factor,
+ "loading": float(lambda_mat[slot, col]),
+ }
+ )
+ if not rows:
+ return pd.DataFrame(
+ columns=["period", "measurement", "factor", "loading"]
+ ).set_index(["period", "measurement", "factor"])
+ return pd.DataFrame(rows).set_index(["period", "measurement", "factor"])
+
+
+def _intercepts_dataframe(
+ layout: AugmentedMeasureLayout,
+ intercept: np.ndarray,
+) -> pd.DataFrame:
+ rows = []
+ for slot, (period, _factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ rows.append(
+ {
+ "period": period,
+ "measurement": meas,
+ "intercept": float(intercept[slot]),
+ }
+ )
+ if not rows:
+ return pd.DataFrame(columns=["period", "measurement", "intercept"]).set_index(
+ ["period", "measurement"]
+ )
+ return pd.DataFrame(rows).set_index(["period", "measurement"])
+
+
+def _meas_sds_dataframe(
+ layout: AugmentedMeasureLayout,
+ sds: np.ndarray,
+) -> pd.DataFrame:
+ rows = []
+ for slot, (period, _factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ rows.append({"period": period, "measurement": meas, "sd": float(sds[slot])})
+ if not rows:
+ return pd.DataFrame(columns=["period", "measurement", "sd"]).set_index(
+ ["period", "measurement"]
+ )
+ return pd.DataFrame(rows).set_index(["period", "measurement"])
diff --git a/src/skillmodels/amn/missing_data_em.py b/src/skillmodels/amn/missing_data_em.py
new file mode 100644
index 00000000..2c2284e9
--- /dev/null
+++ b/src/skillmodels/amn/missing_data_em.py
@@ -0,0 +1,415 @@
+"""Gaussian-mixture EM that marginalises over missing entries (AMN Stage 1).
+
+`sklearn`'s `GaussianMixture` is complete-case only: it drops every row with a
+missing entry. On an unbalanced panel (e.g. age-binned waves with attrition) the
+augmented measure vector can have *zero* rows observed in every column, so the
+complete-case fit is infeasible. This module fits the same mixture by the
+standard missing-data EM (Ghahramani & Jordan 1994; Hunt & Jorgensen 2003):
+
+- the E-step scores each observation on its *observed* sub-vector -- the Gaussian
+ marginal obtained by dropping the missing dimensions;
+- the M-step fills each missing entry with its per-component conditional
+ expectation `E[x_m | x_o]` and adds the conditional-covariance correction
+ `Cov[x_m | x_o]` to the missing-missing block of the scatter.
+
+Valid under MAR missingness.
+
+The EM is vectorised with the **masked-covariance** identity so it runs as dense
+batched linear algebra on the GPU rather than a Python loop over missing
+patterns (prohibitive when nearly every individual has a distinct pattern). For
+a row with observed mask `M` (diagonal, 1 = observed), define
+`G = M Sigma M + (I - M)`. Then `G` is block-diagonal `[[Sigma_oo, 0], [0, I]]`,
+so a single full-dimension Cholesky yields the observed-block log-density,
+log-determinant, conditional mean and the masked inverse `M G^-1 M` (whose
+non-zero block is `Sigma_oo^-1`) all at once -- uniformly across rows regardless
+of which entries are missing. Rows are processed in fixed-size padded chunks so
+only `(chunk, d, d)` arrays are ever materialised.
+"""
+
+import warnings
+from dataclasses import dataclass
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+
+
+@dataclass(frozen=True)
+class MissingDataMixtureFit:
+ """Fitted mixture parameters from the missing-data EM."""
+
+ weights: np.ndarray
+ """Mixture weights, shape `(n_components,)`."""
+
+ means: np.ndarray
+ """Per-component means, shape `(n_components, n_dim)`."""
+
+ covariances: np.ndarray
+ """Per-component covariances, shape `(n_components, n_dim, n_dim)`."""
+
+ loglikelihood: float
+ """Observed-data log-likelihood at the returned parameters."""
+
+ n_iter: int
+ """EM iterations run for the best restart."""
+
+ converged: bool
+ """Whether the best restart hit the tolerance before `max_iter`."""
+
+ co_observation_graph_connected: bool
+ """Whether the column co-observation graph is connected. Connectivity is a
+ *necessary* condition for the cross-covariances to be identified, not a
+ sufficient one: a connected graph can still leave a pair that is never
+ *directly* co-observed unidentified (PSD only bounds it). Treat `False` as a
+ definite warning that some cross-block covariances are not pinned by the data;
+ do not treat `True` as a certificate that every cross-covariance is
+ identified. A purely advisory diagnostic -- it gates nothing downstream."""
+
+
+def _chunk_size_for(n_dim: int) -> int:
+ """Rows per chunk keeping the `(chunk, d, d)` working set near 0.5 GB (f64)."""
+ return int(max(32, min(1024, 6_000_000 // max(n_dim * n_dim, 1))))
+
+
+def _co_observation_connected(obs: np.ndarray) -> bool:
+ """Whether the column co-observation graph is connected.
+
+ Columns `i` and `j` are linked when at least one row observes both. If the
+ graph splits into separate components, no observation ties those blocks
+ together, so the missing-data EM cannot identify the cross-block covariances
+ (only the within-block blocks and all means are identified under MAR).
+ """
+ n_dim = obs.shape[1]
+ if n_dim <= 1:
+ return True
+ co_observed = (obs.T.astype(np.int64) @ obs.astype(np.int64)) > 0
+ seen = np.zeros(n_dim, dtype=bool)
+ stack = [0]
+ seen[0] = True
+ while stack:
+ node = stack.pop()
+ neighbours = np.nonzero(co_observed[node] & ~seen)[0]
+ for nb in neighbours:
+ seen[nb] = True
+ stack.append(int(nb))
+ return bool(seen.all())
+
+
+def _component_stats(
+ x: jax.Array,
+ mask: jax.Array,
+ mean: jax.Array,
+ cov: jax.Array,
+) -> tuple[jax.Array, jax.Array, jax.Array]:
+ """Per-row log-density, imputed mean and masked inverse for one component.
+
+ `cov` already carries the ridge added by the M-step, so it is used as-is.
+ Observed entries are treated as exact (no extra measurement noise), which is
+ what makes the observed-block density and the conditional moments the *exact*
+ EM identities rather than a noisy approximation.
+ """
+ n_dim = x.shape[1]
+ eye = jnp.eye(n_dim)
+ mm = mask[:, :, None] * mask[:, None, :]
+ # G = M cov M + (I - M): block-diagonal [[cov_oo, 0], [0, I]].
+ g = mm * cov[None] + (1.0 - mask)[:, :, None] * eye[None]
+ chol = jnp.linalg.cholesky(g)
+ diff = mask * (x - mean)
+ z = jax.scipy.linalg.cho_solve((chol, True), diff) # G^-1 (masked diff)
+ maha = jnp.sum(diff * z, axis=1)
+ logdet = 2.0 * jnp.sum(jnp.log(jnp.diagonal(chol, axis1=1, axis2=2)), axis=1)
+ n_obs = jnp.sum(mask, axis=1)
+ log_density = -0.5 * (n_obs * jnp.log(2.0 * jnp.pi) + logdet + maha)
+ x_hat = mean + z @ cov # conditional mean fills the missing block
+ ginv = jax.scipy.linalg.cho_solve(
+ (chol, True), jnp.broadcast_to(eye, (x.shape[0], n_dim, n_dim))
+ )
+ masked_ginv = mm * ginv # M G^-1 M: observed-block is Sigma_oo^-1
+ return log_density, x_hat, masked_ginv
+
+
+def _chunk_accumulate(
+ x: jax.Array,
+ mask: jax.Array,
+ valid: jax.Array,
+ log_weights: jax.Array,
+ means: jax.Array,
+ covs: jax.Array,
+) -> tuple[jax.Array, jax.Array, jax.Array, jax.Array, jax.Array]:
+ """Return this chunk's contribution to the EM sufficient statistics.
+
+ `valid` is 1 for real rows and 0 for padding; padded rows contribute zero.
+ """
+ log_density, x_hat, masked_ginv = jax.vmap(
+ _component_stats, in_axes=(None, None, 0, 0)
+ )(x, mask, means, covs) # (K, B), (K, B, d), (K, B, d, d)
+
+ weighted = log_density.T + log_weights # (B, K)
+ log_norm = jax.scipy.special.logsumexp(weighted, axis=1) # (B,)
+ resp = jnp.exp(weighted - log_norm[:, None]) * valid[:, None] # (B, K)
+ loglik = jnp.sum(log_norm * valid)
+ nk = jnp.sum(resp, axis=0) # (K,)
+ sum_x = jnp.einsum("bk,kbd->kd", resp, x_hat) # (K, d)
+ scatter = jnp.einsum("bk,kbd,kbe->kde", resp, x_hat, x_hat) # (K, d, d)
+ corr = jnp.einsum("bk,kbde->kde", resp, masked_ginv) # (K, d, d)
+ return loglik, nk, sum_x, scatter, corr
+
+
+# Jitted at runtime (not via a typed decorator) so the type checker sees the
+# plain tuple-returning signature above.
+_chunk_accumulate_jit = jax.jit(_chunk_accumulate)
+
+
+def _accumulate_sufficient_stats(
+ xj: jax.Array,
+ mj: jax.Array,
+ valid: jax.Array,
+ log_weights: jax.Array,
+ means: jax.Array,
+ covs: jax.Array,
+ *,
+ n_padded: int,
+ chunk: int,
+) -> tuple[jax.Array, jax.Array, jax.Array, jax.Array, jax.Array]:
+ """Sum the chunked EM sufficient statistics over the whole padded sample.
+
+ Returns `(loglik, nk, sum_x, scatter, corr)` evaluated at the supplied
+ `(log_weights, means, covs)`. Padding rows contribute zero via `valid`.
+ """
+ n_components, n_dim = means.shape
+ loglik = jnp.array(0.0)
+ nk = jnp.zeros(n_components)
+ sum_x = jnp.zeros((n_components, n_dim))
+ scatter = jnp.zeros((n_components, n_dim, n_dim))
+ corr = jnp.zeros((n_components, n_dim, n_dim))
+ for start in range(0, n_padded, chunk):
+ sl = slice(start, start + chunk)
+ ll_c, nk_c, sx_c, sc_c, cr_c = _chunk_accumulate_jit(
+ xj[sl], mj[sl], valid[sl], log_weights, means, covs
+ )
+ loglik = loglik + ll_c
+ nk = nk + nk_c
+ sum_x = sum_x + sx_c
+ scatter = scatter + sc_c
+ corr = corr + cr_c
+ return loglik, nk, sum_x, scatter, corr
+
+
+def _run_em(
+ x_filled: np.ndarray,
+ mask: np.ndarray,
+ weights: np.ndarray,
+ means: np.ndarray,
+ covs: np.ndarray,
+ *,
+ max_iter: int,
+ tol: float,
+ reg_covar: float,
+) -> tuple[np.ndarray, np.ndarray, np.ndarray, float, int, bool]:
+ """Run masked-covariance EM from a warm start; return params and diagnostics."""
+ n_obs, n_dim = x_filled.shape
+ chunk = _chunk_size_for(n_dim)
+ n_padded = int(np.ceil(n_obs / chunk) * chunk)
+ pad = n_padded - n_obs
+ xj = jnp.asarray(np.vstack([x_filled, np.zeros((pad, n_dim))]))
+ mj = jnp.asarray(np.vstack([mask, np.zeros((pad, n_dim))]))
+ valid = jnp.asarray(np.concatenate([np.ones(n_obs), np.zeros(pad)]))
+ eye = jnp.eye(n_dim)
+
+ weights_j = jnp.asarray(weights)
+ means_j = jnp.asarray(means)
+ covs_j = jnp.asarray(covs)
+ prev_ll = -np.inf
+ loglik = -np.inf
+ converged = False
+ n_iter = 0
+ for _ in range(max_iter):
+ n_iter += 1
+ loglik_t, nk, sum_x, scatter, corr = _accumulate_sufficient_stats(
+ xj,
+ mj,
+ valid,
+ jnp.log(weights_j),
+ means_j,
+ covs_j,
+ n_padded=n_padded,
+ chunk=chunk,
+ )
+ loglik = float(loglik_t)
+
+ nk_safe = nk + 1e-12
+ weights_j = nk_safe / n_obs
+ means_j = sum_x / nk_safe[:, None]
+ # cov_k = [scatter - Nk mu mu' + Nk cov - cov T cov] / Nk + reg I
+ outer = means_j[:, :, None] * means_j[:, None, :]
+ cov_t_cov = jnp.einsum("kde,kef,kfg->kdg", covs_j, corr, covs_j)
+ covs_j = (
+ scatter
+ - nk_safe[:, None, None] * outer
+ + nk_safe[:, None, None] * covs_j
+ - cov_t_cov
+ ) / nk_safe[:, None, None] + reg_covar * eye[None]
+
+ if abs(loglik - prev_ll) <= tol * (1.0 + abs(loglik)):
+ converged = True
+ break
+ prev_ll = loglik
+
+ # Score the *returned* (post-M-step) parameters, so the reported loglik and
+ # the cross-restart ranking match what is returned rather than the pre-M-step
+ # parameters scored inside the final iteration.
+ final_loglik = _accumulate_sufficient_stats(
+ xj,
+ mj,
+ valid,
+ jnp.log(weights_j),
+ means_j,
+ covs_j,
+ n_padded=n_padded,
+ chunk=chunk,
+ )[0]
+ loglik = float(final_loglik)
+
+ return (
+ np.asarray(weights_j),
+ np.asarray(means_j),
+ np.asarray(covs_j),
+ loglik,
+ n_iter,
+ converged,
+ )
+
+
+def _initialise(
+ x: np.ndarray, obs: np.ndarray, n_components: int, reg_covar: float, seed: int
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """Warm-start from a mixture fitted on the mean-imputed data."""
+ from sklearn.mixture import GaussianMixture # noqa: PLC0415
+
+ # Per-column observed mean, robust to all-missing columns (mean -> 0) without
+ # tripping numpy's "Mean of empty slice" warning from nanmean.
+ counts = obs.sum(axis=0)
+ sums = np.where(obs, x, 0.0).sum(axis=0)
+ col_mean = np.where(counts > 0, sums / np.maximum(counts, 1), 0.0)
+ imputed = np.where(obs, x, col_mean)
+ gm = GaussianMixture(
+ n_components=n_components,
+ covariance_type="full",
+ n_init=1,
+ reg_covar=reg_covar,
+ random_state=seed,
+ ).fit(imputed)
+ return gm.weights_.copy(), gm.means_.copy(), gm.covariances_.copy()
+
+
+def fit_gaussian_mixture_missing(
+ augmented: np.ndarray,
+ *,
+ n_components: int,
+ max_iter: int = 500,
+ tol: float = 1e-6,
+ n_init: int = 5,
+ reg_covar: float = 1e-6,
+ seed: int = 0,
+ allow_never_observed: bool = False,
+) -> MissingDataMixtureFit:
+ """Fit a Gaussian mixture by missing-data EM, keeping the best of `n_init`.
+
+ Args:
+ augmented: `(n_obs, n_dim)` data with `NaN` for missing entries.
+ n_components: Number of mixture components.
+ max_iter: Maximum EM iterations per restart.
+ tol: Relative log-likelihood tolerance for convergence.
+ n_init: Number of warm-started restarts; the best fit is kept.
+ reg_covar: Diagonal ridge for numerical stability.
+ seed: RNG seed for the restarts.
+ allow_never_observed: When `False` (the default), a column observed in no
+ row raises -- its moments are unidentified and feeding a neutral seed
+ into the structural moments would silently corrupt them. Set `True`
+ only when the fit merely *seeds* an estimator that re-fits every
+ parameter from the data (e.g. `estimate_chs`), so a column dropped by
+ row subsampling falls back to a neutral seed and warns instead of
+ crashing the pipeline.
+
+ Return:
+ `MissingDataMixtureFit` with the highest-likelihood restart.
+
+ """
+ x = np.asarray(augmented, dtype=float)
+ if x.ndim != 2:
+ msg = "augmented must be a 2D array."
+ raise ValueError(msg)
+ obs = ~np.isnan(x)
+ if not obs.any():
+ msg = "augmented has no observed entries; cannot fit mixture."
+ raise ValueError(msg)
+ # Identification diagnostics. A column observed in no row, or a co-observation
+ # graph that splits into blocks, leaves some means/covariances unidentified.
+ # These are *not* fatal: the EM still fits the identified part, and the
+ # unidentified entries fall back to a neutral (ridge) seed -- which matters
+ # because a never-observed column can be a transient artefact of subsampling
+ # rows for a seed rather than a genuinely absent measurement. We flag it so a
+ # caller never mistakes ordinary convergence for a fully identified fit.
+ never_observed = np.nonzero(~obs.any(axis=0))[0]
+ co_observation_graph_connected = _co_observation_connected(obs)
+ if never_observed.size and not allow_never_observed:
+ msg = (
+ f"Missing-data mixture EM: columns {never_observed.tolist()} are "
+ "never observed in any row; their means and (co)variances are "
+ "unidentified, so the fit would be arbitrary noise rather than an "
+ "estimate. Drop these measurements, or pass allow_never_observed=True "
+ "if this fit only seeds an estimator that re-fits every parameter "
+ "from the data (the value is then a harmless neutral seed)."
+ )
+ raise ValueError(msg)
+ if never_observed.size:
+ warnings.warn(
+ f"Missing-data mixture EM: columns {never_observed.tolist()} are "
+ "never observed in any row; their means and (co)variances are "
+ "unidentified and are seeded only at the ridge default. Drop these "
+ "measurements if this is not a transient row-subsampling artefact.",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+ elif not co_observation_graph_connected:
+ warnings.warn(
+ "Missing-data mixture EM: the column co-observation graph is "
+ "disconnected -- no individual is observed on measurements from "
+ "different blocks (e.g. periods that no one spans). Means and "
+ "within-block covariances are identified, but the cross-block "
+ "covariances are not pinned by the data and should not be trusted.",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+
+ x_filled = np.where(obs, x, 0.0)
+ mask = obs.astype(float)
+ rng = np.random.default_rng(seed)
+ best: MissingDataMixtureFit | None = None
+ for _ in range(n_init):
+ init_seed = int(rng.integers(0, 2**31 - 1))
+ weights, means, covs = _initialise(x, obs, n_components, reg_covar, init_seed)
+ weights, means, covs, loglik, n_iter, converged = _run_em(
+ x_filled,
+ mask,
+ weights,
+ means,
+ covs,
+ max_iter=max_iter,
+ tol=tol,
+ reg_covar=reg_covar,
+ )
+ if best is None or loglik > best.loglikelihood:
+ best = MissingDataMixtureFit(
+ weights=weights,
+ means=means,
+ covariances=covs,
+ loglikelihood=loglik,
+ n_iter=n_iter,
+ converged=converged,
+ co_observation_graph_connected=co_observation_graph_connected,
+ )
+ if best is None:
+ msg = "n_init must be at least 1."
+ raise ValueError(msg)
+ return best
diff --git a/src/skillmodels/amn/mixture_em.py b/src/skillmodels/amn/mixture_em.py
new file mode 100644
index 00000000..a1d35fe0
--- /dev/null
+++ b/src/skillmodels/amn/mixture_em.py
@@ -0,0 +1,388 @@
+"""Stage 1 of the AMN estimator: mixture-of-normals EM on augmented measurements.
+
+Fits
+
+ F_{M,X} = sum_k tau_k * Normal(Pi_k, Psi_k)
+
+to the joint vector of (factor measurements, observed factor values,
+controls) across all periods. Matches AMN 2020 equations (11)-(14).
+
+The fitted mixture is the reduced-form input to Stage 2's structural
+minimum-distance recovery (`skillmodels.amn.minimum_distance`).
+"""
+
+import warnings
+from collections.abc import Mapping
+from itertools import chain
+from typing import Literal
+
+import numpy as np
+import pandas as pd
+from sklearn.mixture import GaussianMixture
+
+from skillmodels.amn.missing_data_em import fit_gaussian_mixture_missing
+from skillmodels.amn.types import AugmentedMeasureLayout, MixtureFitResult
+from skillmodels.common.types import ProcessedModel
+
+
+class InsufficientCompleteCasesError(ValueError):
+ """Too few listwise-complete rows for a complete-case Stage-1 mixture fit.
+
+ Raised by the complete-case EM when the augmented measure vector has fewer
+ rows observed in *every* column than the mixture has components -- the regime
+ of an unbalanced panel with cross-period attrition. Pass
+ `mixture_em_method="missing_data"` to fit by marginalising over each row's
+ missing entries instead.
+ """
+
+
+def build_augmented_measure_layout(
+ processed_model: ProcessedModel,
+) -> AugmentedMeasureLayout:
+ """Compute the column layout of the augmented measure vector.
+
+ The augmented vector concatenates, in order:
+
+ 1. Factor measurements at each period (one slot per `(period,
+ measurement)` row of `processed_model.update_info`).
+ 2. Observed factor values at each period (one slot per `(period,
+ observed_factor)` pair).
+ 3. Controls at the first period (treated as time-invariant; one slot
+ per non-constant control).
+
+ Slots 2 and 3 are treated as zero-measurement-error observations
+ with loading 1 in the AMN measurement-system mapping (paper p. 2522:
+ "we set the corresponding standard deviation in Sigma to zero and
+ the corresponding factor loading to one").
+
+ Args:
+ processed_model: The output of `common.process_model.process_model`.
+
+ Return:
+ AugmentedMeasureLayout with slot metadata for downstream Stage 2
+ bookkeeping.
+
+ """
+ update_info = processed_model.update_info
+ periods = processed_model.labels.periods
+ aug_to_period = processed_model.labels.aug_periods_to_periods
+ observed_factors = processed_model.labels.observed_factors
+ controls = tuple(c for c in processed_model.labels.controls if c != "constant")
+
+ columns: list[str] = []
+ measurement_slots: list[int] = []
+ measurement_meta: list[tuple[int, str, str]] = []
+ observed_factor_slots: list[int] = []
+ observed_factor_meta: list[tuple[int, str]] = []
+ control_slots: list[int] = []
+
+ # Walk update_info rows in canonical (aug_period, measurement) order.
+ # Each row is one measurement update; map aug_period -> calendar period
+ # via labels.aug_periods_to_periods so the layout metadata is in
+ # AMN-paper terms (calendar period).
+ factor_columns = [c for c in update_info.columns if c != "purpose"]
+ for index, row in update_info.iterrows():
+ aug_period, meas_name = index # ty: ignore[not-iterable]
+ purpose = row.get("purpose", "measurement")
+ if purpose != "measurement":
+ continue
+ loadings = row[factor_columns].astype(bool)
+ if not loadings.any():
+ continue
+ factor = next(f for f in factor_columns if loadings[f])
+ period = int(aug_to_period[int(aug_period)])
+ slot = len(columns)
+ columns.append(f"meas[{period}|{factor}|{meas_name}]")
+ measurement_slots.append(slot)
+ measurement_meta.append((period, str(factor), str(meas_name)))
+
+ for period in periods:
+ for of in observed_factors:
+ slot = len(columns)
+ columns.append(f"obs_factor[{period}|{of}]")
+ observed_factor_slots.append(slot)
+ observed_factor_meta.append((int(period), str(of)))
+
+ for ctrl in controls:
+ slot = len(columns)
+ columns.append(f"control[{ctrl}]")
+ control_slots.append(slot)
+
+ return AugmentedMeasureLayout(
+ columns=tuple(columns),
+ measurement_slots=tuple(measurement_slots),
+ observed_factor_slots=tuple(observed_factor_slots),
+ control_slots=tuple(control_slots),
+ measurement_meta=tuple(measurement_meta),
+ observed_factor_meta=tuple(observed_factor_meta),
+ control_meta=tuple(controls),
+ )
+
+
+def _build_period_views(
+ data: pd.DataFrame,
+ periods: tuple[int, ...],
+ period_level: str,
+ caseids: pd.Index,
+) -> dict[int, pd.DataFrame]:
+ """Return one (n_obs, n_cols) DataFrame per period, reindexed by caseids."""
+ period_views: dict[int, pd.DataFrame] = {}
+ for period in periods:
+ sub = data.xs(period, level=period_level, drop_level=True)
+ if isinstance(sub, pd.Series):
+ sub = sub.to_frame()
+ sub = sub.reindex(caseids)
+ period_views[int(period)] = sub
+ return period_views
+
+
+def _fill_controls(
+ out: np.ndarray,
+ period_views: dict[int, pd.DataFrame],
+ layout: AugmentedMeasureLayout,
+ periods: tuple[int, ...],
+) -> None:
+ """Fill control slots from the first period each control is observed in."""
+ for slot, ctrl in zip(layout.control_slots, layout.control_meta, strict=True):
+ for period in periods:
+ sub = period_views[int(period)]
+ if ctrl not in sub.columns:
+ continue
+ col = sub[ctrl].to_numpy()
+ mask = np.isnan(out[:, slot])
+ out[mask, slot] = col[mask]
+
+
+def build_augmented_measure_matrix(
+ data: pd.DataFrame,
+ processed_model: ProcessedModel,
+ layout: AugmentedMeasureLayout,
+) -> np.ndarray:
+ """Stack each child's augmented measure vector into an ``(n_obs, n_aug)`` matrix.
+
+ Reshapes the long-format `data` into one row per individual (caseid),
+ pulling the right column for each layout slot from the corresponding
+ period.
+
+ Args:
+ data: Panel dataset in long format with MultiIndex
+ ``(caseid, period)``.
+ processed_model: Output of `process_model.process_model`.
+ layout: Slot layout for the augmented vector.
+
+ Return:
+ ``(n_obs, n_aug)`` numpy array. Missing values are NaN.
+
+ """
+ if not isinstance(data.index, pd.MultiIndex) or data.index.nlevels < 2:
+ msg = "data must have a 2-level MultiIndex (caseid, period)."
+ raise ValueError(msg)
+ period_level = str(data.index.names[1])
+ case_level = str(data.index.names[0])
+
+ caseids = data.index.get_level_values(case_level).unique()
+ n_obs = len(caseids)
+ n_aug = len(layout.columns)
+ out = np.full((n_obs, n_aug), np.nan)
+
+ periods = processed_model.labels.periods
+ period_views = _build_period_views(data, periods, period_level, caseids)
+
+ for slot, (period, _factor, meas_name) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ sub = period_views[period]
+ if meas_name in sub.columns:
+ out[:, slot] = sub[meas_name].to_numpy()
+
+ for slot, (period, of_name) in zip(
+ layout.observed_factor_slots, layout.observed_factor_meta, strict=True
+ ):
+ sub = period_views[period]
+ if of_name in sub.columns:
+ out[:, slot] = sub[of_name].to_numpy()
+
+ if layout.control_slots:
+ _fill_controls(out, period_views, layout, periods)
+
+ return out
+
+
+def _fit_complete_case(
+ augmented: np.ndarray,
+ *,
+ n_components: int,
+ max_iter: int,
+ tol: float,
+ n_init: int,
+ reg_covar: float,
+ seed: int,
+) -> tuple[np.ndarray, np.ndarray, np.ndarray, float, int, bool]:
+ """Fit `sklearn`'s GaussianMixture on listwise-complete rows."""
+ complete_mask = ~np.isnan(augmented).any(axis=1)
+ n_complete = int(complete_mask.sum())
+ if n_complete < n_components:
+ msg = (
+ f"AMN Stage 1 complete-case mixture EM needs at least {n_components} "
+ f"rows (one per mixture component) observed in every augmented "
+ f"measurement, but only {n_complete} of {augmented.shape[0]} rows are "
+ f"complete. This is the unbalanced-panel regime where few or no "
+ f'individuals span every period. Set mixture_em_method="missing_data" '
+ f"to fit the mixture by marginalising over each row's missing entries."
+ )
+ raise InsufficientCompleteCasesError(msg)
+ n_total = int(augmented.shape[0])
+ n_dropped = n_total - n_complete
+ if n_dropped > 0:
+ msg = (
+ f"AMN Stage 1 mixture EM is complete-case only: dropped "
+ f"{n_dropped}/{n_total} rows with missing augmented "
+ f"measurements before fitting. The recovered reduced-form "
+ f"mixture targets the population distribution only under a "
+ f"complete-data or MCAR assumption; under an unbalanced panel "
+ f"or non-MCAR missingness the estimates may be biased."
+ )
+ warnings.warn(msg, RuntimeWarning, stacklevel=3)
+ fit_data = augmented[complete_mask]
+ gm = GaussianMixture(
+ n_components=n_components,
+ covariance_type="full",
+ max_iter=max_iter,
+ tol=tol,
+ n_init=n_init,
+ reg_covar=reg_covar,
+ init_params="kmeans",
+ random_state=seed,
+ )
+ gm.fit(fit_data)
+ return (
+ np.asarray(gm.weights_, dtype=float),
+ np.asarray(gm.means_, dtype=float),
+ np.asarray(gm.covariances_, dtype=float),
+ float(gm.score(fit_data) * n_complete),
+ int(gm.n_iter_),
+ bool(gm.converged_),
+ )
+
+
+def fit_mixture_em(
+ augmented: np.ndarray,
+ *,
+ n_components: int,
+ max_iter: int = 500,
+ tol: float = 1e-6,
+ n_init: int = 5,
+ reg_covar: float = 1e-6,
+ seed: int = 0,
+ layout: AugmentedMeasureLayout | None = None,
+ init_params: Mapping[str, np.ndarray] | None = None,
+ method: Literal["complete_case", "missing_data"] = "complete_case",
+ allow_never_observed: bool = False,
+) -> MixtureFitResult:
+ """Fit a Gaussian mixture to the augmented measure matrix via EM.
+
+ With `method="complete_case"` (the default) this fits
+ `sklearn.mixture.GaussianMixture` on the listwise-complete rows -- valid
+ only under a complete-data or MCAR assumption, and raising when fewer than
+ `n_components` complete rows remain. With `method="missing_data"` it uses
+ `missing_data_em.fit_gaussian_mixture_missing`, which marginalises over each
+ row's missing entries and so handles unbalanced panels with no complete
+ cases at all.
+
+ Args:
+ augmented: ``(n_obs, n_aug)`` augmented measure matrix from
+ `build_augmented_measure_matrix`.
+ n_components: Number of mixture components K.
+ max_iter: Maximum EM iterations per restart.
+ tol: Log-likelihood convergence tolerance.
+ n_init: Number of EM restarts; the best fit is kept.
+ reg_covar: Diagonal ridge added to each component covariance for
+ numerical stability.
+ seed: RNG seed.
+ layout: Slot layout to embed in the result (carried through to
+ Stage 2).
+ init_params: Optional warm-start values. Currently unused — kept
+ for forward-compatibility with a custom Spearman-seeded init
+ once Stage 1 results from the moment-init pipeline become
+ available as warm starts.
+ method: ``"complete_case"`` or ``"missing_data"`` (see above).
+ allow_never_observed: Forwarded to the missing-data EM. When `False`
+ (default) a never-observed augmented-measure column raises; set
+ `True` only for the seeding path where the result merely seeds an
+ estimator that re-fits every parameter from the data.
+
+ Return:
+ MixtureFitResult holding the fitted weights, means, covariances
+ and convergence diagnostics.
+
+ """
+ del init_params # reserved for follow-up
+ if augmented.ndim != 2:
+ msg = "augmented must be a 2D array."
+ raise ValueError(msg)
+ if augmented.shape[0] == 0:
+ msg = "augmented has zero rows; cannot fit mixture."
+ raise ValueError(msg)
+
+ if method == "missing_data":
+ fit = fit_gaussian_mixture_missing(
+ augmented,
+ n_components=n_components,
+ max_iter=max_iter,
+ tol=tol,
+ n_init=n_init,
+ reg_covar=reg_covar,
+ seed=seed,
+ allow_never_observed=allow_never_observed,
+ )
+ weights, means, covs = fit.weights, fit.means, fit.covariances
+ loglik, n_iter, converged = fit.loglikelihood, fit.n_iter, fit.converged
+ elif method == "complete_case":
+ weights, means, covs, loglik, n_iter, converged = _fit_complete_case(
+ augmented,
+ n_components=n_components,
+ max_iter=max_iter,
+ tol=tol,
+ n_init=n_init,
+ reg_covar=reg_covar,
+ seed=seed,
+ )
+ else:
+ msg = f"Unknown mixture EM method {method!r}."
+ raise ValueError(msg)
+
+ if layout is None:
+ # Caller didn't supply a layout; synthesize a minimal one purely
+ # from column indices so downstream code that doesn't need slot
+ # metadata still works.
+ n_aug = augmented.shape[1]
+ layout = AugmentedMeasureLayout(
+ columns=tuple(f"col[{i}]" for i in range(n_aug)),
+ measurement_slots=tuple(range(n_aug)),
+ observed_factor_slots=(),
+ control_slots=(),
+ measurement_meta=(),
+ observed_factor_meta=(),
+ control_meta=(),
+ )
+
+ return MixtureFitResult(
+ weights=weights,
+ means=means,
+ covariances=covs,
+ loglikelihood=loglik,
+ n_iter=n_iter,
+ converged=converged,
+ layout=layout,
+ )
+
+
+def _all_slot_ids(layout: AugmentedMeasureLayout) -> tuple[int, ...]:
+ """Return the union of all slot id tuples in canonical order."""
+ return tuple(
+ chain(
+ layout.measurement_slots,
+ layout.observed_factor_slots,
+ layout.control_slots,
+ )
+ )
diff --git a/src/skillmodels/amn/moments.py b/src/skillmodels/amn/moments.py
new file mode 100644
index 00000000..7d46883d
--- /dev/null
+++ b/src/skillmodels/amn/moments.py
@@ -0,0 +1,301 @@
+"""Spearman / multi-indicator moment estimators for starting values.
+
+Pure NumPy helpers used to seed optimizer starting values from data
+moments instead of static defaults (sigma_inv = 0.5 etc.). They derive
+loadings, measurement-error SDs, and latent-factor variances from the
+cross-covariance structure of multi-indicator measurements — the
+standard Spearman / factor-analysis identification.
+
+Used by both the AF estimator (chain-wide moment seeds in
+`af.initial_period` / `af.transition_period`) and the CHS estimator
+(via `skillmodels.amn.start_values.get_spearman_start_params`).
+
+This module is called once before optimization (no JAX dependency) and
+exposes single-pass, robust estimators with floor clamps for numerical
+edge cases.
+"""
+
+from dataclasses import dataclass
+
+import numpy as np
+
+
+@dataclass(frozen=True)
+class SpearmanResult:
+ """Single-factor Spearman moment estimates from cross-covariances."""
+
+ loadings: np.ndarray
+ """Recovered loadings, shape ``(n_meas,)``. The anchor entry equals 1.0
+ by construction (or the user-provided anchor value)."""
+
+ meas_sds: np.ndarray
+ """Recovered measurement-error SDs, shape ``(n_meas,)``."""
+
+ latent_var: float
+ """Recovered latent-factor variance Var(F)."""
+
+ valid: bool
+ """False when identification fails (anchor uncorrelated with all other
+ measurements, or fewer than two measurements available)."""
+
+
+def spearman_factor_moments(
+ measurements: np.ndarray,
+ *,
+ anchor_idx: int = 0,
+ anchor_loading: float = 1.0,
+ sd_floor: float = 1e-3,
+ var_floor: float = 1e-6,
+) -> SpearmanResult:
+ """Recover loadings, sigma_meas, Var(F) from multi-indicator covariances.
+
+ For a single latent factor F observed via ``measurements[:, k] = λ_k F +
+ ε_k`` (after residualizing out controls), the off-diagonal covariances
+ identify the loadings up to scale and the diagonal residual variances
+ give sigma_meas². Anchor measurement ``anchor_idx`` is normalized so its
+ loading equals ``anchor_loading``.
+
+ Algorithm (pairwise complete cases):
+
+ * ``S = pairwise_cov(measurements)``.
+ * Pool ``Var(F)`` via robust median across triples ``S[a,j] S[a,k] /
+ S[j,k]`` for ``j ≠ k ≠ a``.
+ * ``λ_k = S[a, k] / Var(F)`` for ``k ≠ a`` (then rescaled so anchor
+ matches ``anchor_loading``).
+ * ``sigma_meas_k² = max(S[k, k] - λ_k² Var(F), sd_floor²)``.
+
+ If the anchor's covariances with all other measurements are below
+ numerical noise, rotate to a different anchor and retry. If all
+ candidates fail, return ``valid=False``.
+
+ Args:
+ measurements: Shape ``(n_obs, n_meas)``. NaN values are handled via
+ pairwise-complete cases.
+ anchor_idx: Index of the anchor measurement. Loadings are reported
+ on a scale where ``loadings[anchor_idx] == anchor_loading``.
+ anchor_loading: Pinned anchor loading (typically 1.0 from a
+ normalization).
+ sd_floor: Minimum returned measurement SD to avoid zero / negative
+ estimates from sample noise.
+ var_floor: Minimum returned latent variance.
+
+ Return:
+ `SpearmanResult` with recovered loadings, sigma_meas, latent_var, and a
+ `valid` flag.
+
+ """
+ arr = np.asarray(measurements, dtype=float)
+ if arr.ndim != 2:
+ msg = f"measurements must be 2D; got shape {arr.shape}"
+ raise ValueError(msg)
+ n_meas = arr.shape[1]
+ if n_meas < 2:
+ return SpearmanResult(
+ loadings=np.full(n_meas, anchor_loading),
+ meas_sds=np.full(n_meas, sd_floor),
+ latent_var=var_floor,
+ valid=False,
+ )
+
+ s = _pairwise_cov(arr)
+
+ # Try the requested anchor first; rotate through other candidates if
+ # it has no usable cross-covariances.
+ anchor_order = [anchor_idx, *(k for k in range(n_meas) if k != anchor_idx)]
+ for candidate in anchor_order:
+ result = _spearman_with_anchor(
+ s,
+ anchor=candidate,
+ anchor_loading=anchor_loading,
+ target_anchor=anchor_idx,
+ sd_floor=sd_floor,
+ var_floor=var_floor,
+ )
+ if result is not None:
+ return result
+
+ return SpearmanResult(
+ loadings=np.full(n_meas, anchor_loading),
+ meas_sds=np.full(n_meas, sd_floor),
+ latent_var=var_floor,
+ valid=False,
+ )
+
+
+def derive_unexplained_sd(
+ latent_var: float,
+ beta: np.ndarray,
+ prev_state_cov: np.ndarray,
+ *,
+ sd_floor: float = 1e-3,
+) -> float:
+ """Return the residual SD of a regression with explained variance β'Σβ.
+
+ Given a regression ``F = β'·prev_state + ε`` where ``Var(prev_state) =
+ Σ`` and ``Var(F) = latent_var``, the residual variance is ``Var(ε) =
+ Var(F) - β'Σβ``. Clamped at ``sd_floor`` to avoid NaN when sample noise
+ pushes ``β'Σβ`` above ``Var(F)``.
+
+ Used to seed sigma_shock (production shock SD) and sigma_inv (investment shock
+ SD) from the latent factor variance plus the regression coefficients.
+
+ Args:
+ latent_var: Marginal variance of the dependent factor.
+ beta: Regression coefficients, shape ``(n_state,)``.
+ prev_state_cov: Covariance matrix of the regressors, shape
+ ``(n_state, n_state)``.
+ sd_floor: Minimum returned SD.
+
+ Return:
+ ``sqrt(max(latent_var - β'Σβ, sd_floor²))``.
+
+ """
+ beta = np.asarray(beta, dtype=float).ravel()
+ cov = np.asarray(prev_state_cov, dtype=float)
+ explained = float(beta @ cov @ beta)
+ residual_var = max(float(latent_var) - explained, sd_floor**2)
+ return float(np.sqrt(residual_var))
+
+
+def seed_beta_from_ols(
+ response: np.ndarray,
+ regressors: np.ndarray,
+) -> np.ndarray:
+ """OLS coefficient estimate for seeding inv-equation β.
+
+ Pure-numpy OLS of ``response`` (n_obs,) on ``regressors`` (n_obs,
+ n_features). Drops rows with any NaN. Returns zeros when the design
+ is rank-deficient.
+
+ Args:
+ response: Shape ``(n_obs,)``.
+ regressors: Shape ``(n_obs, n_features)``.
+
+ Return:
+ β estimate, shape ``(n_features,)``. Zero vector if the design is
+ rank-deficient or the sample is too small.
+
+ """
+ y = np.asarray(response, dtype=float).ravel()
+ x = np.asarray(regressors, dtype=float)
+ if x.ndim == 1:
+ x = x[:, None]
+ n_features = x.shape[1]
+ mask = np.isfinite(y) & np.all(np.isfinite(x), axis=1)
+ if mask.sum() <= n_features:
+ return np.zeros(n_features)
+ try:
+ coef, *_ = np.linalg.lstsq(x[mask], y[mask], rcond=None)
+ except np.linalg.LinAlgError:
+ return np.zeros(n_features)
+ if not np.all(np.isfinite(coef)):
+ return np.zeros(n_features)
+ return coef
+
+
+def _pairwise_cov(arr: np.ndarray) -> np.ndarray:
+ """Compute pairwise-complete sample covariance matrix.
+
+ Each entry ``S[i, j]`` is the sample covariance over rows where both
+ columns ``i`` and ``j`` are finite. Diagonal entries are sample
+ variances over rows where the column is finite.
+ """
+ n_meas = arr.shape[1]
+ s = np.zeros((n_meas, n_meas))
+ finite = np.isfinite(arr)
+ for i in range(n_meas):
+ for j in range(i, n_meas):
+ mask = finite[:, i] & finite[:, j]
+ if mask.sum() < 2:
+ s[i, j] = s[j, i] = 0.0
+ continue
+ xi = arr[mask, i]
+ xj = arr[mask, j]
+ mi = xi.mean()
+ mj = xj.mean()
+ cov = float(((xi - mi) * (xj - mj)).sum() / (mask.sum() - 1))
+ s[i, j] = s[j, i] = cov
+ return s
+
+
+def _spearman_with_anchor( # noqa: C901, PLR0912
+ s: np.ndarray,
+ *,
+ anchor: int,
+ anchor_loading: float,
+ target_anchor: int,
+ sd_floor: float,
+ var_floor: float,
+) -> SpearmanResult | None:
+ """Spearman estimates with a specified anchor; ``None`` if degenerate."""
+ n_meas = s.shape[0]
+ diag = np.maximum(np.diag(s), sd_floor**2)
+ sds = np.sqrt(diag)
+ cov_threshold = 1e-3 * sds[anchor] * sds
+
+ # The anchor must covary meaningfully with at least one other column.
+ cross = np.array(
+ [
+ (k, abs(s[anchor, k]))
+ for k in range(n_meas)
+ if k != anchor and abs(s[anchor, k]) > cov_threshold[k]
+ ]
+ )
+ if cross.size == 0:
+ return None
+
+ # Pool Var(F) via the median of triples S[a,j] S[a,k] / S[j,k] for
+ # j, k != a, j != k, with S[j,k] above noise.
+ triples = []
+ for j in range(n_meas):
+ if j == anchor or abs(s[anchor, j]) <= cov_threshold[j]:
+ continue
+ for k in range(j + 1, n_meas):
+ if k == anchor or abs(s[anchor, k]) <= cov_threshold[k]:
+ continue
+ cross_threshold = 1e-3 * sds[j] * sds[k]
+ if abs(s[j, k]) <= cross_threshold:
+ continue
+ triples.append(s[anchor, j] * s[anchor, k] / s[j, k])
+
+ if not triples:
+ # Only one measurement covaries with the anchor — Var(F) is
+ # under-identified. Fall back to S[anchor, k] / S[k, k] times
+ # diagonal (rough), then clamp.
+ partner_idx = int(cross[np.argmax(cross[:, 1]), 0])
+ latent_var_raw = abs(s[anchor, partner_idx])
+ else:
+ latent_var_raw = float(np.median(triples))
+
+ latent_var = max(latent_var_raw, var_floor)
+
+ raw_loadings = np.zeros(n_meas)
+ raw_loadings[anchor] = 1.0
+ for k in range(n_meas):
+ if k == anchor:
+ continue
+ raw_loadings[k] = s[anchor, k] / latent_var
+
+ # Rescale so the user-supplied target anchor reports ``anchor_loading``.
+ # If we rotated to a different anchor candidate, the recovered scale
+ # must be re-anchored on ``target_anchor``.
+ if target_anchor != anchor:
+ if abs(raw_loadings[target_anchor]) <= 1e-12:
+ return None
+ scale = anchor_loading / raw_loadings[target_anchor]
+ else:
+ scale = anchor_loading
+ loadings = raw_loadings * scale
+ # Var(F) absorbs the inverse square of the rescale.
+ latent_var = latent_var / (scale**2)
+ latent_var = max(latent_var, var_floor)
+
+ meas_var = np.maximum(diag - loadings**2 * latent_var, sd_floor**2)
+ meas_sds = np.sqrt(meas_var)
+
+ return SpearmanResult(
+ loadings=loadings,
+ meas_sds=meas_sds,
+ latent_var=latent_var,
+ valid=True,
+ )
diff --git a/src/skillmodels/amn/posterior_states.py b/src/skillmodels/amn/posterior_states.py
new file mode 100644
index 00000000..7dc7b5cc
--- /dev/null
+++ b/src/skillmodels/amn/posterior_states.py
@@ -0,0 +1,194 @@
+"""Per-individual posterior latent-factor estimates from an AMN fit.
+
+AMN does not Kalman-filter or quadrature-integrate; it fits a mixture
+of normals on the augmented measure vector. The natural per-individual
+factor estimate is therefore the mixture-Schur conditional posterior
+``E[theta | Y_i]`` evaluated under the fitted reduced-form parameters,
+mirrored across the K components weighted by per-individual mixture
+responsibilities.
+
+For every observation `i` and every mixture component `k`:
+
+ mu_{theta|Y}(k, i) = mu_theta(k)
+ + Cov(theta, Y)(k) Cov(Y)(k)^{-1} (Y_i - mu_Y(k))
+
+where ``mu_Y(k) = A + Lambda mu_theta(k)``,
+``Cov(Y)(k) = Lambda Omega(k) Lambda^T + diag(sigma^2)``, and
+``Cov(theta, Y)(k) = Omega(k) Lambda^T``. The mixture responsibility is the
+standard Bayes posterior of `k` given `Y_i`, and
+``E[theta | Y_i] = sum_k r(k|i) mu_{theta|Y}(k, i)``.
+
+The function returns a dict matching the CHS / AF
+`get_individual_states` shape (an ``"unanchored_states"`` entry only —
+AMN does not produce anchored states without an explicit anchoring
+post-step).
+"""
+
+from typing import Any
+
+import numpy as np
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.amn.mixture_em import build_augmented_measure_matrix
+from skillmodels.amn.types import AMNEstimationResult
+from skillmodels.common.process_model import process_model
+from skillmodels.common.state_ranges import create_state_ranges
+
+
+@beartype(conf=ESTIMATION_CONF)
+def get_amn_posterior_states( # noqa: C901, PLR0912, PLR0915
+ amn_result: AMNEstimationResult,
+ data: pd.DataFrame,
+) -> dict[str, dict[str, Any]]:
+ """Compute the per-observation latent factor posteriors.
+
+ Args:
+ amn_result: The fitted AMN result.
+ data: Same panel dataset used for the original fit.
+
+ Return:
+ Nested dict with the CHS-compatible
+ ``{"unanchored_states": {"states": DataFrame, "state_ranges": ...}}``
+ layout (no ``"anchored_states"`` key — AMN does not anchor).
+
+ """
+ processed_model = process_model(amn_result.model_spec)
+ layout = amn_result.stages.mixture.layout
+ augmented = build_augmented_measure_matrix(data, processed_model, layout)
+ n_aug = augmented.shape[1]
+
+ mixture = amn_result.stages.mixture
+ structural = amn_result.stages.structural
+
+ # Build Lambda and intercepts in the original AMN structural basis.
+ n_components = mixture.weights.shape[0]
+ factor_slots = structural.factor_period_slots
+ n_factor = len(factor_slots)
+
+ # Reconstruct Lambda from the loadings DataFrame + observed-factor
+ # / control passthrough.
+ lambda_mat = np.zeros((n_aug, n_factor))
+ slot_to_id = {sp: i for i, sp in enumerate(factor_slots)}
+
+ for aug_idx, (period, factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ col = slot_to_id.get((period, factor))
+ if col is None:
+ continue
+ try:
+ loading = structural.loadings.loc[(period, meas, factor), "loading"]
+ except KeyError:
+ loading = 1.0
+ lambda_mat[aug_idx, col] = float(loading)
+
+ for aug_idx, (period, of_name) in zip(
+ layout.observed_factor_slots, layout.observed_factor_meta, strict=True
+ ):
+ col = slot_to_id.get((period, of_name))
+ if col is not None:
+ lambda_mat[aug_idx, col] = 1.0
+
+ for aug_idx, ctrl in zip(layout.control_slots, layout.control_meta, strict=True):
+ col = slot_to_id.get((-1, ctrl))
+ if col is not None:
+ lambda_mat[aug_idx, col] = 1.0
+
+ intercept = np.zeros(n_aug)
+ for aug_idx, (period, _factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ try:
+ intercept[aug_idx] = float(
+ structural.measurement_intercepts.loc[(period, meas), "intercept"]
+ )
+ except KeyError:
+ intercept[aug_idx] = 0.0
+
+ sigma2 = np.zeros(n_aug)
+ for aug_idx, (period, _factor, meas) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ ):
+ try:
+ sd = float(structural.measurement_sds.loc[(period, meas), "sd"])
+ except KeyError:
+ sd = 0.0
+ sigma2[aug_idx] = sd * sd
+
+ diag_sigma = np.diag(sigma2)
+
+ # Drop rows with any NaN in the augmented vector (listwise; matches
+ # Stage 1's complete-case behaviour). Posterior is reported only
+ # for complete-case observations.
+ complete_mask = ~np.isnan(augmented).any(axis=1)
+ y_complete = augmented[complete_mask]
+
+ # Precompute per-component pieces.
+ mu_theta = structural.factor_mixture_means
+ omegas = structural.factor_mixture_covariances
+ mu_y_per = np.empty((n_components, n_aug))
+ cov_y_inv = np.empty((n_components, n_aug, n_aug))
+ cov_theta_y = np.empty((n_components, n_factor, n_aug))
+ log_det = np.empty(n_components)
+ for k in range(n_components):
+ mu_y_per[k] = intercept + lambda_mat @ mu_theta[k]
+ cov_y = lambda_mat @ omegas[k] @ lambda_mat.T + diag_sigma
+ cov_y = 0.5 * (cov_y + cov_y.T) + 1e-10 * np.eye(n_aug)
+ cov_y_inv[k] = np.linalg.inv(cov_y)
+ cov_theta_y[k] = omegas[k] @ lambda_mat.T
+ sign, logdet = np.linalg.slogdet(cov_y)
+ log_det[k] = logdet if sign > 0 else np.inf
+
+ # Per-obs log-pdf in each component (up to a constant).
+ log_pi = np.log(np.clip(mixture.weights, 1e-300, None))
+ diffs = y_complete[:, None, :] - mu_y_per[None, :, :] # (n_complete, K, n_aug)
+ quad = np.einsum("ikj,kjl,ikl->ik", diffs, cov_y_inv, diffs)
+ log_probs = log_pi[None, :] - 0.5 * (log_det[None, :] + quad)
+ log_probs -= log_probs.max(axis=1, keepdims=True)
+ probs = np.exp(log_probs)
+ responsibilities = probs / probs.sum(axis=1, keepdims=True)
+
+ # Per-component conditional mean of theta given Y_i.
+ cond_means = np.empty((y_complete.shape[0], n_components, n_factor))
+ for k in range(n_components):
+ cond_means[:, k, :] = (
+ mu_theta[k] + (cov_theta_y[k] @ cov_y_inv[k] @ diffs[:, k, :].T).T
+ )
+
+ # Mixture-averaged posterior mean of theta.
+ posterior = np.einsum("ik,ikj->ij", responsibilities, cond_means)
+
+ # Stuff into a (id, period) -> (factor, ...) DataFrame.
+ case_level = str(data.index.names[0])
+ caseids = data.index.get_level_values(case_level).unique()
+ complete_caseids = caseids[np.asarray(complete_mask, dtype=bool)]
+
+ latent_factors = processed_model.labels.latent_factors
+ periods = processed_model.labels.periods
+ rows = []
+ for row_idx, caseid in enumerate(complete_caseids):
+ for period in periods:
+ row: dict[str, Any] = {"id": caseid, "period": int(period)}
+ for factor in latent_factors:
+ col_idx = slot_to_id.get((int(period), factor))
+ row[factor] = (
+ float(posterior[row_idx, col_idx])
+ if col_idx is not None
+ else np.nan
+ )
+ rows.append(row)
+ states_df = pd.DataFrame(rows)
+
+ state_ranges = create_state_ranges(
+ filtered_states=states_df,
+ factors=latent_factors,
+ )
+
+ return {
+ "unanchored_states": {
+ "states": states_df,
+ "state_ranges": state_ranges,
+ },
+ }
diff --git a/src/skillmodels/amn/simulate_and_regress.py b/src/skillmodels/amn/simulate_and_regress.py
new file mode 100644
index 00000000..337f770d
--- /dev/null
+++ b/src/skillmodels/amn/simulate_and_regress.py
@@ -0,0 +1,859 @@
+"""Stage 3 of the AMN estimator: simulate latent factors and regress.
+
+Draws a synthetic latent-factor panel from the structural mixture
+fitted in Stage 2 and recovers the per-period transition / investment
+parameters by least-squares regression.
+
+Specialised fitters: closed-form OLS for `linear`; softmax-constrained
+Levenberg-Marquardt for `log_ces` and `log_ces_with_constant` (keeps
+gammas on the simplex). Everything else (translog, robust_translog,
+linear_and_squares, log_ces_general, and any user
+`@register_params`-decorated transition) goes through a generic NLS
+path that calls the transition function directly via `jax.vmap`. This
+mirrors the per-factor NLS in
+`Monte Carlo Simulations/master_approx_simulationces2periodrho_5.R`
+but generalises beyond the paper's CES-only case.
+"""
+
+import inspect
+from collections.abc import Callable, Mapping
+from dataclasses import dataclass
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pandas as pd
+from scipy.optimize import least_squares
+
+from skillmodels.amn.types import (
+ MinimumDistanceResult,
+ ProductionFitResult,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import ProcessedModel
+
+
+def _draw_factor_panel(
+ structural: MinimumDistanceResult,
+ mixture_weights: np.ndarray,
+ *,
+ n_draws: int,
+ seed: int,
+) -> pd.DataFrame:
+ """Sample ``n_draws`` rows from the K-component Gaussian mixture.
+
+ Returns a DataFrame with one column per ``(period, factor)`` slot.
+ """
+ rng = np.random.default_rng(seed)
+ means = structural.factor_mixture_means
+ covs = structural.factor_mixture_covariances
+ n_components, n_factor = means.shape
+
+ counts = np.floor(n_draws * mixture_weights).astype(int)
+ deficit = n_draws - counts.sum()
+ if deficit > 0:
+ order = np.argsort(-(n_draws * mixture_weights - counts))
+ for idx in order[:deficit]:
+ counts[idx] += 1
+
+ chunks = []
+ for k in range(n_components):
+ if counts[k] == 0:
+ continue
+ cov = covs[k]
+ cov = 0.5 * (cov + cov.T) + 1e-10 * np.eye(n_factor)
+ samples = rng.multivariate_normal(means[k], cov, size=counts[k])
+ chunks.append(samples)
+ panel = np.vstack(chunks)
+ rng.shuffle(panel)
+
+ columns = [f"f[{t}|{f}]" for t, f in structural.factor_period_slots]
+ return pd.DataFrame(panel, columns=columns)
+
+
+def _slot_column(period: int, factor: str) -> str:
+ return f"f[{period}|{factor}]"
+
+
+def _fit_linear(
+ y: np.ndarray,
+ x_design: np.ndarray,
+ regressor_names: list[str],
+ fixed: Mapping[str, float] | None = None,
+) -> tuple[dict[str, float], float]:
+ """OLS regression with an intercept (added as the last column).
+
+ When ``fixed`` pins some coefficients to values, those columns are
+ partialled out -- ``fixed_value * column`` is moved to the LHS and the
+ column dropped -- so the remaining free coefficients are fit conditional
+ on the pins. The pinned coefficients are reported at their fixed values and
+ the residual SD reflects the full (free + pinned) prediction.
+
+ Returns:
+ ``(params_by_name, residual_sd)`` with `constant` included as
+ the trailing parameter.
+
+ """
+ fixed = fixed or {}
+ n = x_design.shape[0]
+ full_design = np.column_stack([x_design, np.ones(n)])
+ names = [*regressor_names, "constant"]
+
+ y_adj = y.astype(float).copy()
+ free_idx: list[int] = []
+ out: dict[str, float] = {}
+ for j, name in enumerate(names):
+ if name in fixed:
+ out[name] = float(fixed[name])
+ y_adj = y_adj - out[name] * full_design[:, j]
+ else:
+ free_idx.append(j)
+ if free_idx:
+ coefs, *_ = np.linalg.lstsq(full_design[:, free_idx], y_adj, rcond=None)
+ for k, j in enumerate(free_idx):
+ out[names[j]] = float(coefs[k])
+
+ pred = full_design @ np.array([out[name] for name in names])
+ sd = float(np.sqrt(np.mean((y - pred) ** 2)))
+ return out, sd
+
+
+def _fit_investment_residual(
+ y_invest: np.ndarray,
+ x_determinants: np.ndarray,
+ determinant_names: list[str],
+) -> tuple[dict[str, float], float, np.ndarray]:
+ """First-stage investment equation for the control-function correction.
+
+ OLS of the (latent) log-investment factor on its contemporaneous
+ determinants -- the production-input state factors theta_t and the
+ excluded observed instruments Y_t (income/prices) -- with an intercept:
+
+ ln I_t = beta_0 + beta_theta . theta_t + beta_Y . Y_t + eta_{I,t}.
+
+ The in-sample OLS residual `eta_{I,t} = ln I_t - E[ln I_t | theta_t, Y_t]`
+ is the control function added to the production regression (AMN 2020
+ eq. 7-8 / AF Sec. 3.5, Assumption 1(g)). Returns the coefficients
+ (keyed by ``determinant_names + ["constant"]``), the residual SD
+ (= SD(eta_{I,t})), and the residual vector of shape ``(n_draws,)``.
+ """
+ n = x_determinants.shape[0]
+ full_design = np.column_stack([x_determinants, np.ones(n)])
+ coefs, *_ = np.linalg.lstsq(full_design, y_invest, rcond=None)
+ resid = y_invest - full_design @ coefs
+ sd = float(np.sqrt(np.mean(resid**2)))
+ out = dict(zip([*determinant_names, "constant"], coefs.tolist(), strict=True))
+ return out, sd, resid
+
+
+def _fit_log_ces(
+ y: np.ndarray,
+ x_design: np.ndarray,
+ regressor_names: list[str],
+ *,
+ with_constant: bool,
+ cf: np.ndarray | None = None,
+) -> tuple[dict[str, float], float]:
+ """Fit log_ces (or log_ces_with_constant) via Levenberg-Marquardt.
+
+ Parametrises ``y = delta + (1/rho) * log(sum_i gamma_i * exp(X_i * rho))``
+ with gammas constrained to the simplex via softmax. When
+ ``with_constant=False``, the additive ``delta`` is held at 0.
+
+ If ``cf`` is given (the investment control-function residual), an extra
+ additive linear term ``kappa * cf`` is fitted OUTSIDE the CES aggregator
+ (AMN's ``+ alpha*cf``), with ``kappa`` (= the period-specific endogeneity
+ coefficient) estimated jointly with the CES parameters and returned under
+ the ``"cf"`` key.
+ """
+ n_reg = len(regressor_names)
+ eps = 1e-12
+ has_cf = cf is not None
+ kappa_idx = n_reg + (1 if with_constant else 0)
+
+ def residuals(theta: np.ndarray) -> np.ndarray:
+ logits = np.concatenate([theta[: n_reg - 1], [0.0]])
+ gammas = np.exp(logits - logits.max())
+ gammas = gammas / gammas.sum()
+ rho = theta[n_reg - 1]
+ constant = theta[n_reg] if with_constant else 0.0
+ exponents = x_design * rho
+ max_exp = np.max(exponents, axis=1, keepdims=True)
+ shifted = np.exp(exponents - max_exp)
+ log_inside = np.log(np.clip((gammas * shifted).sum(axis=1), eps, None))
+ pred = constant + (max_exp[:, 0] + log_inside) / rho
+ if has_cf:
+ pred = pred + theta[kappa_idx] * cf
+ return pred - y
+
+ n_unknowns = n_reg + (1 if with_constant else 0) + (1 if has_cf else 0)
+ theta0 = np.zeros(n_unknowns)
+ theta0[n_reg - 1] = 0.5
+ result = least_squares(residuals, theta0, method="lm", max_nfev=2000)
+ theta = result.x
+ logits = np.concatenate([theta[: n_reg - 1], [0.0]])
+ gammas = np.exp(logits - logits.max())
+ gammas = gammas / gammas.sum()
+ rho = float(theta[n_reg - 1])
+ constant = float(theta[n_reg]) if with_constant else 0.0
+ resid = residuals(theta)
+ sd = float(np.sqrt(np.mean(resid**2)))
+
+ out: dict[str, float] = dict(zip(regressor_names, gammas.tolist(), strict=True))
+ out["phi"] = rho
+ if with_constant:
+ out["constant"] = constant
+ if has_cf:
+ out["cf"] = float(theta[kappa_idx])
+ return out, sd
+
+
+def _make_user_transition_callable(
+ user_func: Callable,
+ factor_names: tuple[str, ...],
+ param_names: tuple[str, ...],
+) -> Callable[[jnp.ndarray, jnp.ndarray], jnp.ndarray]:
+ """Wrap a `@register_params`-decorated user function as `(states, params)`.
+
+ Mirrors `skillmodels.af.transition_period._wrap_registered_transition_function`
+ so Stage 3 can pass user transitions through `jax.vmap` for NLS.
+ """
+ sig = inspect.signature(user_func)
+ arg_names = [name for name in sig.parameters if name != "params"]
+ arg_positions = tuple(factor_names.index(name) for name in arg_names)
+
+ def wrapped(states: jnp.ndarray, params_vec: jnp.ndarray) -> jnp.ndarray:
+ kwargs: dict[str, jnp.ndarray | dict[str, jnp.ndarray]] = {
+ name: states[pos]
+ for name, pos in zip(arg_names, arg_positions, strict=True)
+ }
+ kwargs["params"] = dict(zip(param_names, params_vec, strict=True))
+ return user_func(**kwargs)
+
+ return wrapped
+
+
+def _resolve_transition_callable(
+ transition_name: str,
+ factor: str,
+ processed_model: ProcessedModel,
+ model_spec: ModelSpec,
+) -> tuple[Callable[[jnp.ndarray, jnp.ndarray], jnp.ndarray], tuple[str, ...]]:
+ """Return a ``(states, params) -> scalar`` callable plus param names.
+
+ For built-in transitions this is the function imported from
+ `skillmodels.common.transition_functions`; for user functions it is
+ `_make_user_transition_callable(...)` applied to the raw callable on
+ the model spec. The user callable looks its positional arguments up against
+ the full `(*latent, *observed)` factor order; a factor that the simulated
+ panel does not provide is read past the end of the (narrower) design row and
+ clamped by `jax` -- a throwaway seed value the CHS MLE re-fits.
+ """
+ from skillmodels.common import transition_functions as tf # noqa: PLC0415
+
+ builtin_names = {
+ "linear",
+ "translog",
+ "robust_translog",
+ "linear_and_squares",
+ "log_ces",
+ "log_ces_with_constant",
+ "log_ces_general",
+ }
+ factor_names = (
+ *processed_model.labels.latent_factors,
+ *processed_model.labels.observed_factors,
+ )
+ transition_info = processed_model.transition_info
+ if transition_info is None:
+ msg = "ProcessedModel has no transition_info; cannot run Stage 3."
+ raise ValueError(msg)
+ param_names = tuple(transition_info.param_names[factor])
+
+ if transition_name in builtin_names:
+ func = getattr(tf, transition_name)
+ return func, param_names
+
+ factor_spec = model_spec.factors.get(factor)
+ if factor_spec is None:
+ msg = (
+ f"Cannot resolve transition callable for factor '{factor}' "
+ f"(transition='{transition_name}'). Factor not found on "
+ "model_spec.factors."
+ )
+ raise KeyError(msg)
+ raw = factor_spec.transition_function
+ if not callable(raw):
+ msg = (
+ f"Factor '{factor}' has transition_function={raw!r} which is "
+ "neither a built-in name nor a callable."
+ )
+ raise TypeError(msg)
+ wrapped = _make_user_transition_callable(raw, factor_names, param_names)
+ return wrapped, param_names
+
+
+def _is_elasticity_param(name: str) -> bool:
+ """Return True for CES exponent / outside-coefficient parameters.
+
+ Covers the single-exponent forms (`phi`, `rho`, `sigma`) and
+ `log_ces_general`'s per-factor exponents `sigma_` and outside
+ coefficient `tfp`. These must be seeded nonzero so the CES log expression is
+ finite at the start point.
+ """
+ return name in {"phi", "rho", "sigma", "tfp"} or name.startswith("sigma_")
+
+
+def _seed_generic_nls_theta0(
+ param_names: tuple[str, ...],
+ init_overrides: dict[str, float],
+ *,
+ n_unknowns: int,
+) -> np.ndarray:
+ """Seed the NLS start vector for `_fit_generic_nls`.
+
+ Applies `init_overrides`, then seeds elasticity/outside-style params at 0.5
+ so CES / general-CES log expressions are finite at the start, and gives the
+ remaining (simplex-style "gamma") params a strictly positive uniform initial
+ share when the function looks CES-shaped. Elasticity-style names cover the
+ single-exponent forms (`phi`, `rho`, `sigma`) AND `log_ces_general`'s
+ per-factor exponents `sigma_` and outside coefficient `tfp` -- the
+ latter were previously unrecognized, leaving every parameter at 0 so that
+ `tfp * log(sum gamma_i ...) = 0 * log(0) = NaN` (Pro F4). The trailing
+ cf-coefficient slot (if `n_unknowns > len(param_names)`) stays at zero.
+ """
+ theta0 = np.zeros(n_unknowns)
+ for name, val in init_overrides.items():
+ if name in param_names:
+ theta0[param_names.index(name)] = val
+ for j, name in enumerate(param_names):
+ if _is_elasticity_param(name) and name not in init_overrides:
+ theta0[j] = 0.5
+ has_elasticity = any(_is_elasticity_param(n) for n in param_names)
+ if has_elasticity:
+ share_candidates = [
+ j
+ for j, n in enumerate(param_names)
+ if not _is_elasticity_param(n)
+ and n != "constant"
+ and n not in init_overrides
+ ]
+ if share_candidates:
+ theta0[share_candidates] = 1.0 / len(share_candidates)
+ return theta0
+
+
+def _fit_generic_nls(
+ transition_func: Callable[[jnp.ndarray, jnp.ndarray], jnp.ndarray],
+ param_names: tuple[str, ...],
+ y: np.ndarray,
+ states_panel: np.ndarray,
+ *,
+ init_overrides: dict[str, float] | None = None,
+ cf: np.ndarray | None = None,
+ fixed: Mapping[str, float] | None = None,
+) -> tuple[dict[str, float], float]:
+ """Generic Levenberg-Marquardt NLS via `jax.vmap` over the panel.
+
+ Works for any `(states, params) -> scalar` callable, including
+ translog, robust_translog, linear_and_squares, log_ces_general, and
+ user-registered transitions.
+
+ Args:
+ transition_func: callable taking a 1D state vector and a 1D
+ param vector and returning a scalar.
+ param_names: names of the parameters in the order accepted by
+ `transition_func`.
+ y: target vector, shape ``(n_obs,)``.
+ states_panel: state matrix, shape ``(n_obs, n_state_features)``.
+ init_overrides: optional ``{name: value}`` to seed specific
+ parameters before NLS. Useful for setting `phi != 0` on
+ log_ces-family functions.
+ cf: optional investment control-function residual, shape
+ ``(n_obs,)``. When given, an extra additive linear term
+ ``kappa * cf`` is fitted OUTSIDE the transition aggregator
+ (AMN's ``+ alpha*cf``); ``kappa`` is appended as an unknown
+ (init 0) and returned under the ``"cf"`` key. ``states_panel``
+ stays the production states (cf is a separate, additive term).
+ fixed: optional ``{name: value}`` pinning a subset of
+ ``param_names``. Pinned entries are held at their values and only
+ the remaining (free) parameters are optimised; the pinned values
+ are reconstructed into the full param vector at every residual
+ evaluation so the free fit is conditional on the pins.
+
+ """
+ init_overrides = init_overrides or {}
+ fixed = fixed or {}
+ has_cf = cf is not None
+ free_names = [n for n in param_names if n not in fixed]
+ n_free = len(free_names)
+ kappa_idx = n_free
+ # Baseline full param vector carrying the pinned values; free positions
+ # are overwritten from the optimiser's vector at each evaluation.
+ base_theta = np.array([float(fixed.get(n, 0.0)) for n in param_names])
+ free_positions = [i for i, n in enumerate(param_names) if n not in fixed]
+
+ @jax.jit
+ def predict_batch(theta: jnp.ndarray, states: jnp.ndarray) -> jnp.ndarray:
+ return jax.vmap(transition_func, in_axes=(0, None))(states, theta)
+
+ states_jnp = jnp.asarray(states_panel)
+
+ def residuals(theta_np: np.ndarray) -> np.ndarray:
+ full = base_theta.copy()
+ full[free_positions] = theta_np[:n_free]
+ preds = np.asarray(predict_batch(jnp.asarray(full), states_jnp))
+ if has_cf:
+ preds = preds + theta_np[kappa_idx] * cf
+ return preds - y
+
+ # Seed using the full param layout (preserves elasticity / CES-share
+ # seeding) then select the free positions plus the trailing cf slot.
+ full_seed = _seed_generic_nls_theta0(
+ param_names,
+ init_overrides,
+ n_unknowns=len(param_names) + (1 if has_cf else 0),
+ )
+ theta0 = np.array(
+ [full_seed[i] for i in free_positions] + ([0.0] if has_cf else [])
+ )
+
+ result = least_squares(residuals, theta0, method="lm", max_nfev=5000)
+ theta = result.x
+ resid = residuals(theta)
+ sd = float(np.sqrt(np.mean(resid**2)))
+ out = {n: float(fixed[n]) for n in param_names if n in fixed}
+ for i, n in enumerate(free_names):
+ out[n] = float(theta[i])
+ if has_cf:
+ out["cf"] = float(theta[kappa_idx])
+ return out, sd
+
+
+def _fit_transition(
+ transition_name: str,
+ factor: str,
+ processed_model: ProcessedModel,
+ model_spec: ModelSpec,
+ y: np.ndarray,
+ x_design: np.ndarray,
+ regressor_names: list[str],
+ *,
+ cf: np.ndarray | None = None,
+ fixed: Mapping[str, float] | None = None,
+) -> tuple[dict[str, float], float]:
+ """Dispatch to the right per-transition fitter.
+
+ `linear` and `log_ces`-family functions get specialised fitters for
+ speed / simplex constraints; everything else (translog,
+ robust_translog, linear_and_squares, log_ces_general, user) falls
+ through to a generic `jax.vmap`-based NLS.
+
+ When ``cf`` is given (the investment control-function residual), an
+ extra additive linear term ``kappa * cf`` is fitted jointly with the
+ transition parameters and returned under the ``"cf"`` key. For
+ `linear` the residual is just an extra design column; for the
+ `log_ces`-family and the generic NLS path it is added OUTSIDE the
+ aggregator (AMN 2020 eq. 7-8 / AF Sec. 3.5).
+
+ When ``fixed`` pins a subset of the transition coefficients (by their
+ parameter name), those are held at their values inside the regression and
+ only the remaining coefficients are fit. The `log_ces`-family fitters do
+ not yet support pinning and raise if asked to.
+ """
+ fixed = dict(fixed) if fixed else {}
+ if transition_name == "linear":
+ if cf is not None:
+ x_design = np.column_stack([x_design, cf])
+ regressor_names = [*regressor_names, "cf"]
+ return _fit_linear(y, x_design, regressor_names, fixed=fixed)
+ # log_ces_af shares log_ces's math (CES over production factors only), so it
+ # routes to the same specialised fitter (Pro F6); without this it would fall
+ # through to _resolve_transition_callable as a bare string and raise.
+ if transition_name in ("log_ces", "log_ces_af", "log_ces_with_constant"):
+ if fixed:
+ msg = (
+ f"fixed_params for the '{transition_name}' transition of factor "
+ f"'{factor}' is not supported; pinning is implemented for linear "
+ "and the generic NLS transitions (translog etc.)."
+ )
+ raise NotImplementedError(msg)
+ with_constant = transition_name == "log_ces_with_constant"
+ return _fit_log_ces(
+ y, x_design, regressor_names, with_constant=with_constant, cf=cf
+ )
+
+ func, param_names = _resolve_transition_callable(
+ transition_name, factor, processed_model, model_spec
+ )
+ return _fit_generic_nls(func, param_names, y, x_design, cf=cf, fixed=fixed)
+
+
+def _transition_fixes_for_period(
+ fixed_params: pd.DataFrame | None,
+ period: int,
+) -> dict[str, dict[str, float]]:
+ """Collect ``transition`` pins for ``period`` as ``{factor: {regname: value}}``.
+
+ Reads the rows of ``fixed_params`` whose category is ``"transition"`` and
+ whose period equals ``period`` (the AMN params index labels this level
+ ``aug_period``, but AMN keys it by calendar period). Returns an empty dict
+ when there is nothing to pin.
+ """
+ if fixed_params is None or fixed_params.empty:
+ return {}
+ idx = fixed_params.index
+ mask = (idx.get_level_values(0) == "transition") & (
+ idx.get_level_values(1) == period
+ )
+ out: dict[str, dict[str, float]] = {}
+ for label, value in fixed_params.loc[mask, "value"].items():
+ _cat, _p, factor, regname = label # ty: ignore[not-iterable]
+ out.setdefault(factor, {})[regname] = float(value)
+ return out
+
+
+def _factors_at_period(processed_model: ProcessedModel) -> tuple[str, ...]:
+ """Latent + observed factor names (used as transition regressors)."""
+ return (
+ *processed_model.labels.latent_factors,
+ *processed_model.labels.observed_factors,
+ )
+
+
+def _fit_first_stage_investment(
+ panel: pd.DataFrame,
+ period: int,
+ *,
+ present_investment: list[str],
+ state_predictors: list[str],
+ present_observed: list[str],
+) -> tuple[dict[str, np.ndarray], list[tuple[str, int, str, str, float]]]:
+ """Fit the contemporaneous investment equation(s) (AMN eq. 7).
+
+ For each present investment factor, regress its (latent) log-investment
+ value on the present production-input state factors plus the excluded
+ observed instruments, and keep the in-sample residual as the control
+ function for the production step (AMN 2020 eq. 7-8 / AF Sec. 3.5).
+
+ Args:
+ panel: Simulated latent-factor panel.
+ period: Calendar period `t` (the `aug_period` index emitted on rows).
+ present_investment: Investment factors present at `period`.
+ state_predictors: CorrectionSpec first-stage state predictors present at
+ `period`, in design order.
+ present_observed: CorrectionSpec instruments present at `period` (the
+ excluded observed factors).
+
+ Return:
+ Tuple `(cf_by_factor, investment_rows)` where `cf_by_factor` maps each
+ investment factor to its residual control-function vector and
+ `investment_rows` are the `investment_eq` / `investment_sds` param
+ rows.
+
+ Raises:
+ NotImplementedError: If more than one investment factor is present
+ (the control-function choice is ambiguous).
+ ValueError: If no observed instrument is present (the residual would
+ be collinear with the production inputs).
+
+ """
+ if len(present_investment) > 1:
+ msg = (
+ "AMN control function with more than one present investment factor at "
+ f"period {period} is unsupported: the control-function choice for the "
+ "state-factor production regressions is ambiguous."
+ )
+ raise NotImplementedError(msg)
+
+ cf_by_factor: dict[str, np.ndarray] = {}
+ investment_rows: list[tuple[str, int, str, str, float]] = []
+ for inv_factor in present_investment:
+ if not present_observed:
+ msg = (
+ "The AMN control function requires at least one present instrument "
+ f"at period {period} to identify the control-function coefficient "
+ f"for '{inv_factor}': without an excluded instrument the residual "
+ "eta_{I,t} is collinear with the production inputs (theta_t, I_t)."
+ )
+ raise ValueError(msg)
+ determinant_names = [*state_predictors, *present_observed]
+ y_invest = panel[_slot_column(period, inv_factor)].to_numpy()
+ x_determinants = panel[
+ [_slot_column(period, f) for f in determinant_names]
+ ].to_numpy()
+ coefs, inv_sd, residual = _fit_investment_residual(
+ y_invest, x_determinants, determinant_names
+ )
+ cf_by_factor[inv_factor] = residual
+ for name, value in coefs.items():
+ investment_rows.append(
+ ("investment_eq", period, inv_factor, name, float(value))
+ )
+ investment_rows.append(("investment_sds", period, inv_factor, "-", inv_sd))
+ return cf_by_factor, investment_rows
+
+
+@dataclass(frozen=True)
+class _ProductionContext:
+ """Per-period design context for the Stage-3 production regressions."""
+
+ x_design: np.ndarray
+ """All-present-factor design (non-control-function path)."""
+ present_factor_names: list[str]
+ """Names matching `x_design`'s columns."""
+ x_design_production: np.ndarray
+ """Production design under the control-function path: present factors with the
+ excluded *instruments* removed. Latent factors and any non-instrument observed
+ factors (genuine production controls) are kept."""
+ production_factor_names: list[str]
+ """Names matching `x_design_production`'s columns."""
+ cf_by_factor: dict[str, np.ndarray]
+ """Investment factor -> control-function residual for this period."""
+
+
+def _fit_period_production(
+ panel: pd.DataFrame,
+ period: int,
+ next_period: int,
+ processed_model: ProcessedModel,
+ model_spec: ModelSpec,
+ *,
+ factor_to_function_name: dict[str, str],
+ context: _ProductionContext,
+ run_cf: bool,
+ targets: list[str],
+ fixed_by_factor: Mapping[str, Mapping[str, float]] | None = None,
+) -> list[tuple[str, int, str, str, float]]:
+ """Run the production regressions for every latent outcome at `period`.
+
+ Under `run_cf` the production inputs are the present factors with the excluded
+ *instruments* removed -- latent factors plus any non-instrument observed
+ factors (genuine production controls) -- and the control-function residual is
+ injected as a `kappa*cf` covariate into *state* outcomes only, not the
+ investment factor's own transition. Only the `CorrectionSpec` instruments are
+ excluded; other observed factors remain production inputs.
+ Without `run_cf` the regressors are all present factors (legacy behaviour).
+
+ Return:
+ Transition / shock_sd parameter rows for this period.
+
+ """
+ if run_cf:
+ fit_x_design = context.x_design_production
+ fit_names = context.production_factor_names
+ else:
+ fit_x_design = context.x_design
+ fit_names = context.present_factor_names
+
+ transition_rows: list[tuple[str, int, str, str, float]] = []
+ for factor in processed_model.labels.latent_factors:
+ target_col = _slot_column(next_period, factor)
+ if target_col not in panel.columns:
+ continue
+ trans_name = factor_to_function_name.get(factor, "linear")
+ if trans_name == "constant":
+ continue
+ y = panel[target_col].to_numpy()
+
+ inject_cf = run_cf and factor in targets
+ cf: np.ndarray | None = None
+ if inject_cf and context.cf_by_factor:
+ cf = next(iter(context.cf_by_factor.values()))
+
+ params, sd = _fit_transition(
+ trans_name,
+ factor,
+ processed_model,
+ model_spec,
+ y,
+ fit_x_design,
+ fit_names,
+ cf=cf,
+ fixed=fixed_by_factor.get(factor) if fixed_by_factor else None,
+ )
+ for regname, value in params.items():
+ transition_rows.append(
+ ("transition", period, factor, regname, float(value))
+ )
+ transition_rows.append(("shock_sds", period, factor, "-", sd))
+ return transition_rows
+
+
+def simulate_and_regress(
+ structural: MinimumDistanceResult,
+ processed_model: ProcessedModel,
+ model_spec: ModelSpec,
+ mixture_weights: np.ndarray,
+ *,
+ n_draws: int = 100_000,
+ seed: int = 0,
+ linearize_control_function: bool = False,
+ fixed_params: pd.DataFrame | None = None,
+) -> ProductionFitResult:
+ """Simulate the joint latent-factor distribution and run Stage-3 regressions.
+
+ Args:
+ structural: Stage 2 output (structural mixture, loadings, etc.).
+ processed_model: Skillmodels processed model.
+ model_spec: Original model spec; used to look up raw transition
+ callables for user-registered `@register_params` functions.
+ mixture_weights: Per-component mixture weights from Stage 1.
+ n_draws: Synthetic-panel size.
+ seed: RNG seed.
+ linearize_control_function: When True, fit only the single linear `cf`
+ term and skip the higher-order `kappa_terms`
+ `NotImplementedError` gate (used when AMN seeds `estimate_chs`).
+ fixed_params: optional params frame whose ``transition`` rows pin
+ production-function coefficients. Each pinned coefficient is held at
+ its value inside the per-period production regression while the
+ remaining coefficients are fit conditional on the pins. Rows of
+ other categories are ignored here (they belong to other stages).
+
+ The AMN eq.-7-8 investment control-function correction (AF Sec. 3.5) runs iff
+ the model declares a `CorrectionSpec` (presence is the single trigger). A
+ contemporaneous first-stage investment equation is then fitted per investment
+ factor over the spec's `state_predictors` + excluded `instruments`, and its
+ in-sample residual `eta_{I,t}` is added as an additive `kappa * cf` covariate
+ to each `targets` factor's production regression. AMN implements only the
+ linear `cf` term; higher-order `kappa_terms` raise `NotImplementedError`.
+
+ Return:
+ ProductionFitResult with production-function and investment-equation
+ parameter DataFrames.
+
+ """
+ endog_info = processed_model.endogenous_factors_info
+ control_function = endog_info.control_function
+ # CorrectionSpec presence is the single trigger; there is no separate flag.
+ run_cf = control_function is not None
+
+ if control_function is not None and not linearize_control_function:
+ # AMN implements only a single linear cf term per target; the higher-order
+ # (translog) kappa_terms basis needs estimate_chs. When used to *seed*
+ # estimate_chs (`linearize_control_function=True`), AMN instead fits only
+ # the linear cf term and leaves the higher-order kappa terms for the
+ # start-value defaults.
+ for target, terms in control_function.kappa_terms.items():
+ if tuple(terms) != ("cf",):
+ msg = (
+ "AMN implements only a linear control function (kappa * cf). "
+ f"Target {target!r} requests higher-order terms {tuple(terms)}; "
+ "use estimate_chs for the full polynomial basis."
+ )
+ raise NotImplementedError(msg)
+
+ investment_factors = (
+ [control_function.investment_factor] if control_function is not None else []
+ )
+ cf_targets = list(control_function.targets) if control_function is not None else []
+ cf_predictors = (
+ list(control_function.state_predictors) if control_function is not None else []
+ )
+ cf_instruments = (
+ list(control_function.instruments) if control_function is not None else []
+ )
+
+ panel = _draw_factor_panel(structural, mixture_weights, n_draws=n_draws, seed=seed)
+
+ periods = processed_model.labels.periods
+ transition_info = processed_model.transition_info
+ factor_to_function_name = (
+ dict(transition_info.function_names) if transition_info is not None else {}
+ )
+
+ transition_rows: list[tuple[str, int, str, str, float]] = []
+ investment_rows: list[tuple[str, int, str, str, float]] = []
+
+ for t_idx in range(len(periods) - 1):
+ t = int(periods[t_idx])
+ t_next = int(periods[t_idx + 1])
+ factor_names = _factors_at_period(processed_model)
+ regressor_cols = [_slot_column(t, f) for f in factor_names]
+ present_pairs = [
+ (f, c)
+ for f, c in zip(factor_names, regressor_cols, strict=True)
+ if c in panel.columns
+ ]
+ if not present_pairs:
+ continue
+ present_factor_names = [f for f, _ in present_pairs]
+ x_design = panel[[c for _, c in present_pairs]].to_numpy()
+
+ # Production design used under the control-function path: drop only the
+ # excluded instruments, keeping latent factors and any non-instrument
+ # observed factors (genuine production controls). When every observed
+ # factor is an instrument this reduces to the latent-only design.
+ instrument_set = set(cf_instruments)
+ production_pairs = [(f, c) for f, c in present_pairs if f not in instrument_set]
+ production_factor_names = [f for f, _ in production_pairs]
+ x_design_production = (
+ panel[[c for _, c in production_pairs]].to_numpy()
+ if production_pairs
+ else x_design
+ )
+
+ # First stage: fit the contemporaneous investment equation(s) and
+ # cache the control-function residual(s) for the production step.
+ cf_by_factor: dict[str, np.ndarray] = {}
+ if run_cf:
+ cf_by_factor, period_investment_rows = _fit_first_stage_investment(
+ panel,
+ t,
+ present_investment=[
+ f for f in present_factor_names if f in investment_factors
+ ],
+ state_predictors=[
+ f for f in cf_predictors if f in present_factor_names
+ ],
+ present_observed=[
+ f for f in cf_instruments if f in present_factor_names
+ ],
+ )
+ investment_rows.extend(period_investment_rows)
+
+ context = _ProductionContext(
+ x_design=x_design,
+ present_factor_names=present_factor_names,
+ x_design_production=x_design_production,
+ production_factor_names=production_factor_names,
+ cf_by_factor=cf_by_factor,
+ )
+ transition_rows.extend(
+ _fit_period_production(
+ panel,
+ t,
+ t_next,
+ processed_model,
+ model_spec,
+ factor_to_function_name=factor_to_function_name,
+ context=context,
+ run_cf=run_cf,
+ targets=cf_targets,
+ fixed_by_factor=_transition_fixes_for_period(fixed_params, t),
+ )
+ )
+
+ def _rows_to_df(
+ rows: list[tuple[str, int, str, str, float]],
+ ) -> pd.DataFrame:
+ if not rows:
+ return pd.DataFrame(
+ {"value": []},
+ index=pd.MultiIndex.from_tuples(
+ [], names=["category", "aug_period", "name1", "name2"]
+ ),
+ )
+ index = pd.MultiIndex.from_tuples(
+ [(c, p, n1, n2) for c, p, n1, n2, _ in rows],
+ names=["category", "aug_period", "name1", "name2"],
+ )
+ values = [v for *_, v in rows]
+ return pd.DataFrame({"value": values}, index=index)
+
+ return ProductionFitResult(
+ production_params=_rows_to_df(transition_rows),
+ investment_params=_rows_to_df(investment_rows),
+ n_draws=n_draws,
+ seed=seed,
+ )
diff --git a/src/skillmodels/amn/start_values.py b/src/skillmodels/amn/start_values.py
new file mode 100644
index 00000000..09489981
--- /dev/null
+++ b/src/skillmodels/amn/start_values.py
@@ -0,0 +1,871 @@
+"""Moment-based starting values for the CHS estimator.
+
+Replaces the legacy `0.5` / `1.0` / `0.0` constant fills with
+data-derived seeds. Two-stage hybrid:
+
+1. **Spearman cross-covariance moments** identify the measurement
+ system (loadings + measurement-error SDs + latent factor SDs)
+ per period.
+2. **OLS on Bartlett-scored factor proxies** identifies transition
+ coefficients and the residual SD of the production shock —
+ the AMN (Attanasio-Meghir-Nix 2020) flavour the AF paper §7
+ recommends as starting values, just bootstrapped from the
+ Spearman estimates rather than from a separate AMN run.
+
+Together these give a data-derived seed for every category that has
+moment-based identification. Categories Spearman + Bartlett-OLS
+cannot identify (mixture weights, initial means, controls) fall
+back to neutral defaults — these affect convergence speed only,
+not identification.
+"""
+
+from collections.abc import Iterable, Mapping
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+
+from skillmodels.amn.moments import (
+ SpearmanResult,
+ seed_beta_from_ols,
+ spearman_factor_moments,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_data import process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import Normalizations, ProcessedModel
+
+
+def get_spearman_start_params(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ params_template: pd.DataFrame,
+) -> pd.DataFrame:
+ """Return a copy of `params_template` with moment-based seed values.
+
+ Walks the params index and fills each row using:
+
+ * `loadings`, `meas_sds`: per-period Spearman moments on the
+ single-factor measurements of each latent factor.
+ * `initial_cholcovs`: diagonal entries set to `sqrt(latent_var)`
+ from the period-0 Spearman result; off-diagonals 0.
+ * `initial_states`: 0 (location is unidentified from cross-covs).
+ * `mixture_weights`: uniform `1 / n_mixtures`.
+ * `controls`: 0.
+ * `shock_sds`: 0.5.
+ * `transition`: 0.5.
+
+ Rows where `lower_bound == upper_bound` (user normalizations,
+ fixed_params pins, model-implied fixes) are left untouched.
+
+ Args:
+ model_spec: Model specification.
+ data: Long-format panel with the same `(id, period)` MultiIndex
+ consumed by `get_maximization_inputs`.
+ params_template: The params DataFrame returned by
+ `get_maximization_inputs(...)["params_template"]` — it
+ already has the right MultiIndex, bounds, and pinned
+ values.
+
+ Return:
+ Copy of `params_template` with the `value` column populated.
+
+ """
+ processed_model = process_model(model_spec)
+ processed_data = process_data(
+ df=data,
+ has_endogenous_factors=processed_model.endogenous_factors_info.has_endogenous_factors,
+ labels=processed_model.labels,
+ update_info=processed_model.update_info,
+ anchoring_info=processed_model.anchoring,
+ purpose="estimation",
+ )
+ measurements = np.asarray(processed_data["measurements"])
+ update_info = processed_model.update_info
+ latent_factors = processed_model.labels.latent_factors
+ n_mixtures = processed_model.dimensions.n_mixtures
+ loading_norms = _collect_loading_norms(processed_model.normalizations)
+ aug_periods = processed_model.labels.aug_periods
+
+ out = params_template.copy()
+ # `free` here means "this entry still needs a value" — i.e. it has
+ # not been pinned by `enforce_fixed_constraints` or by the caller.
+ # We use NaN-detection instead of `lower_bound != upper_bound` because
+ # `enforce_fixed_constraints` only writes `value` and leaves bounds
+ # untouched; bound-equality alone would misclassify fixed entries.
+ free = out["value"].isna()
+
+ _apply_neutral_defaults(out, free, n_mixtures=n_mixtures)
+ _seed_initial_states_by_clustering(
+ out,
+ free,
+ measurements=measurements,
+ update_info=update_info,
+ latent_factors=latent_factors,
+ n_mixtures=n_mixtures,
+ loading_norms=loading_norms,
+ )
+
+ update_info_periods = set(update_info.index.get_level_values("aug_period"))
+ spearman_per_period: dict[tuple[int, str], SpearmanResult] = {}
+ for aug_period in aug_periods:
+ if aug_period not in update_info_periods:
+ continue
+ period_meas_index = _measurement_row_index(update_info, aug_period)
+ for factor in latent_factors:
+ factor_meas = _single_factor_measurements(
+ update_info,
+ aug_period=aug_period,
+ factor=factor,
+ all_factors=latent_factors,
+ )
+ if len(factor_meas) < 2:
+ continue
+ cols = [period_meas_index[m] for m in factor_meas]
+ sub = measurements[cols, :].T # (n_obs, n_meas)
+ anchor_local, anchor_loading = _pick_anchor(
+ factor_meas=factor_meas, factor=factor, loading_norms=loading_norms
+ )
+ result = spearman_factor_moments(
+ sub, anchor_idx=anchor_local, anchor_loading=anchor_loading
+ )
+ if not result.valid:
+ continue
+ spearman_per_period[(aug_period, factor)] = result
+ _override_loadings_meas_sds(
+ out,
+ free,
+ aug_period=aug_period,
+ factor=factor,
+ factor_meas=factor_meas,
+ result=result,
+ )
+
+ _override_initial_cholcovs(
+ out,
+ free,
+ spearman_per_period=spearman_per_period,
+ latent_factors=latent_factors,
+ n_mixtures=n_mixtures,
+ )
+
+ _override_transition_via_ols(
+ out,
+ free,
+ processed_model=processed_model,
+ measurements=measurements,
+ spearman_per_period=spearman_per_period,
+ observed_factors=np.asarray(processed_data["observed_factors"]),
+ )
+
+ _pool_within_stage_equality(
+ out,
+ free=free,
+ processed_model=processed_model,
+ )
+
+ return out
+
+
+def _amn_values_on_chs_index(
+ amn_params: pd.DataFrame,
+ chs_index: pd.Index,
+ aug_periods_to_periods: Mapping[int, int],
+) -> pd.Series:
+ """Map AMN estimates onto the CHS template index, fixing the coordinate gap.
+
+ AMN emits parameters in *calendar* time and carries the control-function
+ coefficient as a `("transition", period, factor, "cf")` row. CHS indexes by
+ *augmented* period and keeps the control function in a dedicated `kappa`
+ category. A raw index intersection therefore silently drops every AMN row on
+ a calendar period that does not coincide with its augmented period, and never
+ transfers the cf coefficient to `kappa` at all.
+
+ For each CHS template row, translate its augmented period to the calendar
+ period via `aug_periods_to_periods` and look up the matching AMN row: `kappa`
+ rows read the AMN `("transition", calendar, factor, "cf")` value, every other
+ category maps straight through on `(name1, name2)`. Because several augmented
+ periods can share a calendar period (e.g. both kappa half-periods), one AMN
+ value can seed several CHS rows -- which is the intended seeding behaviour.
+
+ Args:
+ amn_params: `AMNEstimationResult.params` (calendar-time, cf under
+ `transition`).
+ chs_index: The CHS params template index (augmented-time, dedicated
+ `kappa` category).
+ aug_periods_to_periods: `labels.aug_periods_to_periods`, mapping each
+ augmented period to its calendar period.
+
+ Return:
+ A `value` Series indexed by `chs_index`; `NaN` where AMN has no match.
+
+ """
+ amn_value = amn_params["value"]
+ out = pd.Series(np.nan, index=chs_index, name="value")
+ for loc in chs_index:
+ category, aug_period, name1, name2 = loc
+ calendar = int(aug_periods_to_periods[int(aug_period)])
+ src_category = "transition" if category == "kappa" else category
+ src_key = (src_category, calendar, name1, name2)
+ if src_key in amn_value.index:
+ out.loc[loc] = float(amn_value.loc[src_key])
+ return out
+
+
+def get_amn_start_params(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ params_template: pd.DataFrame,
+ amn_params: pd.DataFrame,
+) -> pd.DataFrame:
+ """Seed start values from AMN estimates, pooling stage-tied params.
+
+ Fills via `get_spearman_start_params` (covering entries AMN does not
+ produce — e.g. mixture weights and initial Cholesky diagonals), translates
+ the AMN estimates from calendar/cf coordinates onto the CHS augmented/`kappa`
+ index (see `_amn_values_on_chs_index`), overlays them onto the free entries,
+ then re-pools the `transition` / `shock_sds` seeds within each stage. The
+ re-pool is essential: AMN estimates per period, so its overlay re-breaks the
+ within-stage `PairwiseEqualityConstraint`s that `optimagic` checks at the
+ start point (`get_spearman_start_params` pools them, but the AMN overlay
+ re-breaks the ties).
+
+ Args:
+ model_spec: Model specification.
+ data: Long-format panel with the `(id, period)` MultiIndex consumed by
+ `get_maximization_inputs`.
+ params_template: Template from `get_maximization_inputs`, with pinned
+ entries already filled.
+ amn_params: `AMNEstimationResult.params` to overlay onto the free
+ common entries.
+
+ Return:
+ Copy of `params_template` with seeded, stage-pooled `value`s.
+
+ """
+ processed_model = process_model(model_spec)
+ pre_pinned = params_template["value"].notna()
+ out = get_spearman_start_params(
+ model_spec=model_spec, data=data, params_template=params_template
+ )
+ seeded = _amn_values_on_chs_index(
+ amn_params, out.index, processed_model.labels.aug_periods_to_periods
+ )
+ free = ~pre_pinned
+ fill = free & seeded.notna()
+ out.loc[fill, "value"] = seeded.loc[fill]
+ _pool_within_stage_equality(out, free=free, processed_model=processed_model)
+ return out
+
+
+def pool_equality_groups( # noqa: C901
+ params: pd.DataFrame,
+ constraints: list[om.constraints.Constraint],
+ *,
+ keep_pinned_values: pd.Series | None = None,
+) -> pd.DataFrame:
+ """Pool param values within each `om.EqualityConstraint` group.
+
+ For each `om.EqualityConstraint` whose selector is the standard
+ `select_by_loc(loc=multi_index)` form, replace the values of all
+ members of the group with a single shared value so the equality
+ constraint holds at the start values. If a member is flagged as
+ "pinned" (via `keep_pinned_values=True` for that loc), the pinned
+ value is used for the whole group; otherwise the group is averaged.
+
+ Use after moment-based starting values: Spearman seeds each period
+ independently, which violates user equality constraints across
+ periods (e.g., loadings or meas_sds constant across periods).
+ Calling this with the user constraint list restores the equalities
+ while keeping the data-derived information (now pooled).
+
+ Args:
+ params: Params DataFrame with a `"value"` column and the
+ standard 4-level MultiIndex.
+ constraints: List of optimagic Constraint objects. Only
+ `om.EqualityConstraint` entries with a `select_by_loc`
+ partial as `selector` are honoured.
+ keep_pinned_values: Optional boolean Series indexed like
+ `params`. Entries where this is True keep their value;
+ the pooling logic copies that value to every other member
+ of the same equality group.
+
+ Return:
+ Modified copy of `params`.
+ """
+ out = params.copy()
+ for c in constraints:
+ if not isinstance(c, om.EqualityConstraint):
+ continue
+ selector = c.selector
+ keywords = getattr(selector, "keywords", None)
+ if not keywords or "loc" not in keywords:
+ continue
+ loc = keywords["loc"]
+ if not isinstance(loc, pd.MultiIndex) or len(loc) <= 1:
+ continue
+ members = [m for m in loc if m in out.index]
+ if len(members) <= 1:
+ continue
+ if keep_pinned_values is not None:
+ pinned = [
+ float(out.loc[m, "value"])
+ for m in members
+ if bool(keep_pinned_values.loc[m]) and pd.notna(out.loc[m, "value"])
+ ]
+ else:
+ pinned = []
+ if pinned:
+ target = pinned[0]
+ else:
+ raw = [
+ float(out.loc[m, "value"])
+ for m in members
+ if pd.notna(out.loc[m, "value"])
+ ]
+ if not raw:
+ continue
+ target = float(np.mean(raw))
+ for m in members:
+ if keep_pinned_values is None or not bool(keep_pinned_values.loc[m]):
+ out.loc[m, "value"] = target
+ return out
+
+
+def _kmeans_labels(
+ features: np.ndarray, n_clusters: int, *, n_iter: int = 25
+) -> np.ndarray:
+ """Return deterministic k-means cluster labels for `features` (n_obs, n_dim).
+
+ Centers are initialised at evenly spaced quantiles of the data (no random
+ seeds, so the result is reproducible), then refined with Lloyd iterations.
+ Used to break the symmetry of the initial-mixture start values: a mixture
+ seeded with identical components is a stationary collapsed subspace for a
+ deterministic optimizer, so the components must start separated.
+ """
+ quantiles = np.linspace(0.0, 1.0, n_clusters + 2)[1:-1]
+ centers = np.quantile(features, quantiles, axis=0)
+ labels = np.zeros(features.shape[0], dtype=int)
+ for it in range(n_iter):
+ distances = ((features[:, None, :] - centers[None, :, :]) ** 2).sum(axis=2)
+ new_labels = distances.argmin(axis=1)
+ if it > 0 and np.array_equal(new_labels, labels):
+ break
+ labels = new_labels
+ for k in range(n_clusters):
+ if np.any(labels == k):
+ centers[k] = features[labels == k].mean(axis=0)
+ return labels
+
+
+def _period0_anchor_columns(
+ update_info: pd.DataFrame,
+ *,
+ latent_factors: tuple[str, ...],
+ loading_norms: dict[tuple[str, str], float],
+) -> dict[str, int]:
+ """Return `{factor: measurement column}` for each period-0 anchor measurement."""
+ period_meas_index = _measurement_row_index(update_info, 0)
+ anchor_cols: dict[str, int] = {}
+ for factor in latent_factors:
+ factor_meas = _single_factor_measurements(
+ update_info, aug_period=0, factor=factor, all_factors=latent_factors
+ )
+ if not factor_meas:
+ continue
+ anchor_local, _ = _pick_anchor(
+ factor_meas=factor_meas, factor=factor, loading_norms=loading_norms
+ )
+ anchor_cols[factor] = period_meas_index[factor_meas[anchor_local]]
+ return anchor_cols
+
+
+def _seed_initial_states_by_clustering(
+ params: pd.DataFrame,
+ free: pd.Series,
+ *,
+ measurements: np.ndarray,
+ update_info: pd.DataFrame,
+ latent_factors: tuple[str, ...],
+ n_mixtures: int,
+ loading_norms: dict[tuple[str, str], float],
+) -> None:
+ """Seed the initial-mixture component means by clustering period-0 anchors.
+
+ For each latent factor with a period-0 anchor (unit-loading) measurement,
+ cluster individuals on the joint of those anchors into `n_mixtures` groups and
+ set each component's initial mean to its cluster mean, ordered so the FIRST
+ factor's component means increase (matching the identification constraint).
+ Mixture weights are seeded to the cluster proportions. This replaces the
+ symmetric all-zeros mean seed that traps a deterministic optimizer at the
+ collapsed one-Gaussian solution. Cross/diagonal covariances are left to the
+ Spearman / neutral seeds.
+ """
+ if n_mixtures < 2:
+ return
+ if 0 not in set(update_info.index.get_level_values("aug_period")):
+ return
+ anchor_cols = _period0_anchor_columns(
+ update_info, latent_factors=latent_factors, loading_norms=loading_norms
+ )
+ if not anchor_cols:
+ return
+
+ features = measurements[list(anchor_cols.values()), :].T # (n_obs, n_anchors)
+ keep = ~np.isnan(features).any(axis=1)
+ features = features[keep]
+ if features.shape[0] < n_mixtures:
+ return
+ labels = _kmeans_labels(features, n_mixtures)
+ present = [k for k in range(n_mixtures) if np.any(labels == k)]
+ if len(present) < n_mixtures:
+ return # degenerate clustering; keep the neutral seed
+ # Order components by the first anchor factor's cluster mean (ascending), to
+ # satisfy the increasing-first-factor-mean identification constraint.
+ order = sorted(present, key=lambda k: float(features[labels == k, 0].mean()))
+ for comp, cluster in enumerate(order):
+ rows = labels == cluster
+ for f_idx, factor in enumerate(anchor_cols):
+ loc = ("initial_states", 0, f"mixture_{comp}", factor)
+ if loc in params.index and bool(free.loc[loc]):
+ params.loc[loc, "value"] = float(features[rows, f_idx].mean())
+ w_loc = ("mixture_weights", 0, f"mixture_{comp}", "-")
+ if w_loc in params.index and bool(free.loc[w_loc]):
+ params.loc[w_loc, "value"] = float(rows.mean())
+
+
+def _apply_neutral_defaults(
+ params: pd.DataFrame,
+ free: pd.Series,
+ *,
+ n_mixtures: int,
+) -> None:
+ cat = params.index.get_level_values("category")
+ params.loc[free & (cat == "controls"), "value"] = 0.0
+ params.loc[free & (cat == "loadings"), "value"] = 1.0
+ params.loc[free & (cat == "meas_sds"), "value"] = 0.5
+ params.loc[free & (cat == "shock_sds"), "value"] = 0.5
+ params.loc[free & (cat == "initial_states"), "value"] = 0.0
+ params.loc[free & (cat == "mixture_weights"), "value"] = 1.0 / max(n_mixtures, 1)
+ params.loc[free & (cat == "initial_cholcovs"), "value"] = 0.0
+ params.loc[free & (cat == "transition"), "value"] = 0.5
+ # Control-function categories (present only under a CorrectionSpec). Seed
+ # small/neutral: no first-stage relationship and no correction initially.
+ params.loc[free & (cat == "investment_eq"), "value"] = 0.0
+ params.loc[free & (cat == "kappa"), "value"] = 0.0
+ # Higher-order terms -- translog interactions / squares ("f1 * f2", "f1 ** 2")
+ # and higher-order cf terms ("cf * f1", "cf ** 2"), identified by a space in
+ # `name2` -- are not produced by the linear AMN/Spearman seeds; start them
+ # small so the optimiser explores away from zero without dominating.
+ name2 = params.index.get_level_values("name2")
+ higher_order = free & pd.Series([" " in str(n) for n in name2], index=params.index)
+ params.loc[higher_order, "value"] = 0.01
+ diag_values = pd.Series(
+ [_is_cholcov_diag(idx) for idx in params.index],
+ index=params.index,
+ )
+ diag_mask = free & (cat == "initial_cholcovs") & diag_values
+ params.loc[diag_mask, "value"] = 1.0
+
+
+def _is_cholcov_diag(idx: tuple) -> bool:
+ if idx[0] != "initial_cholcovs":
+ return False
+ name2 = idx[3]
+ if "-" not in name2:
+ return False
+ a, b = name2.split("-", 1)
+ return a == b
+
+
+def _measurement_row_index(
+ update_info: pd.DataFrame, aug_period: int
+) -> dict[str, int]:
+ out: dict[str, int] = {}
+ for flat_idx, (a_period, meas) in enumerate(update_info.index):
+ if a_period == aug_period:
+ out[meas] = flat_idx
+ return out
+
+
+def _single_factor_measurements(
+ update_info: pd.DataFrame,
+ *,
+ aug_period: int,
+ factor: str,
+ all_factors: Iterable[str],
+) -> tuple[str, ...]:
+ """Return measurements at `aug_period` that load only on `factor`."""
+ period_rows = update_info.xs(aug_period, level="aug_period")
+ measurement_rows = period_rows.loc[period_rows["purpose"] == "measurement"]
+ out: list[str] = []
+ factors = list(all_factors)
+ for meas, row in measurement_rows.iterrows():
+ if not bool(row[factor]):
+ continue
+ if any(bool(row[f]) for f in factors if f != factor):
+ continue
+ out.append(str(meas))
+ return tuple(out)
+
+
+def _collect_loading_norms(
+ normalizations: Mapping[str, Normalizations],
+) -> dict[tuple[str, str], float]:
+ """Flatten per-factor loading normalizations into a (meas, factor) → value dict."""
+ out: dict[tuple[str, str], float] = {}
+ for factor, norms in normalizations.items():
+ loadings_per_period = norms.loadings
+ for period_norms in loadings_per_period:
+ for meas, value in period_norms.items():
+ out[(meas, factor)] = float(value)
+ return out
+
+
+def _pick_anchor(
+ *,
+ factor_meas: tuple[str, ...],
+ factor: str,
+ loading_norms: dict[tuple[str, str], float],
+) -> tuple[int, float]:
+ for local_idx, meas in enumerate(factor_meas):
+ if (meas, factor) in loading_norms:
+ return local_idx, loading_norms[(meas, factor)]
+ return 0, 1.0
+
+
+def _override_loadings_meas_sds(
+ params: pd.DataFrame,
+ free: pd.Series,
+ *,
+ aug_period: int,
+ factor: str,
+ factor_meas: tuple[str, ...],
+ result: SpearmanResult,
+) -> None:
+ for local_idx, meas in enumerate(factor_meas):
+ loc_load = ("loadings", aug_period, meas, factor)
+ if loc_load in params.index and free.loc[loc_load]:
+ params.loc[loc_load, "value"] = float(result.loadings[local_idx])
+ loc_sd = ("meas_sds", aug_period, meas, "-")
+ if loc_sd in params.index and free.loc[loc_sd]:
+ params.loc[loc_sd, "value"] = float(result.meas_sds[local_idx])
+
+
+def _override_initial_cholcovs(
+ params: pd.DataFrame,
+ free: pd.Series,
+ *,
+ spearman_per_period: dict[tuple[int, str], SpearmanResult],
+ latent_factors: tuple[str, ...],
+ n_mixtures: int,
+) -> None:
+ for factor in latent_factors:
+ result = spearman_per_period.get((0, factor))
+ if result is None:
+ continue
+ sd_factor = float(np.sqrt(max(result.latent_var, 1e-12)))
+ for comp in range(n_mixtures):
+ loc = (
+ "initial_cholcovs",
+ 0,
+ f"mixture_{comp}",
+ f"{factor}-{factor}",
+ )
+ if loc in params.index and free.loc[loc]:
+ params.loc[loc, "value"] = sd_factor
+
+
+def _pool_within_stage_equality( # noqa: C901, PLR0912
+ params: pd.DataFrame,
+ *,
+ free: pd.Series,
+ processed_model: ProcessedModel,
+) -> None:
+ """Pool `transition` and `shock_sds` seeds within each stage.
+
+ The `_get_stage_constraints` machinery imposes pairwise equality
+ constraints across aug_periods belonging to the same stage. Our
+ OLS-based seeds produce period-specific values; this post-processing
+ pools them into a single stage value so the constraints hold at
+ the start values. Pinned entries (set by `enforce_fixed_constraints`
+ before the moment-based fill) take precedence — if any member of
+ the equality group is pinned, the whole group uses that pinned
+ value; otherwise the group is averaged.
+ """
+ stagemap = processed_model.labels.aug_stagemap
+ stages: dict[int, list[int]] = {}
+ for aug_period, stage in enumerate(stagemap):
+ stages.setdefault(stage, []).append(aug_period)
+
+ for stage_periods in stages.values():
+ if len(stage_periods) <= 1:
+ continue
+ for category in ("transition", "shock_sds"):
+ try:
+ cat_slice = params.loc[category]
+ except KeyError:
+ continue
+ existing_periods = set(cat_slice.index.get_level_values(0))
+ shared = [p for p in stage_periods if p in existing_periods]
+ if len(shared) <= 1:
+ continue
+ sub_index = cat_slice.loc[shared[0]].index
+ for inner_loc in sub_index:
+ full_locs = [
+ (category, p, *inner_loc)
+ for p in shared
+ if (category, p, *inner_loc) in params.index
+ ]
+ if len(full_locs) <= 1:
+ continue
+ pinned_values = [
+ float(params.loc[loc, "value"])
+ for loc in full_locs
+ if not bool(free.loc[loc]) and pd.notna(params.loc[loc, "value"])
+ ]
+ if pinned_values:
+ target = pinned_values[0]
+ else:
+ raw_values = [
+ float(params.loc[loc, "value"])
+ for loc in full_locs
+ if pd.notna(params.loc[loc, "value"])
+ ]
+ if not raw_values:
+ continue
+ target = float(np.mean(raw_values))
+ for loc in full_locs:
+ if free.loc[loc]:
+ params.loc[loc, "value"] = target
+
+
+def _bartlett_score(
+ measurements: np.ndarray,
+ cols: list[int],
+ loadings: np.ndarray,
+ meas_sds: np.ndarray,
+) -> np.ndarray:
+ r"""Bartlett factor-score estimator from per-indicator measurements.
+
+ Returns the inverse-noise-weighted single-factor proxy
+ :math:`\hat F = \sum_k w_k Z_k / \sum_k w_k \lambda_k`
+ with :math:`w_k = \lambda_k / \sigma_k^2`, over rows where all
+ `cols` are finite. Rows with any NaN get NaN proxy.
+ """
+ sub = measurements[cols, :].T # (n_obs, n_meas)
+ weights = loadings / np.maximum(meas_sds**2, 1e-12)
+ denom = float(np.sum(weights * loadings))
+ if denom < 1e-9:
+ return np.full(sub.shape[0], np.nan)
+ score = (sub * weights).sum(axis=1) / denom
+ mask = np.all(np.isfinite(sub), axis=1)
+ score[~mask] = np.nan
+ return score
+
+
+def _override_transition_via_ols( # noqa: C901, PLR0912, PLR0915
+ params: pd.DataFrame,
+ free: pd.Series,
+ *,
+ processed_model: ProcessedModel,
+ measurements: np.ndarray,
+ spearman_per_period: dict[tuple[int, str], SpearmanResult],
+ observed_factors: np.ndarray,
+) -> None:
+ """Seed transition coefficients + shock_sds via OLS on Bartlett scores.
+
+ For each transition equation that maps state factors at one
+ aug-period to a factor at the next aug-period with measurements,
+ run OLS of the target Bartlett score on regressors derived from
+ the source aug-period's Bartlett scores + observed factors.
+ Coefficients are written into the matching `transition` rows;
+ the residual SD is written to the matching `shock_sds` row.
+
+ Currently implemented for `linear` and `translog` transition
+ functions. Other transition functions keep the constant-default
+ seeds set in `_apply_neutral_defaults`.
+ """
+ update_info = processed_model.update_info
+ update_info_periods = list(update_info.index.get_level_values("aug_period"))
+ aug_periods = processed_model.labels.aug_periods
+ latent_factors = processed_model.labels.latent_factors
+ observed_factor_names = processed_model.labels.observed_factors
+ transition_info = processed_model.transition_info
+
+ bartlett_proxies: dict[tuple[int, str], np.ndarray] = {}
+ for (aug_period, factor), result in spearman_per_period.items():
+ period_meas_index = _measurement_row_index(update_info, aug_period)
+ factor_meas = _single_factor_measurements(
+ update_info,
+ aug_period=aug_period,
+ factor=factor,
+ all_factors=latent_factors,
+ )
+ cols = [period_meas_index[m] for m in factor_meas]
+ proxy = _bartlett_score(
+ measurements,
+ cols,
+ result.loadings,
+ result.meas_sds,
+ )
+ bartlett_proxies[(aug_period, factor)] = proxy
+
+ n_obs = measurements.shape[1] if measurements.ndim == 2 else 0
+ n_calendar_periods = processed_model.dimensions.n_periods
+
+ for src_idx, src_aug in enumerate(aug_periods[:-1]):
+ tgt_aug = aug_periods[src_idx + 1]
+ if tgt_aug not in update_info_periods:
+ continue
+ cal_idx_src = _aug_to_calendar_idx(
+ processed_model,
+ src_aug,
+ n_calendar_periods,
+ )
+ if cal_idx_src is None:
+ continue
+ if observed_factors.ndim == 3:
+ obs_at_src = observed_factors[cal_idx_src]
+ else:
+ obs_at_src = np.zeros((n_obs, 0))
+
+ for factor in latent_factors:
+ func_name = transition_info.function_names.get(factor)
+ if func_name not in ("linear", "translog"):
+ continue
+ if (tgt_aug, factor) not in bartlett_proxies:
+ continue
+ target = bartlett_proxies[(tgt_aug, factor)]
+
+ source_factor_proxies: dict[str, np.ndarray] = {}
+ for src_factor in latent_factors:
+ if (src_aug, src_factor) in bartlett_proxies:
+ source_factor_proxies[src_factor] = bartlett_proxies[
+ (src_aug, src_factor)
+ ]
+ if factor not in source_factor_proxies:
+ # Need at least the dependent factor's source proxy
+ # for the regression to be meaningful.
+ continue
+
+ param_names = transition_info.param_names[factor]
+ design, regressor_to_col = _build_design_for_transition(
+ func_name=func_name,
+ param_names=param_names,
+ latent_factors=latent_factors,
+ source_factor_proxies=source_factor_proxies,
+ observed_factor_names=observed_factor_names,
+ observed_factor_data=obs_at_src,
+ )
+ if design is None:
+ continue
+ mask = np.isfinite(target) & np.all(np.isfinite(design), axis=1)
+ if mask.sum() <= design.shape[1] + 1:
+ continue
+ beta = seed_beta_from_ols(target[mask], design[mask])
+ if not np.all(np.isfinite(beta)):
+ continue
+ for regressor, col_idx in regressor_to_col.items():
+ loc = ("transition", src_aug, factor, regressor)
+ if loc in params.index and free.loc[loc]:
+ params.loc[loc, "value"] = float(beta[col_idx])
+
+ # Residual SD → shock_sds[src_aug][factor].
+ residual = target[mask] - design[mask] @ beta
+ tgt_result = spearman_per_period.get((tgt_aug, factor))
+ if tgt_result is None:
+ continue
+ # Bartlett-score residual variance includes
+ # shock_var + (Bartlett-score-noise) ≈ shock_var + 1/Σ w·λ.
+ score_noise_var = 1.0 / max(
+ np.sum(
+ tgt_result.loadings**2 / np.maximum(tgt_result.meas_sds**2, 1e-12),
+ ),
+ 1e-9,
+ )
+ raw_var = float(np.var(residual, ddof=1))
+ shock_var = max(raw_var - score_noise_var, 1e-6)
+ shock_sd = float(np.sqrt(shock_var))
+ loc_sd = ("shock_sds", src_aug, factor, "-")
+ if loc_sd in params.index and free.loc[loc_sd]:
+ params.loc[loc_sd, "value"] = shock_sd
+
+
+def _aug_to_calendar_idx(
+ processed_model: ProcessedModel,
+ aug_period: int,
+ n_calendar_periods: int,
+) -> int | None:
+ """Map an aug-period to the calendar period of `observed_factors`.
+
+ `processed_data["observed_factors"]` has shape
+ `(n_periods, n_obs, n_observed_factors)`; this returns the
+ calendar period index for the given aug-period, or `None` if it
+ falls outside the calendar range.
+ """
+ mapping = processed_model.labels.aug_periods_to_periods
+ cal = mapping.get(aug_period)
+ if cal is None:
+ return None
+ if 0 <= int(cal) < n_calendar_periods:
+ return int(cal)
+ return None
+
+
+def _build_design_for_transition( # noqa: C901
+ *,
+ func_name: str, # noqa: ARG001
+ param_names: tuple[str, ...],
+ latent_factors: tuple[str, ...], # noqa: ARG001
+ source_factor_proxies: dict[str, np.ndarray],
+ observed_factor_names: tuple[str, ...],
+ observed_factor_data: np.ndarray,
+) -> tuple[np.ndarray | None, dict[str, int]]:
+ """Build the OLS design matrix matching `param_names`.
+
+ Returns `(design, regressor_to_col)` where `regressor_to_col` maps
+ each handled regressor name to its column index in `design`.
+ Regressors that cannot be built from the available proxies are
+ omitted (the corresponding transition coefficient stays at the
+ constant-default seed).
+ """
+ n_obs = next(iter(source_factor_proxies.values())).shape[0]
+ columns: list[np.ndarray] = []
+ regressor_to_col: dict[str, int] = {}
+
+ def _proxy_for(name: str) -> np.ndarray | None:
+ if name in source_factor_proxies:
+ return source_factor_proxies[name]
+ if name in observed_factor_names:
+ idx = observed_factor_names.index(name)
+ if observed_factor_data.shape[1] > idx:
+ return observed_factor_data[:, idx]
+ return None
+
+ for regressor in param_names:
+ if regressor == "constant":
+ columns.append(np.ones(n_obs))
+ regressor_to_col[regressor] = len(columns) - 1
+ elif " ** 2" in regressor:
+ name = regressor.replace(" ** 2", "").strip()
+ proxy = _proxy_for(name)
+ if proxy is not None:
+ columns.append(proxy * proxy)
+ regressor_to_col[regressor] = len(columns) - 1
+ elif " * " in regressor:
+ a, b = (s.strip() for s in regressor.split(" * "))
+ pa, pb = _proxy_for(a), _proxy_for(b)
+ if pa is not None and pb is not None:
+ columns.append(pa * pb)
+ regressor_to_col[regressor] = len(columns) - 1
+ else:
+ proxy = _proxy_for(regressor)
+ if proxy is not None:
+ columns.append(proxy)
+ regressor_to_col[regressor] = len(columns) - 1
+
+ if not columns:
+ return None, {}
+ design = np.column_stack(columns)
+ return design, regressor_to_col
diff --git a/src/skillmodels/amn/types.py b/src/skillmodels/amn/types.py
new file mode 100644
index 00000000..6912faef
--- /dev/null
+++ b/src/skillmodels/amn/types.py
@@ -0,0 +1,341 @@
+"""Frozen dataclass definitions for the AMN estimator.
+
+Mirrors the structure of `skillmodels.af.types` for consistency. The
+three-stage Attanasio-Meghir-Nix (2020) procedure produces a stack of
+intermediate results (reduced-form mixture, structural recovery,
+production-function regression); each stage's output is held in
+`AMNStageResults`.
+"""
+
+from collections.abc import Mapping
+from dataclasses import dataclass
+from types import MappingProxyType
+from typing import Any, Literal
+
+import numpy as np
+import pandas as pd
+
+from skillmodels._beartype_conf import OPTIONS_CONF, beartype_init
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import ensure_containers_are_immutable
+
+
+@beartype_init(OPTIONS_CONF)
+@dataclass(frozen=True, init=False)
+class AMNEstimationOptions:
+ """Configuration options for the AMN estimator."""
+
+ em_max_iter: int
+ """Maximum EM iterations in Stage 1."""
+
+ em_tol: float
+ """Log-likelihood tolerance for EM convergence."""
+
+ em_n_init: int
+ """Number of EM restarts; keep the highest-likelihood fit."""
+
+ em_reg_covar: float
+ """Diagonal ridge added to each EM covariance for numerical stability."""
+
+ n_simulation_draws: int
+ """Synthetic latent-factor panel size for Stage 3."""
+
+ minimum_distance_weighting: Literal["identity", "optimal"]
+ """Stage 2 minimum-distance weighting. `"identity"` (the paper's default
+ and currently the only implemented option) is an unweighted identity metric
+ over per-component means and full covariance matrices. `"optimal"` is
+ reserved for a future 2-step Avar-weighted criterion and currently raises
+ `NotImplementedError`."""
+
+ allow_ces_overnormalization: bool
+ """Opt out of the CES minimal-normalization guard. When True, extra
+ normalized CES loadings are treated as a deliberate fixed-loadings
+ analysis rather than a (Freyberger-adaptation-defeating) error."""
+
+ optimizer_algorithm: str
+ """optimagic algorithm name for Stage 2 minimum-distance optimization."""
+
+ optimizer_options: MappingProxyType[str, Any]
+ """Additional kwargs forwarded to optimagic in Stage 2."""
+
+ keep_synthetic_panel: bool
+ """Retain the Stage-3 simulated panel on the result for diagnostics. Off
+ by default to keep result objects compact."""
+
+ seed: int
+ """RNG seed used for Stage 3 simulation and bootstrap inference."""
+
+ mixture_em_method: Literal["complete_case", "missing_data"]
+ """Stage-1 mixture EM method. `"complete_case"` (default) fits `sklearn`'s
+ `GaussianMixture` on listwise-complete rows and raises
+ `InsufficientCompleteCasesError` when fewer than `n_mixtures` rows are
+ complete in every augmented measurement -- the unbalanced-panel regime.
+ `"missing_data"` instead fits the EM that marginalises over each row's
+ missing entries, valid (under MAR) even with no complete cases at all. The
+ interface is identical for standalone estimation and for CHS seeding; only
+ the option values differ (seeding picks the method and a row cap explicitly,
+ rather than the estimator switching silently)."""
+
+ mixture_em_max_rows: int | None
+ """Optional cap on the number of rows used to fit the Stage-1 mixture. `None`
+ (default) uses every row. When set, rows are subsampled with `seed` before
+ fitting. CHS seeding sets a modest cap so the per-restart cost of the
+ missing-data EM stays bounded; standalone estimation keeps the full sample."""
+
+ allow_never_observed_measurements: bool
+ """Whether the missing-data EM may proceed when an augmented-measure column is
+ never observed in any (sub)sampled row. `False` (default) raises, since such a
+ column's moments are unidentified and would feed noise into Stage 2. CHS
+ seeding sets `True`: the row cap can drop every observation of a rare
+ measurement, and the seeded value is harmless because `estimate_chs` re-fits
+ every parameter from the data."""
+
+ def __init__( # noqa: D107
+ self,
+ em_max_iter: int = 500,
+ em_tol: float = 1e-6,
+ em_n_init: int = 5,
+ em_reg_covar: float = 1e-6,
+ n_simulation_draws: int = 100_000,
+ minimum_distance_weighting: Literal["identity", "optimal"] = "identity",
+ optimizer_algorithm: str = "scipy_lbfgsb",
+ optimizer_options: Mapping[str, Any] | None = None,
+ *,
+ allow_ces_overnormalization: bool = False,
+ keep_synthetic_panel: bool = False,
+ seed: int = 0,
+ mixture_em_method: Literal["complete_case", "missing_data"] = "complete_case",
+ mixture_em_max_rows: int | None = None,
+ allow_never_observed_measurements: bool = False,
+ ) -> None:
+ object.__setattr__(self, "em_max_iter", em_max_iter)
+ object.__setattr__(self, "em_tol", em_tol)
+ object.__setattr__(self, "em_n_init", em_n_init)
+ object.__setattr__(self, "em_reg_covar", em_reg_covar)
+ object.__setattr__(self, "n_simulation_draws", n_simulation_draws)
+ object.__setattr__(
+ self, "minimum_distance_weighting", minimum_distance_weighting
+ )
+ object.__setattr__(
+ self, "allow_ces_overnormalization", allow_ces_overnormalization
+ )
+ object.__setattr__(self, "optimizer_algorithm", optimizer_algorithm)
+ object.__setattr__(
+ self,
+ "optimizer_options",
+ ensure_containers_are_immutable(optimizer_options or {}),
+ )
+ object.__setattr__(self, "keep_synthetic_panel", keep_synthetic_panel)
+ object.__setattr__(self, "seed", seed)
+ object.__setattr__(self, "mixture_em_method", mixture_em_method)
+ object.__setattr__(self, "mixture_em_max_rows", mixture_em_max_rows)
+ object.__setattr__(
+ self,
+ "allow_never_observed_measurements",
+ allow_never_observed_measurements,
+ )
+
+
+@dataclass(frozen=True)
+class AugmentedMeasureLayout:
+ """Index bookkeeping for the augmented measure vector.
+
+ AMN Stage 1 fits a Gaussian mixture on the joint vector of:
+ 1. Factor measurements at each period (have measurement error),
+ 2. Observed factor values at each period (no measurement error,
+ loading fixed at 1, intercept free),
+ 3. Controls (time-invariant, no measurement error).
+
+ The layout records which slot in the stacked vector corresponds to
+ which conceptual quantity, so Stage 2 can map the fitted Pi/Psi back
+ onto the structural Lambda/A/Sigma/mu/Omega.
+ """
+
+ columns: tuple[str, ...]
+ """Human-readable label per augmented-vector column."""
+
+ measurement_slots: tuple[int, ...]
+ """Indices of slots that correspond to factor measurements (with
+ measurement error). One per (period, measurement) update."""
+
+ observed_factor_slots: tuple[int, ...]
+ """Indices of slots that correspond to observed factor values (no
+ measurement error). One per (period, observed factor)."""
+
+ control_slots: tuple[int, ...]
+ """Indices of slots that correspond to controls (no measurement
+ error)."""
+
+ measurement_meta: tuple[tuple[int, str, str], ...]
+ """For each measurement slot: (period, factor_name, measurement_name)."""
+
+ observed_factor_meta: tuple[tuple[int, str], ...]
+ """For each observed-factor slot: (period, observed_factor_name)."""
+
+ control_meta: tuple[str, ...]
+ """Control name for each control slot."""
+
+
+@dataclass(frozen=True)
+class MixtureFitResult:
+ """Output of Stage 1: reduced-form mixture parameters.
+
+ The fitted distribution is
+ ``sum_k weights[k] * Normal(means[k], covariances[k])`` on the
+ augmented measure vector. Matches AMN eq. (11)-(14).
+ """
+
+ weights: np.ndarray
+ """Mixture weights, shape ``(n_components,)``."""
+
+ means: np.ndarray
+ """Per-component mean vectors, shape ``(n_components, n_aug)``."""
+
+ covariances: np.ndarray
+ """Per-component covariance matrices, shape
+ ``(n_components, n_aug, n_aug)``."""
+
+ loglikelihood: float
+ """Final EM log-likelihood (summed across observations)."""
+
+ n_iter: int
+ """EM iterations run by the best restart."""
+
+ converged: bool
+ """Whether the best restart converged within `em_tol`."""
+
+ layout: AugmentedMeasureLayout
+ """Slot bookkeeping for the augmented measure vector this mixture was
+ fit on."""
+
+
+@dataclass(frozen=True)
+class MinimumDistanceResult:
+ """Output of Stage 2: structural parameters from the reduced-form mixture.
+
+ All arrays are in the standard skillmodels ordering established by
+ `process_model.process_model`.
+ """
+
+ loadings: pd.DataFrame
+ """Recovered factor loadings, MultiIndexed by (period, measurement,
+ factor)."""
+
+ measurement_intercepts: pd.DataFrame
+ """Recovered measurement intercepts, MultiIndexed by (period,
+ measurement, control)."""
+
+ measurement_sds: pd.DataFrame
+ """Recovered measurement-error SDs, MultiIndexed by (period,
+ measurement)."""
+
+ factor_mixture_means: np.ndarray
+ """Per-component means of the latent factors stacked across periods,
+ shape ``(n_components, n_factor_period_slots)``."""
+
+ factor_mixture_covariances: np.ndarray
+ """Per-component covariances of the same stacked factor vector, shape
+ ``(n_components, n_factor_period_slots, n_factor_period_slots)``."""
+
+ factor_period_slots: tuple[tuple[int, str], ...]
+ """Ordered ``(period, factor_name)`` for the
+ ``factor_mixture_*`` arrays."""
+
+ objective_value: float
+ """Minimum-distance criterion at the optimum."""
+
+ success: bool
+ """Whether the Stage-2 optimization converged."""
+
+
+@dataclass(frozen=True)
+class ProductionFitResult:
+ """Output of Stage 3: production-function and investment-equation params.
+
+ Fitted by regression on a simulated latent-factor panel; see AMN 2020
+ eqs. 4-5, 7-8.
+ """
+
+ production_params: pd.DataFrame
+ """Production-function parameters, in the standard skillmodels
+ params-DataFrame format (4-level MultiIndex)."""
+
+ investment_params: pd.DataFrame
+ """Investment-equation parameters (eq. 7), 4-level MultiIndex. Populated
+ under the control-function correction (a `CorrectionSpec` on the endogenous
+ investment factor) with the first-stage `investment_eq` coefficients and
+ `investment_sds` residual SD per investment factor and period; empty
+ otherwise. When the correction runs, each state factor's production shock
+ SD (`shock_sds`) is the corrected SD(eps_C) and the production block gains
+ a `cf` row carrying kappa_t."""
+
+ n_draws: int
+ """Number of simulated latent-factor trajectories used."""
+
+ seed: int
+ """RNG seed used for the simulation."""
+
+
+@dataclass(frozen=True)
+class AMNStageResults:
+ """Container for the three stages' intermediate outputs."""
+
+ mixture: MixtureFitResult
+ """Stage 1 reduced-form mixture fit."""
+
+ structural: MinimumDistanceResult
+ """Stage 2 structural recovery."""
+
+ production: ProductionFitResult
+ """Stage 3 production-function regression."""
+
+
+@dataclass(frozen=True)
+class AMNEstimationResult:
+ """Complete result from AMN estimation."""
+
+ model_spec: ModelSpec
+ """The ModelSpec used for estimation."""
+
+ stages: AMNStageResults
+ """Per-stage intermediate outputs."""
+
+ params: pd.DataFrame
+ """Combined parameters across stages, in the standard 4-level
+ MultiIndex (category, period, name1, name2) format consumed by every
+ other skillmodels entry point."""
+
+ success: bool
+ """AND across stage convergence flags."""
+
+ md_criterion: float
+ """Stage-2 minimum-distance criterion at the optimum (AMN's objective).
+ Conforms to `skillmodels.common.estimation.CommonEstimationResult`."""
+
+ loglikelihood: float | None = None
+ """Always `None` for AMN (minimum-distance, not likelihood); present to
+ satisfy the common result Protocol."""
+
+ synthetic_panel: pd.DataFrame | None = None
+ """Stage-3 simulated factor panel, kept iff
+ `AMNEstimationOptions.keep_synthetic_panel` is True."""
+
+
+@dataclass(frozen=True)
+class AMNInferenceResult:
+ """Cluster-bootstrap standard errors and covariance for AMN params."""
+
+ standard_errors: pd.Series
+ """std across replicate_params, indexed by the params MultiIndex."""
+
+ vcov: pd.DataFrame
+ """cov(replicate_params), MultiIndexed on both axes."""
+
+ replicate_params: pd.DataFrame
+ """One row per bootstrap replicate, columns = params MultiIndex."""
+
+ n_clusters: int
+ """Caseids resampled per replicate."""
+
+ n_boot: int
+ """Number of bootstrap replicates."""
diff --git a/src/skillmodels/chs/__init__.py b/src/skillmodels/chs/__init__.py
new file mode 100644
index 00000000..11da3581
--- /dev/null
+++ b/src/skillmodels/chs/__init__.py
@@ -0,0 +1,37 @@
+"""CHS (Cunha-Heckman-Schennach 2010) Kalman-filter MLE estimator.
+
+This subpackage holds the state-space machinery that powers the
+default skillmodels estimator:
+
+* `kalman_filters` — square-root unscented and extended Kalman filter
+ predict/update steps.
+* `likelihood` (`+ `_debug`) — Kalman-filter log-likelihood.
+* `estimate_chs` — one-call driver wrapping `get_maximization_inputs`
+ and `optimagic.maximize`, returning a `CHSEstimationResult`.
+* `maximization_inputs` — `get_maximization_inputs()`, the canonical
+ power-user entry point that bundles likelihood / gradients /
+ constraints / params template for `optimagic.maximize`.
+* `process_debug_data` — Kalman-debug-output post-processing.
+* `qr`, `clipping` — numerical helpers (square-root QR, soft clipping
+ for UKF stability).
+
+The public top-level package re-exports the user-facing entry points
+(`estimate_chs`, `get_maximization_inputs`) so most callers don't need
+to touch the `chs.` prefix. Cross-estimator state extraction
+(`get_individual_states`) and the estimator-agnostic
+`create_state_ranges` live under `skillmodels.common`.
+"""
+
+from skillmodels.chs.estimate import estimate_chs
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.chs.process_debug_data import process_debug_data
+from skillmodels.chs.types import CHSEstimationResult
+
+__all__ = [
+ "CHSEstimationOptions",
+ "CHSEstimationResult",
+ "estimate_chs",
+ "get_maximization_inputs",
+ "process_debug_data",
+]
diff --git a/src/skillmodels/clipping.py b/src/skillmodels/chs/clipping.py
similarity index 100%
rename from src/skillmodels/clipping.py
rename to src/skillmodels/chs/clipping.py
diff --git a/src/skillmodels/chs/estimate.py b/src/skillmodels/chs/estimate.py
new file mode 100644
index 00000000..3fc5aea5
--- /dev/null
+++ b/src/skillmodels/chs/estimate.py
@@ -0,0 +1,133 @@
+"""One-call driver for the CHS Kalman-MLE estimator.
+
+`estimate_chs` is a thin wrapper over `get_maximization_inputs` +
+`estimagic.estimate_ml`, giving CHS the same `estimate_*(model_spec, data,
+options, ...) -> ...EstimationResult` surface as `estimate_af` and
+`estimate_amn`. Running through `estimate_ml` (rather than a bare
+`optimagic.maximize`) means the returned result carries full ML inference —
+standard errors, covariances, summaries — so callers that need inference can
+adopt `estimate_chs` instead of hand-rolling `estimate_ml` on top of the
+inputs. `get_maximization_inputs` stays public as the power-user escape
+hatch for callers who want to drive the optimiser themselves.
+"""
+
+import optimagic as om
+import pandas as pd
+from beartype import beartype
+from estimagic import estimate_ml
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.chs.types import CHSEstimationResult
+from skillmodels.common.constraints import (
+ enforce_fixed_constraints,
+ reconcile_start_to_equality,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import to_plain_dict
+
+
+@beartype(conf=ESTIMATION_CONF)
+def estimate_chs(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ options: CHSEstimationOptions | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+) -> CHSEstimationResult:
+ """Estimate a latent factor model by Cunha-Heckman-Schennach Kalman MLE.
+
+ Args:
+ model_spec: Model specification (same object the other estimators
+ consume).
+ data: Dataset in long format with MultiIndex (id, period).
+ options: CHS-specific tuning parameters, including the
+ `optimizer_algorithm` / `optimizer_options` driving the
+ `optimagic.maximize` call and the `start_params_strategy`
+ seeding the `params_template`. Defaults to
+ `CHSEstimationOptions()`.
+ start_params: Optional starting values. Entries whose index matches
+ the `params_template` overwrite the seeded `value` column;
+ unmatched template entries keep their seeded values. Uses the
+ standard 4-level MultiIndex (category, period, name1, name2).
+ fixed_params: Optional DataFrame with a `"value"` column pinning
+ parameters; forwarded to `get_maximization_inputs`, which turns
+ each into a `FixedConstraintWithValue` so `optimagic` holds it
+ fixed.
+ constraints: Optional extra `optimagic` constraints, appended to the
+ model-implied constraints from `get_maximization_inputs`.
+
+ Return:
+ `CHSEstimationResult` with the estimated `params`, the `success`
+ flag, the maximised `loglikelihood`, the raw optimagic
+ `optimize_result`, and the estimagic `likelihood_result` carrying ML
+ inference (`.se()` / `.cov()` / `.summary()`).
+
+ """
+ options = options or CHSEstimationOptions()
+
+ max_inputs = get_maximization_inputs(
+ model_spec=model_spec,
+ data=data,
+ chs_options=options,
+ fixed_params=fixed_params,
+ )
+
+ start = max_inputs["params_template"].copy()
+ if start_params is not None:
+ overlay = start_params["value"].reindex(start.index)
+ start.loc[overlay.notna(), "value"] = overlay[overlay.notna()]
+
+ all_constraints = [*max_inputs["constraints"], *(constraints or [])]
+
+ # Write every `FixedConstraintWithValue`'s target into the start vector.
+ # optimagic's plain "fixed" constraint pins a parameter at its *start* value,
+ # so a user constraint's `.value` only takes effect once enforced here. User
+ # `constraints=` are merged only now; `get_maximization_inputs` enforced just
+ # the internal (model-implied / `fixed_params`) constraints, so without this
+ # a user-supplied fixed parameter would be silently held at its seed instead
+ # of the requested value.
+ start = enforce_fixed_constraints(start, all_constraints)
+
+ # `estimate_ml` (via `om.minimize`) raises `InvalidParamsError` if the start
+ # point violates any equality constraint. Seeding strategies (AMN/Spearman)
+ # and user start_params fill each member independently, so pool each equality
+ # group's seeded value onto the constraint surface -- honouring any fixed
+ # member's enforced value so the line above is not averaged away.
+ start = reconcile_start_to_equality(start, all_constraints)
+
+ optimize_options = {
+ "algorithm": options.optimizer_algorithm,
+ "algo_options": to_plain_dict(options.optimizer_options) or None,
+ "fun_and_jac": max_inputs["loglike_and_gradient"],
+ }
+
+ # Default to OPG/jacobian-based inference (`hessian=False`): the numerical
+ # Hessian costs O(n_params**2) Kalman passes and is prohibitive on real
+ # models. Overridable via `options.estimate_ml_options`.
+ estimate_ml_kwargs = {
+ "hessian": False,
+ **to_plain_dict(options.estimate_ml_options),
+ }
+
+ res = estimate_ml(
+ loglike=max_inputs["loglikeobs"],
+ params=start[["value"]],
+ optimize_options=optimize_options,
+ bounds=om.Bounds(lower=start["lower_bound"], upper=start["upper_bound"]),
+ constraints=all_constraints,
+ **estimate_ml_kwargs,
+ )
+
+ loglikelihood = float(max_inputs["loglike"](res.params))
+
+ return CHSEstimationResult(
+ model_spec=model_spec,
+ params=res.params,
+ success=bool(res.optimize_result.success),
+ loglikelihood=loglikelihood,
+ optimize_result=res.optimize_result,
+ likelihood_result=res,
+ )
diff --git a/src/skillmodels/kalman_filters.py b/src/skillmodels/chs/kalman_filters.py
similarity index 93%
rename from src/skillmodels/kalman_filters.py
rename to src/skillmodels/chs/kalman_filters.py
index 7f9549f7..72360cd9 100644
--- a/src/skillmodels/kalman_filters.py
+++ b/src/skillmodels/chs/kalman_filters.py
@@ -6,7 +6,8 @@
import jax.numpy as jnp
from jax import Array
-from skillmodels.qr import qr_gpu
+from skillmodels.chs.qr import qr_gpu
+from skillmodels.common.transitions import apply_anchored_transition
LINEAR_FUNCTION_NAMES = frozenset({"linear", "constant"})
@@ -28,7 +29,7 @@ def kalman_update(
upper_chols: Array,
loadings: Array,
control_params: Array,
- meas_sd: Array,
+ meas_sd: float | Array,
measurements: Array,
controls: Array,
log_mixture_weights: Array,
@@ -167,7 +168,7 @@ def kalman_predict(
transition_func: Callable,
states: Array,
upper_chols: Array,
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
trans_coeffs: dict[str, Array],
shock_sds: Array,
@@ -240,7 +241,7 @@ def linear_kalman_predict(
transition_func: Callable | None, # noqa: ARG001
states: Array,
upper_chols: Array,
- sigma_scaling_factor: float, # noqa: ARG001
+ sigma_scaling_factor: float | Array, # noqa: ARG001
sigma_weights: Array, # noqa: ARG001
trans_coeffs: dict[str, Array],
shock_sds: Array,
@@ -374,7 +375,7 @@ def _build_f_and_c(
def _calculate_sigma_points(
states: Array,
upper_chols: Array,
- scaling_factor: float,
+ scaling_factor: float | Array,
observed_factors: Array,
) -> Array:
"""Calculate the array of sigma_points for the unscented transform.
@@ -427,6 +428,14 @@ def transform_sigma_points(
) -> Array:
"""Anchor sigma points, transform them and unanchor the transformed sigma points.
+ Thin sigma-points-shape wrapper around
+ `skillmodels.common.transitions.apply_anchored_transition`: flattens
+ `(n_obs, n_mixtures, n_sigma, n_fac)` to `(N, n_fac)` for the
+ common-core anchor → transition → unanchor pipeline, then restores
+ the sigma-points layout for the UKF caller. Code paths that don't
+ care about sigma-points layout (e.g. `simulate_dataset`) should
+ call `apply_anchored_transition` directly.
+
Args:
sigma_points: Array of shape n_obs, n_mixtures, n_sigma, n_fac.
transition_func: The transition function.
@@ -438,24 +447,19 @@ def transform_sigma_points(
constants for anchoring. The first row corresponds to the input
period, the second to the output period (i.e. input period + 1).
- Returns:
+ Return:
jax.numpy.array: Array of shape n_obs, n_mixtures, n_sigma, n_fac (where n_sigma
equals 2 * n_fac + 1) with transformed sigma points.
"""
n_obs, n_mixtures, n_sigma, n_fac = sigma_points.shape
- flat_sigma_points = sigma_points.reshape(-1, n_fac)
-
- anchored = flat_sigma_points * anchoring_scaling_factors[0] + anchoring_constants[0]
-
- transformed_anchored = transition_func(trans_coeffs, anchored)
-
- n_observed = transformed_anchored.shape[-1]
-
- transformed_unanchored = (
- transformed_anchored - anchoring_constants[1][:n_observed]
- ) / anchoring_scaling_factors[1][:n_observed]
+ transformed_unanchored = apply_anchored_transition(
+ states=sigma_points.reshape(-1, n_fac),
+ transition_func=transition_func,
+ trans_coeffs=trans_coeffs,
+ anchoring_scaling_factors=anchoring_scaling_factors,
+ anchoring_constants=anchoring_constants,
+ )
- out_shape = (n_obs, n_mixtures, n_sigma, -1)
- return transformed_unanchored.reshape(out_shape)
+ return transformed_unanchored.reshape((n_obs, n_mixtures, n_sigma, -1))
diff --git a/src/skillmodels/kalman_filters_debug.py b/src/skillmodels/chs/kalman_filters_debug.py
similarity index 99%
rename from src/skillmodels/kalman_filters_debug.py
rename to src/skillmodels/chs/kalman_filters_debug.py
index 230b768d..c7dd20a8 100644
--- a/src/skillmodels/kalman_filters_debug.py
+++ b/src/skillmodels/chs/kalman_filters_debug.py
@@ -14,7 +14,7 @@ def kalman_update(
upper_chols: Array,
loadings: Array,
control_params: Array,
- meas_sd: float,
+ meas_sd: float | Array,
measurements: Array,
controls: Array,
log_mixture_weights: Array,
diff --git a/src/skillmodels/likelihood_function.py b/src/skillmodels/chs/likelihood.py
similarity index 87%
rename from src/skillmodels/likelihood_function.py
rename to src/skillmodels/chs/likelihood.py
index ee89f016..2f9a5225 100644
--- a/src/skillmodels/likelihood_function.py
+++ b/src/skillmodels/chs/likelihood.py
@@ -6,14 +6,15 @@
import jax
import jax.numpy as jnp
+import numpy as np
from jax import Array
-from skillmodels.clipping import soft_clipping
-from skillmodels.kalman_filters import kalman_update
-from skillmodels.parse_params import parse_params
-from skillmodels.types import (
+from skillmodels.chs.clipping import soft_clipping
+from skillmodels.chs.kalman_filters import kalman_update
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.parse_params import parse_params
+from skillmodels.common.types import (
Dimensions,
- EstimationOptions,
Labels,
ParsedParams,
ParsingInfo,
@@ -23,18 +24,18 @@
def log_likelihood(
params: Array,
parsing_info: ParsingInfo,
- measurements: Array,
+ measurements: Array | np.ndarray,
controls: Array,
predict_func: Callable,
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
dimensions: Dimensions,
labels: Labels,
- estimation_options: EstimationOptions,
- is_measurement_iteration: Array,
- is_predict_iteration: Array,
- iteration_to_period: Array,
- observed_factors: Array,
+ chs_estimation_options: CHSEstimationOptions,
+ is_measurement_iteration: Array | np.ndarray,
+ is_predict_iteration: Array | np.ndarray,
+ iteration_to_period: Array | np.ndarray,
+ observed_factors: Array | np.ndarray,
) -> Array:
"""Aggregated log likelihood of a skill formation model.
@@ -57,7 +58,7 @@ def log_likelihood(
n_mixtures.
labels: Labels for the model quantities like factors, periods, controls,
stagemap and stages.
- estimation_options: Options for estimation including clipping bounds.
+ chs_estimation_options: Options for estimation including clipping bounds.
is_measurement_iteration: Boolean array indicating which iterations are
measurement updates.
is_predict_iteration: Boolean array indicating which iterations are predict
@@ -80,7 +81,7 @@ def log_likelihood(
sigma_weights=sigma_weights,
dimensions=dimensions,
labels=labels,
- estimation_options=estimation_options,
+ chs_estimation_options=chs_estimation_options,
is_measurement_iteration=is_measurement_iteration,
is_predict_iteration=is_predict_iteration,
iteration_to_period=iteration_to_period,
@@ -91,18 +92,18 @@ def log_likelihood(
def log_likelihood_obs(
params: Array,
parsing_info: ParsingInfo,
- measurements: Array,
+ measurements: Array | np.ndarray,
controls: Array,
predict_func: Callable,
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
dimensions: Dimensions,
labels: Labels,
- estimation_options: EstimationOptions,
- is_measurement_iteration: Array,
- is_predict_iteration: Array,
- iteration_to_period: Array,
- observed_factors: Array,
+ chs_estimation_options: CHSEstimationOptions,
+ is_measurement_iteration: Array | np.ndarray,
+ is_predict_iteration: Array | np.ndarray,
+ iteration_to_period: Array | np.ndarray,
+ observed_factors: Array | np.ndarray,
) -> Array:
"""Log likelihood of a skill formation model.
@@ -134,7 +135,7 @@ def log_likelihood_obs(
n_mixtures. See :ref:`dimensions`.
labels: Dict of lists with labels for the model quantities like
factors, periods, controls, stagemap and stages. See :ref:`labels`
- estimation_options: Options for estimation including clipping bounds.
+ chs_estimation_options: Options for estimation including clipping bounds.
is_measurement_iteration: Boolean array indicating which
iterations are measurement updates.
is_predict_iteration: Boolean array indicating which
@@ -188,10 +189,10 @@ def log_likelihood_obs(
# possible.
return soft_clipping(
arr=static_out["loglikes"],
- lower=estimation_options.clipping_lower_bound,
- upper=estimation_options.clipping_upper_bound,
- lower_hardness=estimation_options.clipping_lower_hardness,
- upper_hardness=estimation_options.clipping_upper_hardness,
+ lower=chs_estimation_options.clipping_lower_bound,
+ upper=chs_estimation_options.clipping_upper_bound,
+ lower_hardness=chs_estimation_options.clipping_lower_hardness,
+ upper_hardness=chs_estimation_options.clipping_upper_hardness,
).sum(axis=0)
@@ -200,10 +201,10 @@ def _scan_body(
loop_args: dict[str, Array],
controls: Array,
parsed_params: ParsedParams,
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
predict_func: Callable,
- observed_factors: Array,
+ observed_factors: Array | np.ndarray,
) -> tuple[dict[str, Array], dict[str, Array]]:
# ==================================================================================
# create arguments needed for update
diff --git a/src/skillmodels/likelihood_function_debug.py b/src/skillmodels/chs/likelihood_debug.py
similarity index 89%
rename from src/skillmodels/likelihood_function_debug.py
rename to src/skillmodels/chs/likelihood_debug.py
index 6391695a..ff22194c 100644
--- a/src/skillmodels/likelihood_function_debug.py
+++ b/src/skillmodels/chs/likelihood_debug.py
@@ -6,14 +6,15 @@
import jax
import jax.numpy as jnp
+import numpy as np
from jax import Array
-from skillmodels.clipping import soft_clipping
-from skillmodels.kalman_filters_debug import kalman_update
-from skillmodels.parse_params import parse_params
-from skillmodels.types import (
+from skillmodels.chs.clipping import soft_clipping
+from skillmodels.chs.kalman_filters_debug import kalman_update
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.parse_params import parse_params
+from skillmodels.common.types import (
Dimensions,
- EstimationOptions,
Labels,
ParsedParams,
ParsingInfo,
@@ -23,18 +24,18 @@
def log_likelihood(
params: Array,
parsing_info: ParsingInfo,
- measurements: Array,
+ measurements: Array | np.ndarray,
controls: Array,
predict_func: Callable[..., tuple[Array, Array]],
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
dimensions: Dimensions,
labels: Labels,
- estimation_options: EstimationOptions,
- is_measurement_iteration: Array,
- is_predict_iteration: Array,
- iteration_to_period: Array,
- observed_factors: Array,
+ chs_estimation_options: CHSEstimationOptions,
+ is_measurement_iteration: Array | np.ndarray,
+ is_predict_iteration: Array | np.ndarray,
+ iteration_to_period: Array | np.ndarray,
+ observed_factors: Array | np.ndarray,
) -> dict[str, Any]:
"""Log likelihood of a skill formation model, returning debug data on top.
@@ -56,7 +57,7 @@ def log_likelihood(
n_mixtures.
labels: Labels for the model quantities like factors, periods, controls,
stagemap and stages.
- estimation_options: Options for estimation including clipping bounds.
+ chs_estimation_options: Options for estimation including clipping bounds.
is_measurement_iteration: Boolean array indicating which iterations are
measurement updates.
is_predict_iteration: Boolean array indicating which iterations are predict
@@ -111,10 +112,10 @@ def log_likelihood(
# possible.
clipped = soft_clipping(
arr=static_out["loglikes"],
- lower=estimation_options.clipping_lower_bound,
- upper=estimation_options.clipping_upper_bound,
- lower_hardness=estimation_options.clipping_lower_hardness,
- upper_hardness=estimation_options.clipping_upper_hardness,
+ lower=chs_estimation_options.clipping_lower_bound,
+ upper=chs_estimation_options.clipping_upper_bound,
+ lower_hardness=chs_estimation_options.clipping_lower_hardness,
+ upper_hardness=chs_estimation_options.clipping_upper_hardness,
)
value = clipped.sum()
@@ -151,10 +152,10 @@ def _scan_body(
loop_args: dict[str, Array],
controls: Array,
parsed_params: ParsedParams,
- sigma_scaling_factor: float,
+ sigma_scaling_factor: float | Array,
sigma_weights: Array,
predict_func: Callable[..., tuple[Array, Array]],
- observed_factors: Array,
+ observed_factors: Array | np.ndarray,
) -> tuple[dict[str, Array], dict[str, Any]]:
# ==================================================================================
# create arguments needed for update
diff --git a/src/skillmodels/maximization_inputs.py b/src/skillmodels/chs/maximization_inputs.py
similarity index 53%
rename from src/skillmodels/maximization_inputs.py
rename to src/skillmodels/chs/maximization_inputs.py
index a01c55cd..566bb052 100644
--- a/src/skillmodels/maximization_inputs.py
+++ b/src/skillmodels/chs/maximization_inputs.py
@@ -1,44 +1,63 @@
"""Functions to create inputs for optimization of the log-likelihood."""
import functools
+import warnings
from collections.abc import Callable
+from types import MappingProxyType
from typing import Any
import jax
import jax.numpy as jnp
import numpy as np
import pandas as pd
+from beartype import beartype
from jax import Array
from numpy.typing import NDArray
-import skillmodels.likelihood_function as lf
-import skillmodels.likelihood_function_debug as lfd
-from skillmodels.constraints import (
- add_bounds,
- enforce_fixed_constraints,
- get_constraints,
+import skillmodels.chs.likelihood as lf
+import skillmodels.chs.likelihood_debug as lfd
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.amn.estimate import estimate_amn
+from skillmodels.amn.mixture_em import InsufficientCompleteCasesError
+from skillmodels.amn.start_values import (
+ get_amn_start_params,
+ get_spearman_start_params,
)
-from skillmodels.kalman_filters import (
+from skillmodels.amn.types import AMNEstimationOptions, AMNEstimationResult
+from skillmodels.chs.kalman_filters import (
calculate_sigma_scaling_factor_and_weights,
is_all_linear,
kalman_predict,
linear_kalman_predict,
)
-from skillmodels.model_spec import ModelSpec
-from skillmodels.params_index import get_params_index
-from skillmodels.parse_params import create_parsing_info
-from skillmodels.process_data import process_data
-from skillmodels.process_debug_data import process_debug_data
-from skillmodels.process_model import process_model
-from skillmodels.types import ParsingInfo, ProcessedModel
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.chs.process_debug_data import process_debug_data
+from skillmodels.common.constraints import (
+ FixedConstraintWithValue,
+ add_bounds,
+ align_index_names,
+ enforce_fixed_constraints,
+ get_constraints,
+ project_to_probability_constraints,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info
+from skillmodels.common.process_data import process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import ParsingInfo, ProcessedModel
jax.config.update("jax_enable_x64", True) # noqa: FBT003
-def get_maximization_inputs(
+@beartype(conf=ESTIMATION_CONF)
+def get_maximization_inputs( # noqa: C901, PLR0915
model_spec: ModelSpec,
data: pd.DataFrame,
split_dataset: int = 1,
+ *,
+ chs_options: CHSEstimationOptions | None = None,
+ fixed_params: pd.DataFrame | None = None,
) -> dict[str, Any]:
"""Create inputs for optimagic's maximize function.
@@ -47,6 +66,18 @@ def get_maximization_inputs(
data: Dataset in long format.
split_dataset: Controls into how many slices to split the dataset
during the gradient computation.
+ chs_options: CHS-specific tuning parameters. Defaults to
+ ``CHSEstimationOptions()`` when not provided.
+ fixed_params: Optional DataFrame with a ``"value"`` column pinning
+ specified parameters to fixed values. Uses the same 4-level
+ MultiIndex as the returned ``params_template``. Each matching
+ entry becomes a `FixedConstraintWithValue` in the returned
+ constraints list, so optimagic holds the parameter at the given
+ value during optimization. When a fix overlaps a
+ `ProbabilityConstraint` selector (e.g., a gamma of a ``log_ces``
+ transition), optimagic's fold machinery keeps the remaining free
+ entries on the implied simplex (see
+ ``optimagic.ProbabilityConstraint``).
Returns a dictionary with keys:
loglike: A jax jitted function that takes an optimagic-style
@@ -62,7 +93,7 @@ def get_maximization_inputs(
loglike_and_gradient: Combination of loglike and
loglike_gradient that is faster than calling the two functions separately.
constraints: List of optimagic constraints that are implied by the
- model specification.
+ model specification, extended by any user-supplied ``fixed_params``.
params_template: Parameter DataFrame with correct index and
bounds. The value column is empty except for the fixed constraints, which
are set including the bounds.
@@ -70,6 +101,7 @@ def get_maximization_inputs(
endogenous factors, we double up the number of periods in order to add
"""
+ chs_options = chs_options or CHSEstimationOptions()
processed_model = process_model(model_spec)
p_index = get_params_index(
update_info=processed_model.update_info,
@@ -97,7 +129,7 @@ def get_maximization_inputs(
sigma_scaling_factor, sigma_weights = calculate_sigma_scaling_factor_and_weights(
n_states=processed_model.dimensions.n_latent_factors,
- kappa=processed_model.estimation_options.sigma_points_scale,
+ kappa=chs_options.sigma_points_scale,
)
partialed_get_jnp_params_vec = functools.partial(
@@ -120,6 +152,7 @@ def get_maximization_inputs(
model=processed_model,
sigma_weights=sigma_weights,
sigma_scaling_factor=sigma_scaling_factor,
+ chs_options=chs_options,
)
_jitted_loglike = jax.jit(partialed_loglikes["ll"])
@@ -176,12 +209,19 @@ def debug_loglike(params: pd.DataFrame) -> dict[str, Any]:
update_info=processed_model.update_info,
normalizations=processed_model.normalizations,
endogenous_factors_info=processed_model.endogenous_factors_info,
+ bounds_distance=chs_options.bounds_distance,
)
+ if fixed_params is not None:
+ fixed_constraints = _build_fixed_constraints_from_params(
+ fixed_params, params_index=p_index
+ )
+ constraints = list(constraints) + fixed_constraints
+
params_template = pd.DataFrame(columns=["value"], index=p_index)
params_template = add_bounds(
params=params_template,
- bounds_distance=processed_model.estimation_options.bounds_distance,
+ bounds_distance=chs_options.bounds_distance,
)
params_template = enforce_fixed_constraints(
params_template=params_template,
@@ -189,6 +229,29 @@ def debug_loglike(params: pd.DataFrame) -> dict[str, Any]:
)
if not params_template.index.equals(p_index):
raise ValueError("params_template index is not equal to p_index")
+
+ strategy = chs_options.start_params_strategy
+ if strategy == "spearman":
+ params_template = get_spearman_start_params(
+ model_spec=model_spec,
+ data=data,
+ params_template=params_template,
+ )
+ elif strategy == "amn":
+ amn_result = _estimate_amn_for_chs_seeding(model_spec=model_spec, data=data)
+ params_template = get_amn_start_params(
+ model_spec=model_spec,
+ data=data,
+ params_template=params_template,
+ amn_params=amn_result.params,
+ )
+
+ params_template = project_to_probability_constraints(
+ params_template=params_template, constraints=constraints
+ )
+ if strategy in ("spearman", "amn"):
+ _fail_if_start_params_incomplete(params_template)
+
return {
"loglike": loglike,
"loglikeobs": loglikeobs,
@@ -199,6 +262,116 @@ def debug_loglike(params: pd.DataFrame) -> dict[str, Any]:
}
+def _estimate_amn_for_chs_seeding(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+) -> AMNEstimationResult:
+ """Estimate AMN to seed CHS, falling back to the missing-data EM if needed.
+
+ Tries the fast complete-case Stage-1 mixture (the standalone default). On an
+ unbalanced panel with too few complete cases it retries explicitly with the
+ missing-data EM under a seed-sized budget (one restart, capped iterations,
+ capped rows). The fallback lives here, in the seeding caller, rather than
+ inside `estimate_amn`, so the standalone estimator keeps one honest interface
+ -- complete-case by default, raising when that is infeasible.
+
+ `linearize_control_function=True` fits only the linear `cf` term even for
+ higher-order (translog) kappa bases; the higher-order kappa terms then take
+ their small start defaults.
+ """
+ # Cap the Stage-2 minimum-distance iterations: with the exact JAX gradient
+ # each step is cheap, but a seed does not need full convergence, and the
+ # cap bounds the cost on a large factor-period block.
+ seed_md_options = MappingProxyType({"stopping_maxiter": 500})
+ try:
+ return estimate_amn(
+ model_spec=model_spec,
+ data=data,
+ options=AMNEstimationOptions(
+ mixture_em_method="complete_case",
+ optimizer_options=seed_md_options,
+ ),
+ linearize_control_function=True,
+ for_start_values=True,
+ )
+ except InsufficientCompleteCasesError:
+ warnings.warn(
+ "AMN start-value seeding: too few complete cases for the complete-case "
+ "Stage-1 mixture (unbalanced panel). Falling back to the missing-data "
+ "EM under a seed-sized budget (1 restart, <=100 iterations, <=3000 "
+ "rows).",
+ RuntimeWarning,
+ stacklevel=2,
+ )
+ return estimate_amn(
+ model_spec=model_spec,
+ data=data,
+ options=AMNEstimationOptions(
+ mixture_em_method="missing_data",
+ em_n_init=1,
+ em_max_iter=100,
+ mixture_em_max_rows=3000,
+ optimizer_options=seed_md_options,
+ # This fit only seeds estimate_chs, which re-fits every parameter
+ # from the data; the row cap can drop every observation of a rare
+ # measurement, so tolerate never-observed columns with a neutral
+ # seed rather than crashing the seeding step.
+ allow_never_observed_measurements=True,
+ ),
+ linearize_control_function=True,
+ for_start_values=True,
+ )
+
+
+def _fail_if_start_params_incomplete(params_template: pd.DataFrame) -> None:
+ """Fail early if a seeded start point has any missing or non-finite value.
+
+ A `"spearman"` or `"amn"` strategy must hand the optimiser a complete, finite
+ start point. optimagic otherwise rejects it with an opaque error downstream,
+ so surface the exact offending parameter rows here, where the seeding ran.
+ """
+ value = params_template["value"].to_numpy(dtype=float)
+ bad_mask = ~np.isfinite(value)
+ if bad_mask.any():
+ bad = params_template.index[bad_mask]
+ shown = ", ".join(str(tuple(loc)) for loc in bad[:10])
+ more = "" if len(bad) <= 10 else f" (+{len(bad) - 10} more)"
+ msg = (
+ f"Start-value seeding left {len(bad)} parameter(s) without a finite "
+ f"value: {shown}{more}. This start point is infeasible for "
+ "estimation; check start_params_strategy and the model spec."
+ )
+ raise ValueError(msg)
+
+
+def _build_fixed_constraints_from_params(
+ fixed_params: pd.DataFrame,
+ params_index: pd.MultiIndex,
+) -> list[FixedConstraintWithValue]:
+ """Convert a user-provided ``fixed_params`` DataFrame into constraints.
+
+ Each matching row becomes a ``FixedConstraintWithValue`` so optimagic
+ can treat user fixes uniformly with model-implied fixes (normalisations,
+ anchoring, augmented periods, ...). Entries whose index is not in
+ ``params_index`` are ignored.
+
+ Users typically key `fixed_params` by the public-facing `period`
+ level name, while `params_index` uses `aug_period` internally.
+ `MultiIndex.intersection` silently returns an empty index when
+ the operands' level names differ, so the level names are
+ normalised first via `align_index_names`.
+ """
+ aligned = align_index_names(fixed_params, target_names=params_index.names)
+ common = params_index.intersection(aligned.index)
+ return [
+ FixedConstraintWithValue(
+ loc=idx,
+ value=float(aligned.loc[idx, "value"]),
+ )
+ for idx in common
+ ]
+
+
def _partial_some_log_likelihood(
fun: Callable,
parsing_info: ParsingInfo,
@@ -208,6 +381,7 @@ def _partial_some_log_likelihood(
model: ProcessedModel,
sigma_weights: Array,
sigma_scaling_factor: Array,
+ chs_options: CHSEstimationOptions,
) -> Callable:
update_info = model.update_info
is_measurement_iteration = (update_info["purpose"] == "measurement").to_numpy()
@@ -221,6 +395,13 @@ def _partial_some_log_likelihood(
# n_transitions). To achieve that, we replace the last aug_period by -1. If there
# are endogenous factors, the last aug_period is found at index -2 (there should not
# be measurements for endogenous factors in the "second half" of the last period).
+ # Augmented-period timing: real period p -> even aug_period 2p (states half)
+ # and odd 2p+1 (endogenous half). The investment level and its first-stage
+ # prediction are produced at the same odd aug_period, so cf is a same-period
+ # residual; transition[t] steps t->t+1, so cf formed at odd t enters theta at
+ # t+1. With endogenous factors the terminal aug_period is aug_periods[-2],
+ # dropping the non-existent final production transition rather than applying
+ # one into a non-existent period.
last_aug_period = (
model.labels.aug_periods[-2]
if parsing_info.has_endogenous_factors
@@ -230,7 +411,11 @@ def _partial_some_log_likelihood(
if max(iteration_to_period) != last_aug_period - 1:
raise ValueError("Unexpected iteration_to_period configuration")
- if is_all_linear(model.transition_info.function_names):
+ # A control function makes the production equation non-linear in the raw
+ # states (cf is a non-linear function of the latent states), so the linear
+ # fast-path would silently bypass the cf DAG node. Force the unscented path.
+ has_control_function = model.endogenous_factors_info.control_function is not None
+ if is_all_linear(model.transition_info.function_names) and not has_control_function:
constant_factor_indices = frozenset(
i
for i, f in enumerate(model.labels.latent_factors)
@@ -256,7 +441,7 @@ def _partial_some_log_likelihood(
sigma_weights=sigma_weights,
dimensions=model.dimensions,
labels=model.labels,
- estimation_options=model.estimation_options,
+ chs_estimation_options=chs_options,
is_measurement_iteration=is_measurement_iteration,
is_predict_iteration=is_predict_iteration,
iteration_to_period=iteration_to_period,
diff --git a/src/skillmodels/chs/options.py b/src/skillmodels/chs/options.py
new file mode 100644
index 00000000..48ad358b
--- /dev/null
+++ b/src/skillmodels/chs/options.py
@@ -0,0 +1,87 @@
+"""CHS-specific estimation options."""
+
+from collections.abc import Mapping
+from dataclasses import dataclass, field
+from types import MappingProxyType
+from typing import Any, Literal
+
+from skillmodels._beartype_conf import OPTIONS_CONF, beartype_init
+from skillmodels.common.types import ensure_containers_are_immutable
+
+
+@beartype_init(OPTIONS_CONF)
+@dataclass(frozen=True)
+class CHSEstimationOptions:
+ """Tuning parameters for the CHS Kalman-MLE estimator."""
+
+ robust_bounds: bool = True
+ """Whether to use robust bounds."""
+ bounds_distance: float = 1e-3
+ """Distance for bounds. Zeroed out if `robust_bounds` is False."""
+ sigma_points_scale: float = 2
+ """Scaling factor for sigma points in unscented transform."""
+ clipping_lower_bound: float = -1e30
+ """Lower bound for soft clipping."""
+ clipping_upper_bound: float | None = None
+ """Upper bound for soft clipping (None for no upper bound)."""
+ clipping_lower_hardness: float = 1
+ """Hardness of lower clipping."""
+ clipping_upper_hardness: float = 1
+ """Hardness of upper clipping."""
+ start_params_strategy: Literal["none", "constant", "spearman", "amn"] = "amn"
+ """How to populate the `value` column of the `params_template`.
+
+ Canonical name shared with `AFEstimationOptions`; the literal set is
+ unified across the two likelihood estimators.
+
+ `"amn"` (default) runs the full Attanasio-Meghir-Nix (2020)
+ three-stage estimator and uses its parameter estimates as starting
+ values for the downstream MLE. `"spearman"` seeds free entries
+ from Spearman cross-covariance / Bartlett-OLS moments only (fast
+ but less accurate on non-Gaussian factor distributions). `"none"`
+ leaves free entries as `NaN` so the caller can fill them.
+ `"constant"` is accepted for cross-estimator symmetry and, for the
+ Kalman template, behaves identically to `"none"` (no moment seeding;
+ the template's default values stand).
+ """
+
+ optimizer_algorithm: str = "scipy_lbfgsb"
+ """`optimagic` algorithm name for the maximisation.
+
+ `estimate_chs` forwards it as `estimate_ml`'s
+ `optimize_options["algorithm"]` (e.g. `"scipy_lbfgsb"`, `"fides"`)."""
+
+ optimizer_options: Mapping[str, Any] = field(
+ default_factory=lambda: MappingProxyType({})
+ )
+ """Algorithm-specific options (`optimize_options["algo_options"]`).
+
+ Forwarded by `estimate_chs` to `estimate_ml` (e.g. convergence
+ tolerances, trust-region settings for `fides`)."""
+
+ estimate_ml_options: Mapping[str, Any] = field(
+ default_factory=lambda: MappingProxyType({})
+ )
+ """Extra keyword arguments forwarded verbatim to `estimagic.estimate_ml`.
+
+ The generic estimagic pass-through for everything beyond the optimiser
+ knobs above — e.g. `logging` (an `optimagic` log-options object),
+ `hessian`, `jacobian`, `design_info`. `estimate_chs` defaults
+ `hessian=False` (OPG/jacobian-based standard errors, since the numerical
+ Hessian is prohibitively expensive); override it here for the sandwich
+ covariance. `estimate_chs` manages `loglike`, `params`, `bounds`,
+ `constraints`, and `optimize_options` itself, so do not set those here."""
+
+ def __post_init__(self) -> None: # noqa: D105
+ if not self.robust_bounds:
+ object.__setattr__(self, "bounds_distance", 0.0)
+ object.__setattr__(
+ self,
+ "optimizer_options",
+ ensure_containers_are_immutable(dict(self.optimizer_options)),
+ )
+ object.__setattr__(
+ self,
+ "estimate_ml_options",
+ ensure_containers_are_immutable(dict(self.estimate_ml_options)),
+ )
diff --git a/src/skillmodels/process_debug_data.py b/src/skillmodels/chs/process_debug_data.py
similarity index 79%
rename from src/skillmodels/process_debug_data.py
rename to src/skillmodels/chs/process_debug_data.py
index 770317d5..5cbbe81a 100644
--- a/src/skillmodels/process_debug_data.py
+++ b/src/skillmodels/chs/process_debug_data.py
@@ -7,7 +7,8 @@
from jax import Array
from numpy.typing import NDArray
-from skillmodels.types import ProcessedModel
+from skillmodels.common.state_ranges import create_state_ranges
+from skillmodels.common.types import ProcessedModel
def process_debug_data(
@@ -109,7 +110,7 @@ def process_debug_data(
def _create_post_update_states(
- filtered_states: Array,
+ filtered_states: Array | np.ndarray,
factors: tuple[str, ...],
update_info: pd.DataFrame,
) -> pd.DataFrame:
@@ -128,7 +129,7 @@ def _create_post_update_states(
def _convert_state_array_to_df(
- arr: NDArray[np.floating[Any]],
+ arr: NDArray[np.float64],
factor_names: tuple[str, ...],
) -> pd.DataFrame:
"""Convert a 3d state array into a 2d DataFrame.
@@ -144,8 +145,8 @@ def _convert_state_array_to_df(
def _create_filtered_states(
- filtered_states: Array,
- log_mixture_weights: Array,
+ filtered_states: Array | np.ndarray,
+ log_mixture_weights: Array | np.ndarray,
update_info: pd.DataFrame,
factors: tuple[str, ...],
) -> pd.DataFrame:
@@ -174,49 +175,8 @@ def _create_filtered_states(
return pd.concat(to_concat)
-def create_state_ranges(
- filtered_states: pd.DataFrame,
- factors: tuple[str, ...] | list[str],
- quantile_cutoff: float | None = None,
-) -> dict[str, pd.DataFrame]:
- """Compute minimum and maximum state values for each factor by period.
-
- Args:
- filtered_states: DataFrame with filtered states. Must have a "period"
- column.
- factors: List of factor names to compute ranges for.
- quantile_cutoff: If provided, use quantiles instead of min/max. The cutoff
- is applied symmetrically: the minimum is the `quantile_cutoff` quantile
- and the maximum is the `1 - quantile_cutoff` quantile. For example,
- quantile_cutoff=0.01 uses the 1st and 99th percentiles.
-
- Returns:
- Dictionary mapping factor names to DataFrames with "minimum" and "maximum"
- columns, indexed by period.
-
- """
- ranges: dict[str, pd.DataFrame] = {}
- # Group by whichever period column is present
- period_col = "aug_period" if "aug_period" in filtered_states.columns else "period"
-
- if quantile_cutoff is not None:
- if not 0 < quantile_cutoff < 0.5:
- raise ValueError("quantile_cutoff must be between 0 and 0.5 (exclusive)")
- minima = filtered_states.groupby(period_col).quantile(quantile_cutoff)
- maxima = filtered_states.groupby(period_col).quantile(1 - quantile_cutoff)
- else:
- minima = filtered_states.groupby(period_col).min()
- maxima = filtered_states.groupby(period_col).max()
-
- for factor in factors:
- df = pd.concat([minima[factor], maxima[factor]], axis=1)
- df.columns = pd.Index(["minimum", "maximum"])
- ranges[factor] = df
- return ranges
-
-
def _process_residuals(
- residuals: Array,
+ residuals: Array | np.ndarray | list,
update_info: pd.DataFrame,
) -> pd.DataFrame:
to_concat = []
@@ -232,14 +192,14 @@ def _process_residuals(
def _process_residual_sds(
- residual_sds: Array,
+ residual_sds: Array | np.ndarray,
update_info: pd.DataFrame,
) -> pd.DataFrame:
return _process_residuals(residuals=residual_sds, update_info=update_info)
def _process_all_contributions(
- all_contributions: Array,
+ all_contributions: Array | np.ndarray,
update_info: pd.DataFrame,
) -> pd.DataFrame:
to_concat = []
diff --git a/src/skillmodels/qr.py b/src/skillmodels/chs/qr.py
similarity index 100%
rename from src/skillmodels/qr.py
rename to src/skillmodels/chs/qr.py
diff --git a/src/skillmodels/chs/types.py b/src/skillmodels/chs/types.py
new file mode 100644
index 00000000..6919e312
--- /dev/null
+++ b/src/skillmodels/chs/types.py
@@ -0,0 +1,44 @@
+"""Frozen result dataclass for the CHS Kalman-MLE estimator."""
+
+from dataclasses import dataclass
+from typing import Any
+
+import pandas as pd
+
+from skillmodels.common.model_spec import ModelSpec
+
+
+@dataclass(frozen=True)
+class CHSEstimationResult:
+ """Complete result from CHS Kalman-MLE estimation.
+
+ Conforms to `skillmodels.common.estimation.CommonEstimationResult`:
+ `loglikelihood` is always populated (CHS maximises a likelihood) and
+ `md_criterion` is always `None`. Estimation runs through
+ `estimagic.estimate_ml`, so `likelihood_result` carries full ML
+ inference (standard errors, covariances, summaries).
+ """
+
+ model_spec: ModelSpec
+ """The ModelSpec used for estimation."""
+
+ params: pd.DataFrame
+ """Estimated parameters with the standard 4-level MultiIndex
+ (category, period, name1, name2) and a `"value"` column."""
+
+ success: bool
+ """Whether the optimiser converged."""
+
+ loglikelihood: float
+ """Maximised log-likelihood at the optimum."""
+
+ optimize_result: Any
+ """Raw optimagic `OptimizeResult` for full optimisation diagnostics."""
+
+ likelihood_result: Any = None
+ """The estimagic `LikelihoodResult` from `estimate_ml`, exposing ML
+ inference via `.se()` / `.cov()` / `.summary()` / `.p_values()`. `None`
+ only for hand-constructed results (e.g. in tests)."""
+
+ md_criterion: float | None = None
+ """Always `None` for CHS; present to satisfy the common result Protocol."""
diff --git a/src/skillmodels/common/__init__.py b/src/skillmodels/common/__init__.py
new file mode 100644
index 00000000..e56ee676
--- /dev/null
+++ b/src/skillmodels/common/__init__.py
@@ -0,0 +1,14 @@
+"""Estimator-agnostic infrastructure shared by CHS, AF, and AMN.
+
+This subpackage holds everything that the three estimator subpackages
+build on but do not own: the user-facing model specification
+(`ModelSpec`, `FactorSpec`, `AnchoringSpec`), the data and parameter
+processing pipeline (`process_model`, `process_data`, `params_index`,
+`parse_params`), the constraint plumbing (`constraints`,
+`decorators`), shared transition-function library, and the
+visualisation helpers that operate on the common filtered-states
+DataFrame format.
+
+The dependency rule for this package: it imports from no estimator
+subpackage. Conversely, `chs`, `af`, and `amn` import freely from here.
+"""
diff --git a/src/skillmodels/filtered_states.py b/src/skillmodels/common/anchoring.py
similarity index 52%
rename from src/skillmodels/filtered_states.py
rename to src/skillmodels/common/anchoring.py
index c525ac0e..9a97271a 100644
--- a/src/skillmodels/filtered_states.py
+++ b/src/skillmodels/common/anchoring.py
@@ -1,66 +1,26 @@
-"""Functions to compute and process filtered latent states."""
+"""Generic anchoring utilities, estimator-agnostic.
-from typing import Any
+Anchoring maps unitless latent factors back to the unit of a designated
+anchor measurement via a per-period (scale, offset) pair recovered from
+`ModelSpec.anchoring`. The application is a pure scalar transformation
+of a DataFrame's latent-factor columns; the implementation only depends
+on `process_model` / `parse_params` (both common) and operates on a
+`(obs x period x factor)` DataFrame irrespective of which estimator
+produced it.
+
+Historically this lived under `skillmodels.chs.filtered_states` but
+the cross-subpackage import from `common.simulate_data` was a code
+smell — the function is genuinely common.
+"""
import jax.numpy as jnp
import numpy as np
import pandas as pd
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.model_spec import ModelSpec
-from skillmodels.params_index import get_params_index
-from skillmodels.parse_params import create_parsing_info, parse_params
-from skillmodels.process_debug_data import create_state_ranges
-from skillmodels.process_model import process_model
-
-
-def get_filtered_states(
- model_spec: ModelSpec,
- data: pd.DataFrame,
- params: pd.DataFrame,
-) -> dict[str, dict[str, Any]]:
- """Compute filtered latent states given data and estimated parameters."""
- max_inputs = get_maximization_inputs(model_spec=model_spec, data=data)
- params = params.loc[max_inputs["params_template"].index]
- debug_loglike = max_inputs["debug_loglike"]
- debug_data = debug_loglike(params)
- unanchored_states_df = debug_data["filtered_states"]
- unanchored_ranges = debug_data["state_ranges"]
- processed_model = process_model(model_spec)
-
- anchored_states_df = anchor_states_df(
- states_df=unanchored_states_df,
- model_spec=model_spec,
- params=params,
- use_aug_period=True,
- )
-
- # Map aug_period → period for the public API
- ap_to_p = processed_model.labels.aug_periods_to_periods
- for df in (anchored_states_df, unanchored_states_df):
- df["period"] = df["aug_period"].map(ap_to_p)
- anchored_states_df = anchored_states_df.drop(columns="aug_period")
- unanchored_states_df = unanchored_states_df.drop(columns="aug_period")
-
- anchored_ranges = create_state_ranges(
- filtered_states=anchored_states_df,
- factors=processed_model.labels.latent_factors,
- )
- unanchored_ranges = create_state_ranges(
- filtered_states=unanchored_states_df,
- factors=processed_model.labels.latent_factors,
- )
-
- return {
- "anchored_states": {
- "states": anchored_states_df,
- "state_ranges": anchored_ranges,
- },
- "unanchored_states": {
- "states": unanchored_states_df,
- "state_ranges": unanchored_ranges,
- },
- }
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_model import process_model
def anchor_states_df(
@@ -72,14 +32,13 @@ def anchor_states_df(
) -> pd.DataFrame:
"""Anchor states in a DataFrame.
- The DataFrame is expected to have a column called "period" as well as one column
- for each latent factor.
-
- All other columns are not affected.
-
- This is a bit difficult because we need to re-use `parse_params` (which was meant
- as an internal function that only works with jax objects).
+ The DataFrame is expected to have a column called "period" (or
+ "aug_period" when `use_aug_period=True`) as well as one column for
+ each latent factor. All other columns are not affected.
+ This is a bit difficult because we need to re-use `parse_params`
+ (which was meant as an internal function that only works with jax
+ objects).
"""
processed_model = process_model(model_spec)
diff --git a/src/skillmodels/check_model.py b/src/skillmodels/common/check_model.py
similarity index 78%
rename from src/skillmodels/check_model.py
rename to src/skillmodels/common/check_model.py
index 18f85af7..24191fb9 100644
--- a/src/skillmodels/check_model.py
+++ b/src/skillmodels/common/check_model.py
@@ -1,11 +1,13 @@
"""Functions to validate model specifications."""
from collections.abc import Mapping
+from itertools import combinations
+from typing import Any
import numpy as np
-from skillmodels.model_spec import ModelSpec
-from skillmodels.types import Anchoring, Dimensions, Labels
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.types import Anchoring, Dimensions, Labels
def check_model(
@@ -90,7 +92,12 @@ def check_stagemap(
return report
-def _check_anchoring(anchoring: Anchoring) -> list[str]:
+def _check_anchoring(anchoring: Any) -> list[str]: # noqa: ANN401
+ """Validate anchoring attributes.
+
+ Runtime-typed because callers may pass duck-typed namespaces or
+ partially-built objects.
+ """
report = []
if not isinstance(anchoring.anchoring, bool):
report.append("anchoring.anchoring must be a bool.")
@@ -138,20 +145,49 @@ def _check_measurements(
def _check_no_overlap_in_measurements_of_states_and_inv(
model_spec: ModelSpec, labels: Labels
) -> list[str]:
+ """Reject measurement-name collisions across latent factors of split halves.
+
+ With augmented periods, state factors are measured at the even aug-periods and
+ endogenous factors at the odd ones. A measurement name shared by a state and an
+ endogenous factor (or by two endogenous factors, e.g. a duplicate-measurement
+ twin) collides their level/prediction measurement systems. State-vs-state
+ sharing is left alone (legitimate cross-loadings).
+ """
report = []
for period in labels.periods:
- meas: dict[str, set] = {}
+ aug_periods = [
+ aug_period
+ for aug_period, p in labels.aug_periods_to_periods.items()
+ if p == period
+ ]
+ state_meas: dict[str, set[str]] = {}
+ endogenous_meas: dict[str, set[str]] = {}
for factor in labels.latent_factors:
fspec = model_spec.factors[factor]
- if fspec.is_endogenous:
- meas["endogenous_factors"] = set(fspec.measurements[period])
- else:
- meas["states"] = set(fspec.measurements[period])
- if overlap := meas["states"].intersection(meas["endogenous_factors"]):
- report.append(
- "Measurements for exogenous and endogenous latent factors must not "
- f"overlap.\n\nCheck measurements {overlap} in period {period}.",
- )
+ names = {
+ name
+ for aug_period in aug_periods
+ for name in fspec.measurements[aug_period]
+ }
+ target = endogenous_meas if fspec.is_endogenous else state_meas
+ target[factor] = names
+
+ pairs = [
+ (s_factor, s_names, e_factor, e_names)
+ for s_factor, s_names in state_meas.items()
+ for e_factor, e_names in endogenous_meas.items()
+ ]
+ pairs += [
+ (f1, n1, f2, n2)
+ for (f1, n1), (f2, n2) in combinations(endogenous_meas.items(), 2)
+ ]
+ for factor_a, names_a, factor_b, names_b in pairs:
+ if overlap := names_a & names_b:
+ report.append(
+ "Measurements for distinct latent factors must not overlap.\n\n"
+ f"Check measurements {overlap} shared by {factor_a} and "
+ f"{factor_b} in period {period}.",
+ )
return report
diff --git a/src/skillmodels/common/config.py b/src/skillmodels/common/config.py
new file mode 100644
index 00000000..c570e402
--- /dev/null
+++ b/src/skillmodels/common/config.py
@@ -0,0 +1,16 @@
+"""Configuration constants and paths for skillmodels."""
+
+from pathlib import Path
+
+# `__file__` lives in src/skillmodels/common/config.py; test_data sits in
+# src/skillmodels/test_data so resolve one level up.
+TEST_DATA_DIR = Path(__file__).resolve().parent.parent / "test_data"
+REGRESSION_VAULT = (
+ Path(__file__).resolve().parent.parent.parent.parent / "tests" / "regression_vault"
+)
+
+# Long-format CNLSY measurements used by the AF 2025 application; produced
+# by ``matlab_ces_repro/load_cnlsy.py`` from the bundled ``complete_7_9_11.xls``
+# (CNLSY public-use data, BLS). Read with
+# ``pd.read_csv(CNLSY_DATA_PATH).set_index(["caseid", "period"])``.
+CNLSY_DATA_PATH = TEST_DATA_DIR / "cnlsy_7_9_11.csv"
diff --git a/src/skillmodels/common/constraints.py b/src/skillmodels/common/constraints.py
new file mode 100644
index 00000000..19f9a06d
--- /dev/null
+++ b/src/skillmodels/common/constraints.py
@@ -0,0 +1,817 @@
+"""Constraint objects for a model specification."""
+
+import functools
+import warnings
+from collections.abc import Iterable, Mapping
+from typing import Any
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+
+import skillmodels.common.transition_functions as t_f_module
+from skillmodels.common.fixed_constraint import FixedConstraintWithValue
+from skillmodels.common.selector import align_index_names, select_by_loc
+from skillmodels.common.types import (
+ Anchoring,
+ ControlFunctionInfo,
+ Dimensions,
+ EndogenousFactorsInfo,
+ Labels,
+ MeasurementType,
+ Normalizations,
+)
+
+__all__ = [
+ "FixedConstraintWithValue",
+ "add_bounds",
+ "align_index_names",
+ "collect_fixed_locs",
+ "enforce_fixed_constraints",
+ "filter_within_step_constraints",
+ "get_constraints",
+ "project_to_probability_constraints",
+ "reconcile_start_to_equality",
+ "select_by_loc",
+]
+
+
+def _equality_constraint_loc(c: om.constraints.Constraint) -> pd.MultiIndex | None:
+ """Return the `loc` MultiIndex of a `select_by_loc`-style EqualityConstraint.
+
+ Returns `None` for any other constraint type or selector shape, so
+ callers can `continue` past unrecognised entries without nested
+ guard clauses.
+ """
+ if not isinstance(c, om.EqualityConstraint):
+ return None
+ keywords = getattr(c.selector, "keywords", None)
+ if not keywords:
+ return None
+ loc = keywords.get("loc")
+ return loc if isinstance(loc, pd.MultiIndex) else None
+
+
+def _pairwise_equality_locs(
+ c: om.constraints.Constraint,
+) -> list[pd.MultiIndex] | None:
+ """Return the aligned `select_by_loc` locs of a `PairwiseEqualityConstraint`.
+
+ Each selector ties its members element-wise to the others, so the returned
+ `MultiIndex`es are equal length and position `k` forms one equality group.
+ Returns `None` for any other constraint type or selector shape.
+ """
+ if not isinstance(c, om.PairwiseEqualityConstraint):
+ return None
+ selectors = getattr(c, "selectors", None)
+ if not selectors:
+ return None
+ locs: list[pd.MultiIndex] = []
+ for sel in selectors:
+ keywords = getattr(sel, "keywords", None)
+ loc = keywords.get("loc") if keywords else None
+ if not isinstance(loc, pd.MultiIndex):
+ return None
+ locs.append(loc)
+ if len({len(loc) for loc in locs}) != 1:
+ return None
+ return locs
+
+
+def filter_within_step_constraints(
+ user_constraints: list[om.constraints.Constraint] | None,
+ params_index: pd.Index,
+) -> list[om.constraints.Constraint]:
+ """Return user equality constraints fully contained in `params_index`.
+
+ Used by AF's per-step optimizers to forward only those user-supplied
+ `om.EqualityConstraint` objects whose `select_by_loc` `loc` MultiIndex
+ is a subset of the current step's params index. Cross-period
+ equalities (whose members straddle multiple steps) are handled
+ separately by `_propagate_equality_groups` in
+ `skillmodels.af.estimate`.
+ """
+ if not user_constraints:
+ return []
+ idx_set = set(params_index)
+ out: list[om.constraints.Constraint] = []
+ for c in user_constraints:
+ loc = _equality_constraint_loc(c)
+ if loc is not None and all(tup in idx_set for tup in loc):
+ out.append(c)
+ return out
+
+
+def _fixed_loc_values(
+ constraints: Iterable[om.constraints.Constraint],
+) -> dict[tuple[Any, ...], float]:
+ """Map every `FixedConstraintWithValue.loc` tuple to its target `value`.
+
+ The companion of `collect_fixed_locs` that keeps the value, so the
+ equality reconciler can pool a group onto a fixed member's value
+ rather than the group mean. Handles the same `loc` shapes
+ (single 4-tuple, list/tuple of 4-tuples, `pd.MultiIndex`); string
+ `loc`s are skipped as in `collect_fixed_locs`.
+ """
+ out: dict[tuple[Any, ...], float] = {}
+ for c in constraints:
+ if not isinstance(c, FixedConstraintWithValue) or c.value is None:
+ continue
+ value = float(c.value)
+ loc = c.loc
+ if isinstance(loc, pd.MultiIndex):
+ for tup in loc:
+ out[tuple(tup)] = value
+ elif isinstance(loc, tuple) and loc and not isinstance(loc[0], tuple):
+ out[loc] = value
+ elif isinstance(loc, (list, tuple)):
+ for sub in loc:
+ if isinstance(sub, tuple):
+ out[sub] = value
+ return out
+
+
+def _pooled_equality_value(
+ members: list[tuple[Any, ...]],
+ params: pd.DataFrame,
+ fixed_values: dict[tuple[Any, ...], float],
+) -> float:
+ """Return the shared value an equality group's members must take.
+
+ If any member is fixed (via a `FixedConstraintWithValue`), the group
+ must take that fixed value -- averaging would move the fixed
+ coordinate off its target. Conflicting fixed values within one group
+ are infeasible and raise. Otherwise the group is averaged.
+ """
+ fixed = {fixed_values[m] for m in members if m in fixed_values}
+ if len(fixed) > 1:
+ msg = (
+ f"Conflicting fixed values in an equality group: {sorted(fixed)}. "
+ "Members tied by equality cannot be fixed to different values."
+ )
+ raise ValueError(msg)
+ if fixed:
+ return next(iter(fixed))
+ return float(params["value"].reindex(members).mean())
+
+
+def reconcile_start_to_equality(
+ params: pd.DataFrame,
+ equality_constraints: list[om.constraints.Constraint],
+) -> pd.DataFrame:
+ """Pool each equality group's `value` so the start point satisfies it.
+
+ `om.minimize` raises `InvalidParamsError` when an equality
+ constraint is violated at the starting point. For each
+ `om.EqualityConstraint` and each element-wise group of an
+ `om.PairwiseEqualityConstraint` (e.g. the time-invariance ties on
+ controls / loadings / meas_sds across periods), set every member's
+ `value` to a single shared value: the value of a fixed member if the
+ group contains a `FixedConstraintWithValue` (so a previously enforced
+ fix is not averaged away), otherwise the group mean. Conflicting
+ fixed values within one group raise. Returns a copy; `params` is not
+ modified.
+ """
+ if not equality_constraints:
+ return params
+ out = params.copy()
+ fixed_values = _fixed_loc_values(equality_constraints)
+ for c in equality_constraints:
+ loc = _equality_constraint_loc(c)
+ if loc is not None and all(tup in out.index for tup in loc):
+ members = list(loc)
+ out.loc[members, "value"] = _pooled_equality_value(
+ members, out, fixed_values
+ )
+ continue
+ pairwise = _pairwise_equality_locs(c)
+ if pairwise is None:
+ continue
+ for group in zip(*pairwise, strict=True):
+ members = [m for m in group if m in out.index]
+ if len(members) > 1:
+ out.loc[members, "value"] = _pooled_equality_value(
+ members, out, fixed_values
+ )
+ return out
+
+
+def collect_fixed_locs(
+ constraints: Iterable[om.constraints.Constraint],
+) -> set[tuple[Any, ...]]:
+ """Flatten every `FixedConstraintWithValue.loc` into a single set of tuples.
+
+ Used by `project_to_probability_constraints` to decide which
+ entries of a `ProbabilityConstraint` group are already pinned by
+ an overlapping `FixedConstraintWithValue` and therefore must not
+ be touched by the rescaling step.
+
+ Handles every shape that `FixedConstraintWithValue.loc` permits
+ per its type annotation: a single 4-tuple (`("loadings", 0, ...)`),
+ a `tuple` / `list` of 4-tuples (used by the anchoring
+ constraints), and a `pd.MultiIndex` (the type annotation allows
+ it; the runtime needs to follow). String `loc`s (like
+ `"mixture_weights"`) are deliberately skipped: they refer to
+ a category prefix in the params index, not to a single
+ parameter, and never belong to a probability fold.
+ """
+ fixed_locs: set[tuple[Any, ...]] = set()
+ for c in constraints:
+ if not isinstance(c, FixedConstraintWithValue):
+ continue
+ loc = c.loc
+ if isinstance(loc, pd.MultiIndex):
+ fixed_locs.update(tuple(t) for t in loc)
+ elif isinstance(loc, tuple) and loc and not isinstance(loc[0], tuple):
+ fixed_locs.add(loc)
+ elif isinstance(loc, (list, tuple)):
+ fixed_locs.update(sub for sub in loc if isinstance(sub, tuple))
+ return fixed_locs
+
+
+def project_to_probability_constraints(
+ params_template: pd.DataFrame,
+ constraints: Iterable[om.constraints.Constraint],
+) -> pd.DataFrame:
+ """Project starting values onto each `ProbabilityConstraint`'s simplex.
+
+ Spearman / AMN seeding does not know about probability folds: the
+ seeded entries don't sum to one. Walk every `ProbabilityConstraint`
+ whose selector is the `select_by_loc(loc=list_of_tuples)` form and
+ rescale its free members so they sum to `1 - sum(fixed_values)`.
+ Entries also bound by a `FixedConstraintWithValue` keep their
+ pinned value; only the remaining (free) entries are rescaled.
+ Groups where the free entries sum to zero are left untouched --
+ the user is on the hook for supplying a feasible start in that
+ degenerate case.
+ """
+ fixed_locs = collect_fixed_locs(constraints)
+
+ out = params_template
+ for c in constraints:
+ if not isinstance(c, om.ProbabilityConstraint):
+ continue
+ keywords = getattr(c.selector, "keywords", None)
+ loc = keywords.get("loc") if keywords else None
+ if not isinstance(loc, list):
+ continue
+
+ free_loc = [tup for tup in loc if tup not in fixed_locs]
+ pinned_loc = [tup for tup in loc if tup in fixed_locs]
+ if not free_loc:
+ continue
+ try:
+ free_values = out.loc[free_loc, "value"]
+ except KeyError:
+ continue
+ free_total = float(free_values.sum())
+ if free_total <= 0 or not np.isfinite(free_total):
+ continue
+
+ pinned_total = float(out.loc[pinned_loc, "value"].sum()) if pinned_loc else 0.0
+ target = max(0.0, 1.0 - pinned_total)
+ if abs(free_total - target) < 1e-12:
+ continue
+
+ if out is params_template:
+ out = params_template.copy()
+ out.loc[free_loc, "value"] = free_values * (target / free_total)
+ return out
+
+
+def get_constraints(
+ dimensions: Dimensions,
+ labels: Labels,
+ anchoring_info: Anchoring,
+ update_info: pd.DataFrame,
+ normalizations: Mapping[str, Normalizations],
+ endogenous_factors_info: EndogenousFactorsInfo,
+ bounds_distance: float,
+) -> list[om.constraints.Constraint]:
+ """Generate constraints implied by the model specification.
+
+ Args:
+ dimensions: Dimensional information like n_states, n_periods, n_controls,
+ n_mixtures. See :ref:`dimensions`.
+ labels: Dict of lists with labels for the model quantities like
+ factors, periods, controls, stagemap and stages. See :ref:`labels`
+ anchoring_info: Information about anchoring. See :ref:`anchoring`
+ update_info: DataFrame with one row per Kalman update needed
+ in the likelihood function. See :ref:`update_info`.
+ normalizations: Nested dictionary with information on normalized factor
+ loadings and intercepts for each factor. See :ref:`normalizations`.
+ endogenous_factors_info: Information about endogenous factors in the model.
+ bounds_distance: Distance from zero/one used for soft-pinning shock
+ standard deviations in carry-forward augmented periods.
+
+ Returns:
+ List of optimagic constraint objects.
+
+ """
+ constraints: list[om.constraints.Constraint] = []
+
+ constraints += _get_normalization_constraints(
+ normalizations=normalizations, factors=labels.latent_factors
+ )
+ constraints += _get_mixture_weights_constraints(dimensions.n_mixtures)
+ constraints += _get_stage_constraints(
+ stagemap=labels.aug_stagemap,
+ stages=labels.aug_stages,
+ )
+ constraints += _get_constant_factors_constraints(
+ labels=labels, endogenous_factors_info=endogenous_factors_info
+ )
+ constraints += _get_initial_states_constraints(
+ n_mixtures=dimensions.n_mixtures,
+ factors=labels.latent_factors,
+ )
+ constraints += _get_transition_constraints(labels=labels)
+ constraints += _get_anchoring_constraints(
+ update_info=update_info,
+ controls=labels.controls,
+ anchoring_info=anchoring_info,
+ periods=labels.aug_periods,
+ )
+ if endogenous_factors_info.has_endogenous_factors:
+ constraints += _get_constraints_for_augmented_periods(
+ labels=labels,
+ endogenous_factors_info=endogenous_factors_info,
+ bounds_distance=bounds_distance,
+ )
+
+ return constraints
+
+
+def add_bounds(params: pd.DataFrame, bounds_distance: float) -> pd.DataFrame:
+ """Add bounds for standard deviations to params.
+
+ Lower and upper bounds are set to (minus) infinity; lower bounds for standard
+ deviation-like parameters are set to *bounds_distance*. Note that the latter will be
+ overridden for parameters where fixed constraints are imposed.
+
+ Args:
+ params: see :ref:`params`.
+ bounds_distance: set standard deviation-like to this amount.
+
+ Returns:
+ Modified copy of params
+
+ """
+ df = params.copy()
+ with warnings.catch_warnings():
+ warnings.filterwarnings(
+ "ignore",
+ message="indexing past lexsort depth may impact performance.",
+ )
+ if "lower_bound" not in df.columns:
+ df["lower_bound"] = -np.inf
+ if "upper_bound" not in df.columns:
+ df["upper_bound"] = np.inf
+
+ df.loc["meas_sds", "lower_bound"] = bounds_distance
+ df.loc["shock_sds", "lower_bound"] = bounds_distance
+
+ cholcov_index = df.query("category == 'initial_cholcovs'").index.tolist()
+ ind_tups = [tup for tup in cholcov_index if _is_diagonal_entry(tup)]
+ df.loc[ind_tups, "lower_bound"] = bounds_distance
+
+ return df
+
+
+def _is_diagonal_entry(ind_tup: tuple[Any, ...]) -> bool:
+ name2 = ind_tup[-1]
+ middle_pos = int(len(name2) // 2)
+ if (
+ len(name2) % 2 == 0
+ or name2[middle_pos] != "-"
+ or name2[:middle_pos] != name2[middle_pos + 1 :]
+ ):
+ is_diag = False
+ else:
+ is_diag = True
+ return is_diag
+
+
+def _get_normalization_constraints(
+ normalizations: Mapping[str, Normalizations],
+ factors: tuple[str, ...],
+) -> list[om.constraints.Constraint]:
+ """List of constraints to enforce normalizations.
+
+ Args:
+ normalizations: Mapping from factor name to Normalizations instance.
+ factors: Tuple of factor names to process.
+
+ Returns:
+ List of constraint objects.
+
+ """
+ periods = range(len(normalizations[factors[0]].loadings))
+
+ constraints: list[om.constraints.Constraint] = []
+ for factor in factors:
+ for period in periods:
+ for meas, normval in normalizations[factor].loadings[period].items():
+ loc = ("loadings", period, meas, factor)
+ constraints.append(FixedConstraintWithValue(loc=loc, value=normval))
+ for meas, normval in normalizations[factor].intercepts[period].items():
+ loc = ("controls", period, meas, "constant")
+ constraints.append(FixedConstraintWithValue(loc=loc, value=normval))
+
+ return constraints
+
+
+def _get_mixture_weights_constraints(
+ n_mixtures: int,
+) -> list[om.constraints.Constraint]:
+ """Constrain mixture weights to be between 0 and 1 and sum to 1."""
+ loc = "mixture_weights"
+ if n_mixtures == 1:
+ return [
+ FixedConstraintWithValue(loc=loc, value=1.0),
+ ]
+ return [
+ om.ProbabilityConstraint(selector=functools.partial(select_by_loc, loc=loc))
+ ]
+
+
+def _get_stage_constraints(
+ stagemap: tuple[int, ...],
+ stages: tuple[int, ...],
+) -> list[om.constraints.Constraint]:
+ """Equality constraints for transition and shock parameters within stages.
+
+ Args:
+ stagemap: map aug_periods to aug_stages
+ stages: aug_stages
+
+ Returns:
+ List of constraint objects.
+
+ """
+ constraints: list[om.constraints.Constraint] = []
+
+ stages_to_periods: dict[int, list[int]] = {stage: [] for stage in stages}
+ for aug_period, stage in enumerate(stagemap):
+ stages_to_periods[stage].append(aug_period)
+
+ for stage_periods in stages_to_periods.values():
+ if len(stage_periods) > 1:
+ loc_trans = [("transition", p) for p in stage_periods]
+ loc_q = [("shock_sds", p) for p in stage_periods]
+ constraints.append(
+ om.PairwiseEqualityConstraint(
+ selectors=[
+ functools.partial(select_by_loc, loc=loc) for loc in loc_trans
+ ],
+ ),
+ )
+ constraints.append(
+ om.PairwiseEqualityConstraint(
+ selectors=[
+ functools.partial(select_by_loc, loc=loc) for loc in loc_q
+ ],
+ ),
+ )
+
+ return constraints
+
+
+def _get_constant_factors_constraints(
+ labels: Labels,
+ endogenous_factors_info: EndogenousFactorsInfo,
+) -> list[om.constraints.Constraint]:
+ """Fix shock variances of constant factors to zero.
+
+ Args:
+ labels: Dict of lists with labels for the model quantities like
+ factors, periods, controls, stagemap and stages. See :ref:`labels`
+ endogenous_factors_info: Information about endogenous factors. Used to
+ mirror `get_transition_index_tuples`, which stops at
+ `aug_periods[:-2]` when endogenous factors are present (otherwise
+ `[:-1]`). The params index has no transition/shock entries at the
+ final transition aug-period, so a naive `[:-1]` loop would emit one
+ orphan `shock_sds` loc that trips the optimagic selector.
+
+ Returns:
+ List of constraint objects.
+
+ """
+ last = -2 if endogenous_factors_info.has_endogenous_factors else -1
+ transition_augs = labels.aug_periods[:last]
+ constraints: list[om.constraints.Constraint] = []
+ for f, factor in enumerate(labels.latent_factors):
+ if labels.transition_names[f] == "constant":
+ for aug_period in transition_augs:
+ loc = ("shock_sds", aug_period, factor, "-")
+ constraints.append(
+ FixedConstraintWithValue(loc=loc, value=0.0),
+ )
+ return constraints
+
+
+def _get_initial_states_constraints(
+ n_mixtures: int,
+ factors: tuple[str, ...],
+) -> list[om.constraints.Constraint]:
+ """Enforce that the x values of the first factor are increasing.
+
+ Otherwise the model would only be identified up to the order of the start factors.
+
+ Args:
+ n_mixtures: number of elements in the mixture of normal of the factors.
+ factors: the latent factors of the model
+
+ Returns:
+ List of constraint objects.
+
+ """
+ if n_mixtures > 1:
+ locs = [
+ ("initial_states", 0, f"mixture_{emf}", factors[0])
+ for emf in range(n_mixtures)
+ ]
+ return [
+ om.IncreasingConstraint(selector=functools.partial(select_by_loc, loc=locs))
+ ]
+ return []
+
+
+def _get_transition_constraints(
+ labels: Labels,
+) -> list[om.constraints.Constraint]:
+ """Collect possible constraints on transition parameters.
+
+ Args:
+ labels: Dict of lists with labels for the model quantities like
+ factors, periods, controls, stagemap and stages. See :ref:`labels`
+
+ Returns:
+ List of constraint objects.
+
+ """
+ constraints: list[om.constraints.Constraint] = []
+ for f, factor in enumerate(labels.latent_factors):
+ tname = labels.transition_names[f]
+ for aug_period in labels.aug_periods[:-1]:
+ funcname = f"constraints_{tname}"
+ if func := getattr(t_f_module, funcname, False):
+ constraints.append(
+ func( # ty: ignore[call-non-callable]
+ factor=factor,
+ factors=labels.all_factors,
+ aug_period=aug_period,
+ )
+ )
+ return constraints
+
+
+def _get_anchoring_constraints( # noqa: C901
+ update_info: pd.DataFrame,
+ controls: tuple[str, ...],
+ anchoring_info: Anchoring,
+ periods: tuple[int, ...],
+) -> list[om.constraints.Constraint]:
+ """Constraints on anchoring parameters.
+
+ Args:
+ update_info: DataFrame with one row per Kalman update needed
+ in the likelihood function. See :ref:`update_info`.
+ controls: List of control variables
+ anchoring_info: Information about anchoring. See :ref:`anchoring`
+ periods: Period of the model
+
+ Returns:
+ List of constraint objects.
+
+ """
+ anchoring_updates = update_info[update_info["purpose"] == "anchoring"].index
+
+ constraints: list[om.constraints.Constraint] = []
+ if not anchoring_info.free_constant:
+ locs = []
+ for period, meas in anchoring_updates:
+ locs.append(("controls", period, meas, "constant"))
+ if locs:
+ loc = tuple(locs)
+ constraints.append(
+ FixedConstraintWithValue(loc=loc, value=0),
+ )
+
+ if not anchoring_info.free_controls:
+ ind_tups = []
+ for period, meas in anchoring_updates:
+ for cont in [c for c in controls if c != "constant"]:
+ ind_tups.append(("controls", period, meas, cont))
+ if ind_tups:
+ loc = tuple(ind_tups)
+ constraints.append(
+ FixedConstraintWithValue(loc=loc, value=0),
+ )
+
+ if not anchoring_info.free_loadings:
+ ind_tups = []
+ for period in periods:
+ for factor in anchoring_info.factors:
+ outcome = anchoring_info.outcomes[factor]
+ meas = f"{outcome}_{factor}"
+ ind_tups.append(("loadings", period, meas, factor))
+
+ if ind_tups:
+ loc = tuple(ind_tups)
+ constraints.append(
+ FixedConstraintWithValue(loc=loc, value=1),
+ )
+
+ return constraints
+
+
+def _factors_in_param_name(name: str) -> set[str]:
+ """Return the factor tokens referenced by a built-in transition param name.
+
+ `"inv_z"` -> `{"inv_z"}`, `"inv_z ** 2"` -> `{"inv_z"}`,
+ `"fac1 * inv_z"` -> `{"fac1", "inv_z"}`, `"constant"` -> `{"constant"}`.
+ """
+ return {part.strip() for part in name.replace(" ** 2", "").split(" * ")}
+
+
+def _get_instrument_exclusion_constraints(
+ labels: Labels,
+ control_function: ControlFunctionInfo,
+ aug_period_meas_types: Mapping[int, MeasurementType],
+) -> list[FixedConstraintWithValue]:
+ """Pin built-in production coefficients on first-stage-only instruments to 0.
+
+ A built-in transition enumerates a free coefficient for every observed factor
+ (incl. the excluded instruments), which would leak the instrument into
+ production. Pin those coefficients to 0 on the production (ENDOGENOUS) aug
+ periods; on the carry-forward aug periods they are already 0 via the identity
+ constraints. Custom transitions are validated separately.
+ """
+ constraints: list[FixedConstraintWithValue] = []
+ production_aug_periods = [
+ k
+ for k, v in aug_period_meas_types.items()
+ if v == MeasurementType.ENDOGENOUS_FACTORS
+ ][:-1]
+ instruments = set(control_function.instruments)
+ for target in control_function.targets:
+ tname = labels.transition_names[labels.latent_factors.index(target)]
+ if not isinstance(tname, str) or tname == "constant":
+ continue
+ params_enumerator = getattr(t_f_module, f"params_{tname}", None)
+ if params_enumerator is None:
+ # Custom transition (no built-in `params_` enumerator). The
+ # built-in safe-by-construction pinning does not apply; instrument
+ # leakage through custom production is validated separately by
+ # `check_model`, which raises on it.
+ continue
+ leak_names = [
+ name
+ for name in params_enumerator(labels.all_factors)
+ if instruments & _factors_in_param_name(name)
+ ]
+ constraints.extend(
+ FixedConstraintWithValue(
+ loc=("transition", aug_period, target, name2),
+ value=0.0,
+ )
+ for aug_period in production_aug_periods
+ for name2 in leak_names
+ )
+ return constraints
+
+
+def _get_constraints_for_augmented_periods(
+ labels: Labels,
+ endogenous_factors_info: EndogenousFactorsInfo,
+ bounds_distance: float,
+) -> list[om.constraints.Constraint]:
+ """Constraints for augmented periods.
+
+ - Carry forward states from uneven periods to even periods
+ - Carry forward endogenous factors even periods to uneven periods
+ - Set shock_sds to 0 when carrying anything forward
+
+ Both depend on the transition function.
+
+ Args:
+ labels: Dict of lists with labels for the model quantities like
+ factors, periods, controls, stagemap and stages. See :ref:`labels`
+ endogenous_factors_info: Information about endogenous factors and their
+ relationship to augmented periods.
+ bounds_distance: Value to pin shock standard deviations to in
+ carry-forward augmented periods.
+
+ Returns:
+ List of constraint objects.
+
+ """
+ constraints: list[om.constraints.Constraint] = []
+ for f, factor in enumerate(labels.latent_factors):
+ tname = labels.transition_names[f]
+ if tname == "constant":
+ continue
+ # We are restricting transitions and shocks, not measurements. So this might
+ # look counterintuitive...
+ aug_period_meas_type_to_constrain = (
+ MeasurementType.STATES
+ if endogenous_factors_info.factor_info[factor].is_state
+ else MeasurementType.ENDOGENOUS_FACTORS
+ )
+ aug_period_meas_types = (
+ endogenous_factors_info.aug_periods_to_aug_period_meas_types
+ )
+ aug_periods_to_constrain = [
+ k
+ for k, v in aug_period_meas_types.items()
+ if v == aug_period_meas_type_to_constrain
+ ]
+ # The last entry of `aug_periods_to_constrain` is the aug-period
+ # half of the last calendar period for this factor's meas-type.
+ # `get_transition_index_tuples` stops at `aug_periods[:-2]` when
+ # endogenous factors are present (or `[:-1]` otherwise), so the
+ # params index has no transition entries at that final aug-period
+ # for any factor. Emitting identity constraints there would target
+ # locs that don't exist and trip the optimagic selector. The
+ # shock-sds loop below already uses `[:-1]` for the same reason
+ # — keep them symmetric.
+ for aug_period in aug_periods_to_constrain[:-1]:
+ if func := getattr(t_f_module, f"identity_constraints_{tname}", False):
+ constraints += func( # ty: ignore[call-non-callable]
+ factor=factor,
+ aug_period=aug_period,
+ all_factors=labels.all_factors,
+ )
+ for aug_period in aug_periods_to_constrain[:-1]:
+ loc = ("shock_sds", aug_period, factor, "-")
+ constraints.append(
+ FixedConstraintWithValue(
+ loc=loc,
+ value=bounds_distance,
+ )
+ )
+
+ control_function = endogenous_factors_info.control_function
+ if control_function is not None:
+ # The control-function loading (kappa) only acts where a target factor's
+ # production transition runs. On the target's carry-forward aug periods the
+ # base transition is pinned to identity, so kappa must be pinned to 0 there
+ # too (otherwise kappa * cf corrupts the carried-forward state). Targets are
+ # state factors, so their carry-forward periods are the STATES aug periods,
+ # truncated by [:-1] for the same index-range reason as the loops above.
+ aug_period_meas_types = (
+ endogenous_factors_info.aug_periods_to_aug_period_meas_types
+ )
+ carry_forward_aug_periods = [
+ k for k, v in aug_period_meas_types.items() if v == MeasurementType.STATES
+ ][:-1]
+ for target in control_function.targets:
+ for aug_period in carry_forward_aug_periods:
+ for term in control_function.kappa_terms[target]:
+ constraints.append(
+ FixedConstraintWithValue(
+ loc=("kappa", aug_period, target, term),
+ value=0.0,
+ )
+ )
+
+ constraints.extend(
+ _get_instrument_exclusion_constraints(
+ labels=labels,
+ control_function=control_function,
+ aug_period_meas_types=aug_period_meas_types,
+ )
+ )
+
+ return constraints
+
+
+def enforce_fixed_constraints(
+ params_template: pd.DataFrame,
+ constraints: list[om.constraints.Constraint],
+) -> pd.DataFrame:
+ """Enforce fixed constraints on params_template.
+
+ For fixed constraints, we also set the lower and upper bounds to the fixed value.
+ This means that any robust bounds will be overridden for fixed parameters.
+
+ Args:
+ params_template: see :ref:`params_df`.
+ constraints: list of optimagic constraint objects.
+
+ Returns:
+ pd.DataFrame: modified copy of params_template
+ """
+ params = params_template.copy()
+ with warnings.catch_warnings():
+ warnings.filterwarnings(
+ "ignore",
+ message="indexing past lexsort depth may impact performance.",
+ )
+ for constraint in constraints:
+ if isinstance(constraint, FixedConstraintWithValue):
+ params.loc[constraint.loc, "value"] = constraint.value
+
+ # Setting via loc may expand the index, so reduce to the original index
+ return params.loc[params_template.index].astype(float)
diff --git a/src/skillmodels/common/control_function.py b/src/skillmodels/common/control_function.py
new file mode 100644
index 00000000..45aa44e8
--- /dev/null
+++ b/src/skillmodels/common/control_function.py
@@ -0,0 +1,266 @@
+"""Construction of the control-function (cf) nodes for the CHS transition DAG.
+
+The first-class control-function correction adds three kinds of synthetic node
+to the per-period transition DAG built in `process_model._get_transition_info`:
+
+1. a deterministic, contemporaneous first-stage prediction
+ `E[ln I_t | theta_t, Y_t]` for the endogenous investment factor,
+2. the residual `cf_t = ln I_t - E[ln I_t | theta_t, Y_t]`, and
+3. for each target production factor, the additive `sum_k kappa_k * cf_term_k`
+ term grafted onto the factor's transition output.
+
+All nodes operate on the same period-`t` anchored sigma-point `states` row that
+the production transitions already consume, which is what makes `cf` a genuine
+same-period residual. The functions here are pure builders returning the node
+callables; the wiring into the DAG lives in `process_model`.
+"""
+
+from collections.abc import Callable, Iterator, Mapping, Sequence
+
+import jax.numpy as jnp
+from jax import Array
+
+
+def build_prediction_node(
+ beta_key: str,
+ predictor_positions: Sequence[int],
+) -> Callable[[Array, Mapping[str, Array]], Array]:
+ """Return the contemporaneous first-stage prediction node.
+
+ The node reads the period-`t` anchored `states` row and the reserved
+ first-stage coefficient vector `params[beta_key]` (ordered as the
+ predictors then a trailing constant) and returns `x @ betas`.
+
+ Args:
+ beta_key: Reserved transition-coeffs key holding the first-stage betas.
+ predictor_positions: Positions of the predictor/instrument factors in
+ the `states` vector, in the same order as the first-stage betas.
+
+ Returns:
+ A node `(states, params) -> prediction`.
+
+ """
+ pos = jnp.array(tuple(predictor_positions), dtype=int)
+
+ def prediction(states: Array, params: Mapping[str, Array]) -> Array:
+ betas = params[beta_key]
+ x = jnp.concatenate([states[pos], jnp.array([1.0])])
+ return jnp.dot(x, betas)
+
+ return prediction
+
+
+def compute_investment_residual_sds(
+ investment: Array,
+ predictors: Array,
+ betas: Array,
+) -> Array:
+ """Report SD(eta_I) per period: the first-stage residual's cross-sectional SD.
+
+ A derived diagnostic, not a free MLE parameter. `eta_{I,t} = ln I_t -
+ E[ln I_t | theta_t, Y_t]` and this returns its standard deviation over
+ observations for each period, mirroring the AMN first-stage residual SD. The
+ caller supplies the (filtered or simulated) investment values and predictor
+ panel and the estimated first-stage coefficients.
+
+ Args:
+ investment: Shape `(n_obs, n_periods)`. The investment factor values.
+ predictors: Shape `(n_obs, n_periods, n_predictors)`. The first-stage
+ predictors and instruments, in the coefficient order.
+ betas: Shape `(n_periods, n_predictors + 1)`. First-stage coefficients
+ with the constant last.
+
+ Returns:
+ Shape `(n_periods,)` with SD(eta_I) for each period.
+
+ """
+ ones = jnp.ones((*predictors.shape[:2], 1))
+ design = jnp.concatenate([predictors, ones], axis=-1)
+ prediction = jnp.einsum("opk,pk->op", design, betas)
+ return jnp.std(investment - prediction, axis=0)
+
+
+def build_cf_node(inv_pos: int) -> Callable[[Array, Array], Array]:
+ """Return the residual node `cf = ln I_t - prediction`.
+
+ Args:
+ inv_pos: Position of the investment factor in the `states` vector.
+
+ Returns:
+ A node `(states, prediction) -> cf`.
+
+ """
+
+ def cf(states: Array, prediction: Array) -> Array:
+ return states[inv_pos] - prediction
+
+ return cf
+
+
+def build_kappa_term_evaluators(
+ kappa_terms: Sequence[str],
+ factor_positions: Mapping[str, int],
+) -> list[Callable[[Array, Array], Array]]:
+ """Return one evaluator per kappa term.
+
+ Each evaluator maps `(cf, states) -> term value`: `"cf"` -> `cf`,
+ `"cf ** 2"` -> `cf ** 2`, and `"cf * "` -> `cf * states[pos]`.
+
+ Args:
+ kappa_terms: The cf regressor names for one target factor.
+ factor_positions: Positions of factors in the `states` vector, used to
+ resolve interaction terms.
+
+ Returns:
+ Evaluators aligned with `kappa_terms`.
+
+ Raises:
+ ValueError: If a kappa term is not one of the supported forms.
+
+ """
+ return [_make_monomial_evaluator(term, factor_positions) for term in kappa_terms]
+
+
+def _parse_kappa_term(
+ term: str,
+ factor_positions: Mapping[str, int],
+) -> tuple[int, tuple[tuple[int, int], ...]]:
+ """Parse a kappa monomial into its cf power and `(position, power)` factors.
+
+ A kappa term is a monomial `cf ** a * factor_1 ** b_1 * ...` written with the
+ same spacing as the built-in transition parameter names (`" * "` between
+ atoms, `" ** "` for powers, a bare name for power 1). Returns the cf power
+ (which must be at least one) and the `(states position, power)` pairs.
+ """
+ cf_power = 0
+ factor_powers: list[tuple[int, int]] = []
+ for atom in term.split(" * "):
+ if atom == "cf":
+ cf_power += 1
+ elif atom.startswith("cf ** "):
+ cf_power += int(atom.removeprefix("cf ** "))
+ elif " ** " in atom:
+ factor, power = atom.split(" ** ")
+ factor_powers.append((factor_positions[factor], int(power)))
+ else:
+ factor_powers.append((factor_positions[atom], 1))
+ if cf_power == 0:
+ msg = (
+ f"Kappa term {term!r} must include cf (e.g. 'cf', 'cf ** 2', "
+ "'cf * factor', 'cf ** 2 * factor_1 * factor_2')."
+ )
+ raise ValueError(msg)
+ return cf_power, tuple(factor_powers)
+
+
+def _make_monomial_evaluator(
+ term: str,
+ factor_positions: Mapping[str, int],
+) -> Callable[[Array, Array], Array]:
+ cf_power, factor_powers = _parse_kappa_term(term, factor_positions)
+
+ def evaluator(cf: Array, states: Array) -> Array:
+ result = cf**cf_power
+ for position, power in factor_powers:
+ result = result * states[position] ** power
+ return result
+
+ return evaluator
+
+
+def generate_kappa_terms(
+ factors: Sequence[str],
+ max_degree: int,
+ max_cf_power: int | None = None,
+) -> tuple[str, ...]:
+ """Generate the complete cf-interaction basis up to a total degree.
+
+ Every monomial `cf ** a * prod_i factor_i ** b_i` with `a >= 1`, `b_i >= 0`
+ and `a + sum_i b_i <= max_degree` (optionally capping the cf power at
+ `max_cf_power`). At `max_degree=1` this is just `("cf",)`; at `max_degree=2`
+ over two factors it is the translog set `cf, cf * f1, cf * f2, cf ** 2`.
+ Pass the result as a target's `kappa_terms` and pin unwanted coefficients to
+ zero with an optimagic constraint.
+
+ Args:
+ factors: The state factors that interact with cf.
+ max_degree: Maximum total degree of a monomial (cf power plus factor
+ powers).
+ max_cf_power: Optional cap on the cf power. Defaults to `max_degree`.
+
+ Returns:
+ The kappa term names, in ascending degree order.
+
+ """
+ factors = tuple(factors)
+ cap = max_degree if max_cf_power is None else min(max_cf_power, max_degree)
+ terms: list[str] = []
+ for cf_power in range(1, cap + 1):
+ for factor_powers in _bounded_power_tuples(len(factors), max_degree - cf_power):
+ terms.append(_monomial_name(cf_power, factor_powers, factors))
+ return tuple(terms)
+
+
+def _bounded_power_tuples(n_factors: int, total: int) -> Iterator[tuple[int, ...]]:
+ """Yield non-negative integer tuples of length `n_factors` summing to <= total."""
+ if n_factors == 0:
+ yield ()
+ return
+ for first in range(total + 1):
+ for rest in _bounded_power_tuples(n_factors - 1, total - first):
+ yield (first, *rest)
+
+
+def _monomial_name(
+ cf_power: int,
+ factor_powers: Sequence[int],
+ factors: Sequence[str],
+) -> str:
+ parts = ["cf" if cf_power == 1 else f"cf ** {cf_power}"]
+ for factor, power in zip(factors, factor_powers, strict=True):
+ if power == 1:
+ parts.append(factor)
+ elif power >= 2:
+ parts.append(f"{factor} ** {power}")
+ return " * ".join(parts)
+
+
+def build_kappa_addition_node(
+ kappa_key: str,
+ kappa_evaluators: Sequence[Callable[[Array, Array], Array]],
+) -> Callable[[Array, Mapping[str, Array], Array, Array], Array]:
+ """Add `sum_k kappa_k * cf_term_k` to a target factor's base output.
+
+ Kappa coefficients live in their own transition-coeffs key (a separate
+ `kappa` params category), so the base production node is left completely
+ untouched: its arguments, parameter layout, and DAG dependencies are
+ unchanged, which keeps both built-in (positional, constant-last) and custom
+ (named-factor) transitions working. The kappa contribution is added to the
+ scalar base output, outside any translog/CES aggregator.
+
+ Args:
+ kappa_key: The target's key into the transition-coeffs dict holding its
+ period-sliced kappa coefficients (aligned with `kappa_evaluators`).
+ kappa_evaluators: One evaluator per kappa term (see
+ `build_kappa_term_evaluators`).
+
+ Returns:
+ A node `(base_value, params, cf, states) -> next state`. The first
+ argument is the base factor transition's output; the caller renames it
+ to the base node's name when wiring the DAG.
+
+ """
+
+ def add_kappa(
+ base_value: Array,
+ params: Mapping[str, Array],
+ cf: Array,
+ states: Array,
+ ) -> Array:
+ kappa = params[kappa_key]
+ result = base_value
+ for coefficient, evaluator in zip(kappa, kappa_evaluators, strict=True):
+ result = result + coefficient * evaluator(cf, states)
+ return result
+
+ return add_kappa
diff --git a/src/skillmodels/correlation_heatmap.py b/src/skillmodels/common/correlation_heatmap.py
similarity index 97%
rename from src/skillmodels/correlation_heatmap.py
rename to src/skillmodels/common/correlation_heatmap.py
index be0f6aff..9225e4b0 100644
--- a/src/skillmodels/correlation_heatmap.py
+++ b/src/skillmodels/common/correlation_heatmap.py
@@ -4,15 +4,18 @@
import numpy as np
import pandas as pd
+from beartype import beartype
from numpy.typing import NDArray
from plotly import graph_objects as go
-from skillmodels.model_spec import ModelSpec
-from skillmodels.process_data import pre_process_data
-from skillmodels.process_model import process_model
-from skillmodels.types import ProcessedModel
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_data import pre_process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import ProcessedModel
+@beartype(conf=DIAGNOSTICS_CONF)
def plot_correlation_heatmap(
corr: pd.DataFrame,
heatmap_kwargs: dict[str, Any] | None = None,
@@ -132,6 +135,7 @@ def plot_correlation_heatmap(
return fig
+@beartype(conf=DIAGNOSTICS_CONF)
def get_measurements_corr(
data: pd.DataFrame,
model_spec: ModelSpec,
@@ -175,6 +179,7 @@ def get_measurements_corr(
return df.corr()
+@beartype(conf=DIAGNOSTICS_CONF)
def get_quasi_scores_corr(
data: pd.DataFrame,
model_spec: ModelSpec,
@@ -221,6 +226,7 @@ def get_quasi_scores_corr(
return df.corr()
+@beartype(conf=DIAGNOSTICS_CONF)
def get_scores_corr(
data: pd.DataFrame,
params: pd.DataFrame,
@@ -786,10 +792,15 @@ def _get_factor_scores_data_for_multiple_periods(
def _process_factors(
- model: ProcessedModel,
+ model: Any, # noqa: ANN401
factors: list[str] | tuple[str, ...] | str | None,
) -> tuple[tuple[str, ...], tuple[str, ...]]:
- """Process factors to get a tuple of tuples."""
+ """Process factors to get a tuple of tuples.
+
+ `model` is annotated `Any` because tests pass minimal duck-typed
+ namespaces that only expose `.labels.latent_factors` /
+ `.labels.observed_factors`. Production callers pass a `ProcessedModel`.
+ """
if not factors:
latent_factors = model.labels.latent_factors
observed_factors = model.labels.observed_factors
diff --git a/src/skillmodels/decorators.py b/src/skillmodels/common/decorators.py
similarity index 100%
rename from src/skillmodels/decorators.py
rename to src/skillmodels/common/decorators.py
diff --git a/src/skillmodels/diagnostic_plots.py b/src/skillmodels/common/diagnostic_plots.py
similarity index 80%
rename from src/skillmodels/diagnostic_plots.py
rename to src/skillmodels/common/diagnostic_plots.py
index 21d45634..66fb8e84 100644
--- a/src/skillmodels/diagnostic_plots.py
+++ b/src/skillmodels/common/diagnostic_plots.py
@@ -5,47 +5,48 @@
import numpy as np
import pandas as pd
import plotly.graph_objects as go
+from beartype import beartype
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.model_spec import ModelSpec
-from skillmodels.process_model import process_model
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+@beartype(conf=DIAGNOSTICS_CONF)
def plot_residual_boxplots(
model_spec: ModelSpec,
- data: pd.DataFrame,
- params: pd.DataFrame,
- period: int | None = None,
*,
+ residuals: pd.DataFrame,
+ period: int | None = None,
show_reference_line: bool = True,
layout_kwargs: dict[str, Any] | None = None,
) -> go.Figure | dict[int, go.Figure]:
"""Create boxplots of measurement residuals by measurement variable.
- Residuals are computed as the difference between observed measurements and
- their predicted values based on filtered states.
+ Residuals are the difference between observed measurements and their
+ predicted values based on filtered latent states. The caller is
+ responsible for producing this DataFrame from their estimator's
+ debug output (e.g. CHS's
+ ``get_maximization_inputs(...)["debug_loglike"](params)["residuals"]``).
Args:
- model_spec: The model specification.
- data: Empirical dataset used to estimate the model.
- params: Estimated model parameters.
- period: If provided, create a single figure for that period. If None,
- returns a dictionary mapping periods to figures.
+ model_spec: The model specification, used to map ``aug_period``
+ back to user-facing ``period``.
+ residuals: DataFrame with at minimum the columns ``aug_period``,
+ ``measurement``, and ``residual``.
+ period: If provided, create a single figure for that period. If
+ ``None``, returns a dictionary mapping periods to figures.
show_reference_line: Whether to show a horizontal reference line at zero.
layout_kwargs: Dictionary of keyword arguments for Plotly layout.
- Returns:
+ Return:
If period is specified, returns a single go.Figure. Otherwise, returns
a dictionary mapping period numbers to figures.
"""
- max_inputs = get_maximization_inputs(model_spec=model_spec, data=data)
- # debug_loglike already returns processed debug data
- processed_debug = max_inputs["debug_loglike"](params)
-
processed_model = process_model(model_spec)
- residuals_df = processed_debug["residuals"]
+ residuals_df = residuals
update_info = processed_model.update_info
# Get period column name
@@ -92,7 +93,7 @@ def plot_residual_boxplots(
def _create_residual_boxplot_for_period(
residuals_df: pd.DataFrame,
- period: int,
+ period: int | np.integer,
period_col: str,
*,
show_reference_line: bool,
@@ -135,36 +136,37 @@ def _create_residual_boxplot_for_period(
return fig
+@beartype(conf=DIAGNOSTICS_CONF)
def plot_likelihood_contributions(
model_spec: ModelSpec,
- data: pd.DataFrame,
- params: pd.DataFrame,
- period: int | None = None,
*,
+ contributions: pd.DataFrame,
+ period: int | None = None,
layout_kwargs: dict[str, Any] | None = None,
) -> go.Figure | dict[int, go.Figure]:
"""Create boxplots of log-likelihood contributions by measurement.
+ The caller is responsible for producing the contributions DataFrame
+ from their estimator's debug output (e.g. CHS's
+ ``get_maximization_inputs(...)["debug_loglike"](params)["all_contributions"]``).
+
Args:
- model_spec: The model specification.
- data: Empirical dataset used to estimate the model.
- params: Estimated model parameters.
- period: If provided, create a single figure for that period. If None,
- returns a dictionary mapping periods to figures.
+ model_spec: The model specification, used to map ``aug_period``
+ back to user-facing ``period``.
+ contributions: DataFrame with at minimum the columns
+ ``aug_period``, ``measurement``, and ``contribution``.
+ period: If provided, create a single figure for that period. If
+ ``None``, returns a dictionary mapping periods to figures.
layout_kwargs: Dictionary of keyword arguments for Plotly layout.
- Returns:
+ Return:
If period is specified, returns a single go.Figure. Otherwise, returns
a dictionary mapping period numbers to figures.
"""
- max_inputs = get_maximization_inputs(model_spec=model_spec, data=data)
- # debug_loglike already returns processed debug data
- processed_debug = max_inputs["debug_loglike"](params)
-
processed_model = process_model(model_spec)
- contributions_df = processed_debug["all_contributions"]
+ contributions_df = contributions
update_info = processed_model.update_info
period_col = "aug_period"
@@ -208,7 +210,7 @@ def plot_likelihood_contributions(
def _create_likelihood_boxplot_for_period(
contributions_df: pd.DataFrame,
- period: int,
+ period: int | np.integer,
period_col: str,
layout_kwargs: dict[str, Any] | None,
) -> go.Figure:
diff --git a/src/skillmodels/common/estimation.py b/src/skillmodels/common/estimation.py
new file mode 100644
index 00000000..57d9c54f
--- /dev/null
+++ b/src/skillmodels/common/estimation.py
@@ -0,0 +1,64 @@
+"""Cross-estimator structural Protocols.
+
+The three estimators (CHS, AF, AMN) each return a rich, concrete result
+dataclass with estimator-specific extras (`period_results`, `stages`,
+`optimize_result`, ...). `CommonEstimationResult` and
+`CommonEstimationOptions` capture the *minimal* surface every consumer can
+rely on regardless of which estimator produced the object, so harmonised
+post-estimation code (state extraction, plotting, tabulation) can be written
+once. They are `runtime_checkable` Protocols, not base classes: the concrete
+dataclasses conform structurally and a single conformance test guards the
+contract.
+"""
+
+from collections.abc import Mapping
+from typing import Any, Protocol, runtime_checkable
+
+import pandas as pd
+
+from skillmodels.common.model_spec import ModelSpec
+
+
+@runtime_checkable
+class CommonEstimationResult(Protocol):
+ """Minimal result surface shared by every estimator's result object.
+
+ Invariant: **exactly one** of `loglikelihood` / `md_criterion` is
+ non-`None`. Likelihood-based estimators (CHS, AF) fill `loglikelihood`
+ and leave `md_criterion` `None`; the minimum-distance estimator (AMN)
+ does the reverse. This lets a caller branch on *which* objective was
+ optimised without importing the concrete result types.
+ """
+
+ model_spec: ModelSpec
+ """The `ModelSpec` that was estimated."""
+
+ params: pd.DataFrame
+ """Estimated parameters with the standard 4-level MultiIndex
+ (category, period, name1, name2) and a `"value"` column."""
+
+ success: bool
+ """Whether the estimator's optimisation converged."""
+
+ loglikelihood: float | None
+ """Maximised log-likelihood (CHS, AF); `None` for AMN."""
+
+ md_criterion: float | None
+ """Minimum-distance criterion at the optimum (AMN); `None` for CHS/AF."""
+
+
+@runtime_checkable
+class CommonEstimationOptions(Protocol):
+ """Minimal options surface shared by every estimator's options object.
+
+ Every estimator ultimately drives `optimagic`; these two fields are the
+ universal optimiser knobs. Estimator-specific tuning (Halton counts, EM
+ restarts, start-value strategy, ...) lives on the concrete options
+ dataclasses and is intentionally absent here.
+ """
+
+ optimizer_algorithm: str
+ """`optimagic` algorithm name passed to `minimize`/`maximize`."""
+
+ optimizer_options: Mapping[str, Any]
+ """Extra keyword arguments forwarded to the `optimagic` call."""
diff --git a/src/skillmodels/common/fixed_constraint.py b/src/skillmodels/common/fixed_constraint.py
new file mode 100644
index 00000000..0296f7d2
--- /dev/null
+++ b/src/skillmodels/common/fixed_constraint.py
@@ -0,0 +1,46 @@
+"""`FixedConstraintWithValue`: leaf data type used across constraint code.
+
+Lives in its own module so that low-level callers (`transition_functions`,
+`af/params`, etc.) can import it without triggering the heavier
+`skillmodels.common.constraints` module — `constraints.py` imports
+`transition_functions`, which would otherwise force a circular import or
+a `TYPE_CHECKING` guard that beartype.claw cannot resolve at decoration
+time.
+"""
+
+import functools
+from dataclasses import dataclass
+
+import optimagic as om
+import pandas as pd
+
+from skillmodels.common.selector import select_by_loc
+
+
+@dataclass(frozen=True)
+class FixedConstraintWithValue(om.FixedConstraint):
+ """Fixed constraint that carries the target value and parameter location.
+
+ `om.FixedConstraint` fixes parameters at their start values but does not carry a
+ target value. This wrapper adds `loc` (the parameter location in the params
+ DataFrame) and `value` (the value to set before optimization).
+ """
+
+ loc: pd.MultiIndex | tuple | str | None = None
+ """Parameter location in the params DataFrame."""
+ value: float | None = None
+ """Value to enforce on the parameter."""
+
+ def __post_init__(self) -> None:
+ """Validate that `loc` and `value` are not None and derive `selector`."""
+ if self.loc is None:
+ msg = "loc must not be None"
+ raise TypeError(msg)
+ if self.value is None:
+ msg = "value must not be None"
+ raise TypeError(msg)
+ object.__setattr__(
+ self,
+ "selector",
+ functools.partial(select_by_loc, loc=self.loc),
+ )
diff --git a/src/skillmodels/common/identification.py b/src/skillmodels/common/identification.py
new file mode 100644
index 00000000..b9f80c17
--- /dev/null
+++ b/src/skillmodels/common/identification.py
@@ -0,0 +1,196 @@
+"""Transition-aware identification anchor diagnostics (audit F6/F7/F8).
+
+The initial-period latent distribution is not produced by any transition, so
+its affine orbit (scale + location) must be pinned directly. `check_identification`
+verifies that, dispatching on each factor's transition type:
+
+Every factor with an initial distribution needs BOTH a loading (scale) anchor and
+an intercept (location) anchor at the initial period, regardless of transition.
+The CES simplex `sum_i gamma_i = 1` does NOT supply the initial location anchor
+(Pro F1: plain CES obeys f(x+c,i+c)=f(x,i)+c, so a common shift of all latent
+inputs leaves observables unchanged while preserving the simplex); it only
+replaces the *cross-period* skills-location alternative, which this period-0
+precheck does not police.
+
+An anchor may come from a `Normalizations` map, a `fixed_params` pin, or a
+`select_by_loc` equality constraint that is connected to a numerically fixed
+member. Periods t>0 are intentionally not checked here: an unrestricted
+transition transforms along with a later latent's affine orbit, so verifying
+those needs a full transition-aware diagnostic (a larger, separate piece). This
+is therefore an INITIAL-ANCHOR PRECHECK, not a complete identification proof: an
+empty result means `initial_anchor_ok`, with later identification unverified.
+
+This is the estimator-agnostic core used by `validate_af_model`. It is exposed
+for CHS/common tooling but is deliberately NOT wired into the default
+`process_model` path, so it does not gate the application PyTask pipelines.
+
+KNOWN LIMITATION -- restricted-CES scale is per-COMPONENT, not per-factor (Pro
+F2). For a restricted-CES skill factor, the production restrictions identify the
+relative skill/investment scales, so only ONE primitive scale anchor is needed
+across the connected skill-investment system (on lambda_theta,0,1 OR
+lambda_I,0,1); a second loading pin is then a testable restriction, not a
+normalization. This precheck does not build the production-graph connected
+components: it checks each factor's OWN initial loading anchor. In the standard
+setup -- investment is endogenous with `has_initial_distribution=False`, so it is
+skipped here -- this happens to require exactly one scale anchor (on skills),
+which is correct. But it does NOT flag an additional lambda_I,0,1 pin as an
+over-normalizing testable restriction, and for a CES model where the input factor
+DOES carry an initial distribution it would over-require (one anchor per factor).
+The connected-component scale accounting belongs to the full identification
+diagnostic.
+"""
+
+import math
+
+import optimagic as om
+import pandas as pd
+
+from skillmodels.common.constraints import _equality_constraint_loc
+from skillmodels.common.model_spec import ModelSpec
+
+
+def _is_scale_anchor_value(value: float) -> bool:
+ """A loading (scale) anchor must be finite and nonzero (Pro F1).
+
+ A zero loading is invariant to every rescaling of the latent factor and so
+ cannot pin its scale; non-finite values do not define a valid model.
+ """
+ return math.isfinite(value) and value != 0.0
+
+
+def _is_location_anchor_value(value: float) -> bool:
+ """An intercept (location) anchor must be finite (Pro F1)."""
+ return math.isfinite(value)
+
+
+def _normalized_keys(model_spec: ModelSpec) -> set[tuple[object, ...]]:
+ """Return the param keys pinned by `Normalizations` across all factor-periods.
+
+ Loadings map to `("loadings", period, meas, factor)` and intercepts to
+ `("controls", period, meas, "constant")` -- the conventions used by the
+ params MultiIndex.
+ """
+ keys: set[tuple[object, ...]] = set()
+ for factor, spec in model_spec.factors.items():
+ norms = spec.normalizations
+ if norms is None:
+ continue
+ for period, loadings in enumerate(norms.loadings or ()):
+ for meas, value in loadings.items():
+ if _is_scale_anchor_value(value):
+ keys.add(("loadings", period, meas, factor))
+ for period, intercepts in enumerate(norms.intercepts or ()):
+ for meas, value in intercepts.items():
+ if _is_location_anchor_value(value):
+ keys.add(("controls", period, meas, "constant"))
+ return keys
+
+
+def _valid_fixed_keys(fixed_params: pd.DataFrame | None) -> set[tuple[object, ...]]:
+ """Return the `fixed_params` keys that are VALID anchors by value (Pro F1).
+
+ Loading pins count only when finite and nonzero; intercept (controls) pins
+ count when finite; other categories pass through unchecked (they are not
+ consulted as period-0 anchors).
+ """
+ keys: set[tuple[object, ...]] = set()
+ if fixed_params is None:
+ return keys
+ values = fixed_params["value"].to_numpy()
+ for idx, value in zip(fixed_params.index, values, strict=True):
+ category = idx[0]
+ if category == "loadings":
+ if _is_scale_anchor_value(float(value)):
+ keys.add(tuple(idx))
+ elif category == "controls":
+ if _is_location_anchor_value(float(value)):
+ keys.add(tuple(idx))
+ else:
+ keys.add(tuple(idx))
+ return keys
+
+
+def _equality_closure(
+ constraints: list[om.constraints.Constraint] | None,
+ anchor_sources: set[tuple[object, ...]],
+) -> set[tuple[object, ...]]:
+ """Propagate anchors transitively through equality groups (Pro F2).
+
+ A `select_by_loc` equality group ties its members equal. A group fixes its
+ members to a number only when it is connected -- possibly through a chain of
+ groups -- to a numerically fixed or normalized member. Iterate to a fixed
+ point so that A fixed, A=B, B=C all anchor C regardless of how the single
+ logical component is split across constraints.
+ """
+ groups = [
+ {tuple(idx) for idx in loc}
+ for constraint in constraints or []
+ if (loc := _equality_constraint_loc(constraint)) is not None
+ ]
+ anchored = set(anchor_sources)
+ changed = True
+ while changed:
+ changed = False
+ for group in groups:
+ if group & anchored and not group <= anchored:
+ anchored |= group
+ changed = True
+ return anchored
+
+
+def check_identification(
+ model_spec: ModelSpec,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+) -> list[str]:
+ """Return problems with the initial-period affine anchoring of each factor.
+
+ Empty list means every factor with an initial distribution has the anchors
+ its transition requires (see the module docstring for the per-transition
+ rules). Factors whose `normalizations is None` are skipped -- that is a
+ separate, estimator-specific error.
+ """
+ # Anchor sources are the VALID (by-value) fixed pins and normalizations;
+ # equality groups then transfer those anchors transitively.
+ anchor_sources = _valid_fixed_keys(fixed_params) | _normalized_keys(model_spec)
+ anchored = _equality_closure(constraints, anchor_sources)
+ problems: list[str] = []
+ for factor_name, spec in model_spec.factors.items():
+ norms = spec.normalizations
+ if norms is None:
+ continue
+ if not spec.has_initial_distribution:
+ continue
+ if len(spec.measurements) == 0 or len(spec.measurements[0]) == 0:
+ continue
+ measures = spec.measurements[0]
+
+ # Every factor with an initial distribution needs an absolute initial
+ # location anchor mu_theta,0,1=0 (the CES simplex does NOT supply it --
+ # f(x+c,i+c)=f(x,i)+c leaves a common-shift orbit) and a scale anchor.
+ # Both must be VALID by value (Pro F1) -- normalizations and fixed pins
+ # are filtered above, so a plain set-membership test suffices here.
+ has_loading = any(
+ ("loadings", 0, meas, factor_name) in anchored for meas in measures
+ )
+ has_intercept = any(
+ ("controls", 0, meas, "constant") in anchored for meas in measures
+ )
+
+ if not has_loading:
+ problems.append(
+ f"Factor '{factor_name}' period 0: no loading normalization "
+ f"(scale anchor). The initial distribution is not produced by a "
+ f"transition, so its scale must be pinned directly. Add a "
+ f"loading=1 normalization for one period-0 measurement, a "
+ f"`fixed_params` loading pin, or an equality constraint."
+ )
+ if not has_intercept:
+ problems.append(
+ f"Factor '{factor_name}' period 0: no intercept normalization "
+ f"(location anchor). The initial distribution is not produced by "
+ f"a transition, so its location must be pinned directly. Add an "
+ f"intercept=0 normalization for one period-0 measurement, a "
+ f"`fixed_params` intercept pin, or an equality constraint."
+ )
+ return problems
diff --git a/src/skillmodels/common/individual_states.py b/src/skillmodels/common/individual_states.py
new file mode 100644
index 00000000..9d073c04
--- /dev/null
+++ b/src/skillmodels/common/individual_states.py
@@ -0,0 +1,150 @@
+"""Cross-estimator extraction of per-individual latent states.
+
+Replaces the old `get_filtered_states` (the "filtered" name was a Kalman
+term that did not fit AF/AMN). Two entry points:
+
+* `get_individual_states(data, result)` dispatches on the estimation
+ result type and is the harmonised, recommended call.
+* `get_individual_states_from_params(model_spec, data, params)` is the
+ CHS-only Kalman-from-raw-parameters escape hatch (AF/AMN need their
+ result machinery, so there is no raw-params path for them).
+"""
+
+from typing import Any
+
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+
+# Runtime imports (not `TYPE_CHECKING`-guarded) so the beartype perimeter
+# can resolve the union annotation without a forward-ref string. The
+# `types` modules are negligible-cost; AMN's pulls sklearn lazily.
+from skillmodels.af.types import AFEstimationResult
+from skillmodels.amn.types import AMNEstimationResult
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.types import CHSEstimationResult
+from skillmodels.common.anchoring import anchor_states_df
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.state_ranges import create_state_ranges
+
+
+@beartype(conf=ESTIMATION_CONF)
+def get_individual_states(
+ data: pd.DataFrame,
+ result: CHSEstimationResult | AFEstimationResult | AMNEstimationResult,
+) -> dict[str, dict[str, Any]]:
+ """Compute per-individual latent state estimates from a fitted result.
+
+ Dispatches on the concrete result type; the `ModelSpec` and parameters
+ are read off `result`. For CHS this filters via the Kalman debug
+ likelihood; for AF it computes posterior means via Halton quadrature;
+ for AMN it computes mixture-Schur conditional posteriors of the latent
+ factors given the augmented measure vector.
+
+ Args:
+ data: Dataset in long format with MultiIndex (id, period).
+ result: A `CHSEstimationResult`, `AFEstimationResult`, or
+ `AMNEstimationResult`.
+
+ Return:
+ Nested dict. The return shape is **asymmetric** across estimators:
+
+ * CHS returns both `"anchored_states"` and `"unanchored_states"`.
+ * AF and AMN return `"unanchored_states"` only — neither anchors.
+
+ Each present key maps to `{"states": DataFrame, "state_ranges": ...}`.
+
+ """
+ if isinstance(result, AFEstimationResult):
+ from skillmodels.af.posterior_states import ( # noqa: PLC0415
+ get_af_posterior_states,
+ )
+
+ return get_af_posterior_states(
+ af_result=result,
+ model_spec=result.model_spec,
+ data=data,
+ )
+
+ if isinstance(result, AMNEstimationResult):
+ from skillmodels.amn.posterior_states import ( # noqa: PLC0415
+ get_amn_posterior_states,
+ )
+
+ return get_amn_posterior_states(
+ amn_result=result,
+ data=data,
+ )
+
+ return get_individual_states_from_params(
+ model_spec=result.model_spec,
+ data=data,
+ params=result.params,
+ )
+
+
+@beartype(conf=ESTIMATION_CONF)
+def get_individual_states_from_params(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ params: pd.DataFrame,
+) -> dict[str, dict[str, Any]]:
+ """Compute CHS filtered states directly from raw parameters.
+
+ The escape hatch behind `get_individual_states`'s CHS branch: it runs
+ the Kalman debug likelihood at `params` without needing a result
+ object. Inherently CHS-only — AF and AMN reconstruct states from their
+ result machinery, not from a flat parameter vector.
+
+ Args:
+ model_spec: Model specification.
+ data: Dataset in long format with MultiIndex (id, period).
+ params: Estimated parameter DataFrame (standard 4-level MultiIndex).
+
+ Return:
+ Dict with both `"anchored_states"` and `"unanchored_states"`, each
+ `{"states": DataFrame, "state_ranges": ...}`.
+
+ """
+ max_inputs = get_maximization_inputs(model_spec=model_spec, data=data)
+ params = params.loc[max_inputs["params_template"].index]
+ debug_loglike = max_inputs["debug_loglike"]
+ debug_data = debug_loglike(params)
+ unanchored_states_df = debug_data["filtered_states"]
+ processed_model = process_model(model_spec)
+
+ anchored_states_df = anchor_states_df(
+ states_df=unanchored_states_df,
+ model_spec=model_spec,
+ params=params,
+ use_aug_period=True,
+ )
+
+ # Map aug_period → period for the public API
+ ap_to_p = processed_model.labels.aug_periods_to_periods
+ for df in (anchored_states_df, unanchored_states_df):
+ df["period"] = df["aug_period"].map(ap_to_p)
+ anchored_states_df = anchored_states_df.drop(columns="aug_period")
+ unanchored_states_df = unanchored_states_df.drop(columns="aug_period")
+
+ anchored_ranges = create_state_ranges(
+ filtered_states=anchored_states_df,
+ factors=processed_model.labels.latent_factors,
+ )
+ unanchored_ranges = create_state_ranges(
+ filtered_states=unanchored_states_df,
+ factors=processed_model.labels.latent_factors,
+ )
+
+ return {
+ "anchored_states": {
+ "states": anchored_states_df,
+ "state_ranges": anchored_ranges,
+ },
+ "unanchored_states": {
+ "states": unanchored_states_df,
+ "state_ranges": unanchored_ranges,
+ },
+ }
diff --git a/src/skillmodels/model_spec.py b/src/skillmodels/common/model_spec.py
similarity index 53%
rename from src/skillmodels/model_spec.py
rename to src/skillmodels/common/model_spec.py
index 9959c2cd..2b20354b 100644
--- a/src/skillmodels/model_spec.py
+++ b/src/skillmodels/common/model_spec.py
@@ -11,13 +11,66 @@
from types import MappingProxyType
from typing import Any, Self
-from skillmodels.types import (
- EstimationOptions,
+from skillmodels._beartype_conf import MODEL_SPEC_CONF, beartype_init
+from skillmodels.common.types import (
Normalizations,
ensure_containers_are_immutable,
)
+@beartype_init(MODEL_SPEC_CONF)
+@dataclass(frozen=True)
+class CorrectionSpec:
+ """Control-function correction for an endogenous investment factor.
+
+ Declared on the endogenous investment `FactorSpec`. It makes the library
+ own the AF Section 3.5 / AMN eq. 7-8 control function: a contemporaneous
+ first-stage equation predicts the investment factor from the present state
+ factors and excluded observed instruments, and its residual `cf` enters
+ each target factor's production equation as an additive `kappa * cf` term.
+
+ The same specification is read by both the CHS (Kalman-MLE) and AMN
+ (simulate-and-regress) estimators, so the control function is configured in
+ exactly one place regardless of which estimator runs.
+ """
+
+ instruments: tuple[str, ...]
+ """Excluded observed factors entering the first-stage equation only and never
+ a production (target) equation, identifying `kappa`. Required (at least one);
+ auto-registered as observed factors by `ModelSpec.with_correction`."""
+ state_predictors: tuple[str, ...] = ()
+ """State factors entering the first-stage investment equation. Empty means
+ all state factors; per-period presence is then handled downstream."""
+ targets: tuple[str, ...] = ()
+ """State factors whose production equation receives the additive `kappa *
+ cf` term. Empty means all state factors."""
+ kappa_degree: int | None = None
+ """Degree of the `cf`-interaction polynomial applied to every target (1 =
+ linear `cf`, 2 = the translog basis). `None` resolves to degree 1. Mutually
+ exclusive with `kappa_terms`."""
+ kappa_terms: Mapping[str, tuple[str, ...]] | None = None
+ """Expert per-target override of the `cf` regressor names (e.g. `("cf",)` or
+ `("cf", "cf ** 2", "cf * health_mom")`). Mutually exclusive with
+ `kappa_degree`; `None` means expand `kappa_degree`."""
+
+ def __post_init__(self) -> None: # noqa: D105
+ if not self.instruments:
+ msg = (
+ "CorrectionSpec needs at least one excluded observed instrument; "
+ "otherwise the control-function residual is collinear with the "
+ "production inputs and kappa is unidentified."
+ )
+ raise ValueError(msg)
+ if self.kappa_degree is not None and self.kappa_terms is not None:
+ msg = "kappa_degree and kappa_terms are mutually exclusive; set one."
+ raise ValueError(msg)
+ if self.kappa_terms is not None:
+ object.__setattr__(
+ self, "kappa_terms", ensure_containers_are_immutable(self.kappa_terms)
+ )
+
+
+@beartype_init(MODEL_SPEC_CONF)
@dataclass(frozen=True)
class FactorSpec:
"""Specification for a single latent factor."""
@@ -28,10 +81,35 @@ class FactorSpec:
"""Identification normalizations for this factor."""
is_endogenous: bool = False
"""Whether this factor is endogenous."""
- is_correction: bool = False
- """Whether this factor is a correction factor."""
+ correction: CorrectionSpec | None = None
+ """Control-function correction declared on an endogenous investment factor.
+
+ When set (and the factor is endogenous), the library forms the deterministic
+ control-function residual `cf` and injects `kappa * cf` into each target
+ factor's production equation. `None` means no correction."""
transition_function: str | Callable | None = None
"""Transition function name (e.g. `"linear"`, `"log_ces"`) or a callable."""
+ has_production_shock: bool = True
+ """Whether transitions add a stochastic shock for this factor.
+
+ When `False`, the AF transition integrates the factor deterministically:
+ no shock SD parameter, no shock dimension in the joint Halton draw, and
+ the transition output is used as-is. Set this to `False` for
+ time-invariant factors (combined with an identity transition pinned via
+ `fixed_params`) to cut integration dimensionality.
+ """
+ has_initial_distribution: bool = True
+ """Whether this factor is drawn from the AF period-0 mixture distribution.
+
+ When `False`, the factor is not included in the initial joint mixture
+ (no mean / Cholesky entries for it) and is instead reconstructed
+ deterministically per Halton draw. Currently only supported in
+ conjunction with `is_endogenous=True`: the factor's period-0 value is
+ computed from its investment equation at period 0 plus an investment
+ shock, with investment-equation and shock parameters estimated as part
+ of the initial step. The transition function must not depend on the
+ factor's own lag.
+ """
def with_transition_function(self, func: str | Callable) -> Self:
"""Return a new FactorSpec with the given transition function."""
@@ -42,6 +120,7 @@ def with_normalizations(self, normalizations: Normalizations) -> Self:
return replace(self, normalizations=normalizations)
+@beartype_init(MODEL_SPEC_CONF)
@dataclass(frozen=True)
class AnchoringSpec:
"""Specification for anchoring latent factors to outcomes."""
@@ -63,6 +142,7 @@ def __post_init__(self) -> None: # noqa: D105
)
+@beartype_init(MODEL_SPEC_CONF)
@dataclass(frozen=True, init=False)
class ModelSpec:
"""Complete model specification.
@@ -79,8 +159,8 @@ class ModelSpec:
"""Stage mapping for transition functions."""
anchoring: AnchoringSpec | None = None
"""Anchoring specification."""
- estimation_options: EstimationOptions | None = None
- """Estimation tuning parameters."""
+ n_mixtures: int = 1
+ """Number of Gaussian-mixture components in the latent-factor distribution."""
def __init__(
self,
@@ -89,7 +169,7 @@ def __init__(
controls: tuple[str, ...] = (),
stagemap: tuple[int, ...] | None = None,
anchoring: AnchoringSpec | None = None,
- estimation_options: EstimationOptions | None = None,
+ n_mixtures: int = 1,
) -> None:
"""Create ModelSpec, wrapping factors dict in MappingProxyType."""
object.__setattr__(self, "_factors", ensure_containers_are_immutable(factors))
@@ -97,7 +177,7 @@ def __init__(
object.__setattr__(self, "controls", controls)
object.__setattr__(self, "stagemap", stagemap)
object.__setattr__(self, "anchoring", anchoring)
- object.__setattr__(self, "estimation_options", estimation_options)
+ object.__setattr__(self, "n_mixtures", n_mixtures)
@classmethod
def from_dict(cls, d: dict[str, Any]) -> Self:
@@ -105,14 +185,31 @@ def from_dict(cls, d: dict[str, Any]) -> Self:
Args:
d: A dictionary with keys like "factors", "observed_factors",
- "controls", "stagemap", "anchoring", "estimation_options".
+ "controls", "stagemap", "anchoring", "n_mixtures".
Returns:
A ModelSpec instance.
"""
factors = {}
+ auto_instruments: list[str] = []
for name, spec in d["factors"].items():
+ correction = None
+ if "correction" in spec:
+ cd = spec["correction"]
+ kt = cd.get("kappa_terms")
+ correction = CorrectionSpec(
+ instruments=tuple(cd["instruments"]),
+ state_predictors=tuple(cd.get("state_predictors", ())),
+ targets=tuple(cd.get("targets", ())),
+ kappa_degree=cd.get("kappa_degree"),
+ kappa_terms=(
+ {t: tuple(v) for t, v in kt.items()} if kt is not None else None
+ ),
+ )
+ auto_instruments.extend(
+ i for i in correction.instruments if i not in auto_instruments
+ )
normalizations = None
if "normalizations" in spec:
nd = spec["normalizations"]
@@ -127,27 +224,29 @@ def from_dict(cls, d: dict[str, Any]) -> Self:
measurements=tuple(tuple(m) for m in spec["measurements"]),
normalizations=normalizations,
is_endogenous=spec.get("is_endogenous", False),
- is_correction=spec.get("is_correction", False),
transition_function=spec.get("transition_function"),
+ has_production_shock=spec.get("has_production_shock", True),
+ has_initial_distribution=spec.get("has_initial_distribution", True),
+ correction=correction,
)
anchoring = None
if "anchoring" in d:
anchoring = AnchoringSpec(**d["anchoring"])
- estimation = None
- if "estimation_options" in d:
- estimation = EstimationOptions(**d["estimation_options"])
-
stagemap = d.get("stagemap")
+ # Auto-register control-function instruments as observed factors (deduped).
+ observed = tuple(d.get("observed_factors", []))
+ observed += tuple(i for i in auto_instruments if i not in observed)
+
return cls(
factors=factors,
- observed_factors=tuple(d.get("observed_factors", [])),
+ observed_factors=observed,
controls=tuple(d.get("controls", [])),
stagemap=tuple(stagemap) if stagemap is not None else None,
anchoring=anchoring,
- estimation_options=estimation,
+ n_mixtures=d.get("n_mixtures", 1),
)
@property
@@ -163,9 +262,7 @@ def _replace(self, **changes: Any) -> Self: # noqa: ANN401
controls=changes.get("controls", self.controls),
stagemap=changes.get("stagemap", self.stagemap),
anchoring=changes.get("anchoring", self.anchoring),
- estimation_options=changes.get(
- "estimation_options", self.estimation_options
- ),
+ n_mixtures=changes.get("n_mixtures", self.n_mixtures),
)
def with_transition_functions(
@@ -234,20 +331,49 @@ def with_added_observed_factors(
observed_factors=self.observed_factors + names,
)
- def with_estimation_options(
+ def without_correction(self) -> Self:
+ """Return a new ModelSpec with every `FactorSpec.correction` removed.
+
+ Useful to run an estimator that does not implement the control-function
+ correction (e.g. AF) on a spec authored for CHS.
+
+ Returns:
+ New ModelSpec with no control-function corrections.
+
+ """
+ new_factors = {
+ name: replace(spec, correction=None)
+ if spec.correction is not None
+ else spec
+ for name, spec in self.factors.items()
+ }
+ return self._replace(factors=new_factors)
+
+ def with_correction(
self,
- estimation_options: EstimationOptions,
+ factor_name: str,
+ correction: CorrectionSpec,
) -> Self:
- """Return a new ModelSpec with the given estimation options.
+ """Return a new ModelSpec attaching a control-function correction.
+
+ Attaches `correction` to `factor_name` and auto-registers its instruments
+ as observed factors (deduped against existing ones), so instruments are
+ declared exactly once.
Args:
- estimation_options: New estimation options.
+ factor_name: The endogenous investment factor to correct.
+ correction: The control-function specification.
Returns:
- New ModelSpec with the updated estimation options.
+ New ModelSpec with the correction attached and instruments registered.
"""
- return self._replace(estimation_options=estimation_options)
+ corrected = replace(self.factors[factor_name], correction=correction)
+ new_factors = {**self.factors, factor_name: corrected}
+ new_observed = self.observed_factors + tuple(
+ i for i in correction.instruments if i not in self.observed_factors
+ )
+ return self._replace(factors=new_factors, observed_factors=new_observed)
def with_anchoring(
self,
diff --git a/src/skillmodels/params_index.py b/src/skillmodels/common/params_index.py
similarity index 74%
rename from src/skillmodels/params_index.py
rename to src/skillmodels/common/params_index.py
index c3a19587..ad519a57 100644
--- a/src/skillmodels/params_index.py
+++ b/src/skillmodels/common/params_index.py
@@ -2,7 +2,8 @@
import pandas as pd
-from skillmodels.types import (
+from skillmodels.common.types import (
+ ControlFunctionInfo,
Dimensions,
EndogenousFactorsInfo,
Labels,
@@ -62,6 +63,15 @@ def get_params_index(
aug_periods=labels.aug_periods,
has_endogenous_factors=endogenous_factors_info.has_endogenous_factors,
)
+ if endogenous_factors_info.control_function is not None:
+ ind_tups += get_investment_eq_index_tuples(
+ aug_periods=labels.aug_periods,
+ control_function=endogenous_factors_info.control_function,
+ )
+ ind_tups += get_kappa_index_tuples(
+ aug_periods=labels.aug_periods,
+ control_function=endogenous_factors_info.control_function,
+ )
return pd.MultiIndex.from_tuples(
ind_tups,
@@ -147,6 +157,60 @@ def get_shock_sds_index_tuples(
return ind_tups
+def get_investment_eq_index_tuples(
+ aug_periods: tuple[int, ...],
+ control_function: ControlFunctionInfo,
+) -> list[tuple[str, int, str, str]]:
+ """Index tuples for the first-stage investment-equation coefficients.
+
+ One canonical block keyed by the investment factor (`name1`). The
+ predictor order (`name2`) is the single source of truth shared with the
+ prediction DAG node: state predictors, then excluded instruments, then the
+ constant. A control function only exists for endogenous models, so the
+ rows always live on `aug_periods[:-2]`.
+
+ Args:
+ aug_periods: The augmented periods of the model.
+ control_function: The resolved control-function configuration.
+
+ """
+ inv = control_function.investment_factor
+ predictors = (
+ *control_function.state_predictors,
+ *control_function.instruments,
+ "constant",
+ )
+ ind_tups = []
+ for aug_period in aug_periods[:-2]:
+ for predictor in predictors:
+ ind_tups.append(("investment_eq", aug_period, inv, predictor))
+ return ind_tups
+
+
+def get_kappa_index_tuples(
+ aug_periods: tuple[int, ...],
+ control_function: ControlFunctionInfo,
+) -> list[tuple[str, int, str, str]]:
+ """Index tuples for the control-function loadings (kappa).
+
+ Each target factor receives one `("kappa", aug_period, target, term)` row
+ per cf regressor term, free per period (a dedicated category, so the
+ transition-stage constraints do not touch it). A control function only
+ exists for endogenous models, so the rows live on `aug_periods[:-2]`.
+
+ Args:
+ aug_periods: The augmented periods of the model.
+ control_function: The resolved control-function configuration.
+
+ """
+ ind_tups = []
+ for aug_period in aug_periods[:-2]:
+ for target, terms in control_function.kappa_terms.items():
+ for term in terms:
+ ind_tups.append(("kappa", aug_period, target, term))
+ return ind_tups
+
+
def initial_mean_index_tuples(
n_mixtures: int,
factors: tuple[str, ...],
diff --git a/src/skillmodels/parse_params.py b/src/skillmodels/common/parse_params.py
similarity index 86%
rename from src/skillmodels/parse_params.py
rename to src/skillmodels/common/parse_params.py
index 21e06a5e..92b8c659 100644
--- a/src/skillmodels/parse_params.py
+++ b/src/skillmodels/common/parse_params.py
@@ -8,7 +8,7 @@
import pandas as pd
from jax import Array
-from skillmodels.types import (
+from skillmodels.common.types import (
Anchoring,
Dimensions,
Labels,
@@ -59,6 +59,31 @@ def create_parsing_info(
meas_sds = _get_positional_selector_from_loc(range_sr=range_sr, loc="meas_sds")
shock_sds = _get_positional_selector_from_loc(range_sr=range_sr, loc="shock_sds")
+ # control-function first-stage equation (empty selector for non-CF models).
+ investment_eq = _get_positional_selector_from_loc(
+ range_sr=range_sr, loc="investment_eq"
+ )
+ investment_eq_rows = params_index[
+ params_index.get_level_values("category") == "investment_eq"
+ ]
+ investment_factor = (
+ str(investment_eq_rows.get_level_values("name1")[0])
+ if len(investment_eq_rows)
+ else None
+ )
+
+ # control-function loadings (kappa), one selector per target factor.
+ kappa: dict[str, Array | slice] = {}
+ kappa_targets = params_index[
+ params_index.get_level_values("category") == "kappa"
+ ].get_level_values("name1")
+ kappa_helper = pd.DataFrame(index=params_index)
+ for target in dict.fromkeys(kappa_targets):
+ loc = kappa_helper.query(f"category == 'kappa' & name1 == '{target}'").index
+ kappa[str(target)] = _get_positional_selector_from_loc(
+ range_sr=range_sr, loc=loc
+ )
+
# loadings:
mask = update_info[list(labels.latent_factors)].to_numpy()
helper = np.arange(mask.size).reshape(mask.shape)
@@ -105,6 +130,9 @@ def create_parsing_info(
is_anchoring_update=is_anchoring_update,
ignore_constant_when_anchoring=anchoring.ignore_constant_when_anchoring,
has_endogenous_factors=has_endogenous_factors,
+ investment_eq=investment_eq,
+ investment_factor=investment_factor,
+ kappa=MappingProxyType(kappa),
)
@@ -296,6 +324,18 @@ def _get_transition_params(
for factor in list(labels.latent_factors):
ilocs = info.transition[factor]
trans_params[factor] = params[ilocs].reshape(n_aug_periods - len_reduction, -1)
+ if info.investment_factor is not None:
+ # First-stage betas, threaded under a reserved key so the prediction DAG
+ # node reads them as ordinary period-sliced transition coefficients.
+ reserved = f"__first_stage_{info.investment_factor}__"
+ trans_params[reserved] = params[info.investment_eq].reshape(
+ n_aug_periods - len_reduction, -1
+ )
+ for target, ilocs in info.kappa.items():
+ # Control-function loadings, one reserved key per target factor.
+ trans_params[f"__kappa_{target}__"] = params[ilocs].reshape(
+ n_aug_periods - len_reduction, -1
+ )
return MappingProxyType(trans_params)
diff --git a/src/skillmodels/process_data.py b/src/skillmodels/common/process_data.py
similarity index 99%
rename from src/skillmodels/process_data.py
rename to src/skillmodels/common/process_data.py
index 72f731fe..8e3f48de 100644
--- a/src/skillmodels/process_data.py
+++ b/src/skillmodels/common/process_data.py
@@ -8,7 +8,7 @@
import pandas as pd
from jax import Array
-from skillmodels.types import Anchoring, Labels
+from skillmodels.common.types import Anchoring, Labels
def process_data(
diff --git a/src/skillmodels/process_model.py b/src/skillmodels/common/process_model.py
similarity index 64%
rename from src/skillmodels/process_model.py
rename to src/skillmodels/common/process_model.py
index 43b5aedc..71c504c2 100644
--- a/src/skillmodels/process_model.py
+++ b/src/skillmodels/common/process_model.py
@@ -1,6 +1,7 @@
"""Functions to process model specifications from user-friendly to internal form."""
-from collections.abc import KeysView, Mapping
+import inspect
+from collections.abc import Callable, KeysView, Mapping
from dataclasses import replace
from functools import partial
from types import MappingProxyType
@@ -12,15 +13,22 @@
from jax import Array, vmap
from pandas import DataFrame
-import skillmodels.transition_functions as t_f_module
-from skillmodels.check_model import check_model, check_stagemap
-from skillmodels.decorators import extract_params, jax_array_output
-from skillmodels.model_spec import FactorSpec, ModelSpec
-from skillmodels.types import (
+import skillmodels.common.transition_functions as t_f_module
+from skillmodels.common.check_model import check_model, check_stagemap
+from skillmodels.common.control_function import (
+ build_cf_node,
+ build_kappa_addition_node,
+ build_kappa_term_evaluators,
+ build_prediction_node,
+ generate_kappa_terms,
+)
+from skillmodels.common.decorators import extract_params, jax_array_output
+from skillmodels.common.model_spec import FactorSpec, ModelSpec
+from skillmodels.common.types import (
Anchoring,
+ ControlFunctionInfo,
Dimensions,
EndogenousFactorsInfo,
- EstimationOptions,
FactorInfo,
Labels,
MeasurementType,
@@ -72,12 +80,10 @@ def process_model(model_spec: ModelSpec) -> ProcessedModel:
)
else:
_model_spec_aug = model_spec
- estimation_options = _model_spec_aug.estimation_options or EstimationOptions()
endogenous_factors_info = _get_endogenous_factors_info(
has_endogenous_factors=has_endogenous_factors,
model_spec=_model_spec_aug,
labels=labels,
- bounds_distance=estimation_options.bounds_distance,
)
check_model(
model_spec=_model_spec_aug,
@@ -86,7 +92,11 @@ def process_model(model_spec: ModelSpec) -> ProcessedModel:
anchoring=anchoring,
has_endogenous_factors=has_endogenous_factors,
)
- transition_info = _get_transition_info(model_spec=_model_spec_aug, labels=labels)
+ transition_info = _get_transition_info(
+ model_spec=_model_spec_aug,
+ labels=labels,
+ control_function=endogenous_factors_info.control_function,
+ )
labels = replace(
labels, transition_names=tuple(transition_info.function_names.values())
)
@@ -95,7 +105,6 @@ def process_model(model_spec: ModelSpec) -> ProcessedModel:
dimensions=dims,
labels=labels,
anchoring=anchoring,
- estimation_options=estimation_options,
transition_info=transition_info,
update_info=_get_update_info(
model_spec=_model_spec_aug,
@@ -112,29 +121,14 @@ def process_model(model_spec: ModelSpec) -> ProcessedModel:
def get_has_endogenous_factors(factors: Mapping[str, FactorSpec]) -> bool:
"""Return True if any endogenous factors are present."""
- endogenous_factors = pd.DataFrame(
- [
- {
- "factor": f,
- "is_endogenous": v.is_endogenous,
- "is_correction": v.is_correction,
- }
- for f, v in factors.items()
- ]
- ).set_index("factor")
- if (endogenous_factors.dtypes != bool).any(): # noqa: E721
- raise ValueError(
- "If specified, 'is_endogenous' and 'is_correction' both need to be of type"
- f"'bool', got:\n{endogenous_factors}"
- )
- if (
- ~endogenous_factors["is_endogenous"] & endogenous_factors["is_correction"]
- ).any():
- raise ValueError(
- "A factor cannot be a correction and not endogenous, got:\n"
- f"{endogenous_factors}"
- )
- return endogenous_factors["is_endogenous"].any() # ty: ignore[invalid-return-type]
+ for factor, fspec in factors.items():
+ if not isinstance(fspec.is_endogenous, bool):
+ msg = (
+ f"'is_endogenous' must be a bool, got {fspec.is_endogenous!r} "
+ f"for {factor}."
+ )
+ raise TypeError(msg)
+ return any(fspec.is_endogenous for fspec in factors.values())
def get_dimensions(
@@ -153,13 +147,12 @@ def get_dimensions(
all_n_periods = [len(fspec.measurements) for fspec in model_spec.factors.values()]
n_periods = max(all_n_periods)
n_aug_periods = 2 * n_periods if has_endogenous_factors else n_periods
- est_opts = model_spec.estimation_options
return Dimensions(
n_latent_factors=len(model_spec.factors),
n_observed_factors=len(model_spec.observed_factors),
n_controls=len(model_spec.controls) + 1, # plus 1: constant
- n_mixtures=est_opts.n_mixtures if est_opts else 1,
+ n_mixtures=model_spec.n_mixtures,
n_aug_periods=n_aug_periods,
n_periods=n_periods,
)
@@ -178,7 +171,7 @@ def _get_aug_periods_to_periods(
def _aug_periods_from_period(
- period: int, aug_periods_to_periods: dict[int, int]
+ period: int, aug_periods_to_periods: Mapping[int, int]
) -> list[int]:
"""The inverse of the the aug_periods_to_periods mapper."""
return [ap for ap, p in aug_periods_to_periods.items() if p == period]
@@ -286,6 +279,12 @@ def _augment_periods_for_endogenous_factors(
"""
new_factors: dict[str, FactorSpec] = {}
for fac, fspec in model_spec.factors.items():
+ # insert_at_modulo decides measurement parity: endogenous (investment)
+ # factors are measured at ODD aug_periods (the endogenous half), ordinary
+ # state factors at EVEN aug_periods (the states half). This co-placement
+ # produces the investment level and the first-class control-function
+ # prediction at the same odd aug_period, so the residual cf = level -
+ # prediction is a genuine same-period residual.
insert_at_modulo = 0 if fspec.is_endogenous else 1
# Insert empty elements into measurements when we do not have those.
@@ -323,19 +322,80 @@ def _augment_periods_for_endogenous_factors(
measurements=aug_measurements,
normalizations=aug_normalizations,
is_endogenous=fspec.is_endogenous,
- is_correction=fspec.is_correction,
+ correction=fspec.correction,
transition_function=fspec.transition_function,
+ has_production_shock=fspec.has_production_shock,
+ has_initial_distribution=fspec.has_initial_distribution,
)
return model_spec._replace(factors=new_factors)
-def _get_transition_info(model_spec: ModelSpec, labels: Labels) -> TransitionInfo:
- """Collect information about transition functions."""
- func_list, param_names = [], []
- latent_factors = labels.latent_factors
- all_factors = labels.all_factors
+def _inject_control_function_nodes(
+ *,
+ functions: dict,
+ control_function: ControlFunctionInfo,
+ all_factors: tuple[str, ...],
+) -> None:
+ """Graft the control-function nodes into the transition DAG in place.
+
+ Adds a contemporaneous first-stage prediction node and a residual `cf`
+ node, and rewrites each target factor's `__next___` node to add
+ `kappa * cf` on top of the (untouched) base production node. The base node
+ is preserved under `__base_next___`, so its arguments, positional
+ parameter layout, and DAG dependencies are unchanged.
+
+ Args:
+ functions: The DAG node mapping built by `_get_transition_info`.
+ control_function: The resolved control-function configuration.
+ all_factors: Factor order of the `states` vector (latent then observed).
+
+ """
+ inv = control_function.investment_factor
+ inv_pos = all_factors.index(inv)
+ predictor_positions = tuple(
+ all_factors.index(factor)
+ for factor in (
+ *control_function.state_predictors,
+ *control_function.instruments,
+ )
+ )
+ factor_positions = {factor: i for i, factor in enumerate(all_factors)}
+
+ prediction_node = f"__prediction_{inv}__"
+ functions[prediction_node] = build_prediction_node(
+ beta_key=f"__first_stage_{inv}__",
+ predictor_positions=predictor_positions,
+ )
+ functions["cf"] = rename_arguments(
+ build_cf_node(inv_pos=inv_pos),
+ mapper={"prediction": prediction_node},
+ )
+
+ for target in control_function.targets:
+ base_node = f"__base_next_{target}__"
+ functions[base_node] = functions.pop(f"__next_{target}__")
+ evaluators = build_kappa_term_evaluators(
+ kappa_terms=control_function.kappa_terms[target],
+ factor_positions=factor_positions,
+ )
+ functions[f"__next_{target}__"] = rename_arguments(
+ build_kappa_addition_node(
+ kappa_key=f"__kappa_{target}__",
+ kappa_evaluators=evaluators,
+ ),
+ mapper={"base_value": base_node},
+ )
+
+def _build_base_transition_funcs(
+ model_spec: ModelSpec,
+ latent_factors: tuple[str, ...],
+ all_factors: tuple[str, ...],
+) -> tuple[list[Callable], list[list[str]]]:
+ """Build the per-factor base transition callables and their parameter names."""
+ func_list: list[Callable] = []
+ param_names: list[list[str]] = []
for factor in latent_factors:
spec = model_spec.factors[factor].transition_function
if isinstance(spec, str):
@@ -349,17 +409,35 @@ def _get_transition_info(model_spec: ModelSpec, labels: Labels) -> TransitionInf
raise AttributeError(
"Custom transition functions must have a __name__ attribute.",
)
- if hasattr(spec, "__registered_params__"):
- names: list[str] = spec.__registered_params__ # ty: ignore[invalid-assignment]
- param_names.append(names)
- else:
+ if not hasattr(spec, "__registered_params__"):
raise AttributeError(
"Custom transition_functions must have a __registered_params__ "
"attribute. You can set it via the register_params decorator.",
)
+ names: list[str] = spec.__registered_params__ # ty: ignore[invalid-assignment]
+ param_names.append(names)
func_list.append(extract_params(spec, key=factor, names=names))
+ return func_list, param_names
- function_names = [f.__name__ for f in func_list]
+
+def _get_transition_info(
+ model_spec: ModelSpec,
+ labels: Labels,
+ control_function: ControlFunctionInfo | None = None,
+) -> TransitionInfo:
+ """Collect information about transition functions."""
+ latent_factors = labels.latent_factors
+ all_factors = labels.all_factors
+
+ func_list, param_names = _build_base_transition_funcs(
+ model_spec=model_spec,
+ latent_factors=latent_factors,
+ all_factors=all_factors,
+ )
+
+ # `extract_params` preserves `__name__` via `functools.wraps`, but `ty` only
+ # sees the `Callable` return type, which does not expose it.
+ function_names = [f.__name__ for f in func_list] # ty: ignore[unresolved-attribute]
functions = {
f"__next_{fac}__": func
@@ -374,6 +452,13 @@ def _extract_factor(states: Array, pos: int) -> Array:
for i, factor in enumerate(labels.all_factors):
functions[factor] = partial(_extract_factor, pos=i)
+ if control_function is not None:
+ _inject_control_function_nodes(
+ functions=functions,
+ control_function=control_function,
+ all_factors=all_factors,
+ )
+
transition_function = concatenate_functions(
functions=functions,
targets=[f"__next_{fac}__" for fac in latent_factors],
@@ -392,7 +477,7 @@ def _extract_factor(states: Array, pos: int) -> Array:
return TransitionInfo(
func=transition_function,
param_names=MappingProxyType(
- dict(zip(latent_factors, param_names, strict=False))
+ dict(zip(latent_factors, (tuple(p) for p in param_names), strict=False))
),
individual_functions=MappingProxyType(individual_functions),
function_names=MappingProxyType(
@@ -401,20 +486,117 @@ def _extract_factor(states: Array, pos: int) -> Array:
)
+def _resolve_control_function(model_spec: ModelSpec) -> ControlFunctionInfo | None:
+ """Resolve the `CorrectionSpec` declared on the investment factor.
+
+ Expand the user-facing `CorrectionSpec` (which may leave fields empty as
+ "all state factors" / "the default `cf` regressor") into a fully resolved
+ `ControlFunctionInfo` read by both estimators. Return `None` when no factor
+ declares a `correction`.
+
+ Args:
+ model_spec: The model specification.
+
+ Returns:
+ Resolved `ControlFunctionInfo`, or `None` if there is no correction.
+
+ Raises:
+ ValueError: If a non-endogenous factor declares a `correction`.
+ NotImplementedError: If more than one factor declares a `correction`.
+
+ """
+ with_correction = [
+ (fac, fspec.correction)
+ for fac, fspec in model_spec.factors.items()
+ if fspec.correction is not None
+ ]
+ if not with_correction:
+ return None
+ if len(with_correction) > 1:
+ names = ", ".join(fac for fac, _ in with_correction)
+ msg = (
+ "The control function supports exactly one investment factor, but "
+ f"a correction was declared on multiple factors: {names}."
+ )
+ raise NotImplementedError(msg)
+
+ investment_factor, spec = with_correction[0]
+ if not model_spec.factors[investment_factor].is_endogenous:
+ msg = (
+ f"Factor {investment_factor!r} declares a correction but is not "
+ "endogenous. A control function requires an endogenous investment "
+ "factor."
+ )
+ raise ValueError(msg)
+
+ not_observed = tuple(
+ i for i in spec.instruments if i not in model_spec.observed_factors
+ )
+ if not_observed:
+ msg = (
+ f"The correction on {investment_factor!r} lists instruments "
+ f"{not_observed} that are not declared observed factors. Control-"
+ "function instruments must be observed factors of the model."
+ )
+ raise ValueError(msg)
+
+ state_factors = tuple(
+ fac for fac, fspec in model_spec.factors.items() if not fspec.is_endogenous
+ )
+ state_predictors = spec.state_predictors or state_factors
+ targets = spec.targets or state_factors
+ if not targets:
+ msg = (
+ f"Factor {investment_factor!r} declares a correction but the model "
+ "has no state factors to apply it to. A control function needs at "
+ "least one non-endogenous state factor as a target."
+ )
+ raise ValueError(msg)
+
+ # Built-in production transitions enumerate (and the constraint machinery pins
+ # to 0) an instrument coefficient, but a custom transition could consume an
+ # instrument as an input with no pinnable coefficient. Instruments are
+ # first-stage-only, so reject that loudly.
+ instruments = set(spec.instruments)
+ for fac, fspec in model_spec.factors.items():
+ tfunc = fspec.transition_function
+ if fac == investment_factor or not callable(tfunc):
+ continue
+ consumed = set(inspect.signature(tfunc).parameters) - {"params"}
+ if leaked := sorted(consumed & instruments):
+ msg = (
+ f"The custom transition for {fac!r} consumes control-function "
+ f"instrument(s) {leaked}. Instruments are first-stage-only and must "
+ "not enter a production transition."
+ )
+ raise ValueError(msg)
+
+ if spec.kappa_terms is not None:
+ kappa_terms = {t: spec.kappa_terms.get(t, ("cf",)) for t in targets}
+ else:
+ degree = spec.kappa_degree if spec.kappa_degree is not None else 1
+ basis = generate_kappa_terms(state_factors, max_degree=degree)
+ kappa_terms = dict.fromkeys(targets, basis)
+
+ return ControlFunctionInfo(
+ investment_factor=investment_factor,
+ state_predictors=tuple(state_predictors),
+ instruments=tuple(spec.instruments),
+ targets=tuple(targets),
+ kappa_terms=MappingProxyType(kappa_terms),
+ )
+
+
def _get_endogenous_factors_info(
*,
has_endogenous_factors: bool,
model_spec: ModelSpec,
labels: Labels,
- bounds_distance: float,
) -> EndogenousFactorsInfo:
"""Collect information about endogenous factors."""
factor_info = {}
for fac, fspec in model_spec.factors.items():
- factor_info[fac] = FactorInfo.from_flags(
- is_endogenous=fspec.is_endogenous,
- is_correction=fspec.is_correction,
- )
+ factor_info[fac] = FactorInfo.from_flags(is_endogenous=fspec.is_endogenous)
return EndogenousFactorsInfo(
has_endogenous_factors=has_endogenous_factors,
@@ -422,12 +604,12 @@ def _get_endogenous_factors_info(
aug_periods=labels.aug_periods_to_periods.keys(),
has_endogenous_factors=has_endogenous_factors,
),
- bounds_distance=bounds_distance,
aug_periods_from_period=partial(
_aug_periods_from_period,
aug_periods_to_periods=labels.aug_periods_to_periods,
),
factor_info=MappingProxyType(factor_info),
+ control_function=_resolve_control_function(model_spec),
)
diff --git a/src/skillmodels/common/selector.py b/src/skillmodels/common/selector.py
new file mode 100644
index 00000000..5f753461
--- /dev/null
+++ b/src/skillmodels/common/selector.py
@@ -0,0 +1,63 @@
+"""Selector helpers for optimagic constraint plumbing.
+
+Both `skillmodels.common.constraints` and
+`skillmodels.common.transition_functions` build optimagic constraint
+selectors of the form `functools.partial(select_by_loc, loc=...)`.
+Hosting `select_by_loc` here breaks the previous circular-import
+workaround (`constraints` -> `transition_functions` -> a hand-copy
+of `select_by_loc`) by giving both call sites a single dependency
+that pulls nothing else from `skillmodels`.
+
+`align_index_names` lives here because it is also a selector-side
+concern: users supply `fixed_params` / `start_params` keyed by the
+public-facing `period` level name, while internal frames are keyed
+by `aug_period`. The two-line rename lets downstream `MultiIndex`
+set operations keep their level names.
+"""
+
+from collections.abc import Hashable, Sequence
+from typing import Any
+
+import pandas as pd
+
+
+def select_by_loc(params: Any, loc: Any) -> Any: # noqa: ANN401
+ """Select parameters by location, restricted to the `value` column.
+
+ optimagic's pytree machinery flattens whatever the selector
+ returns. A bare `params.loc[single_tuple]` is a row `Series`
+ whose index is the column names (`value`, `lower_bound`,
+ `upper_bound`); flattening that yields all three values, and the
+ bounds' `±inf` collapse to int64 sentinels inside
+ `_fail_if_duplicates`. Project down to the `value` column so the
+ selector returns exactly the parameter values regardless of
+ whether bounds columns are present.
+ """
+ selected = params.loc[loc]
+ if isinstance(selected, pd.Series) and "value" in selected.index:
+ return selected["value"]
+ if isinstance(selected, pd.DataFrame) and "value" in selected.columns:
+ return selected["value"]
+ return selected
+
+
+def align_index_names(
+ overrides: pd.DataFrame, target_names: Sequence[Hashable]
+) -> pd.DataFrame:
+ """Return `overrides` with its MultiIndex level names matched to `target_names`.
+
+ `MultiIndex.union` silently strips any level whose name differs
+ across the two operands, collapsing the result to anonymous
+ levels and breaking `params.loc[...]` for callers downstream.
+ Re-stamping the overrides' level names keeps the underlying
+ tuples bit-identical (`set_names` is metadata-only) while making
+ the union name-preserving. Used wherever user-supplied
+ `fixed_params` / `start_params` (typically keyed by `period`)
+ meet an internal params frame keyed by `aug_period`.
+ """
+ if list(overrides.index.names) == list(target_names):
+ return overrides
+ new_index = overrides.index.set_names(list(target_names))
+ out = overrides.copy()
+ out.index = new_index
+ return out
diff --git a/src/skillmodels/simulate_data.py b/src/skillmodels/common/simulate_data.py
similarity index 92%
rename from src/skillmodels/simulate_data.py
rename to src/skillmodels/common/simulate_data.py
index 13b9c005..67060b7b 100644
--- a/src/skillmodels/simulate_data.py
+++ b/src/skillmodels/common/simulate_data.py
@@ -6,18 +6,20 @@
import jax.numpy as jnp
import numpy as np
import pandas as pd
+from beartype import beartype
from jax import Array
from numpy.typing import NDArray
-from skillmodels.filtered_states import anchor_states_df
-from skillmodels.kalman_filters import transform_sigma_points
-from skillmodels.model_spec import ModelSpec
-from skillmodels.params_index import get_params_index
-from skillmodels.parse_params import create_parsing_info, parse_params
-from skillmodels.process_data import process_data
-from skillmodels.process_debug_data import create_state_ranges
-from skillmodels.process_model import process_model
-from skillmodels.types import (
+from skillmodels._beartype_conf import SIMULATION_CONF
+from skillmodels.common.anchoring import anchor_states_df
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_data import process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.state_ranges import create_state_ranges
+from skillmodels.common.transitions import apply_anchored_transition
+from skillmodels.common.types import (
Dimensions,
EndogenousFactorsInfo,
Labels,
@@ -27,6 +29,7 @@
)
+@beartype(conf=SIMULATION_CONF)
def simulate_dataset(
model_spec: ModelSpec,
params: pd.DataFrame,
@@ -108,7 +111,7 @@ def simulate_dataset(
params = params.reindex(params_index)
parsing_info = create_parsing_info(
- params_index=params.index, # ty: ignore[invalid-argument-type]
+ params_index=params_index,
update_info=processed_model.update_info,
labels=processed_model.labels,
anchoring=processed_model.anchoring,
@@ -144,7 +147,7 @@ def simulate_dataset(
update_info=processed_model.update_info,
control_data=control_data,
observed_factors=observed_factors,
- policies=policies, # ty: ignore[invalid-argument-type]
+ policies=policies,
transition_info=processed_model.transition_info,
rng=rng,
)
@@ -203,7 +206,7 @@ def _simulate_dataset(
update_info: pd.DataFrame,
control_data: Array,
observed_factors: Array,
- policies: list[dict],
+ policies: list[dict] | None,
transition_info: TransitionInfo,
rng: np.random.Generator,
) -> tuple[pd.DataFrame, pd.DataFrame]:
@@ -292,29 +295,27 @@ def _simulate_dataset(
# get combined states and observed factors as jax array
to_concat = [latent_states[t], observed_factors[t]]
states = jnp.array(np.concatenate(to_concat, axis=-1))
- # reshaping is just needed for transform sigma points
- states = states.reshape(1, 1, *states.shape)
# extract trans coeffs for the period
trans_coeffs = {k: arr[t] for k, arr in transition_params.items()}
- # get anchoring_scaling_factors for the period
+ # get anchoring scaling factors and constants for periods t, t+1
anchoring_scaling_factors = parsed_params.anchoring_scaling_factors[
jnp.array([t, t + 1])
]
- # get anchoring constants for the period
anchoring_constants = parsed_params.anchoring_constants[jnp.array([t, t + 1])]
- # call transform_sigma_points and convert result to numpy
+ # apply the period-t transition; the common helper takes flat
+ # `(N, n_fac)` states directly so no sigma-points reshape is needed.
next_states = np.array(
- transform_sigma_points(
- sigma_points=states,
+ apply_anchored_transition(
+ states=states,
transition_func=transition_info.func,
trans_coeffs=trans_coeffs,
anchoring_scaling_factors=anchoring_scaling_factors,
anchoring_constants=anchoring_constants,
),
- ).reshape(n_obs, -1)
+ )
errors = rng.multivariate_normal(
mean=np.zeros(n_states),
@@ -331,8 +332,8 @@ def _simulate_dataset(
meas = pd.DataFrame(
data=measurements_from_states(
rng=rng,
- states=latent_states[t], # ty: ignore[invalid-argument-type]
- controls=control_data[t], # ty: ignore[invalid-argument-type]
+ states=latent_states[t],
+ controls=control_data[t],
loadings=loadings_df.loc[t].to_numpy(),
control_params=control_params_df.loc[t].to_numpy(),
sds=meas_sds.loc[t].to_numpy().flatten(),
@@ -432,7 +433,7 @@ def _get_shock(
mean: float,
sd: float,
size: int,
-) -> NDArray[np.floating]:
+) -> NDArray[np.floating] | Array:
"""Add stochastic effect to a factor of length n_obs.
Args:
@@ -459,8 +460,8 @@ def generate_start_states(
n_obs: int,
dimensions: Dimensions,
dist_args: list[dict],
- weights: NDArray[np.floating],
-) -> NDArray[np.floating]:
+ weights: NDArray[np.floating] | Array,
+) -> NDArray[np.floating] | Array:
"""Draw initial states and control variables from a (mixture of) normals.
Args:
@@ -491,12 +492,12 @@ def generate_start_states(
def measurements_from_states(
rng: np.random.Generator,
- states: NDArray[np.floating],
- controls: NDArray[np.floating],
- loadings: NDArray[np.floating],
- control_params: NDArray[np.floating],
- sds: NDArray[np.floating],
-) -> NDArray[np.floating]:
+ states: NDArray[np.floating] | Array,
+ controls: NDArray[np.floating] | Array,
+ loadings: NDArray[np.floating] | Array,
+ control_params: NDArray[np.floating] | Array,
+ sds: NDArray[np.floating] | Array,
+) -> NDArray[np.floating] | Array:
"""Generate the variables that would be observed in practice.
This generates the data for only one period. Let n_meas be the number
@@ -525,6 +526,7 @@ def measurements_from_states(
return states_part + control_part + epsilon
+@beartype(conf=SIMULATION_CONF)
def simulate_policy_effect(
model_spec: ModelSpec,
params: pd.DataFrame,
diff --git a/src/skillmodels/common/state_ranges.py b/src/skillmodels/common/state_ranges.py
new file mode 100644
index 00000000..af7b88fc
--- /dev/null
+++ b/src/skillmodels/common/state_ranges.py
@@ -0,0 +1,61 @@
+"""Generic posterior-state range utilities, estimator-agnostic.
+
+`create_state_ranges` reduces a `(obs x period x factor)` DataFrame of
+filtered or simulated latent-factor values to a per-factor, per-period
+range (min/max or symmetric quantile bounds). The function is purely
+DataFrame-level and does not depend on which estimator produced the
+input — any caller that can hand it a DataFrame with a "period" (or
+"aug_period") column and one column per factor can use it.
+
+Historically this lived under `skillmodels.chs.process_debug_data` but
+the implementation never depended on CHS-specific machinery; AF and
+AMN consumers (`posterior_states.py` in both subpackages) already
+imported it across the subpackage boundary, which motivated the move.
+"""
+
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+
+
+@beartype(conf=DIAGNOSTICS_CONF)
+def create_state_ranges(
+ filtered_states: pd.DataFrame,
+ factors: tuple[str, ...] | list[str],
+ quantile_cutoff: float | None = None,
+) -> dict[str, pd.DataFrame]:
+ """Compute minimum and maximum state values for each factor by period.
+
+ Args:
+ filtered_states: DataFrame with filtered states. Must have a "period"
+ column (or "aug_period" — that one wins if both are present).
+ factors: List of factor names to compute ranges for.
+ quantile_cutoff: If provided, use quantiles instead of min/max. The
+ cutoff is applied symmetrically: the minimum is the
+ `quantile_cutoff` quantile and the maximum is the
+ `1 - quantile_cutoff` quantile. For example,
+ `quantile_cutoff=0.01` uses the 1st and 99th percentiles.
+
+ Return:
+ Dictionary mapping factor names to DataFrames with "minimum" and
+ "maximum" columns, indexed by period.
+
+ """
+ ranges: dict[str, pd.DataFrame] = {}
+ period_col = "aug_period" if "aug_period" in filtered_states.columns else "period"
+
+ if quantile_cutoff is not None:
+ if not 0 < quantile_cutoff < 0.5:
+ raise ValueError("quantile_cutoff must be between 0 and 0.5 (exclusive)")
+ minima = filtered_states.groupby(period_col).quantile(quantile_cutoff)
+ maxima = filtered_states.groupby(period_col).quantile(1 - quantile_cutoff)
+ else:
+ minima = filtered_states.groupby(period_col).min()
+ maxima = filtered_states.groupby(period_col).max()
+
+ for factor in factors:
+ df = pd.concat([minima[factor], maxima[factor]], axis=1)
+ df.columns = pd.Index(["minimum", "maximum"])
+ ranges[factor] = df
+ return ranges
diff --git a/src/skillmodels/common/transition_functions.py b/src/skillmodels/common/transition_functions.py
new file mode 100644
index 00000000..ef54b9b4
--- /dev/null
+++ b/src/skillmodels/common/transition_functions.py
@@ -0,0 +1,446 @@
+"""Contains transition functions and corresponding helper functions.
+
+Below the signature and purpose of a transition function and its helper
+functions is explained with a transition function called example_func:
+>
+
+**example_func(** *states, params**)**:
+
+ The actual transition function.
+
+Args:
+ * states: 1d numpy array of length n_all_factors
+ * params: 1d numpy array with coefficients specific to this transition function
+
+Return:
+ * float
+**names_example_func(** *factors* **)**:
+
+ Generate a list of names for the params of the transition function.
+
+ The names will be used to construct index tuples in the following way:
+
+ ('transition', period, factor, NAME)
+
+The transition functions have to be JAX jittable and differentiable. However, they
+should not be jitted yet.
+
+"""
+
+import functools
+from itertools import combinations
+
+import jax
+import jax.numpy as jnp
+import optimagic as om
+from jax import Array
+
+from skillmodels.common.fixed_constraint import FixedConstraintWithValue
+from skillmodels.common.selector import select_by_loc
+
+
+def linear(states: Array, params: Array) -> Array:
+ """Linear production function where the constant is the last parameter."""
+ constant = params[-1]
+ betas = params[:-1]
+ return jnp.dot(states, betas) + constant
+
+
+def params_linear(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for linear transition function."""
+ return [*factors, "constant"]
+
+
+def identity_constraints_linear(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[FixedConstraintWithValue]:
+ """Identity constraints for linear transition function."""
+ constraints: list[FixedConstraintWithValue] = []
+ for regressor in params_linear(all_factors):
+ val = 1.0 if factor == regressor else 0.0
+ loc = ("transition", aug_period, factor, regressor)
+ constraints.append(FixedConstraintWithValue(loc=loc, value=val))
+ return constraints
+
+
+def translog(states: Array, params: Array) -> Array:
+ """Translog transition function.
+
+ The name is a convention in the skill formation literature even though the function
+ is better described as a linear in parameters transition function with squares and
+ interaction terms of the states.
+
+ This is the general-library specification: parameters are enumerated over ALL
+ factors in `all_factors` (latent AND observed). Observed factors (e.g. income)
+ therefore enter the production function with their own free linear, square and
+ interaction coefficients. This is by design for the CHS estimator. For an AF
+ production function that matches the paper's equation (6) (skill + investment
+ only, NO squares), use `translog_af` and pass only the production factors.
+
+ """
+ nfac = len(states)
+ constant = params[-1]
+ lin_beta = params[:nfac]
+ square_beta = params[nfac : 2 * nfac]
+ inter_beta = params[2 * nfac : -1]
+
+ res = jnp.dot(states, lin_beta)
+ res += jnp.dot(states**2, square_beta)
+ for p, (a, b) in zip(inter_beta, combinations(range(nfac), 2), strict=False):
+ res += p * states[a] * states[b]
+ res += constant
+ return res
+
+
+def params_translog(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for the translog production function."""
+ return (
+ list(factors)
+ + [f"{factor} ** 2" for factor in factors]
+ + [f"{a} * {b}" for a, b in combinations(factors, 2)]
+ + ["constant"]
+ )
+
+
+def identity_constraints_translog(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[FixedConstraintWithValue]:
+ """Identity constraints for translog transition function."""
+ constraints: list[FixedConstraintWithValue] = []
+ for regressor in params_translog(all_factors):
+ val = 1.0 if factor == regressor else 0.0
+ loc = ("transition", aug_period, factor, regressor)
+ constraints.append(FixedConstraintWithValue(loc=loc, value=val))
+ return constraints
+
+
+def translog_af(states: Array, params: Array) -> Array:
+ """AF (2020) production translog, equation (6): NO square terms.
+
+ Implements `a_t + sum_i beta_i * states_i + sum_{i list[str]:
+ """Index tuples for `translog_af` (linear + interactions + constant)."""
+ return (
+ list(factors)
+ + [f"{a} * {b}" for a, b in combinations(factors, 2)]
+ + ["constant"]
+ )
+
+
+def identity_constraints_translog_af(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[FixedConstraintWithValue]:
+ """Identity constraints for `translog_af` (carry-forward aug periods)."""
+ constraints: list[FixedConstraintWithValue] = []
+ for regressor in params_translog_af(all_factors):
+ val = 1.0 if factor == regressor else 0.0
+ loc = ("transition", aug_period, factor, regressor)
+ constraints.append(FixedConstraintWithValue(loc=loc, value=val))
+ return constraints
+
+
+def log_ces(states: Array, params: Array) -> Array:
+ """Log CES production function (KLS version).
+
+ Computed as ``log(sum_i gamma_i * exp(states_i * phi)) / phi`` via a
+ numerically stable weighted logsumexp. The weighted form keeps both the
+ forward pass and the gradient finite when some ``gamma_i = 0``; the
+ naive ``logsumexp(log(gamma) + states * phi)`` has a 1 / gamma term in
+ the gradient that produces NaN at ``gamma_i = 0``.
+
+ This is the general-library specification: the CES weights `gamma_i` are
+ enumerated over ALL factors in `all_factors` (latent AND observed), so
+ observed factors (e.g. income) receive a share of the probability simplex
+ and enter the production aggregate. This is by design for the CHS
+ estimator. For an AF production CES over the production factors only
+ (skill + investment, matching the paper's equation (7)), use `log_ces_af`
+ and pass only the production factors.
+
+ Location restriction (Freyberger 2025): the simplex `sum_i gamma_i = 1`
+ (with no free additive level) supplies the *cross-period* skills-location
+ alternative (Assumption a:ageinvariant_technology_skills_ces(b)) -- i.e. it
+ substitutes for age-invariance of the later skill measurement intercepts. It
+ does NOT supply the absolute INITIAL location anchor mu_theta,0,1=0, which is
+ still required separately: plain log_ces obeys f(x+c,i+c)=f(x,i)+c, so a
+ common shift of all latent inputs would otherwise leave observables unchanged.
+ So a `log_ces` model still pins a period-0 intercept, but need not also pin
+ the later skill intercepts to be equal across periods.
+ """
+ phi = params[-1]
+ gammas = params[:-1]
+ scaling_factor = 1 / phi
+
+ exponents = states * phi
+ max_exp = jnp.max(exponents)
+ shifted = jnp.exp(exponents - max_exp)
+ unscaled = max_exp + jnp.log(jnp.sum(gammas * shifted))
+ return unscaled * scaling_factor
+
+
+def params_log_ces(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for the log_ces production function."""
+ return [*factors, "phi"]
+
+
+def constraints_log_ces(
+ factor: str,
+ factors: tuple[str, ...],
+ aug_period: int,
+) -> om.constraints.Constraint:
+ """Constraints for log_ces production function."""
+ names = params_log_ces(factors)
+ loc = [("transition", aug_period, factor, name) for name in names[:-1]]
+ return om.ProbabilityConstraint(selector=functools.partial(select_by_loc, loc=loc))
+
+
+def identity_constraints_log_ces(
+ factor: str, # noqa: ARG001
+ aug_period: int, # noqa: ARG001
+ all_factors: tuple[str, ...], # noqa: ARG001
+) -> list[om.constraints.Constraint]:
+ """Identity constraints for log_ces in carry-forward aug periods.
+
+ Returns an empty list. `log_ces` factors carry their own
+ `ProbabilityConstraint` on the gammas (`constraints_log_ces`),
+ which already pins the simplex. The carry-forward identity
+ constraints used for `linear` / `translog` would conflict with
+ that probability fold, so we no-op here -- the natural carry-
+ forward in aug periods comes from the upstream model setup
+ (e.g. `has_production_shock=False` for time-invariant factors).
+
+ The signature matches `identity_constraints_linear` so callers
+ can dispatch by name without case-splitting.
+ """
+ return []
+
+
+def log_ces_af(states: Array, params: Array) -> Array:
+ """AF (2020) production CES, equation (7): CES over production factors only.
+
+ Identical math to `log_ces`; named separately so AF models can declare a
+ production-only CES (skill + investment) without observed factors leaking
+ in. Pass ONLY the production factors as `states`.
+ """
+ return log_ces(states, params)
+
+
+def params_log_ces_af(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for the `log_ces_af` production function."""
+ return params_log_ces(factors)
+
+
+def constraints_log_ces_af(
+ factor: str,
+ factors: tuple[str, ...],
+ aug_period: int,
+) -> om.constraints.Constraint:
+ """Constraints for `log_ces_af` production function (gammas on simplex)."""
+ return constraints_log_ces(factor=factor, factors=factors, aug_period=aug_period)
+
+
+def identity_constraints_log_ces_af(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[om.constraints.Constraint]:
+ """Identity constraints for `log_ces_af` -- no-op.
+
+ See :func:`identity_constraints_log_ces` for the rationale.
+ """
+ return identity_constraints_log_ces(
+ factor=factor, aug_period=aug_period, all_factors=all_factors
+ )
+
+
+def log_ces_with_constant(states: Array, params: Array) -> Array:
+ """Log CES production function with an additive level constant.
+
+ Computed as ``A + (1/phi) * log(sum_i gamma_i * exp(states_i * phi))``,
+ matching MATLAB's AF reference parametrisation
+ ``log_skills_{t+1} = log(A_t) + (1/sigma) log(sum gamma_i theta_i^sigma)``.
+
+ The plain ``log_ces`` lacks the constant ``A``, which forces models with
+ a non-trivial ``A`` (e.g. AF Sec. 5.1's CES sims with ``A = e``) to
+ absorb the level shift into the next-period skills measurement
+ intercepts. When matching the MATLAB sim parametrisation exactly
+ (all skill intercepts pinned to 0, ``A_t`` free per period), use
+ this variant instead.
+
+ Location (Freyberger 2025): unlike plain ``log_ces``, the free additive
+ constant ``A`` adds a level degree of freedom, so the simplex on the weights
+ is only a redundant parameterisation here and supplies no location
+ restriction at all. Both the absolute initial location anchor and any
+ cross-period location restriction must be imposed via measurement-intercept
+ normalizations (the AF validator requires the initial intercept anchor).
+ """
+ constant_term = params[-1]
+ phi = params[-2]
+ gammas = params[:-2]
+ scaling_factor = 1 / phi
+
+ exponents = states * phi
+ max_exp = jnp.max(exponents)
+ shifted = jnp.exp(exponents - max_exp)
+ unscaled = max_exp + jnp.log(jnp.sum(gammas * shifted))
+ return constant_term + unscaled * scaling_factor
+
+
+def params_log_ces_with_constant(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for ``log_ces_with_constant``."""
+ return [*factors, "phi", "constant"]
+
+
+def constraints_log_ces_with_constant(
+ factor: str,
+ factors: tuple[str, ...],
+ aug_period: int,
+) -> om.constraints.Constraint:
+ """Constraints for ``log_ces_with_constant`` (gammas on the simplex)."""
+ names = params_log_ces_with_constant(factors)
+ # Gammas are everything except the last two entries (phi and constant).
+ loc = [("transition", aug_period, factor, name) for name in names[:-2]]
+ return om.ProbabilityConstraint(selector=functools.partial(select_by_loc, loc=loc))
+
+
+def identity_constraints_log_ces_with_constant(
+ factor: str, # noqa: ARG001
+ aug_period: int, # noqa: ARG001
+ all_factors: tuple[str, ...], # noqa: ARG001
+) -> list[om.constraints.Constraint]:
+ """Identity constraints for ``log_ces_with_constant`` -- no-op.
+
+ See :func:`identity_constraints_log_ces` for the rationale.
+ """
+ return []
+
+
+def constant(state: Array, params: Array) -> Array: # noqa: ARG001
+ """Constant production function."""
+ return state
+
+
+def params_constant(factors: tuple[str, ...]) -> list[str]: # noqa: ARG001
+ """Index tuples for the constant production function."""
+ return []
+
+
+def robust_translog(states: Array, params: Array) -> Array:
+ """Numerically robust version of the translog transition function.
+
+ This function does a clipping of the state vector at +- 1e12 before calling
+ the standard translog function. It has a no effect on the results if the
+ states do not get close to the clipping values and prevents overflows otherwise.
+
+ The name is a convention in the skill formation literature even though the function
+ is better described as a linear in parameters transition function with squares and
+ interaction terms of the states.
+
+ """
+ clipped_states = jnp.clip(states, -1e12, 1e12)
+ return translog(states=clipped_states, params=params)
+
+
+def params_robust_translog(factors: tuple[str, ...]) -> list[str]:
+ """Return parameter names for robust translog transition function."""
+ return params_translog(factors)
+
+
+def identity_constraints_robust_translog(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[FixedConstraintWithValue]:
+ """Identity constraints for robust_translog."""
+ return identity_constraints_translog(
+ factor=factor, aug_period=aug_period, all_factors=all_factors
+ )
+
+
+def linear_and_squares(states: Array, params: Array) -> Array:
+ """linear_and_squares transition function."""
+ nfac = len(states)
+ constant = params[-1]
+ lin_beta = params[:nfac]
+ square_beta = params[nfac : 2 * nfac]
+
+ res = jnp.dot(states, lin_beta)
+ res += jnp.dot(states**2, square_beta)
+ res += constant
+ return res
+
+
+def params_linear_and_squares(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for the linear_and_squares production function."""
+ return list(factors) + [f"{factor} ** 2" for factor in factors] + ["constant"]
+
+
+def identity_constraints_linear_and_squares(
+ factor: str,
+ aug_period: int,
+ all_factors: tuple[str, ...],
+) -> list[FixedConstraintWithValue]:
+ """Identity constraints for linear_and_squares transition function."""
+ constraints: list[FixedConstraintWithValue] = []
+ for regressor in params_linear_and_squares(all_factors):
+ val = 1.0 if factor == regressor else 0.0
+ loc = ("transition", aug_period, factor, regressor)
+ constraints.append(FixedConstraintWithValue(loc=loc, value=val))
+ return constraints
+
+
+def log_ces_general(states: Array, params: Array) -> Array:
+ """Generalized log_ces production function without known location and scale."""
+ n = states.shape[-1]
+ tfp = params[-1]
+ gammas = params[:n]
+ sigmas = params[n : 2 * n]
+
+ # note: once the b argument is supported in jax.scipy.special.logsumexp, we can set
+ # b = gammas instead of adding the log of gammas to sigma_points * phi
+
+ # the log step for gammas underflows for gamma = 0, but this is handled correctly
+ # by logsumexp and does not raise a warning.
+ unscaled = jax.scipy.special.logsumexp(jnp.log(gammas) + states * sigmas)
+ return unscaled * tfp
+
+
+def params_log_ces_general(factors: tuple[str, ...]) -> list[str]:
+ """Index tuples for the generalized log_ces production function."""
+ return list(factors) + [f"sigma_{fac}" for fac in factors] + ["tfp"]
+
+
+def identity_constraints_log_ces_general(
+ factor: str, # noqa: ARG001
+ aug_period: int, # noqa: ARG001
+ all_factors: tuple[str, ...], # noqa: ARG001
+) -> list[om.constraints.Constraint]:
+ """Identity constraints for log_ces_general -- no-op.
+
+ See :func:`identity_constraints_log_ces` for the rationale.
+ """
+ return []
diff --git a/src/skillmodels/common/transitions.py b/src/skillmodels/common/transitions.py
new file mode 100644
index 00000000..0fabbe89
--- /dev/null
+++ b/src/skillmodels/common/transitions.py
@@ -0,0 +1,58 @@
+"""Estimator-agnostic transition-function helpers.
+
+The core operation in any latent-factor model is
+
+ state_next = (transition_function · anchor) (state_current)
+
+with the per-period anchoring rescaling the latent factor onto the unit
+of its anchor measurement before the transition runs and back to the
+factor's own unit after. The CHS UKF, the AF Halton integrator, and the
+AMN simulate-and-regress stage all need this composition; only the
+CHS UKF additionally reshapes the inputs into sigma points.
+
+`apply_anchored_transition` is the shared core. CHS's
+`transform_sigma_points` wraps it with a `(n_obs, n_mixtures, n_sigma,
+n_fac)`-aware reshape. Code that just needs to push a flat
+`(N, n_fac)` panel of states through one period's transition (e.g.
+`simulate_dataset`) can call this helper directly.
+"""
+
+from collections.abc import Callable
+
+from jax import Array
+
+
+def apply_anchored_transition(
+ states: Array,
+ transition_func: Callable[[dict[str, Array], Array], Array],
+ trans_coeffs: dict[str, Array],
+ anchoring_scaling_factors: Array,
+ anchoring_constants: Array,
+) -> Array:
+ """Anchor states, apply the transition, then unanchor the result.
+
+ Args:
+ states: Shape `(N, n_fac)`. Each row is one (obs x mixture x
+ sigma-point) packed into a flat sample.
+ transition_func: Vectorised transition `(trans_coeffs, anchored)
+ -> anchored_next`. Must broadcast over the leading axis.
+ trans_coeffs: Per-factor transition parameters dict for the
+ current period.
+ anchoring_scaling_factors: Shape `(2, n_fac)`. Row 0 is the
+ input period's scaling, row 1 is the output period's.
+ anchoring_constants: Shape `(2, n_fac)`. Same layout.
+
+ Return:
+ Shape `(N, n_observed)` where `n_observed` is the leading
+ latent-factor block of `n_fac` (observed factors at the tail
+ of the input are passed through to the transition but the
+ unanchoring slice trims them off — same convention as the
+ former `transform_sigma_points`).
+ """
+ anchored = states * anchoring_scaling_factors[0] + anchoring_constants[0]
+ transformed_anchored = transition_func(trans_coeffs, anchored)
+
+ n_observed = transformed_anchored.shape[-1]
+ return (
+ transformed_anchored - anchoring_constants[1][:n_observed]
+ ) / anchoring_scaling_factors[1][:n_observed]
diff --git a/src/skillmodels/types.py b/src/skillmodels/common/types.py
similarity index 81%
rename from src/skillmodels/types.py
rename to src/skillmodels/common/types.py
index 05c8a795..2cf2de35 100644
--- a/src/skillmodels/types.py
+++ b/src/skillmodels/common/types.py
@@ -10,6 +10,8 @@
import pandas as pd
from jax import Array
+from skillmodels._beartype_conf import MODEL_SPEC_CONF, beartype_init
+
def _make_immutable(value: Any) -> Any: # noqa: ANN401
"""Recursively convert a value to its immutable equivalent."""
@@ -48,6 +50,29 @@ def ensure_containers_are_immutable[K, V](
return cast("MappingProxyType[K, V]", _make_immutable(value))
+def _to_plain(value: Any) -> Any: # noqa: ANN401
+ """Inverse of `_make_immutable`: recursively unwrap to mutable Python.
+
+ Used at boundaries where a downstream library (e.g. optimagic's
+ `om.minimize(algo_options=...)`) does a strict `isinstance(..., dict)`
+ check that rejects `MappingProxyType`.
+ """
+ if isinstance(value, MappingProxyType | Mapping):
+ return {k: _to_plain(v) for k, v in value.items()}
+ if isinstance(value, (tuple, list)):
+ return [_to_plain(v) for v in value]
+ if isinstance(value, frozenset | set):
+ return {_to_plain(v) for v in value}
+ return value
+
+
+def to_plain_dict[K, V](
+ mp: Mapping[K, V],
+) -> dict[K, V]:
+ """Recursively unwrap a `MappingProxyType` tree into plain `dict`."""
+ return cast("dict[K, V]", _to_plain(mp))
+
+
def _reduce_mapping_proxy(mp: MappingProxyType) -> tuple:
return ensure_containers_are_immutable, (dict(mp),)
@@ -67,8 +92,7 @@ class FactorType(Enum):
"""Type of a latent factor in the model."""
STATE = auto() # Regular state factor
- ENDOGENOUS = auto() # Endogenous factor (not a correction)
- CORRECTION = auto() # Correction factor (is_endogenous=True, is_correction=True)
+ ENDOGENOUS = auto() # Endogenous (investment) factor
class MeasurementType(Enum):
@@ -196,32 +220,6 @@ def from_config(
)
-@dataclass(frozen=True)
-class EstimationOptions:
- """Options for model estimation."""
-
- robust_bounds: bool = True
- """Whether to use robust bounds."""
- bounds_distance: float = 1e-3
- """Distance for bounds. Zeroed out if `robust_bounds` is False."""
- n_mixtures: int = 1
- """Number of mixture components."""
- sigma_points_scale: float = 2
- """Scaling factor for sigma points in unscented transform."""
- clipping_lower_bound: float = -1e30
- """Lower bound for soft clipping."""
- clipping_upper_bound: float | None = None
- """Upper bound for soft clipping (None for no upper bound)."""
- clipping_lower_hardness: float = 1
- """Hardness of lower clipping."""
- clipping_upper_hardness: float = 1
- """Hardness of upper clipping."""
-
- def __post_init__(self) -> None: # noqa: D105
- if not self.robust_bounds:
- object.__setattr__(self, "bounds_distance", 0.0)
-
-
@dataclass(frozen=True)
class TransitionInfo:
"""Information about transition functions."""
@@ -250,39 +248,45 @@ def is_state(self) -> bool:
@property
def is_endogenous(self) -> bool:
- """Whether the factor is endogenous (ENDOGENOUS or CORRECTION)."""
- return self.factor_type in (FactorType.ENDOGENOUS, FactorType.CORRECTION)
-
- @property
- def is_correction(self) -> bool:
- """Whether the factor is a correction factor."""
- return self.factor_type == FactorType.CORRECTION
+ """Whether the factor is endogenous."""
+ return self.factor_type == FactorType.ENDOGENOUS
@classmethod
- def from_flags(
- cls, *, is_endogenous: bool = False, is_correction: bool = False
- ) -> FactorInfo:
+ def from_flags(cls, *, is_endogenous: bool = False) -> FactorInfo:
"""Create FactorInfo from boolean flags.
Args:
is_endogenous: Whether the factor is endogenous.
- is_correction: Whether the factor is a correction (must be endogenous).
Returns:
FactorInfo with the appropriate FactorType.
- Raises:
- ValueError: If is_correction is True but is_endogenous is False.
-
"""
- if is_correction and not is_endogenous:
- msg = "A correction factor must also be endogenous"
- raise ValueError(msg)
- if is_correction:
- return cls(factor_type=FactorType.CORRECTION)
- if is_endogenous:
- return cls(factor_type=FactorType.ENDOGENOUS)
- return cls(factor_type=FactorType.STATE)
+ factor_type = FactorType.ENDOGENOUS if is_endogenous else FactorType.STATE
+ return cls(factor_type=factor_type)
+
+
+@dataclass(frozen=True)
+class ControlFunctionInfo:
+ """Resolved control-function configuration for the endogenous investment.
+
+ Single source of truth shared by the CHS (Kalman-MLE) and AMN
+ (simulate-and-regress) estimators. Built by resolving the `CorrectionSpec`
+ declared on the endogenous investment `FactorSpec`: empty `state_predictors`
+ and `targets` expand to all state factors, and each target's `kappa_terms`
+ default to `("cf",)`.
+ """
+
+ investment_factor: str
+ """The endogenous factor whose control-function residual `cf` is formed."""
+ state_predictors: tuple[str, ...]
+ """State factors entering the contemporaneous first-stage equation."""
+ instruments: tuple[str, ...]
+ """Excluded observed factors entering the first stage only."""
+ targets: tuple[str, ...]
+ """State factors whose production equation receives the `kappa * cf` term."""
+ kappa_terms: MappingProxyType[str, tuple[str, ...]]
+ """Per-target `cf` regressor names (e.g. `("cf",)`)."""
@dataclass(frozen=True)
@@ -294,14 +298,16 @@ class EndogenousFactorsInfo:
aug_periods_to_aug_period_meas_types: MappingProxyType[int, MeasurementType]
"""Map each augmented period to whether it measures states or endogenous
factors."""
- bounds_distance: float
- """Small value used as shock sd in carry-forward periods."""
aug_periods_from_period: Callable[[int], list[int]]
"""Return the augmented period indices for a given original period."""
factor_info: MappingProxyType[str, FactorInfo]
"""Mapping from factor name to its `FactorInfo`."""
+ control_function: ControlFunctionInfo | None = None
+ """Resolved control-function configuration, or `None` if no factor declares
+ a `correction`."""
+@beartype_init(MODEL_SPEC_CONF)
@dataclass(frozen=True)
class Normalizations:
"""Normalizations for factor identification."""
@@ -339,8 +345,6 @@ class ProcessedModel:
"""String identifiers for factors, periods, controls, and stages."""
anchoring: Anchoring
"""Anchoring configuration."""
- estimation_options: EstimationOptions
- """Numerical estimation settings."""
transition_info: TransitionInfo
"""Transition function details."""
update_info: pd.DataFrame
@@ -398,6 +402,15 @@ class ParsingInfo:
"""Whether to ignore constant when anchoring."""
has_endogenous_factors: bool
"""Whether the model has endogenous factors."""
+ investment_eq: Array | slice = slice(0, 0)
+ """Slice for the first-stage investment-equation coefficients (empty unless
+ a control function is present)."""
+ investment_factor: str | None = None
+ """The investment factor carrying the control function, or `None`."""
+ kappa: MappingProxyType[str, Array | slice] = field(
+ default_factory=lambda: MappingProxyType({})
+ )
+ """Mapping from target factor to its control-function-loading (kappa) slice."""
@dataclass(frozen=True)
diff --git a/src/skillmodels/utilities.py b/src/skillmodels/common/utilities.py
similarity index 98%
rename from src/skillmodels/utilities.py
rename to src/skillmodels/common/utilities.py
index 9b69945f..9fcb9894 100644
--- a/src/skillmodels/utilities.py
+++ b/src/skillmodels/common/utilities.py
@@ -6,13 +6,13 @@
import numpy as np
import pandas as pd
-from skillmodels.model_spec import (
+from skillmodels.common.model_spec import (
FactorSpec,
ModelSpec,
Normalizations,
)
-from skillmodels.params_index import get_params_index
-from skillmodels.process_model import (
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.process_model import (
get_dimensions,
get_has_endogenous_factors,
process_model,
diff --git a/src/skillmodels/utils_plotting.py b/src/skillmodels/common/utils_plotting.py
similarity index 100%
rename from src/skillmodels/utils_plotting.py
rename to src/skillmodels/common/utils_plotting.py
diff --git a/src/skillmodels/variance_decomposition.py b/src/skillmodels/common/variance_decomposition.py
similarity index 82%
rename from src/skillmodels/variance_decomposition.py
rename to src/skillmodels/common/variance_decomposition.py
index e92d055e..480859dc 100644
--- a/src/skillmodels/variance_decomposition.py
+++ b/src/skillmodels/common/variance_decomposition.py
@@ -8,16 +8,19 @@
from collections.abc import Mapping
import pandas as pd
+from beartype import beartype
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.model_spec import ModelSpec
-from skillmodels.process_model import process_model
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+@beartype(conf=DIAGNOSTICS_CONF)
def decompose_measurement_variance(
model_spec: ModelSpec,
params: pd.DataFrame,
- data: pd.DataFrame,
+ *,
+ filtered_states: pd.DataFrame,
) -> pd.DataFrame:
"""Decompose measurement variance into signal and noise components.
@@ -34,9 +37,16 @@ def decompose_measurement_variance(
Args:
model_spec: The model specification.
params: DataFrame with estimated model parameters.
- data: Empirical dataset used to estimate the model.
-
- Returns:
+ filtered_states: DataFrame with one column per latent factor plus a
+ "period" column. The caller is responsible for producing this
+ via the estimator they used (CHS:
+ ``get_individual_states(...)["anchored_states"]["states"]``;
+ AF: ``get_af_posterior_states(...)``; AMN:
+ ``get_amn_posterior_states(...)``). Anchored states are
+ preferable when available; if not, unanchored states still
+ give a valid decomposition of the latent variance.
+
+ Return:
DataFrame indexed by (period, measurement, factor) with columns:
- loading: The factor loading (L)
- factor_variance: Var(F) for that period
@@ -51,12 +61,6 @@ def decompose_measurement_variance(
78(3), 883-931. https://doi.org/10.3982/ECTA6551
"""
- # Get filtered states to compute factor variances
- filtered_result = get_filtered_states(
- model_spec=model_spec, data=data, params=params
- )
- filtered_states = filtered_result["anchored_states"]["states"]
-
processed_model = process_model(model_spec)
return _compute_variance_decomposition(
filtered_states=filtered_states,
@@ -113,11 +117,19 @@ def _compute_variance_decomposition(
var_name="factor", value_name="factor_variance", ignore_index=False
).reset_index(names="aug_period")
- # Extract loadings (non-zero only)
+ # Extract loadings (non-zero only). The params index uses either
+ # `aug_period` (CHS, internal) or `period` (AF / AMN, public) as the
+ # second level name; normalize both to `aug_period` so the merge
+ # below is symmetric across estimators.
loadings_df = params.loc["loadings"].reset_index()
loadings_df = loadings_df[loadings_df["value"] != 0].copy()
loadings_df = loadings_df.rename(
- columns={"name1": "measurement", "name2": "factor", "value": "loading"}
+ columns={
+ "name1": "measurement",
+ "name2": "factor",
+ "value": "loading",
+ "period": "aug_period",
+ }
)
# Merge loadings with factor variances
@@ -129,7 +141,7 @@ def _compute_variance_decomposition(
# Extract measurement standard deviations
meas_sds_df = params.loc["meas_sds"].reset_index()
meas_sds_df = meas_sds_df.rename(
- columns={"name1": "measurement", "value": "meas_sd"}
+ columns={"name1": "measurement", "value": "meas_sd", "period": "aug_period"}
)
meas_sds_df = meas_sds_df[["aug_period", "measurement", "meas_sd"]]
@@ -170,6 +182,7 @@ def _compute_variance_decomposition(
]
+@beartype(conf=DIAGNOSTICS_CONF)
def summarize_measurement_reliability(
variance_decomposition: pd.DataFrame,
) -> pd.DataFrame:
diff --git a/src/skillmodels/visualize_factor_distributions.py b/src/skillmodels/common/visualize_factor_distributions.py
similarity index 91%
rename from src/skillmodels/visualize_factor_distributions.py
rename to src/skillmodels/common/visualize_factor_distributions.py
index c6ca7a9b..8f77f9e5 100644
--- a/src/skillmodels/visualize_factor_distributions.py
+++ b/src/skillmodels/common/visualize_factor_distributions.py
@@ -10,17 +10,19 @@
import plotly.express as px
import plotly.figure_factory as ff
import plotly.graph_objects as go
+from beartype import beartype
from numpy.typing import NDArray
from plotly.subplots import make_subplots
from scipy.stats import gaussian_kde
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.model_spec import ModelSpec
-from skillmodels.process_model import process_model
-from skillmodels.types import ProcessedModel
-from skillmodels.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import ProcessedModel
+from skillmodels.common.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
+@beartype(conf=DIAGNOSTICS_CONF)
def combine_distribution_plots(
kde_plots: dict[str, go.Figure],
contour_plots: dict[tuple[str, str], go.Figure],
@@ -159,15 +161,15 @@ def combine_distribution_plots(
return fig
+@beartype(conf=DIAGNOSTICS_CONF)
def univariate_densities(
data: pd.DataFrame,
model_spec: ModelSpec,
- params: pd.DataFrame,
period: int,
- factors: list[str] | tuple[str, ...] | None = None,
*,
+ filtered_states: pd.DataFrame | dict[str, pd.DataFrame] | list[pd.DataFrame],
+ factors: list[str] | tuple[str, ...] | None = None,
observed_factors: bool = False,
- states: pd.DataFrame | dict[str, pd.DataFrame] | list[pd.DataFrame] | None = None,
show_curve: bool = True,
show_hist: bool = False,
show_rug: bool = False,
@@ -183,16 +185,19 @@ def univariate_densities(
with factor names as keys.
Args:
- data: Model estimation input data.
+ data: Model estimation input data (used for observed-factor columns).
model_spec: The model specification. See: :ref:`model_specs`
- params: Estimated parameter values.
period: Model period for which to plot the distributions for.
+ filtered_states: Pre-computed filtered or simulated factor draws.
+ Can be a single DataFrame, a list (one per scenario), or a
+ dict mapping scenario label to DataFrame. Produce it via
+ the estimator you used (CHS:
+ ``get_individual_states(...)["anchored_states"]["states"]``;
+ AF: ``get_af_posterior_states(...)``; AMN:
+ ``get_amn_posterior_states(...)``).
factors: Factors for which to plot the densities.
- If None, plot pairwise distributions for all latent factors.
+ If None, plot densities for all latent factors.
observed_factors: If True, plot densities of observed factors too.
- states: Filtered or simulated states. Can be a single DataFrame, a list,
- or a dictionary of DataFrames. If None, retrieve filtered states using
- model and data. Used to estimate state ranges and factor distributions.
show_hist: Add histogram to the distplot.
show_curve: Add density curve to the distplot.
show_rug: Add rug to the distplot.
@@ -215,10 +220,7 @@ def univariate_densities(
plots_dict: Density plots keyed by factor name.
"""
- if states is None:
- states = get_filtered_states(model_spec=model_spec, data=data, params=params)[
- "anchored_states"
- ]["states"]
+ states = filtered_states
processed_model = process_model(model_spec)
factors = _get_factors(
model=processed_model,
@@ -266,15 +268,15 @@ def univariate_densities(
return plots_dict
+@beartype(conf=DIAGNOSTICS_CONF)
def bivariate_density_contours(
data: pd.DataFrame,
model_spec: ModelSpec,
- params: pd.DataFrame,
period: int,
- factors: list[str] | tuple[str, ...] | None = None,
*,
+ filtered_states: pd.DataFrame | dict[str, pd.DataFrame] | list[pd.DataFrame],
+ factors: list[str] | tuple[str, ...] | None = None,
observed_factors: bool = False,
- states: pd.DataFrame | dict[str, pd.DataFrame] | list[pd.DataFrame] | None = None,
n_points: int = 50,
contour_kwargs: dict[str, Any] | None = None,
layout_kwargs: dict[str, Any] | None = None,
@@ -284,22 +286,20 @@ def bivariate_density_contours(
lines_colorscale: str = "D3",
showcolorbar: bool = False,
) -> dict[tuple[str, str], go.Figure]:
- """Get dictionary with pariwise density contour plots.
+ """Get dictionary with pairwise density contour plots.
Plots pairwise bivariate density contours for latent factors
and collects them in a dictionary with factor combinations as keys.
Args:
- data: Model estimation input data.
+ data: Model estimation input data (used for observed-factor columns).
model_spec: The model specification. See: :ref:`model_specs`
- params: Estimated parameter values.
period: Model period for which to plot the distributions for.
+ filtered_states: Pre-computed filtered or simulated factor draws
+ (see :func:`univariate_densities` for shape requirements).
factors: Factors for which to plot the densities.
If None, plot pairwise distributions for all latent factors.
observed_factors: If True, plot densities of observed factors too.
- states: Filtered or simulated states. Can be a single DataFrame, a list,
- or a dictionary of DataFrames. If None, retrieve filtered states using
- model and data. Used to estimate state ranges and factor distributions.
n_points: Number of grid points used to create the mesh for calculation
of kernel densities.
contour_kwargs: Keyword arguments to set contour line properties
@@ -326,10 +326,7 @@ def bivariate_density_contours(
plots_dict: Pairwise density contour plots keyed by factor combinations.
"""
- if states is None:
- states = get_filtered_states(model_spec=model_spec, data=data, params=params)[
- "anchored_states"
- ]["states"]
+ states = filtered_states
processed_model = process_model(model_spec)
factors = _get_factors(
model=processed_model,
@@ -392,15 +389,15 @@ def bivariate_density_contours(
return plots_dict
+@beartype(conf=DIAGNOSTICS_CONF)
def bivariate_density_surfaces(
data: pd.DataFrame,
model_spec: ModelSpec,
- params: pd.DataFrame,
period: int,
- factors: list[str] | tuple[str, ...] | None = None,
*,
+ filtered_states: pd.DataFrame,
+ factors: list[str] | tuple[str, ...] | None = None,
observed_factors: bool = False,
- states: pd.DataFrame | None = None,
n_points: int = 50,
layout_kwargs: dict[str, Any] | None = None,
colorscale: str = "RdBu_r",
@@ -410,22 +407,22 @@ def bivariate_density_surfaces(
showaxlines: bool = True,
showlabels: bool = True,
) -> dict[tuple[str, str], go.Figure]:
- """Get dictionary with pariwise 3d density surface plots.
+ """Get dictionary with pairwise 3d density surface plots.
Plots pairwise 3d density surfaces for latent factors
and collects them in a dictionary with factor name combinations keys.
Args:
- data: Model estimation input data.
+ data: Model estimation input data (used for observed-factor columns).
model_spec: The model specification. See: :ref:`model_specs`
- params: Estimated parameter values.
period: Model period for which to plot the distributions for.
+ filtered_states: Pre-computed filtered or simulated factor draws
+ as a single DataFrame (see :func:`univariate_densities` for
+ production guidance). 3d plots do not support multi-scenario
+ inputs (dict or list) -- pass one DataFrame at a time.
factors: Factors for which to plot the densities.
If None, plot pairwise distributions for all latent factors.
observed_factors: If True, plot densities of observed factors too.
- states: Filtered or simulated states as a single DataFrame.
- If None, retrieve filtered states using model and data. Used to estimate
- state ranges and factor distributions.
n_points: Number of grid points used to create the mesh for calculation
of kernel densities.
@@ -448,12 +445,9 @@ def bivariate_density_surfaces(
plots_dict: Pairwise 3d density surface plots keyed by factor combinations.
"""
- if states is None:
- states = get_filtered_states(model_spec=model_spec, data=data, params=params)[
- "anchored_states"
- ]["states"]
- elif not isinstance(states, pd.DataFrame):
- raise ValueError("3d plots are only supported if states is a DataFrame")
+ if not isinstance(filtered_states, pd.DataFrame):
+ raise TypeError("3d plots are only supported if filtered_states is a DataFrame")
+ states = filtered_states
processed_model = process_model(model_spec)
factors = _get_factors(
model=processed_model,
@@ -587,7 +581,7 @@ def _process_distplot_kwargs(
show_rug: bool,
curve_type: str,
bin_size: float,
- scenarios: NDArray[Any],
+ scenarios: NDArray[Any] | pd.api.extensions.ExtensionArray,
colorscale: str,
distplot_kwargs: dict[str, Any] | None,
) -> dict[str, Any]:
@@ -610,9 +604,7 @@ def _calculate_kde_for_3d(
data: pd.DataFrame,
factors: tuple[str, str],
n_points: int,
-) -> tuple[
- NDArray[np.floating[Any]], NDArray[np.floating[Any]], NDArray[np.floating[Any]]
-]:
+) -> tuple[NDArray[np.float64], NDArray[np.float64], NDArray[np.float64]]:
"""Create grid mesh and calculate Gaussian kernel over the grid."""
x = data[factors[0]]
y = data[factors[1]]
diff --git a/src/skillmodels/visualize_transition_equations.py b/src/skillmodels/common/visualize_transition_equations.py
similarity index 92%
rename from src/skillmodels/visualize_transition_equations.py
rename to src/skillmodels/common/visualize_transition_equations.py
index e74e51b0..da1d4dbd 100644
--- a/src/skillmodels/visualize_transition_equations.py
+++ b/src/skillmodels/common/visualize_transition_equations.py
@@ -8,22 +8,24 @@
import jax.numpy as jnp
import numpy as np
import pandas as pd
+from beartype import beartype
from jax import Array
from plotly import express as px
from plotly import graph_objects as go
from plotly.subplots import make_subplots
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.model_spec import ModelSpec
-from skillmodels.params_index import get_params_index
-from skillmodels.parse_params import create_parsing_info, parse_params
-from skillmodels.process_data import process_data
-from skillmodels.process_debug_data import create_state_ranges
-from skillmodels.process_model import process_model
-from skillmodels.types import ParsedParams, ProcessedModel
-from skillmodels.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
+from skillmodels._beartype_conf import DIAGNOSTICS_CONF
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_data import process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.state_ranges import create_state_ranges
+from skillmodels.common.types import ParsedParams, ProcessedModel
+from skillmodels.common.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
+@beartype(conf=DIAGNOSTICS_CONF)
def combine_transition_plots(
plots_dict: dict[tuple[str, str], go.Figure],
column_order: list[str] | tuple[str, ...] | str | None = None,
@@ -140,12 +142,15 @@ def combine_transition_plots(
return fig
-def get_transition_plots( # noqa: C901, PLR0912
+@beartype(conf=DIAGNOSTICS_CONF)
+def get_transition_plots(
model_spec: ModelSpec,
params: pd.DataFrame,
+ *,
+ filtered_states: pd.DataFrame,
data: pd.DataFrame | None = None,
period: int | None = None,
- periods: Sequence[int] | None = None,
+ periods: Sequence[int] | np.ndarray | None = None,
state_ranges: dict[str, pd.DataFrame] | None = None,
quantiles_of_other_factors: tuple[float, ...] | list[float] | float | None = (
0.25,
@@ -158,8 +163,6 @@ def get_transition_plots( # noqa: C901, PLR0912
colorscale: str | list[str] = "Magenta_r",
state_range_quantile_cutoff: float | None = None,
layout_kwargs: dict[str, Any] | None = None,
- *,
- states: pd.DataFrame | None = None,
include_correction_factors: bool = False,
) -> dict[tuple[str, str], go.Figure]:
"""Get dictionary with individual plots of transition equations for each factor.
@@ -167,8 +170,15 @@ def get_transition_plots( # noqa: C901, PLR0912
Args:
model_spec: The model specification. See: :ref:`model_specs`
params: Model parameters.
- data: Empirical dataset used to estimate the model. Required when `states`
- is not provided or when the model has observed factors.
+ filtered_states: Pre-computed filtered states DataFrame (with a
+ ``period`` column and one column per latent factor). Produce
+ it via the estimator you used (CHS:
+ ``get_individual_states(...)["anchored_states"]["states"]``;
+ AF: ``get_af_posterior_states(...)``; AMN:
+ ``get_amn_posterior_states(...)``).
+ data: Empirical dataset used to estimate the model. Required when
+ the model has observed factors (their realised values appear
+ in the plotted transitions).
period: The start period of the transition equations that are plotted.
Deprecated in favor of `periods`. If both are provided, `periods` is used.
periods: List of periods to overlay on each plot. Each period gets a different
@@ -196,8 +206,6 @@ def get_transition_plots( # noqa: C901, PLR0912
layout_kwargs: Dictionary of key word arguments used to
update layout of plotly image object. If None, the default kwargs
defined in the function will be used.
- states: Pre-computed filtered states DataFrame (with a `period`
- column). If provided, skip the internal `get_filtered_states` call.
include_correction_factors: Whether to include correction factors in the
plots. Default False.
@@ -206,9 +214,13 @@ def get_transition_plots( # noqa: C901, PLR0912
for each combination of input and output factors.
"""
+ states = filtered_states
# Handle period/periods arguments
if periods is not None:
- periods_list = list(periods)
+ # Coerce to plain Python ints so downstream `list[int]`-typed helpers
+ # accept the values (a numpy array yields `np.int64`, which beartype
+ # rejects against `int`).
+ periods_list = [int(p) for p in periods]
elif period is not None:
periods_list = [period]
else:
@@ -239,25 +251,12 @@ def get_transition_plots( # noqa: C901, PLR0912
"(the last period has no transition).",
)
- if (
- include_correction_factors
- or not processed_model.endogenous_factors_info.has_endogenous_factors
- ):
- latent_factors = processed_model.labels.latent_factors
- else:
- latent_factors = [
- lf
- for lf in processed_model.labels.latent_factors
- if not processed_model.endogenous_factors_info.factor_info[lf].is_correction
- ]
+ # `include_correction_factors` is a deprecated no-op: correction factors are
+ # no longer separate measured latent twins (the control function is a
+ # deterministic DAG node), so there is nothing to filter out.
+ _ = include_correction_factors
+ latent_factors = processed_model.labels.latent_factors
all_factors = processed_model.labels.all_factors
- if states is None:
- if data is None:
- msg = "Either 'data' or 'states' must be provided."
- raise TypeError(msg)
- states = get_filtered_states(model_spec=model_spec, data=data, params=params)[
- "anchored_states"
- ]["states"]
states = _normalize_states_columns(
states,
@@ -270,7 +269,7 @@ def get_transition_plots( # noqa: C901, PLR0912
params=params,
states=states,
state_ranges=state_ranges,
- latent_factors=latent_factors, # ty: ignore[invalid-argument-type]
+ latent_factors=latent_factors,
all_factors=all_factors,
quantiles_of_other_factors=quantiles_of_other_factors,
periods=periods_list,
@@ -437,8 +436,15 @@ def _prepare_plot_data_for_factor_pair(
has_endogenous_factors=has_endogenous_factors,
)
+ # Forward every transition-coeffs key sliced at this period, not just the
+ # output factor's: a correction target's grafted DAG also reads the
+ # reserved first-stage (`__first_stage___`) and kappa
+ # (`__kappa___`) keys. All keys share the same per-period axis, so
+ # `[aug_period]` indexes them uniformly; the DAG ignores keys it does not
+ # need (e.g. other factors' coefficients).
transition_params = {
- output_factor: parsed_params.transition[output_factor][aug_period]
+ key: per_period[aug_period]
+ for key, per_period in parsed_params.transition.items()
}
period_states = states_data[states_data["aug_period"] == aug_period]
diff --git a/src/skillmodels/config.py b/src/skillmodels/config.py
deleted file mode 100644
index cd7eb32b..00000000
--- a/src/skillmodels/config.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""Configuration constants and paths for skillmodels."""
-
-from pathlib import Path
-
-TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data"
-REGRESSION_VAULT = (
- Path(__file__).resolve().parent.parent.parent / "tests" / "regression_vault"
-)
diff --git a/src/skillmodels/constraints.py b/src/skillmodels/constraints.py
deleted file mode 100644
index 4285ac0e..00000000
--- a/src/skillmodels/constraints.py
+++ /dev/null
@@ -1,478 +0,0 @@
-"""Constraint objects for a model specification."""
-
-import functools
-import warnings
-from collections.abc import Mapping
-from dataclasses import dataclass
-from typing import Any
-
-import numpy as np
-import optimagic as om
-import pandas as pd
-
-import skillmodels.transition_functions as t_f_module
-from skillmodels.types import (
- Anchoring,
- Dimensions,
- EndogenousFactorsInfo,
- Labels,
- MeasurementType,
- Normalizations,
-)
-
-
-def select_by_loc(params: pd.DataFrame, loc: Any) -> pd.DataFrame: # noqa: ANN401
- """Select parameters by location."""
- return params.loc[loc]
-
-
-@dataclass(frozen=True)
-class FixedConstraintWithValue(om.FixedConstraint):
- """Fixed constraint that carries the target value and parameter location.
-
- `om.FixedConstraint` fixes parameters at their start values but does not carry a
- target value. This wrapper adds `loc` (the parameter location in the params
- DataFrame) and `value` (the value to set before optimization).
- """
-
- loc: pd.MultiIndex | tuple | str | None = None
- """Parameter location in the params DataFrame."""
- value: float | None = None
- """Value to enforce on the parameter."""
-
- def __post_init__(self) -> None:
- """Validate that `loc` and `value` are not None and derive `selector`."""
- if self.loc is None:
- msg = "loc must not be None"
- raise TypeError(msg)
- if self.value is None:
- msg = "value must not be None"
- raise TypeError(msg)
- object.__setattr__(
- self,
- "selector",
- functools.partial(select_by_loc, loc=self.loc),
- )
-
-
-def get_constraints(
- dimensions: Dimensions,
- labels: Labels,
- anchoring_info: Anchoring,
- update_info: pd.DataFrame,
- normalizations: Mapping[str, Normalizations],
- endogenous_factors_info: EndogenousFactorsInfo,
-) -> list[om.constraints.Constraint]:
- """Generate constraints implied by the model specification.
-
- Args:
- dimensions: Dimensional information like n_states, n_periods, n_controls,
- n_mixtures. See :ref:`dimensions`.
- labels: Dict of lists with labels for the model quantities like
- factors, periods, controls, stagemap and stages. See :ref:`labels`
- anchoring_info: Information about anchoring. See :ref:`anchoring`
- update_info: DataFrame with one row per Kalman update needed
- in the likelihood function. See :ref:`update_info`.
- normalizations: Nested dictionary with information on normalized factor
- loadings and intercepts for each factor. See :ref:`normalizations`.
- endogenous_factors_info: Information about endogenous factors in the model.
-
- Returns:
- List of optimagic constraint objects.
-
- """
- constraints: list[om.constraints.Constraint] = []
-
- constraints += _get_normalization_constraints(
- normalizations=normalizations, factors=labels.latent_factors
- )
- constraints += _get_mixture_weights_constraints(dimensions.n_mixtures)
- constraints += _get_stage_constraints(
- stagemap=labels.aug_stagemap,
- stages=labels.aug_stages,
- )
- constraints += _get_constant_factors_constraints(labels=labels)
- constraints += _get_initial_states_constraints(
- n_mixtures=dimensions.n_mixtures,
- factors=labels.latent_factors,
- )
- constraints += _get_transition_constraints(labels=labels)
- constraints += _get_anchoring_constraints(
- update_info=update_info,
- controls=labels.controls,
- anchoring_info=anchoring_info,
- periods=labels.aug_periods,
- )
- if endogenous_factors_info.has_endogenous_factors:
- constraints += _get_constraints_for_augmented_periods(
- labels=labels,
- endogenous_factors_info=endogenous_factors_info,
- )
-
- return constraints
-
-
-def add_bounds(params: pd.DataFrame, bounds_distance: float) -> pd.DataFrame:
- """Add bounds for standard deviations to params.
-
- Lower and upper bounds are set to (minus) infinity; lower bounds for standard
- deviation-like parameters are set to *bounds_distance*. Note that the latter will be
- overridden for parameters where fixed constraints are imposed.
-
- Args:
- params: see :ref:`params`.
- bounds_distance: set standard deviation-like to this amount.
-
- Returns:
- Modified copy of params
-
- """
- df = params.copy()
- with warnings.catch_warnings():
- warnings.filterwarnings(
- "ignore",
- message="indexing past lexsort depth may impact performance.",
- )
- if "lower_bound" not in df.columns:
- df["lower_bound"] = -np.inf
- if "upper_bound" not in df.columns:
- df["upper_bound"] = np.inf
-
- df.loc["meas_sds", "lower_bound"] = bounds_distance
- df.loc["shock_sds", "lower_bound"] = bounds_distance
-
- cholcov_index = df.query("category == 'initial_cholcovs'").index.tolist()
- ind_tups = [tup for tup in cholcov_index if _is_diagonal_entry(tup)]
- df.loc[ind_tups, "lower_bound"] = bounds_distance
-
- return df
-
-
-def _is_diagonal_entry(ind_tup: tuple[str, ...]) -> bool:
- name2 = ind_tup[-1]
- middle_pos = int(len(name2) // 2)
- if (
- len(name2) % 2 == 0
- or name2[middle_pos] != "-"
- or name2[:middle_pos] != name2[middle_pos + 1 :]
- ):
- is_diag = False
- else:
- is_diag = True
- return is_diag
-
-
-def _get_normalization_constraints(
- normalizations: Mapping[str, Normalizations],
- factors: tuple[str, ...],
-) -> list[om.constraints.Constraint]:
- """List of constraints to enforce normalizations.
-
- Args:
- normalizations: Mapping from factor name to Normalizations instance.
- factors: Tuple of factor names to process.
-
- Returns:
- List of constraint objects.
-
- """
- periods = range(len(normalizations[factors[0]].loadings))
-
- constraints: list[om.constraints.Constraint] = []
- for factor in factors:
- for period in periods:
- for meas, normval in normalizations[factor].loadings[period].items():
- loc = ("loadings", period, meas, factor)
- constraints.append(FixedConstraintWithValue(loc=loc, value=normval))
- for meas, normval in normalizations[factor].intercepts[period].items():
- loc = ("controls", period, meas, "constant")
- constraints.append(FixedConstraintWithValue(loc=loc, value=normval))
-
- return constraints
-
-
-def _get_mixture_weights_constraints(
- n_mixtures: int,
-) -> list[om.constraints.Constraint]:
- """Constrain mixture weights to be between 0 and 1 and sum to 1."""
- loc = "mixture_weights"
- if n_mixtures == 1:
- return [
- FixedConstraintWithValue(loc=loc, value=1.0),
- ]
- return [
- om.ProbabilityConstraint(selector=functools.partial(select_by_loc, loc=loc))
- ]
-
-
-def _get_stage_constraints(
- stagemap: tuple[int, ...],
- stages: tuple[int, ...],
-) -> list[om.constraints.Constraint]:
- """Equality constraints for transition and shock parameters within stages.
-
- Args:
- stagemap: map aug_periods to aug_stages
- stages: aug_stages
-
- Returns:
- List of constraint objects.
-
- """
- constraints: list[om.constraints.Constraint] = []
-
- stages_to_periods: dict[int, list[int]] = {stage: [] for stage in stages}
- for aug_period, stage in enumerate(stagemap):
- stages_to_periods[stage].append(aug_period)
-
- for stage_periods in stages_to_periods.values():
- if len(stage_periods) > 1:
- loc_trans = [("transition", p) for p in stage_periods]
- loc_q = [("shock_sds", p) for p in stage_periods]
- constraints.append(
- om.PairwiseEqualityConstraint(
- selectors=[
- functools.partial(select_by_loc, loc=loc) for loc in loc_trans
- ],
- ),
- )
- constraints.append(
- om.PairwiseEqualityConstraint(
- selectors=[
- functools.partial(select_by_loc, loc=loc) for loc in loc_q
- ],
- ),
- )
-
- return constraints
-
-
-def _get_constant_factors_constraints(
- labels: Labels,
-) -> list[om.constraints.Constraint]:
- """Fix shock variances of constant factors to zero.
-
- Args:
- labels: Dict of lists with labels for the model quantities like
- factors, periods, controls, stagemap and stages. See :ref:`labels`
-
- Returns:
- List of constraint objects.
-
- """
- constraints: list[om.constraints.Constraint] = []
- for f, factor in enumerate(labels.latent_factors):
- if labels.transition_names[f] == "constant":
- for aug_period in labels.aug_periods[:-1]:
- loc = ("shock_sds", aug_period, factor, "-")
- constraints.append(
- FixedConstraintWithValue(loc=loc, value=0.0),
- )
- return constraints
-
-
-def _get_initial_states_constraints(
- n_mixtures: int,
- factors: tuple[str, ...],
-) -> list[om.constraints.Constraint]:
- """Enforce that the x values of the first factor are increasing.
-
- Otherwise the model would only be identified up to the order of the start factors.
-
- Args:
- n_mixtures: number of elements in the mixture of normal of the factors.
- factors: the latent factors of the model
-
- Returns:
- List of constraint objects.
-
- """
- if n_mixtures > 1:
- locs = [
- ("initial_states", 0, f"mixture_{emf}", factors[0])
- for emf in range(n_mixtures)
- ]
- return [
- om.IncreasingConstraint(selector=functools.partial(select_by_loc, loc=locs))
- ]
- return []
-
-
-def _get_transition_constraints(
- labels: Labels,
-) -> list[om.constraints.Constraint]:
- """Collect possible constraints on transition parameters.
-
- Args:
- labels: Dict of lists with labels for the model quantities like
- factors, periods, controls, stagemap and stages. See :ref:`labels`
-
- Returns:
- List of constraint objects.
-
- """
- constraints: list[om.constraints.Constraint] = []
- for f, factor in enumerate(labels.latent_factors):
- tname = labels.transition_names[f]
- for aug_period in labels.aug_periods[:-1]:
- funcname = f"constraints_{tname}"
- if func := getattr(t_f_module, funcname, False):
- constraints.append(
- func( # ty: ignore[call-non-callable]
- factor=factor,
- factors=labels.all_factors,
- aug_period=aug_period,
- )
- )
- return constraints
-
-
-def _get_anchoring_constraints( # noqa: C901
- update_info: pd.DataFrame,
- controls: tuple[str, ...],
- anchoring_info: Anchoring,
- periods: tuple[int, ...],
-) -> list[om.constraints.Constraint]:
- """Constraints on anchoring parameters.
-
- Args:
- update_info: DataFrame with one row per Kalman update needed
- in the likelihood function. See :ref:`update_info`.
- controls: List of control variables
- anchoring_info: Information about anchoring. See :ref:`anchoring`
- periods: Period of the model
-
- Returns:
- List of constraint objects.
-
- """
- anchoring_updates = update_info[update_info["purpose"] == "anchoring"].index
-
- constraints: list[om.constraints.Constraint] = []
- if not anchoring_info.free_constant:
- locs = []
- for period, meas in anchoring_updates:
- locs.append(("controls", period, meas, "constant"))
- if locs:
- loc = tuple(locs)
- constraints.append(
- FixedConstraintWithValue(loc=loc, value=0),
- )
-
- if not anchoring_info.free_controls:
- ind_tups = []
- for period, meas in anchoring_updates:
- for cont in [c for c in controls if c != "constant"]:
- ind_tups.append(("controls", period, meas, cont))
- if ind_tups:
- loc = tuple(ind_tups)
- constraints.append(
- FixedConstraintWithValue(loc=loc, value=0),
- )
-
- if not anchoring_info.free_loadings:
- ind_tups = []
- for period in periods:
- for factor in anchoring_info.factors:
- outcome = anchoring_info.outcomes[factor]
- meas = f"{outcome}_{factor}"
- ind_tups.append(("loadings", period, meas, factor))
-
- if ind_tups:
- loc = tuple(ind_tups)
- constraints.append(
- FixedConstraintWithValue(loc=loc, value=1),
- )
-
- return constraints
-
-
-def _get_constraints_for_augmented_periods(
- labels: Labels,
- endogenous_factors_info: EndogenousFactorsInfo,
-) -> list[om.constraints.Constraint]:
- """Constraints for augmented periods.
-
- - Carry forward states from uneven periods to even periods
- - Carry forward endogenous factors even periods to uneven periods
- - Set shock_sds to 0 when carrying anything forward
-
- Both depend on the transition function.
-
- Args:
- labels: Dict of lists with labels for the model quantities like
- factors, periods, controls, stagemap and stages. See :ref:`labels`
- endogenous_factors_info: Information about endogenous factors and their
- relationship to augmented periods.
-
- Returns:
- List of constraint objects.
-
- """
- constraints: list[om.constraints.Constraint] = []
- for f, factor in enumerate(labels.latent_factors):
- tname = labels.transition_names[f]
- if tname == "constant":
- continue
- # We are restricting transitions and shocks, not measurements. So this might
- # look counterintuitive...
- aug_period_meas_type_to_constrain = (
- MeasurementType.STATES
- if endogenous_factors_info.factor_info[factor].is_state
- else MeasurementType.ENDOGENOUS_FACTORS
- )
- aug_period_meas_types = (
- endogenous_factors_info.aug_periods_to_aug_period_meas_types
- )
- aug_periods_to_constrain = [
- k
- for k, v in aug_period_meas_types.items()
- if v == aug_period_meas_type_to_constrain
- ]
- for aug_period in aug_periods_to_constrain:
- if func := getattr(t_f_module, f"identity_constraints_{tname}", False):
- constraints += func( # ty: ignore[call-non-callable]
- factor=factor,
- aug_period=aug_period,
- all_factors=labels.all_factors,
- )
- for aug_period in aug_periods_to_constrain[:-1]:
- loc = ("shock_sds", aug_period, factor, "-")
- constraints.append(
- FixedConstraintWithValue(
- loc=loc,
- value=endogenous_factors_info.bounds_distance,
- )
- )
-
- return constraints
-
-
-def enforce_fixed_constraints(
- params_template: pd.DataFrame,
- constraints: list[om.constraints.Constraint],
-) -> pd.DataFrame:
- """Enforce fixed constraints on params_template.
-
- For fixed constraints, we also set the lower and upper bounds to the fixed value.
- This means that any robust bounds will be overridden for fixed parameters.
-
- Args:
- params_template: see :ref:`params_df`.
- constraints: list of optimagic constraint objects.
-
- Returns:
- pd.DataFrame: modified copy of params_template
- """
- params = params_template.copy()
- with warnings.catch_warnings():
- warnings.filterwarnings(
- "ignore",
- message="indexing past lexsort depth may impact performance.",
- )
- for constraint in constraints:
- if isinstance(constraint, FixedConstraintWithValue):
- params.loc[constraint.loc, "value"] = constraint.value
-
- # Setting via loc may expand the index, so reduce to the original index
- return params.loc[params_template.index].astype(float)
diff --git a/src/skillmodels/exceptions.py b/src/skillmodels/exceptions.py
new file mode 100644
index 00000000..551c3329
--- /dev/null
+++ b/src/skillmodels/exceptions.py
@@ -0,0 +1,66 @@
+"""Project-specific exception types raised by skillmodels' user-facing API.
+
+The beartype decorators applied at the public entry points
+(`skillmodels._beartype_conf`) route parameter-type violations through
+one of the classes defined here, so callers can write narrowly-scoped
+`except` clauses against a stable skillmodels-specific hierarchy
+instead of catching the framework-supplied `BeartypeCallHintParamViolation`.
+
+All classes inherit from `TypeError` so existing `except TypeError`
+handlers continue to fire; the subclasses are additive.
+"""
+
+
+class SkillmodelsInputError(TypeError):
+ """Base class for all skillmodels parameter-validation errors."""
+
+
+class ModelSpecInitializationError(SkillmodelsInputError):
+ """Bad argument to a model-spec dataclass.
+
+ Raised on construction of `ModelSpec`, `FactorSpec`,
+ `AnchoringSpec`, or `Normalizations`.
+ """
+
+
+class OptionsInitializationError(SkillmodelsInputError):
+ """Bad argument to an estimation-options dataclass.
+
+ Raised on construction of `CHSEstimationOptions`,
+ `AFEstimationOptions`, or `AMNEstimationOptions`.
+ """
+
+
+class EstimationCallError(SkillmodelsInputError):
+ """Bad argument to an estimation entry point.
+
+ Raised by `get_maximization_inputs`, `get_individual_states`,
+ `estimate_af`, `estimate_amn`, `get_af_posterior_states`, or
+ `get_amn_posterior_states` when arguments don't match the
+ declared types.
+ """
+
+
+class InferenceCallError(SkillmodelsInputError):
+ """Bad argument to a standard-error / bootstrap helper.
+
+ Raised by `compute_af_standard_errors` and
+ `compute_amn_standard_errors`.
+ """
+
+
+class SimulationCallError(SkillmodelsInputError):
+ """Bad argument to a simulation helper.
+
+ Raised by `simulate_dataset` and `simulate_policy_effect`.
+ """
+
+
+class DiagnosticsCallError(SkillmodelsInputError):
+ """Bad argument to a diagnostics / visualisation helper.
+
+ Raised by `decompose_measurement_variance`,
+ `summarize_measurement_reliability`, `plot_residual_boxplots`,
+ `plot_likelihood_contributions`, `create_state_ranges`, and the
+ factor-distribution / transition-equation plotting helpers.
+ """
diff --git a/src/skillmodels/test_data/cnlsy_7_9_11.NOTICE.md b/src/skillmodels/test_data/cnlsy_7_9_11.NOTICE.md
new file mode 100644
index 00000000..d21675f3
--- /dev/null
+++ b/src/skillmodels/test_data/cnlsy_7_9_11.NOTICE.md
@@ -0,0 +1,24 @@
+# cnlsy_7_9_11.csv
+
+Long-format measurements derived from the CNLSY (Children of the National
+Longitudinal Survey of Youth) public-use sample, ages 7 / 9 / 11. Produced
+by `matlab_ces_repro/load_cnlsy.py` from the bundled
+`complete_7_9_11.xls`, which itself is the input file used in the
+Attanasio & Freyberger (2025) application.
+
+The CSV is a tidy, period-indexed view of the same dataset:
+
+- `(caseid, period)` MultiIndex (period ∈ {0, 1, 2}, mapping to ages 7 / 9 / 11).
+- Skill measurements (`skill_math`, `skill_recog`, `skill_comp`) standardised
+ within each period.
+- Time-invariant cognitive (`mc_*`, 6 ASVAB sub-tests) and non-cognitive
+ (`mn_neg`, `mn_pos`, `mn_rotter`) blocks standardised across the whole
+ sample; written only in period 0, NaN elsewhere.
+- Investment measurements (`inv_*`, parental involvement) standardised
+ within each period and present in periods 0 and 1 only.
+- `log_income_observed`: log family income (already in logs in the source);
+ the period-2 value is held forward from period 1 to keep the CHS observed-
+ factor column NaN-free (period 2 isn't used by the AF transition).
+
+CNLSY is a U.S. Bureau of Labor Statistics public-use dataset. Redistribution
+of a processed subset for documentation purposes is permitted under BLS terms.
diff --git a/src/skillmodels/test_data/cnlsy_7_9_11.csv b/src/skillmodels/test_data/cnlsy_7_9_11.csv
new file mode 100644
index 00000000..414fb727
--- /dev/null
+++ b/src/skillmodels/test_data/cnlsy_7_9_11.csv
@@ -0,0 +1,4210 @@
+caseid,period,skill_math,skill_recog,skill_comp,mc_1,mc_2,mc_3,mc_4,mc_5,mc_6,mn_neg,mn_pos,mn_rotter,inv_reads,inv_museum,inv_praised,log_income_observed
+1602,0,-0.8255845489855216,-1.460901963714797,-1.3289780031076046,0.2108641118148177,0.7727681057484966,0.457405498335207,1.3969449327761334,0.6982958042700221,0.7596854921540671,0.36043714080320877,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,2.4150469303131104
+1602,1,0.048094632541727786,0.5285571507320932,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.4160003662109375
+1602,2,-0.4729569847285068,-0.10626094735465771,0.008082907292302316,,,,,,,,,,,,,2.4160003662109375
+2502,0,-1.164432463825118,0.6101443027976923,0.893230199930166,0.6533003264850905,0.39561354207787724,0.17294631652479245,1.3057140180675306,0.9393511068205153,0.9242937926161762,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.995732307434082
+2502,1,0.33645689517439314,2.577573332492533,0.14609054585137357,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.310551991190808,2.995732307434082
+2502,2,-0.07938720443544948,0.6722461499747677,-0.981944935899015,,,,,,,,,,,,,2.995732307434082
+5001,0,0.19095919553326762,0.4950861768803317,1.016686211210042,1.2432152793787876,1.0242044815289095,1.3107830437664505,1.4881758474847362,0.9996149324581385,0.9242937926161762,-1.432801541987221,0.22503104425430823,-0.5517814777504622,-1.0422163045785646,0.806708965813594,0.42764121833107505,2.3797354698181152
+5001,1,-0.04802612166916067,0.7067324708851749,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.0266363620758057
+5001,2,0.11739768571107917,0.5165447305088826,-0.17192215510611902,,,,,,,,,,,,,2.0266363620758057
+6101,0,0.4168578054263319,0.14991179912825014,-0.4647859241484716,1.833130232272485,1.401359045199529,1.3107830437664505,1.3969449327761334,1.4214617119215014,2.07655189585094,-0.835055314390411,-0.16814274788616518,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.771721839904785
+6101,1,1.77826820833772,0.2612941705024705,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.974954605102539
+6101,2,0.41257502093087217,-0.41766378628642786,0.18808796969072364,,,,,,,,,,,,,2.974954605102539
+6203,0,0.6427564153193962,0.2649699250456107,0.029038120971032973,-0.5265295793023037,0.1441771662974643,-0.1115128652856221,-0.1539806172701155,-1.2904104417715454,-0.3925726110806964,0.36043714080320877,-0.5613165400266386,-0.13173296267509654,-2.5822157519969178,-0.2910724881500066,0.20460009219036931,1.4210286140441895
+6203,1,0.7209399120179469,0.5285571507320932,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.3139013144854623,1.594625473022461
+6203,2,0.11739768571107917,0.43869402077594005,0.45809556328835566,,,,,,,,,,,,,1.594625473022461
+6801,0,0.07800989058673549,1.7607255619712974,0.2759501435307853,2.1280877087193333,1.401359045199529,1.3107830437664505,1.1232521886503248,1.9035723170224874,2.07655189585094,1.5559295959968287,1.4045524206757267,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.24148216009104212,2.995732307434082
+6801,1,1.2976644372832777,0.9739954511147976,0.963091186925524,,,,,,,,,,0.9503768127628092,1.8141914255436393,1.1944719937511734,2.995732307434082
+6801,2,1.1997145815169867,1.8400067959689057,0.5480980944875663,,,,,,,,,,,,,2.995732307434082
+9701,0,0.529807110372864,-0.42537883045855246,-0.5882419354283478,0.2108641118148177,1.149922669419116,1.026323861956036,0.028481212147090252,0.15592137353141286,0.430468891229849,0.36043714080320877,-1.3476641243075844,0.28831555240026907,1.267782866548965,0.806708965813594,0.8737234706124865,2.4017746448516846
+9701,1,-1.2975959264107106,-0.6295824302629383,-0.568785015088508,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.4193592071533203
+9701,2,0.7077523561506651,0.43869402077594005,0.638100625686777,,,,,,,,,,,,,2.4193592071533203
+9702,0,-0.03493941435979663,-0.8856113341279945,-0.4647859241484716,0.2108641118148177,1.149922669419116,1.026323861956036,0.028481212147090252,0.15592137353141286,0.430468891229849,0.36043714080320877,-1.3476641243075844,0.28831555240026907,1.267782866548965,0.806708965813594,0.8737234706124865,2.4193592071533203
+9702,1,-0.14414687588004912,-0.00596880972715211,-0.26240977468570165,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.9436346629275099,2.4286715984344482
+9702,2,1.1997145815169867,-0.41766378628642786,-0.6219348111021723,,,,,,,,,,,,,2.4286715984344482
+9801,0,0.7557057202659283,1.0703768064671344,1.3870542450496706,1.0957365411553635,1.0242044815289095,0.7418646801456215,0.3934048709815018,0.6380319786323989,0.595077191691958,0.9581833684000187,-0.16814274788616518,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,0.36564069986343384
+9801,1,1.2015436830723893,1.0630831111913384,1.6779667478654055,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,0.9098517298698425
+9801,2,1.298107026590251,0.20514189157711243,1.8981360624757264,,,,,,,,,,,,,0.9098517298698425
+13702,0,1.320452244998589,0.3800280509629712,1.016686211210042,1.833130232272485,0.8984862936387031,0.7418646801456215,1.3057140180675306,1.6625170144719943,1.9119435953888306,1.5559295959968287,1.0113786285352542,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.995732307434082
+13702,1,1.2976644372832777,1.0630831111913384,0.6567159465227176,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.059714660367144415,2.995732307434082
+13702,2,1.3964994716635155,1.450753247304193,0.5480980944875663,,,,,,,,,,,,,2.995732307434082
+13802,0,1.4334015499451211,1.875783687888658,0.6463181773704137,1.2432152793787876,0.7727681057484966,1.026323861956036,1.0320212739417218,2.265155270848227,1.7473352949267216,-0.835055314390411,1.4045524206757267,0.28831555240026907,0.49778314283978853,-0.2910724881500066,1.7658879751753094,2.158076763153076
+13802,1,1.4899059457050545,1.8648720518802064,1.371591507462599,,,,,,,,,,0.2373400917434395,-0.3229291202479022,2.699495978693155,2.092273473739624
+13802,2,0.5109674660041365,1.0614996986394805,-0.35192721750454037,,,,,,,,,,,,,2.092273473739624
+14301,0,0.6427564153193962,-0.3103207045411919,0.029038120971032973,0.6533003264850905,1.149922669419116,0.17294631652479245,0.5758667003987075,-0.26592540593194997,0.430468891229849,-0.835055314390411,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,0.806708965813594,0.8737234706124865,2.489999532699585
+14301,1,1.0093021746506123,-0.2732317899567748,0.24821562598564237,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.5049023628234863
+14301,2,1.1013221364437225,0.1272911818441699,0.2780905008899343,,,,,,,,,,,,,2.5049023628234863
+14901,0,0.3039085004797998,0.2649699250456107,-0.2178739015887193,-0.23157210285545515,-0.2329773973731551,-0.1115128652856221,-0.06274970256151263,0.2161851991690361,-0.3925726110806964,-0.835055314390411,1.0113786285352542,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.6352858543395996
+14901,1,0.33645689517439314,-0.09505646980369299,-0.05815961441716403,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,2.729461908340454
+14901,2,0.5109674660041365,0.1272911818441699,-0.17192215510611902,,,,,,,,,,,,,2.729461908340454
+14902,0,0.6427564153193962,0.8402605546324132,0.3994061548106614,-0.23157210285545515,-0.2329773973731551,-0.1115128652856221,-0.06274970256151263,0.2161851991690361,-0.3925726110806964,-0.835055314390411,1.0113786285352542,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.729461908340454
+14902,1,1.1054229288615007,0.7958201309617158,1.2694664273283303,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.4286515712738037
+14902,2,0.41257502093087217,1.0614996986394805,0.368093032089145,,,,,,,,,,,,,2.4286515712738037
+15801,0,-0.37378732919939306,1.0703768064671344,1.8808782901691752,0.9482578029319392,1.401359045199529,1.026323861956036,1.1232521886503248,-0.14539775465670343,1.5827269944646125,0.9581833684000187,1.4045524206757267,0.28831555240026907,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.9572726488113403
+15801,1,-0.14414687588004912,1.0630831111913384,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.031648874282837
+15801,2,-0.6697418748750354,0.43869402077594005,0.008082907292302316,,,,,,,,,,,,,2.031648874282837
+16702,0,0.19095919553326762,0.2649699250456107,0.2759501435307853,-0.9689657939725767,-0.10725920948294862,1.026323861956036,0.028481212147090252,0.8188234555452687,-0.8863975124670236,0.9581833684000187,1.0113786285352542,-0.13173296267509654,1.267782866548965,0.806708965813594,3.104134732019544,1.1936686038970947
+16702,1,0.7209399120179469,0.4394694906555523,-0.6709100952227768,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,1.259954810142517
+16702,2,-0.4729569847285068,-0.18411165708760024,0.638100625686777,,,,,,,,,,,,,1.259954810142517
+17901,0,-0.7126352440389895,-0.3103207045411919,-0.8351539579881,0.06338537359139342,0.5213317299680837,-0.1115128652856221,0.11971212685569313,-1.9533125237854012,-0.22796431061858732,0.36043714080320877,1.4045524206757267,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,2.1410915851593018
+17901,1,-0.14414687588004912,-0.4514071101098565,0.963091186925524,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.0792863368988037
+17901,2,-0.6697418748750354,-0.729066625218198,-0.35192721750454037,,,,,,,,,,,,,2.0792863368988037
+17902,0,-0.14788871930632877,-0.5404369563759129,-0.2178739015887193,0.06338537359139342,0.5213317299680837,-0.1115128652856221,0.11971212685569313,-1.9533125237854012,-0.22796431061858732,0.36043714080320877,1.4045524206757267,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,2.0792863368988037
+17902,1,-0.33638838430182605,-0.18414412988023388,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.31561279296875
+17902,2,-0.1777796495087138,-0.10626094735465771,0.2780905008899343,,,,,,,,,,,,,2.31561279296875
+18401,0,1.0945536351055247,1.3004930583018552,2.004334301449051,0.8007790647085149,0.5213317299680837,0.7418646801456215,0.4846357856901046,-0.5069807084824429,0.595077191691958,0.9581833684000187,-0.16814274788616518,0.28831555240026907,1.267782866548965,1.9044904197771946,1.9889291013160153,2.41306734085083
+18401,1,0.9131814204397238,0.5285571507320932,0.8609661067912552,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.370971202850342
+18401,2,0.2157901307843435,0.36084331104299755,0.2780905008899343,,,,,,,,,,,,,2.370971202850342
+18801,0,-1.164432463825118,-2.266308845136321,-2.1931700820667377,-1.2639232704194252,-0.2329773973731551,0.17294631652479245,-0.9750588496475414,-0.6275083597576895,-1.3802224138533508,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.2435826063156128
+18801,1,-0.8169921553562683,-1.2531960507987243,-1.2836605760283897,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.5613893220144716,1.1617645025253296
+18801,2,-0.6697418748750354,0.1272911818441699,-0.26192468630532967,,,,,,,,,,,,,1.1617645025253296
+19001,0,0.529807110372864,1.1854349323844948,1.757422278889299,0.6533003264850905,0.8984862936387031,0.7418646801456215,-0.06274970256151263,1.4214617119215014,1.4181186940025035,0.36043714080320877,1.7977262128162,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,2.639143943786621
+19001,1,0.33645689517439314,1.7757843918036655,0.963091186925524,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.6101396083831787
+19001,2,1.4948919167367798,2.2292603446336186,0.368093032089145,,,,,,,,,,,,,2.6101396083831787
+20001,0,1.9981480746777818,2.105899939723379,1.8808782901691752,-0.5265295793023037,-0.8615683368241874,0.7418646801456215,-0.06274970256151263,1.843308491384864,-0.3925726110806964,-2.030547769584031,-0.9544903321671111,-2.2319755380519246,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.225468873977661
+20001,1,0.4325776493852816,0.5285571507320932,0.7588410266569864,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-1.3139013144854623,-0.6931471824645996
+20001,2,0.2157901307843435,0.20514189157711243,0.008082907292302316,,,,,,,,,,,,,-0.6931471824645996
+21102,0,1.9981480746777818,1.3004930583018552,0.029038120971032973,1.0957365411553635,-0.10725920948294862,0.7418646801456215,0.940790359233119,0.7585596299076455,1.5827269944646125,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.373138904571533
+21102,1,1.3937851914941661,0.9739954511147976,0.7588410266569864,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.059714660367144415,2.361774206161499
+21102,2,1.6916768068833083,0.8279475694406527,0.18808796969072364,,,,,,,,,,,,,2.361774206161499
+21103,0,-0.03493941435979663,-0.1952625786238314,-0.3413299128685955,1.0957365411553635,-0.10725920948294862,0.7418646801456215,0.940790359233119,0.7585596299076455,1.5827269944646125,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.24148216009104212,2.361774206161499
+21103,1,0.2403361409635047,0.3503818305790114,0.7588410266569864,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.4419600012801827,2.414478302001953
+21103,2,-0.8665267650215641,-0.18411165708760024,0.5480980944875663,,,,,,,,,,,,,2.414478302001953
+22104,0,-0.2608380242528609,-0.770553208210634,-0.4647859241484716,-0.5265295793023037,-2.4959047793968714,-2.102727137958524,-2.708446229110996,-2.4956869545240106,-1.2156141133912417,-1.432801541987221,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,0.7634837031364441
+22104,1,-1.585958189043376,-1.2531960507987243,-1.079410415759852,,,,,,,,,,0.9503768127628092,1.8141914255436393,-1.3139013144854623,0.6528940796852112
+22104,2,-0.8665267650215641,-1.040469464149968,-1.251952529496647,,,,,,,,,,,,,0.6528940796852112
+22703,0,-0.03493941435979663,0.2649699250456107,-0.8351539579881,-1.1164445321960008,-1.7415956520556326,-0.9648904107168657,-0.9750588496475414,-2.073840175060648,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,0.20460009219036931,0.28899428248405457
+22703,1,-1.0092336637780452,-0.80775775041602,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.0630639836617988,0.3237709701061249
+22703,2,-0.4729569847285068,-0.4955144960193704,-0.8019398735005937,,,,,,,,,,,,,0.3237709701061249
+23102,0,1.5463508548916531,0.7252024287150527,0.6463181773704137,-0.23157210285545515,0.1441771662974643,-0.1115128652856221,1.0320212739417218,0.9996149324581385,0.595077191691958,0.36043714080320877,0.22503104425430823,-0.13173296267509654,1.267782866548965,-1.388853942113607,0.20460009219036931,2.4122843742370605
+23102,1,1.1054229288615007,0.2612941705024705,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.9769929647445679
+23102,2,0.5109674660041365,0.43869402077594005,0.2780905008899343,,,,,,,,,,,,,1.9769929647445679
+24503,0,1.6593001598381854,0.2649699250456107,-0.7116979467082238,1.9806089704959091,0.7727681057484966,0.7418646801456215,1.4881758474847362,1.1804064093710083,1.7473352949267216,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.9106055385131593,2.177345037460327
+24503,1,1.3937851914941661,-0.2732317899567748,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.024730682373047
+24503,2,1.4948919167367798,-0.028410237621715174,-0.5319322799029617,,,,,,,,,,,,,2.024730682373047
+24903,0,0.19095919553326762,0.3800280509629712,-0.7116979467082238,1.2432152793787876,-0.8615683368241874,-0.1115128652856221,1.2144831033589276,-0.08513392901908017,0.595077191691958,-0.835055314390411,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-1.133646664653865,2.068176031112671
+24903,1,-0.04802612166916067,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,2.093778133392334
+24903,2,1.8884616970298371,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,2.093778133392334
+25401,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,2.1280877087193333,1.149922669419116,1.026323861956036,1.3969449327761334,1.4214617119215014,1.7473352949267216,1.5559295959968287,1.0113786285352542,-0.5517814777504622,-1.0422163045785646,0.806708965813594,0.8737234706124865,1.100927472114563
+25401,1,-1.2975959264107106,-0.6295824302629383,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,0.901209831237793
+25401,2,-0.37456453965524245,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,0.901209831237793
+25403,0,2.1110973796243138,1.4155511842192159,2.004334301449051,2.1280877087193333,1.149922669419116,1.026323861956036,1.3969449327761334,1.4214617119215014,1.7473352949267216,1.5559295959968287,1.0113786285352542,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.018441033950336395,1.326094627380371
+25403,1,1.5860266999159431,1.7757843918036655,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.8396230936050415
+25403,2,0.9045372462971938,0.7500968597077102,1.8081335312765157,,,,,,,,,,,,,1.8396230936050415
+25405,0,0.4168578054263319,1.0703768064671344,1.2635982337697944,2.1280877087193333,1.149922669419116,1.026323861956036,1.3969449327761334,1.4214617119215014,1.7473352949267216,1.5559295959968287,1.0113786285352542,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.3260313272476196
+25405,1,0.6248191578070585,0.4394694906555523,0.5545908663884488,,,,,,,,,,0.2373400917434395,-1.3914893931436731,3.7028453019878094,1.263806700706482
+25405,2,2.478816367469423,0.7500968597077102,0.7281031568859877,,,,,,,,,,,,,1.263806700706482
+25501,0,0.4168578054263319,1.7607255619712974,1.5105102563295467,1.390694017602212,-0.6101319610437744,-0.1115128652856221,1.4881758474847362,1.120142583733385,0.430468891229849,-0.835055314390411,-0.5613165400266386,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,2.2385826110839844
+25501,1,0.7209399120179469,1.1521707712678793,0.7588410266569864,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.0630639836617988,2.189894914627075
+25501,2,1.0029296913704582,0.5943954402418251,0.368093032089145,,,,,,,,,,,,,2.189894914627075
+25503,0,0.8686550252124604,1.5306093101365763,1.6339662676094229,1.390694017602212,-0.6101319610437744,-0.1115128652856221,1.4881758474847362,1.120142583733385,0.430468891229849,-0.835055314390411,-0.5613165400266386,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.2875821590423584
+25503,1,0.7209399120179469,1.5085214115740428,0.963091186925524,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,2.4085776805877686
+25503,2,0.7077523561506651,0.8279475694406527,1.8981360624757264,,,,,,,,,,,,,2.4085776805877686
+25504,0,1.4334015499451211,2.6811905693101816,3.1154384029679365,1.390694017602212,-0.6101319610437744,-0.1115128652856221,1.4881758474847362,1.120142583733385,0.430468891229849,-0.835055314390411,-0.5613165400266386,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.3985893726348877
+25504,1,2.4511134878139393,1.9539597119567473,2.392842308805287,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,2.5223758220672607
+25504,2,1.4948919167367798,1.3729025375712505,0.18808796969072364,,,,,,,,,,,,,2.5223758220672607
+25505,0,0.6427564153193962,-0.6554950822932735,-0.3413299128685955,1.390694017602212,-0.6101319610437744,-0.1115128652856221,1.4881758474847362,1.120142583733385,0.430468891229849,-0.835055314390411,-0.5613165400266386,1.1284125825510003,1.267782866548965,-0.2910724881500066,-0.4645232862317478,2.619271993637085
+25505,1,1.6821474541268315,-0.00596880972715211,1.1673413471940615,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.059714660367144415,2.3917901515960693
+25505,2,1.3964994716635155,0.5943954402418251,0.368093032089145,,,,,,,,,,,,,2.3917901515960693
+25802,0,0.07800989058673549,-0.42537883045855246,-0.3413299128685955,1.9806089704959091,1.2756408573093225,1.026323861956036,1.3057140180675306,1.361197886283878,0.2658605907677399,0.36043714080320877,1.0113786285352542,-0.9718299928258278,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.9708583354949951
+25802,1,-0.14414687588004912,-0.09505646980369299,0.04396546571710477,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.9436346629275099,0.31627628207206726
+25802,2,-0.4729569847285068,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,0.31627628207206726
+26201,0,1.6593001598381854,1.5306093101365763,2.4981583465685557,0.06338537359139342,0.5213317299680837,0.457405498335207,0.3021739562728989,0.9393511068205153,-0.22796431061858732,1.5559295959968287,1.4045524206757267,-2.2319755380519246,1.267782866548965,0.806708965813594,0.8737234706124865,2.3139476776123047
+26201,1,0.4325776493852816,2.0430473720332882,1.1673413471940615,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.0420117378234863
+26201,2,1.7900692519565728,2.462812473832446,0.8181056880851983,,,,,,,,,,,,,2.0420117378234863
+26503,0,0.07800989058673549,-0.770553208210634,-0.7116979467082238,2.1280877087193333,0.8984862936387031,1.3107830437664505,0.8495594445245161,0.8188234555452687,2.07655189585094,0.9581833684000187,0.22503104425430823,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,2.673995018005371
+26503,1,0.33645689517439314,-0.3623194500333156,0.963091186925524,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.7813186645507812
+26503,2,1.298107026590251,-0.573365205752313,1.0881132816828303,,,,,,,,,,,,,2.7813186645507812
+27501,0,0.4168578054263319,0.3800280509629712,0.3994061548106614,0.8007790647085149,0.7727681057484966,0.7418646801456215,-0.518904276104527,0.6982958042700221,0.430468891229849,1.5559295959968287,1.7977262128162,1.548461097626366,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.7522709369659424
+27501,1,0.4325776493852816,-0.4514071101098565,0.6567159465227176,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.19112267045651915,2.6391751766204834
+27501,2,1.1997145815169867,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,2.6391751766204834
+27502,0,1.207502940052057,1.5306093101365763,2.4981583465685557,0.8007790647085149,0.7727681057484966,0.7418646801456215,-0.518904276104527,0.6982958042700221,0.430468891229849,1.5559295959968287,1.7977262128162,1.548461097626366,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,2.6391751766204834
+27502,1,0.9131814204397238,0.7067324708851749,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.19112267045651915,2.7031962871551514
+27502,2,0.5109674660041365,0.8279475694406527,1.3581208752804623,,,,,,,,,,,,,2.7031962871551514
+27801,0,0.8686550252124604,1.645667436053937,-0.09441789030884316,0.5058215882616662,-0.10725920948294862,0.7418646801456215,0.5758667003987075,1.0598787580957618,0.10125229030563083,-0.23730908679360116,1.0113786285352542,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-1.133646664653865,1.7522656917572021
+27801,1,0.52869840359617,1.0630831111913384,0.35034070611991114,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,1.5666850805282593
+27801,2,0.8061448012239295,0.9836489889065378,0.008082907292302316,,,,,,,,,,,,,1.5666850805282593
+28201,0,0.8686550252124604,0.4950861768803317,-0.2178739015887193,1.390694017602212,0.39561354207787724,1.026323861956036,1.3969449327761334,0.3367128504442826,1.9119435953888306,-0.23730908679360116,-0.5613165400266386,-1.8119270229765592,1.267782866548965,-0.2910724881500066,-0.6875644123724536,2.2481138706207275
+28201,1,1.0093021746506123,0.3503818305790114,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.2666268348693848
+28201,2,1.1013221364437225,0.20514189157711243,0.008082907292302316,,,,,,,,,,,,,2.2666268348693848
+28803,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-0.8615683368241874,-0.3959720470960366,-0.1539806172701155,-0.024870103381456905,-1.2156141133912417,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,0.8890940546989441
+28803,1,0.14421538675261625,-0.18414412988023388,1.1673413471940615,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,0.9996287226676941
+28803,2,-0.9649192100948284,0.5165447305088826,-0.7119373423013831,,,,,,,,,,,,,0.9996287226676941
+28804,0,-0.03493941435979663,-0.42537883045855246,-0.7116979467082238,-0.8214870557491524,-0.8615683368241874,-0.3959720470960366,-0.1539806172701155,-0.024870103381456905,-1.2156141133912417,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,0.8192956447601318
+28804,1,0.6248191578070585,-0.09505646980369299,-1.3857856561626585,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,1.0727218389511108
+28804,2,0.11739768571107917,-0.18411165708760024,-0.08191962390690835,,,,,,,,,,,,,1.0727218389511108
+28902,0,-0.8255845489855216,0.9553186805497738,0.6463181773704137,-1.4114020086428494,-0.10725920948294862,0.457405498335207,-0.1539806172701155,0.7585596299076455,-0.8863975124670236,-0.23730908679360116,1.7977262128162,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.24148216009104212,0.4081231951713562
+28902,1,-0.528629892723603,0.17220651042592966,0.5545908663884488,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.059714660367144415,0.6007058024406433
+28902,2,-0.4729569847285068,0.282992601310055,0.18808796969072364,,,,,,,,,,,,,0.6007058024406433
+33901,0,-2.7457227330765677,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-1.4901592762752198,-0.6804312289064511,-1.4312134231905558,-1.5917295699596616,-0.7217892120049145,0.36043714080320877,0.6182048363947807,-0.9718299928258278,-1.812216028287741,1.9044904197771946,-0.24148216009104212,-0.0007813644479028881
+33901,1,-3.3161317648393682,-1.609546691104888,-2.10066121710254,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,0.24786165356636047
+33901,2,-2.735983221413586,-1.8189765614793936,-2.151977841488754,,,,,,,,,,,,,0.24786165356636047
+34002,0,-1.27738176877165,0.8402605546324132,-0.4647859241484716,-0.37905084107887943,-1.3644410883850133,-0.1115128652856221,-0.2452115319787184,0.4572405017195292,-1.2156141133912417,-0.835055314390411,1.0113786285352542,-3.072072568202656,-0.27221658086938805,0.806708965813594,0.20460009219036931,0.8774716854095459
+34002,1,0.33645689517439314,0.6176448108086341,0.5545908663884488,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,0.3478347361087799
+34002,2,-0.5713494298017712,0.04944047211122737,0.18808796969072364,,,,,,,,,,,,,0.3478347361087799
+34402,0,1.7722494647847176,2.796248695227542,1.016686211210042,1.9806089704959091,1.401359045199529,1.026323861956036,0.028481212147090252,-0.989091313583429,1.5827269944646125,-0.835055314390411,-0.9544903321671111,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-0.9106055385131593,2.386824369430542
+34402,1,2.1627512251812737,1.6866967317271246,2.1885921485367494,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.8122266528381351,2.517941474914551
+34402,2,1.298107026590251,1.8400067959689057,2.798161374467833,,,,,,,,,,,,,2.517941474914551
+34701,0,0.7557057202659283,1.1854349323844948,1.5105102563295467,0.8007790647085149,0.7727681057484966,0.17294631652479245,1.4881758474847362,0.8790872811828919,0.595077191691958,0.36043714080320877,0.6182048363947807,0.7083640674756347,1.267782866548965,0.806708965813594,3.104134732019544,1.9784197807312012
+34701,1,1.3937851914941661,0.5285571507320932,1.7800918279996742,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.8620959520339966
+34701,2,0.31418257585760784,1.450753247304193,1.988138593674937,,,,,,,,,,,,,1.8620959520339966
+35402,0,0.529807110372864,0.14991179912825014,0.2759501435307853,1.0957365411553635,1.2756408573093225,0.457405498335207,0.7583285298159133,0.8188234555452687,0.430468891229849,0.36043714080320877,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.237837076187134
+35402,1,1.2015436830723893,0.9739954511147976,1.371591507462599,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.341696262359619
+35402,2,-0.4729569847285068,0.04944047211122737,-0.35192721750454037,,,,,,,,,,,,,2.341696262359619
+36901,0,1.320452244998589,0.7252024287150527,0.6463181773704137,1.9806089704959091,1.149922669419116,1.026323861956036,1.2144831033589276,-0.4467168828448197,1.9119435953888306,-0.835055314390411,1.0113786285352542,-0.5517814777504622,1.267782866548965,-0.2910724881500066,-0.4645232862317478,2.231358051300049
+36901,1,2.0666304709703853,1.419433751497502,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,2.269479990005493
+36901,2,1.4948919167367798,0.282992601310055,1.8081335312765157,,,,,,,,,,,,,2.269479990005493
+37402,0,0.19095919553326762,-0.1952625786238314,-0.7116979467082238,-0.9689657939725767,-0.9872865247143939,-0.3959720470960366,-0.06274970256151263,0.5777681529947757,-0.5571809115428055,-0.835055314390411,1.0113786285352542,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.6875644123724536,1.536313772201538
+37402,1,0.048094632541727786,-0.18414412988023388,0.14609054585137357,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.3939902782440186
+37402,2,-0.8665267650215641,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,2.3939902782440186
+38502,0,-1.9550775984508428,1.0703768064671344,-0.09441789030884316,-0.5265295793023037,0.5213317299680837,-0.1115128652856221,-0.8838279349389385,-0.08513392901908017,-0.3925726110806964,1.5559295959968287,0.6182048363947807,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.4645232862317478,2.0105955600738525
+38502,1,-2.835527993784926,-0.5404947701863974,-1.590035816431196,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.1145520210266113
+38502,2,-3.7199076721462294,-0.8847680446840831,0.09808543849151298,,,,,,,,,,,,,2.1145520210266113
+38803,0,0.07800989058673549,-0.3103207045411919,-0.2178739015887193,0.6533003264850905,1.401359045199529,0.7418646801456215,0.4846357856901046,0.035393722256166354,0.430468891229849,0.9581833684000187,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,2.0931787490844727
+38803,1,0.14421538675261625,-0.09505646980369299,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,2.1076858043670654
+38803,2,0.019005240637814846,0.6722461499747677,0.008082907292302316,,,,,,,,,,,,,2.1076858043670654
+40202,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.2329773973731551,0.17294631652479245,0.210943041564296,1.120142583733385,-0.06335601015647824,0.36043714080320877,-0.9544903321671111,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.018441033950336395,1.4746179580688477
+40202,1,-0.9131129095671567,-1.520459031028347,-1.1815354958941209,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.8001633882522583
+40202,2,-0.5713494298017712,-0.9626187544170256,-0.26192468630532967,,,,,,,,,,,,,1.8001633882522583
+40203,0,-1.27738176877165,-2.266308845136321,-2.1931700820667377,-0.674008317525728,-0.2329773973731551,0.17294631652479245,0.210943041564296,1.120142583733385,-0.06335601015647824,0.36043714080320877,-0.9544903321671111,-1.3918785079011935,-1.0422163045785646,-1.388853942113607,0.8737234706124865,1.1878172159194946
+40203,1,-2.0665619600978182,-2.322247971717215,-2.3049113773710777,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.1838568449020386
+40203,2,-3.227945446779908,-2.286080819877049,-2.2419803726879644,,,,,,,,,,,,,1.1838568449020386
+40501,0,-1.3903310737181822,-0.770553208210634,-0.7116979467082238,-0.9689657939725767,-0.10725920948294862,-0.1115128652856221,-0.2452115319787184,0.3969766760819059,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.666351318359375
+40501,1,0.14421538675261625,-0.9859330705691017,-0.9772853356255832,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.6557177305221558
+40501,2,0.2157901307843435,-0.4955144960193704,-0.26192468630532967,,,,,,,,,,,,,1.6557177305221558
+40502,0,0.529807110372864,-0.6554950822932735,-0.7116979467082238,-0.9689657939725767,-0.10725920948294862,-0.1115128652856221,-0.2452115319787184,0.3969766760819059,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.6557177305221558
+40502,1,0.048094632541727786,0.17220651042592966,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.9082566499710083
+40502,2,-0.5713494298017712,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,1.9082566499710083
+40503,0,1.0945536351055247,0.03485367321088963,-0.3413299128685955,-0.9689657939725767,-0.10725920948294862,-0.1115128652856221,-0.2452115319787184,0.3969766760819059,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.9082566499710083
+40503,1,0.8170606662288354,-0.18414412988023388,-1.2836605760283897,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,1.9261248111724854
+40503,2,-0.27617209458197817,-0.028410237621715174,-0.441929748703751,,,,,,,,,,,,,1.9261248111724854
+41603,0,-0.03493941435979663,-0.3103207045411919,-0.5882419354283478,0.5058215882616662,1.149922669419116,0.457405498335207,1.3057140180675306,0.9393511068205153,0.9242937926161762,1.5559295959968287,1.4045524206757267,1.548461097626366,0.49778314283978853,3.002271873740795,0.8737234706124865,2.995732307434082
+41603,1,0.52869840359617,0.2612941705024705,0.04396546571710477,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.995732307434082
+41603,2,0.019005240637814846,0.7500968597077102,0.008082907292302316,,,,,,,,,,,,,2.995732307434082
+42505,0,0.4168578054263319,1.7607255619712974,0.3994061548106614,-0.674008317525728,1.0242044815289095,0.17294631652479245,1.3969449327761334,0.3367128504442826,-0.06335601015647824,0.9581833684000187,0.22503104425430823,0.7083640674756347,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.0837733745574951
+42505,1,0.9131814204397238,2.0430473720332882,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.3876476287841797
+42505,2,1.0029296913704582,0.9057982791735953,-0.441929748703751,,,,,,,,,,,,,1.3876476287841797
+43701,0,2.1110973796243138,0.9553186805497738,0.6463181773704137,0.5058215882616662,0.6470499178582901,1.3107830437664505,0.4846357856901046,0.3969766760819059,0.7596854921540671,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.24148216009104212,2.0849108695983887
+43701,1,1.0093021746506123,0.7958201309617158,1.2694664273283303,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,2.2256689071655273
+43701,2,0.31418257585760784,0.5165447305088826,-0.26192468630532967,,,,,,,,,,,,,2.2256689071655273
+43703,0,0.19095919553326762,0.14991179912825014,-0.3413299128685955,0.5058215882616662,0.6470499178582901,1.3107830437664505,0.4846357856901046,0.3969766760819059,0.7596854921540671,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,2.3035826683044434
+43703,1,0.4325776493852816,0.9739954511147976,0.8609661067912552,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,2.0197417736053467
+43703,2,0.31418257585760784,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,2.0197417736053467
+44402,0,0.7557057202659283,2.9113068211449025,2.2512463240088034,0.2108641118148177,1.149922669419116,1.3107830437664505,-0.06274970256151263,0.6982958042700221,0.9242937926161762,0.36043714080320877,0.22503104425430823,1.548461097626366,1.267782866548965,-1.388853942113607,1.7658879751753094,2.112476110458374
+44402,1,0.14421538675261625,1.330346091420961,1.0652162670597927,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,2.2019877433776855
+44402,2,0.7077523561506651,1.2172011181053655,2.1681436560733585,,,,,,,,,,,,,2.2019877433776855
+44601,0,-1.27738176877165,-0.42537883045855246,-0.5882419354283478,-0.674008317525728,0.1441771662974643,0.17294631652479245,-0.33644244668732126,-0.6877721853953127,-0.7217892120049145,1.5559295959968287,1.4045524206757267,1.9685096127017316,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.1121740341186523
+44601,1,-2.4510449769413722,0.3503818305790114,0.8609661067912552,,,,,,,,,,0.9503768127628092,1.8141914255436393,0.4419600012801827,2.2314510345458984
+44601,2,-1.0633116551680928,0.20514189157711243,-0.981944935899015,,,,,,,,,,,,,2.2314510345458984
+45202,0,0.19095919553326762,-0.3103207045411919,-0.5882419354283478,-0.9689657939725767,0.6470499178582901,0.7418646801456215,-0.06274970256151263,1.1804064093710083,0.595077191691958,0.9581833684000187,-0.9544903321671111,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,2.373232126235962
+45202,1,0.7209399120179469,0.2612941705024705,0.6567159465227176,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,2.2412171363830566
+45202,2,-0.1777796495087138,0.04944047211122737,1.3581208752804623,,,,,,,,,,,,,2.2412171363830566
+45501,0,1.6593001598381854,0.6101443027976923,2.004334301449051,1.9806089704959091,1.401359045199529,0.7418646801456215,0.028481212147090252,0.9996149324581385,2.07655189585094,0.36043714080320877,-0.16814274788616518,0.28831555240026907,1.267782866548965,-0.2910724881500066,-0.24148216009104212,2.995732307434082
+45501,1,0.14421538675261625,1.2412584313444202,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,2.995732307434082
+45501,2,1.4948919167367798,1.0614996986394805,1.5381259376788836,,,,,,,,,,,,,2.995732307434082
+45903,0,3.127641124143103,0.7252024287150527,1.016686211210042,2.1280877087193333,0.6470499178582901,0.457405498335207,0.3934048709815018,0.4572405017195292,2.07655189585094,0.9581833684000187,-0.16814274788616518,-0.13173296267509654,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.5770716667175293
+45903,1,2.3549927336030505,0.4394694906555523,1.5758416677311367,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,3.7028453019878094,2.508848190307617
+45903,2,1.593284361810044,2.307111054366561,1.8981360624757264,,,,,,,,,,,,,2.508848190307617
+46201,0,2.224046684570846,2.105899939723379,2.3747023352886796,1.9806089704959091,1.149922669419116,1.3107830437664505,0.6670976151073104,0.15592137353141286,1.9119435953888306,0.36043714080320877,0.22503104425430823,-0.13173296267509654,1.267782866548965,0.806708965813594,0.8737234706124865,2.5521326065063477
+46201,1,1.0093021746506123,0.9739954511147976,0.963091186925524,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.518949270248413
+46201,2,1.593284361810044,1.7621560862359633,1.5381259376788836,,,,,,,,,,,,,2.518949270248413
+46701,0,1.4334015499451211,2.2209580656407395,2.745070369128308,1.833130232272485,1.149922669419116,1.3107830437664505,1.4881758474847362,1.361197886283878,1.9119435953888306,-0.23730908679360116,1.7977262128162,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.835911750793457
+46701,1,0.33645689517439314,1.419433751497502,0.8609661067912552,,,,,,,,,,-1.1887333502953,1.8141914255436393,-0.5613893220144716,2.0420117378234863
+46701,2,1.7900692519565728,1.3729025375712505,1.6281284688780944,,,,,,,,,,,,,2.0420117378234863
+47102,0,1.0945536351055247,-0.1952625786238314,-0.09441789030884316,-0.674008317525728,0.6470499178582901,-0.1115128652856221,0.3934048709815018,0.9996149324581385,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,-1.812216028287741,0.806708965813594,-0.9106055385131593,2.196533203125
+47102,1,-0.528629892723603,-0.18414412988023388,-0.36453485481997044,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.302800178527832
+47102,2,1.1997145815169867,-0.028410237621715174,0.008082907292302316,,,,,,,,,,,,,2.302800178527832
+47402,0,1.207502940052057,-0.770553208210634,-0.7116979467082238,-0.5265295793023037,-0.2329773973731551,0.7418646801456215,-0.7013661055217327,-0.8685636623081825,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.4963642358779907
+47402,1,0.4325776493852816,-0.2732317899567748,0.45246578625417994,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.0630639836617988,1.5561882257461548
+47402,2,-0.1777796495087138,-0.10626094735465771,-1.251952529496647,,,,,,,,,,,,,1.5561882257461548
+47403,0,2.224046684570846,0.3800280509629712,0.15249413225090913,-0.5265295793023037,-0.2329773973731551,0.7418646801456215,-0.7013661055217327,-0.8685636623081825,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,1.267782866548965,-0.2910724881500066,-0.4645232862317478,1.718765139579773
+47403,1,0.33645689517439314,0.2612941705024705,-0.568785015088508,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.5480700731277466
+47403,2,0.6093599110774008,0.1272911818441699,-0.17192215510611902,,,,,,,,,,,,,1.5480700731277466
+48503,0,-1.164432463825118,-0.5404369563759129,-0.7116979467082238,-0.9689657939725767,-0.7358501489339809,-0.9648904107168657,0.3934048709815018,0.09565754789378961,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-1.3566877907945707,1.9553838968276978
+48503,1,-0.04802612166916067,0.5285571507320932,-1.2836605760283897,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,0.5030383467674255
+48503,2,-0.1777796495087138,0.5165447305088826,1.8081335312765157,,,,,,,,,,,,,0.5030383467674255
+49202,0,0.3039085004797998,0.6101443027976923,0.15249413225090913,0.6533003264850905,-0.10725920948294862,0.457405498335207,1.0320212739417218,0.5175043273571525,1.0889020930782853,1.5559295959968287,0.22503104425430823,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.4645232862317478,1.4377877712249756
+49202,1,1.1054229288615007,1.1521707712678793,0.5545908663884488,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.582479953765869
+49202,2,0.31418257585760784,1.995708215434791,1.178115812882041,,,,,,,,,,,,,2.582479953765869
+49401,0,-0.03493941435979663,-0.08020445270647089,-0.4647859241484716,1.5381727558256364,1.149922669419116,1.3107830437664505,0.3934048709815018,0.5175043273571525,0.7596854921540671,1.5559295959968287,1.4045524206757267,-0.13173296267509654,1.267782866548965,-0.2910724881500066,0.6506823444717807,2.2988340854644775
+49401,1,0.8170606662288354,0.17220651042592966,0.6567159465227176,,,,,,,,,,0.2373400917434395,-0.3229291202479022,3.7028453019878094,2.2634217739105225
+49401,2,-0.07938720443544948,0.6722461499747677,0.638100625686777,,,,,,,,,,,,,2.2634217739105225
+50101,0,0.07800989058673549,1.4155511842192159,1.016686211210042,0.6533003264850905,1.401359045199529,1.3107830437664505,-0.33644244668732126,-0.26592540593194997,-0.3925726110806964,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,0.49778314283978853,0.806708965813594,3.104134732019544,2.6213645935058594
+50101,1,1.1054229288615007,2.132135032109829,0.963091186925524,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.7572953701019287
+50101,2,1.8884616970298371,1.0614996986394805,1.448123406479673,,,,,,,,,,,,,2.7572953701019287
+50701,0,-1.3903310737181822,-0.42537883045855246,-0.7116979467082238,0.6533003264850905,0.8984862936387031,0.7418646801456215,0.028481212147090252,0.2161851991690361,0.595077191691958,0.9581833684000187,-1.3476641243075844,-1.8119270229765592,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.652299165725708
+50701,1,0.6248191578070585,0.2612941705024705,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.9536874294281006
+50701,2,0.5109674660041365,1.3729025375712505,0.8181056880851983,,,,,,,,,,,,,1.9536874294281006
+50702,0,0.3039085004797998,-0.770553208210634,-0.8351539579881,0.6533003264850905,0.8984862936387031,0.7418646801456215,0.028481212147090252,0.2161851991690361,0.595077191691958,0.9581833684000187,-1.3476641243075844,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,1.9536874294281006
+50702,1,-0.24026763009093757,-0.09505646980369299,-0.05815961441716403,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,1.659705638885498
+50702,2,0.019005240637814846,-0.729066625218198,-0.35192721750454037,,,,,,,,,,,,,1.659705638885498
+52801,0,1.0945536351055247,-0.1952625786238314,-0.5882419354283478,-0.37905084107887943,-0.6101319610437744,-0.3959720470960366,0.5758667003987075,0.6380319786323989,-0.3925726110806964,-0.835055314390411,1.4045524206757267,-0.13173296267509654,-0.27221658086938805,0.806708965813594,1.9889291013160153,2.214350938796997
+52801,1,1.3937851914941661,-0.18414412988023388,0.35034070611991114,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,2.2274668216705322
+52801,2,0.9045372462971938,0.9836489889065378,1.448123406479673,,,,,,,,,,,,,2.2274668216705322
+52802,0,0.6427564153193962,0.4950861768803317,0.5228621660905376,-0.37905084107887943,-0.6101319610437744,-0.3959720470960366,0.5758667003987075,0.6380319786323989,-0.3925726110806964,-0.835055314390411,1.4045524206757267,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.9572726488113403
+52802,1,0.2403361409635047,0.08311885034938876,0.04396546571710477,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,1.4185444116592407
+52802,2,0.019005240637814846,-0.33981307655348536,0.008082907292302316,,,,,,,,,,,,,1.4185444116592407
+53301,0,0.07800989058673549,1.4155511842192159,-0.09441789030884316,0.06338537359139342,0.7727681057484966,1.3107830437664505,0.11971212685569313,0.5777681529947757,-0.8863975124670236,-0.23730908679360116,0.6182048363947807,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.007115602493286
+53301,1,-0.24026763009093757,-0.09505646980369299,0.24821562598564237,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.8122266528381351,2.125227212905884
+53301,2,-0.1777796495087138,1.450753247304193,-0.26192468630532967,,,,,,,,,,,,,2.125227212905884
+53601,0,-1.0514831588785858,-2.0361925933015996,-1.9462580595069854,-1.5588807468662738,-1.4901592762752198,-1.8182679561481092,-2.4347534849851873,-2.0135763494230243,-1.0510058129291326,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,0.3988898992538452
+53601,1,-0.24026763009093757,-0.2732317899567748,0.24821562598564237,,,,,,,,,,-0.47569662927593015,2.88275169843941,-0.8122266528381351,-0.04779261723160744
+53601,2,-0.8665267650215641,-0.9626187544170256,-1.3419550606958577,,,,,,,,,,,,,-0.04779261723160744
+54602,0,-1.27738176877165,-0.8856113341279945,-0.8351539579881,-0.5265295793023037,-0.48441377315356804,-0.1115128652856221,-0.61013519081313,-0.9288274879458058,-0.8863975124670236,-1.432801541987221,-0.5613165400266386,-2.2319755380519246,1.267782866548965,1.9044904197771946,-0.4645232862317478,2.0192418098449707
+54602,1,-0.528629892723603,-1.520459031028347,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,2.0807852745056152
+54602,2,0.31418257585760784,-1.3518723030817383,-0.8019398735005937,,,,,,,,,,,,,2.0807852745056152
+54804,0,-0.37378732919939306,-1.1157275859627156,-0.9586099692679761,0.9482578029319392,0.8984862936387031,0.457405498335207,0.028481212147090252,0.09565754789378961,0.430468891229849,0.9581833684000187,1.0113786285352542,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,2.0051040649414062
+54804,1,-0.33638838430182605,-1.2531960507987243,-1.2836605760283897,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.310551991190808,2.41306734085083
+54804,2,0.019005240637814846,-1.429723012814681,-0.7119373423013831,,,,,,,,,,,,,2.41306734085083
+55002,0,0.07800989058673549,0.3800280509629712,0.3994061548106614,1.390694017602212,1.401359045199529,0.7418646801456215,0.028481212147090252,0.5175043273571525,1.0889020930782853,0.36043714080320877,1.4045524206757267,1.1284125825510003,-0.27221658086938805,0.806708965813594,1.9889291013160153,2.0313985347747803
+55002,1,1.2976644372832777,0.5285571507320932,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.196476936340332
+55002,2,1.1013221364437225,0.5165447305088826,0.45809556328835566,,,,,,,,,,,,,2.196476936340332
+55801,0,0.07800989058673549,0.6101443027976923,0.5228621660905376,1.0957365411553635,0.8984862936387031,0.7418646801456215,1.3057140180675306,1.3009340606462547,1.7473352949267216,0.9581833684000187,1.0113786285352542,1.548461097626366,1.267782866548965,-0.2910724881500066,-0.6875644123724536,2.27714467048645
+55801,1,0.2403361409635047,0.17220651042592966,-0.6709100952227768,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,2.5022635459899902
+55801,2,0.2157901307843435,1.3729025375712505,0.45809556328835566,,,,,,,,,,,,,2.5022635459899902
+58804,0,-1.164432463825118,-0.8856113341279945,-0.7116979467082238,-0.8214870557491524,-1.9930320278360456,-2.3871863197689382,-1.7049061673163644,-1.0493551392210523,-1.2156141133912417,-2.628293997180841,-1.740837916448057,-1.3918785079011935,0.49778314283978853,0.806708965813594,-0.9106055385131593,0.3094535768032074
+58804,1,-0.14414687588004912,-0.896845410492561,-1.2836605760283897,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,0.33210456371307373
+58804,2,-0.1777796495087138,-1.5075737225476233,-1.1619499982974364,,,,,,,,,,,,,0.33210456371307373
+60401,0,0.6427564153193962,-0.1952625786238314,0.029038120971032973,0.06338537359139342,0.6470499178582901,0.7418646801456215,1.4881758474847362,-0.38645305720719647,0.10125229030563083,-0.835055314390411,-0.9544903321671111,1.1284125825510003,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.5554916858673096
+60401,1,2.0666304709703853,0.4394694906555523,0.35034070611991114,,,,,,,,,,-1.1887333502953,0.7456311526478686,-1.0630639836617988,2.496546983718872
+60401,2,1.4948919167367798,0.7500968597077102,-0.441929748703751,,,,,,,,,,,,,2.496546983718872
+60803,0,0.9816043301589925,1.9908418138060184,1.5105102563295467,1.0957365411553635,1.149922669419116,1.3107830437664505,1.4881758474847362,1.9035723170224874,1.9119435953888306,0.9581833684000187,1.7977262128162,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.517941474914551
+60803,1,0.2403361409635047,1.0630831111913384,0.7588410266569864,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,2.3758533000946045
+60803,2,-0.07938720443544948,1.606454666770078,0.368093032089145,,,,,,,,,,,,,2.3758533000946045
+61501,0,-0.7126352440389895,-0.42537883045855246,0.2759501435307853,-0.23157210285545515,-1.2387229004948068,-2.3871863197689382,-0.1539806172701155,-0.3261892315695732,-0.3925726110806964,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,1.267782866548965,1.9044904197771946,-1.133646664653865,1.2599879503250122
+61501,1,-0.33638838430182605,-0.4514071101098565,-1.6921608965654649,,,,,,,,,,1.663413533782179,-0.3229291202479022,-1.0630639836617988,1.2153352499008179
+61501,2,-0.8665267650215641,-0.729066625218198,-1.1619499982974364,,,,,,,,,,,,,1.2153352499008179
+62703,0,-1.164432463825118,1.1854349323844948,-0.5882419354283478,1.6856514940490606,1.2756408573093225,1.3107830437664505,1.1232521886503248,1.120142583733385,1.0889020930782853,0.9581833684000187,-0.16814274788616518,-1.8119270229765592,0.49778314283978853,0.806708965813594,0.8737234706124865,1.3099652528762817
+62703,1,-0.8169921553562683,0.2612941705024705,-0.16028469455143282,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,1.8459665775299072
+62703,2,0.11739768571107917,-0.2619623668205428,0.7281031568859877,,,,,,,,,,,,,1.8459665775299072
+64002,0,-0.8255845489855216,-0.8856113341279945,-0.7116979467082238,0.5058215882616662,0.6470499178582901,1.026323861956036,1.3969449327761334,0.6982958042700221,1.2535103935403944,-1.432801541987221,-1.3476641243075844,1.1284125825510003,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.1520228385925293
+64002,1,0.2403361409635047,-0.9859330705691017,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.19112267045651915,2.278610944747925
+64002,2,-0.9649192100948284,0.9836489889065378,0.8181056880851983,,,,,,,,,,,,,2.278610944747925
+66501,0,-0.37378732919939306,-0.42537883045855246,-0.2178739015887193,-0.08409336463203088,0.5213317299680837,0.17294631652479245,0.8495594445245161,0.5175043273571525,1.0889020930782853,0.9581833684000187,1.4045524206757267,-1.3918785079011935,0.49778314283978853,-1.388853942113607,-0.24148216009104212,2.474311113357544
+66501,1,0.14421538675261625,0.3503818305790114,0.7588410266569864,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,2.490705728530884
+66501,2,0.9045372462971938,0.20514189157711243,0.2780905008899343,,,,,,,,,,,,,2.490705728530884
+66502,0,2.1110973796243138,1.4155511842192159,1.5105102563295467,-0.08409336463203088,0.5213317299680837,0.17294631652479245,0.8495594445245161,0.5175043273571525,1.0889020930782853,0.9581833684000187,1.4045524206757267,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.490705728530884
+66502,1,1.970509716759497,0.4394694906555523,1.7800918279996742,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,2.4473764896392822
+66502,2,1.4948919167367798,1.3729025375712505,0.908108219284409,,,,,,,,,,,,,2.4473764896392822
+67702,0,1.6593001598381854,-0.3103207045411919,0.029038120971032973,0.5058215882616662,-0.10725920948294862,0.17294631652479245,-1.0662897643561442,0.4572405017195292,0.10125229030563083,0.36043714080320877,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,0.20460009219036931,0.9342957139015198
+67702,1,1.8743889625486083,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.310551991190808,1.5242894887924194
+67702,2,0.9045372462971938,0.5165447305088826,0.008082907292302316,,,,,,,,,,,,,1.5242894887924194
+67703,0,-0.03493941435979663,1.0703768064671344,1.5105102563295467,0.5058215882616662,-0.10725920948294862,0.17294631652479245,-1.0662897643561442,0.4572405017195292,0.10125229030563083,0.36043714080320877,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,0.20460009219036931,1.5242894887924194
+67703,1,0.8170606662288354,0.7958201309617158,0.963091186925524,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.4903464317321777
+67703,2,0.41257502093087217,0.8279475694406527,0.5480980944875663,,,,,,,,,,,,,1.4903464317321777
+67704,0,-0.5996859390924573,0.6101443027976923,0.2759501435307853,0.5058215882616662,-0.10725920948294862,0.17294631652479245,-1.0662897643561442,0.4572405017195292,0.10125229030563083,0.36043714080320877,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.5242894887924194
+67704,1,-0.33638838430182605,-0.09505646980369299,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.4903464317321777
+67704,2,-0.27617209458197817,0.282992601310055,-0.26192468630532967,,,,,,,,,,,,,1.4903464317321777
+68802,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-0.37905084107887943,0.39561354207787724,0.457405498335207,0.028481212147090252,-0.38645305720719647,-0.8863975124670236,-1.432801541987221,-1.740837916448057,-1.3918785079011935,1.267782866548965,-0.2910724881500066,0.8737234706124865,-0.35376572608947754
+68802,1,0.048094632541727786,-0.3623194500333156,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.6927973321038463,0.7898010611534119
+68802,2,0.7077523561506651,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,0.7898010611534119
+70604,0,-1.3903310737181822,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,0.2698953541876708,0.7418646801456215,-1.6136752526077616,-0.14539775465670343,-1.3802224138533508,-0.23730908679360116,-1.3476641243075844,1.548461097626366,1.267782866548965,-1.388853942113607,1.9889291013160153,0.9841455221176147
+70604,1,-1.0092336637780452,-1.431371370951806,-2.10066121710254,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,1.2742960453033447
+70604,2,-1.0633116551680928,-1.585424432280566,-1.6119626542934897,,,,,,,,,,,,,1.2742960453033447
+72102,0,-1.27738176877165,-0.6554950822932735,-0.5882419354283478,-0.37905084107887943,-0.35869558526336154,-1.5338087743376947,-0.7925970202303356,-1.230146616133922,-0.5571809115428055,-1.432801541987221,-1.740837916448057,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,2.2999749183654785
+72102,1,-1.585958189043376,-1.431371370951806,-1.6921608965654649,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.0709683895111084
+72102,2,-2.735983221413586,-2.3639315296099914,-2.151977841488754,,,,,,,,,,,,,1.0709683895111084
+73903,0,0.7557057202659283,0.9553186805497738,1.1401422224899183,-0.37905084107887943,0.39561354207787724,0.457405498335207,-1.0662897643561442,0.09565754789378961,-0.7217892120049145,1.5559295959968287,-1.3476641243075844,-1.3918785079011935,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.422383189201355
+73903,1,0.9131814204397238,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,2.8221399784088135
+73903,2,0.41257502093087217,1.5286039570371357,1.5381259376788836,,,,,,,,,,,,,2.8221399784088135
+74001,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,1.6856514940490606,1.2756408573093225,1.026323861956036,1.4881758474847362,0.3367128504442826,1.0889020930782853,-0.23730908679360116,-0.5613165400266386,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,1.3240667581558228
+74001,1,-0.528629892723603,0.2612941705024705,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.268164873123169
+74001,2,-0.7681343199482997,0.6722461499747677,0.8181056880851983,,,,,,,,,,,,,1.268164873123169
+74601,0,-0.2608380242528609,-0.770553208210634,-0.7116979467082238,1.2432152793787876,0.39561354207787724,0.7418646801456215,1.0320212739417218,1.2406702350086316,1.0889020930782853,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.3799235820770264
+74601,1,0.6248191578070585,-1.2531960507987243,-1.4879107362969273,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.5087494850158691
+74601,2,-0.4729569847285068,-0.9626187544170256,-1.3419550606958577,,,,,,,,,,,,,1.5087494850158691
+75601,0,-0.9385338539320537,-0.08020445270647089,-0.4647859241484716,-0.674008317525728,-0.8615683368241874,-0.3959720470960366,-0.8838279349389385,0.3969766760819059,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,-0.27221658086938805,0.806708965813594,3.104134732019544,0.9940563440322876
+75601,1,0.2403361409635047,0.5285571507320932,2.6992175492080936,,,,,,,,,,0.2373400917434395,2.88275169843941,0.4419600012801827,0.7845523953437805
+75601,2,-0.9649192100948284,-0.10626094735465771,-0.981944935899015,,,,,,,,,,,,,0.7845523953437805
+75605,0,-0.9385338539320537,0.6101443027976923,-0.5882419354283478,-0.674008317525728,-0.8615683368241874,-0.3959720470960366,-0.8838279349389385,0.3969766760819059,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,1.267782866548965,-1.388853942113607,-0.018441033950336395,0.843880295753479
+75605,1,0.33645689517439314,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,-0.06684461981058121
+75605,2,0.6093599110774008,-0.2619623668205428,-0.17192215510611902,,,,,,,,,,,,,-0.06684461981058121
+76103,0,-1.27738176877165,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,1.2756408573093225,0.7418646801456215,-0.33644244668732126,-0.38645305720719647,-0.7217892120049145,0.9581833684000187,-0.9544903321671111,-1.8119270229765592,1.267782866548965,0.806708965813594,-0.24148216009104212,1.0721328258514404
+76103,1,0.14421538675261625,0.08311885034938876,-0.05815961441716403,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,0.79022616147995
+76103,2,0.019005240637814846,-0.573365205752313,-0.26192468630532967,,,,,,,,,,,,,0.79022616147995
+76403,0,0.07800989058673549,1.1854349323844948,1.3870542450496706,-0.5265295793023037,-0.7358501489339809,0.17294631652479245,0.11971212685569313,0.5777681529947757,-0.7217892120049145,-0.23730908679360116,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.19122423231601715
+76403,1,0.33645689517439314,0.7067324708851749,0.963091186925524,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,1.0091897249221802
+76403,2,0.8061448012239295,0.5165447305088826,0.368093032089145,,,,,,,,,,,,,1.0091897249221802
+76405,0,0.8686550252124604,1.4155511842192159,0.15249413225090913,-0.5265295793023037,-0.7358501489339809,0.17294631652479245,0.11971212685569313,0.5777681529947757,-0.7217892120049145,-0.23730908679360116,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,1.9044904197771946,0.8737234706124865,-0.3759506642818451
+76405,1,-0.14414687588004912,1.9539597119567473,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,1.1944719937511734,0.657188892364502
+76405,2,0.9045372462971938,0.43869402077594005,-0.7119373423013831,,,,,,,,,,,,,0.657188892364502
+76802,0,-0.48673663414592516,-0.8856113341279945,-0.7116979467082238,1.0957365411553635,0.6470499178582901,0.7418646801456215,1.4881758474847362,1.9638361426601105,0.7596854921540671,1.5559295959968287,0.22503104425430823,1.1284125825510003,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,2.1679630279541016
+76802,1,0.52869840359617,-0.4514071101098565,-0.46665993495423924,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,2.183178663253784
+76802,2,-0.07938720443544948,-0.573365205752313,0.008082907292302316,,,,,,,,,,,,,2.183178663253784
+76803,0,-1.0514831588785858,-0.8856113341279945,-0.7116979467082238,1.0957365411553635,0.6470499178582901,0.7418646801456215,1.4881758474847362,1.9638361426601105,0.7596854921540671,1.5559295959968287,0.22503104425430823,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.183178663253784
+76803,1,-1.201475172199822,0.08311885034938876,-1.3857856561626585,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.486250162124634
+76803,2,-1.161704100241357,-0.573365205752313,-0.8019398735005937,,,,,,,,,,,,,2.486250162124634
+76804,0,-0.48673663414592516,-1.000669460045355,-0.8351539579881,1.0957365411553635,0.6470499178582901,0.7418646801456215,1.4881758474847362,1.9638361426601105,0.7596854921540671,1.5559295959968287,0.22503104425430823,1.1284125825510003,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,2.7002627849578857
+76804,1,-0.04802612166916067,0.2612941705024705,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,2.6204519271850586
+76804,2,-0.07938720443544948,0.7500968597077102,0.008082907292302316,,,,,,,,,,,,,2.6204519271850586
+77002,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,0.2108641118148177,-0.7358501489339809,0.17294631652479245,-0.8838279349389385,-0.4467168828448197,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,-0.6931471824645996
+77002,1,-0.9131129095671567,-1.431371370951806,-1.590035816431196,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,0.1528620421886444
+77002,2,-0.7681343199482997,-1.3518723030817383,-0.441929748703751,,,,,,,,,,,,,0.1528620421886444
+80101,0,3.014691819196571,3.1414230729796238,2.745070369128308,-0.37905084107887943,0.6470499178582901,-0.6804312289064511,-0.42767336139592416,-0.26592540593194997,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,0.806708965813594,1.7658879751753094,0.19911672174930573
+80101,1,1.1054229288615007,1.8648720518802064,1.7800918279996742,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.4486586478694914,0.35362669825553894
+80101,2,0.5109674660041365,2.2292603446336186,2.3481487184717795,,,,,,,,,,,,,0.35362669825553894
+80103,0,-0.14788871930632877,-0.3103207045411919,-0.2178739015887193,-0.37905084107887943,0.6470499178582901,-0.6804312289064511,-0.42767336139592416,-0.26592540593194997,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,1.7658879751753094,0.49064815044403076
+80103,1,-0.04802612166916067,-0.18414412988023388,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,0.5824958682060242
+80103,2,-0.8665267650215641,-0.573365205752313,-0.7119373423013831,,,,,,,,,,,,,0.5824958682060242
+80301,0,0.07800989058673549,0.2649699250456107,0.029038120971032973,1.9806089704959091,0.6470499178582901,0.7418646801456215,-0.33644244668732126,-0.26592540593194997,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,1.9044904197771946,0.20460009219036931,1.5365381240844727
+80301,1,0.14421538675261625,0.3503818305790114,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.6807416677474976
+80301,2,-1.0633116551680928,-0.2619623668205428,0.008082907292302316,,,,,,,,,,,,,1.6807416677474976
+80302,0,0.3039085004797998,0.14991179912825014,0.029038120971032973,1.9806089704959091,0.6470499178582901,0.7418646801456215,-0.33644244668732126,-0.26592540593194997,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.031648874282837
+80302,1,0.2403361409635047,0.7067324708851749,0.5545908663884488,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,2.415060520172119
+80302,2,-0.5713494298017712,1.6843053765030207,0.7281031568859877,,,,,,,,,,,,,2.415060520172119
+80303,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,1.9806089704959091,0.6470499178582901,0.7418646801456215,-0.33644244668732126,-0.26592540593194997,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,-1.0422163045785646,0.806708965813594,0.20460009219036931,2.415060520172119
+80303,1,0.048094632541727786,-0.18414412988023388,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.6031863689422607
+80303,2,-0.4729569847285068,-0.8069173349511406,-0.8019398735005937,,,,,,,,,,,,,2.6031863689422607
+80306,0,1.4334015499451211,-0.42537883045855246,0.15249413225090913,1.9806089704959091,0.6470499178582901,0.7418646801456215,-0.33644244668732126,-0.26592540593194997,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,1.267782866548965,-1.388853942113607,0.8737234706124865,2.0478529930114746
+80306,1,-1.585958189043376,0.7067324708851749,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,2.0557045936584473
+80306,2,-0.1777796495087138,1.1393504083724229,0.368093032089145,,,,,,,,,,,,,2.0557045936584473
+81001,0,1.6593001598381854,0.3800280509629712,0.15249413225090913,1.390694017602212,1.2756408573093225,1.3107830437664505,1.3969449327761334,1.7227808401096176,1.5827269944646125,1.5559295959968287,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.895293712615967
+81001,1,1.2976644372832777,0.3503818305790114,1.4737165875968679,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.907463788986206
+81001,2,1.593284361810044,1.450753247304193,1.5381259376788836,,,,,,,,,,,,,2.907463788986206
+81101,0,1.7722494647847176,2.6811905693101816,3.1154384029679365,0.9482578029319392,0.7727681057484966,1.026323861956036,0.11971212685569313,0.15592137353141286,0.595077191691958,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.963492751121521
+81101,1,2.1627512251812737,1.2412584313444202,1.6779667478654055,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.7184454202651978
+81101,2,1.3964994716635155,0.9836489889065378,1.178115812882041,,,,,,,,,,,,,1.7184454202651978
+82802,0,-0.5996859390924573,-0.8856113341279945,-0.7116979467082238,-1.4114020086428494,-0.35869558526336154,-1.2493495925272802,-0.2452115319787184,-1.4712019186844152,-0.3925726110806964,-0.835055314390411,-1.3476641243075844,0.28831555240026907,0.49778314283978853,0.806708965813594,0.6506823444717807,2.3729214668273926
+82802,1,-0.04802612166916067,-0.6295824302629383,0.14609054585137357,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.19112267045651915,2.460783004760742
+82802,2,0.31418257585760784,-0.18411165708760024,0.18808796969072364,,,,,,,,,,,,,2.460783004760742
+82902,0,-0.37378732919939306,-0.770553208210634,-0.7116979467082238,0.06338537359139342,0.6470499178582901,0.457405498335207,0.940790359233119,0.2764490248066594,0.10125229030563083,0.36043714080320877,0.22503104425430823,0.7083640674756347,1.267782866548965,-0.2910724881500066,1.9889291013160153,2.267340898513794
+82902,1,1.1054229288615007,-0.3623194500333156,-0.6709100952227768,,,,,,,,,,0.9503768127628092,0.7456311526478686,3.7028453019878094,2.4842214584350586
+82902,2,-0.37456453965524245,0.5165447305088826,0.368093032089145,,,,,,,,,,,,,2.4842214584350586
+83102,0,1.5463508548916531,0.2649699250456107,0.15249413225090913,-1.4114020086428494,-0.7358501489339809,-2.671645501579353,-1.1575206790647472,-0.9288274879458058,-1.0510058129291326,-2.628293997180841,-2.920359292869476,0.7083640674756347,-1.812216028287741,-1.388853942113607,-1.133646664653865,0.6112805604934692
+83102,1,0.2403361409635047,-0.00596880972715211,0.45246578625417994,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,0.6300633549690247
+83102,2,-0.5713494298017712,-0.4955144960193704,-0.441929748703751,,,,,,,,,,,,,0.6300633549690247
+83901,0,-1.3903310737181822,-0.42537883045855246,-0.7116979467082238,-1.7063594850896981,-1.1130047126046003,-0.9648904107168657,-1.6136752526077616,-1.5917295699596616,-1.3802224138533508,0.36043714080320877,0.22503104425430823,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.7793318033218384
+83901,1,-1.8743204516760412,-1.6986343511814288,-1.3857856561626585,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.964345932006836
+83901,2,-2.1456285509740005,-1.9746779809452786,-0.981944935899015,,,,,,,,,,,,,1.964345932006836
+84101,0,0.4168578054263319,1.3004930583018552,2.1277903127289273,0.8007790647085149,0.8984862936387031,0.7418646801456215,0.8495594445245161,0.3969766760819059,0.10125229030563083,1.5559295959968287,1.7977262128162,0.7083640674756347,-1.812216028287741,-1.388853942113607,-0.9106055385131593,1.1090941429138184
+84101,1,0.14421538675261625,0.9739954511147976,-0.05815961441716403,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,0.25935599207878113
+84101,2,1.1013221364437225,0.282992601310055,0.5480980944875663,,,,,,,,,,,,,0.25935599207878113
+85501,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,1.0957365411553635,0.7727681057484966,0.7418646801456215,1.3057140180675306,2.265155270848227,1.4181186940025035,0.9581833684000187,1.0113786285352542,1.548461097626366,1.267782866548965,-0.2910724881500066,0.42764121833107505,2.0511155128479004
+85501,1,0.6248191578070585,0.3503818305790114,0.7588410266569864,,,,,,,,,,0.9503768127628092,-1.3914893931436731,2.4486586478694914,2.0373153686523438
+85501,2,0.31418257585760784,0.282992601310055,0.8181056880851983,,,,,,,,,,,,,2.0373153686523438
+86202,0,-0.5996859390924573,-0.5404369563759129,-0.3413299128685955,0.9482578029319392,0.7727681057484966,0.17294631652479245,-0.8838279349389385,-0.024870103381456905,-0.5571809115428055,-0.23730908679360116,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,2.4138169288635254
+86202,1,1.0093021746506123,-0.4514071101098565,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,2.592885971069336
+86202,2,0.11739768571107917,-0.028410237621715174,0.45809556328835566,,,,,,,,,,,,,2.592885971069336
+87501,0,-0.48673663414592516,-0.6554950822932735,-0.7116979467082238,-0.5265295793023037,0.7727681057484966,0.17294631652479245,-0.9750588496475414,-0.14539775465670343,-1.3802224138533508,0.9581833684000187,1.7977262128162,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.198568344116211
+87501,1,-0.33638838430182605,-0.7186700903394792,0.14609054585137357,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.8951489925384521
+87501,2,-0.1777796495087138,-0.573365205752313,0.09808543849151298,,,,,,,,,,,,,1.8951489925384521
+88602,0,-0.37378732919939306,0.2649699250456107,-0.5882419354283478,1.0957365411553635,1.401359045199529,1.026323861956036,-0.06274970256151263,0.5175043273571525,1.7473352949267216,-0.23730908679360116,-0.16814274788616518,1.1284125825510003,-2.5822157519969178,0.806708965813594,0.20460009219036931,2.9687657356262207
+88602,1,-1.0092336637780452,0.17220651042592966,-0.568785015088508,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.995732307434082
+88602,2,0.41257502093087217,0.282992601310055,0.18808796969072364,,,,,,,,,,,,,2.995732307434082
+88701,0,0.529807110372864,0.03485367321088963,0.5228621660905376,-0.8214870557491524,0.8984862936387031,0.7418646801456215,0.028481212147090252,0.035393722256166354,0.595077191691958,0.36043714080320877,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.743966817855835
+88701,1,0.4325776493852816,0.5285571507320932,0.35034070611991114,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,1.7072670459747314
+88701,2,1.1013221364437225,0.43869402077594005,0.008082907292302316,,,,,,,,,,,,,1.7072670459747314
+89303,0,-0.7126352440389895,-0.6554950822932735,-0.3413299128685955,-0.674008317525728,0.5213317299680837,0.7418646801456215,1.0320212739417218,1.602253188834371,-0.22796431061858732,0.9581833684000187,-0.16814274788616518,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.821273922920227
+89303,1,0.14421538675261625,-0.9859330705691017,0.24821562598564237,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.099053144454956
+89303,2,-0.27617209458197817,-0.6512159154852555,-0.17192215510611902,,,,,,,,,,,,,2.099053144454956
+89601,0,1.5463508548916531,3.3715393248143446,1.5105102563295467,2.1280877087193333,1.2756408573093225,1.026323861956036,1.4881758474847362,1.4214617119215014,2.07655189585094,0.9581833684000187,0.22503104425430823,1.1284125825510003,1.267782866548965,1.9044904197771946,1.7658879751753094,2.119163751602173
+89601,1,1.0093021746506123,2.0430473720332882,1.1673413471940615,,,,,,,,,,1.663413533782179,0.7456311526478686,2.197821317045828,1.9138813018798828
+89601,2,1.6916768068833083,1.295051827838308,1.718131000077305,,,,,,,,,,,,,1.9138813018798828
+89803,0,1.0945536351055247,1.645667436053937,1.3870542450496706,1.2432152793787876,0.39561354207787724,0.457405498335207,1.3969449327761334,0.3367128504442826,1.9119435953888306,-0.23730908679360116,-0.9544903321671111,-1.3918785079011935,1.267782866548965,1.9044904197771946,0.8737234706124865,2.363732099533081
+89803,1,0.048094632541727786,1.1521707712678793,0.5545908663884488,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,2.386996030807495
+89803,2,1.7900692519565728,2.151409634900676,1.2681183440812516,,,,,,,,,,,,,2.386996030807495
+91202,0,0.3039085004797998,0.7252024287150527,1.5105102563295467,1.9806089704959091,1.2756408573093225,0.7418646801456215,1.3057140180675306,1.4214617119215014,1.9119435953888306,-0.23730908679360116,1.0113786285352542,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.20460009219036931,2.0563414096832275
+91202,1,1.77826820833772,0.7958201309617158,1.0652162670597927,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,2.2998993396759033
+91202,2,1.7900692519565728,0.5943954402418251,1.3581208752804623,,,,,,,,,,,,,2.2998993396759033
+91401,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,0.8007790647085149,1.401359045199529,0.457405498335207,1.2144831033589276,0.2161851991690361,0.7596854921540671,0.9581833684000187,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.42764121833107505,2.439333438873291
+91401,1,0.14421538675261625,-0.3623194500333156,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.587674617767334
+91401,2,0.11739768571107917,1.6843053765030207,1.0881132816828303,,,,,,,,,,,,,2.587674617767334
+91402,0,0.9816043301589925,0.3800280509629712,0.2759501435307853,0.8007790647085149,1.401359045199529,0.457405498335207,1.2144831033589276,0.2161851991690361,0.7596854921540671,0.9581833684000187,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.587674617767334
+91402,1,0.7209399120179469,-0.00596880972715211,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.19112267045651915,2.0513575077056885
+91402,2,0.41257502093087217,-0.573365205752313,0.8181056880851983,,,,,,,,,,,,,2.0513575077056885
+91801,0,0.4168578054263319,-0.5404369563759129,-0.7116979467082238,-0.5265295793023037,0.6470499178582901,0.7418646801456215,-0.518904276104527,-0.14539775465670343,-0.5571809115428055,-0.835055314390411,0.6182048363947807,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.7157959938049316
+91801,1,0.4325776493852816,-1.2531960507987243,-0.9772853356255832,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,1.7448049783706665
+91801,2,0.11739768571107917,-1.2740215933487957,-0.8019398735005937,,,,,,,,,,,,,1.7448049783706665
+92301,0,0.7557057202659283,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,0.018458978407257843,-0.6804312289064511,-0.06274970256151263,0.9393511068205153,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,1.747433066368103
+92301,1,0.6248191578070585,-1.520459031028347,-0.26240977468570165,,,,,,,,,,0.2373400917434395,2.88275169843941,-0.5613893220144716,2.090804100036621
+92301,2,0.31418257585760784,-0.729066625218198,-0.26192468630532967,,,,,,,,,,,,,2.090804100036621
+92302,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-1.4114020086428494,0.018458978407257843,-0.6804312289064511,-0.06274970256151263,0.9393511068205153,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.018441033950336395,2.2875821590423584
+92302,1,0.33645689517439314,-0.18414412988023388,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.2343530654907227
+92302,2,-0.1777796495087138,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,2.2343530654907227
+92303,0,1.5463508548916531,0.9553186805497738,0.029038120971032973,-1.4114020086428494,0.018458978407257843,-0.6804312289064511,-0.06274970256151263,0.9393511068205153,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,2.2343530654907227
+92303,1,0.7209399120179469,0.17220651042592966,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.198568344116211
+92303,2,-0.37456453965524245,0.20514189157711243,0.8181056880851983,,,,,,,,,,,,,2.198568344116211
+93203,0,0.07800989058673549,0.9553186805497738,0.3994061548106614,-1.4114020086428494,-0.10725920948294862,0.7418646801456215,-0.518904276104527,-0.9288274879458058,-0.8863975124670236,0.9581833684000187,-0.16814274788616518,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,2.1035828590393066
+93203,1,-0.8169921553562683,0.2612941705024705,0.24821562598564237,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.6927973321038463,1.9950716495513916
+93203,2,-0.7681343199482997,1.1393504083724229,0.7281031568859877,,,,,,,,,,,,,1.9950716495513916
+93602,0,0.07800989058673549,-0.6554950822932735,-0.5882419354283478,-0.08409336463203088,0.2698953541876708,1.026323861956036,1.2144831033589276,2.2048914452106034,0.9242937926161762,0.9581833684000187,1.0113786285352542,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,2.1758182048797607
+93602,1,0.4325776493852816,0.08311885034938876,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.662102460861206
+93602,2,0.019005240637814846,-0.573365205752313,0.2780905008899343,,,,,,,,,,,,,2.662102460861206
+94901,0,-0.03493941435979663,-1.1157275859627156,-0.9586099692679761,0.06338537359139342,0.2698953541876708,0.457405498335207,-0.2452115319787184,-0.4467168828448197,1.0889020930782853,-1.432801541987221,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.20381760597229
+94901,1,-1.0092336637780452,-0.80775775041602,0.14609054585137357,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,1.503217339515686
+94901,2,0.2157901307843435,0.04944047211122737,0.2780905008899343,,,,,,,,,,,,,1.503217339515686
+95001,0,-0.2608380242528609,0.14991179912825014,-0.3413299128685955,1.2432152793787876,1.149922669419116,1.026323861956036,0.210943041564296,0.7585596299076455,1.5827269944646125,0.9581833684000187,1.4045524206757267,0.28831555240026907,-0.27221658086938805,-1.388853942113607,0.20460009219036931,2.3390393257141113
+95001,1,-0.33638838430182605,-0.2732317899567748,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,2.2857046127319336
+95001,2,0.11739768571107917,0.8279475694406527,-0.08191962390690835,,,,,,,,,,,,,2.2857046127319336
+96201,0,0.6427564153193962,0.7252024287150527,0.3994061548106614,0.358342850038242,1.2756408573093225,0.7418646801456215,-0.42767336139592416,0.4572405017195292,-0.06335601015647824,0.9581833684000187,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.4180325269699097
+96201,1,-1.1053544179889336,0.3503818305790114,0.8609661067912552,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,1.356400728225708
+96201,2,0.11739768571107917,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,1.356400728225708
+96203,0,0.6427564153193962,0.03485367321088963,-0.7116979467082238,0.358342850038242,1.2756408573093225,0.7418646801456215,-0.42767336139592416,0.4572405017195292,-0.06335601015647824,0.9581833684000187,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.3793237209320068
+96203,1,-0.528629892723603,-0.5404947701863974,0.04396546571710477,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.3125829696655273
+96203,2,-0.07938720443544948,-0.8069173349511406,-0.6219348111021723,,,,,,,,,,,,,2.3125829696655273
+96701,0,1.320452244998589,-0.6554950822932735,0.2759501435307853,-0.5265295793023037,-1.3644410883850133,-1.8182679561481092,-0.7013661055217327,-0.6275083597576895,-0.22796431061858732,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,-1.812216028287741,-0.2910724881500066,0.8737234706124865,2.386955976486206
+96701,1,1.77826820833772,0.17220651042592966,1.371591507462599,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.19112267045651915,2.4851884841918945
+96701,2,1.7900692519565728,-0.2619623668205428,0.8181056880851983,,,,,,,,,,,,,2.4851884841918945
+96702,0,0.529807110372864,0.2649699250456107,0.029038120971032973,-0.5265295793023037,-1.3644410883850133,-1.8182679561481092,-0.7013661055217327,-0.6275083597576895,-0.22796431061858732,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,-1.812216028287741,0.806708965813594,-0.24148216009104212,2.4851884841918945
+96702,1,2.3549927336030505,0.4394694906555523,1.882216908133943,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.310551991190808,1.763675332069397
+96702,2,2.6756012576159516,-0.33981307655348536,0.7281031568859877,,,,,,,,,,,,,1.763675332069397
+97101,0,-0.9385338539320537,-0.5404369563759129,-0.09441789030884316,-0.23157210285545515,0.8984862936387031,-0.1115128652856221,0.4846357856901046,0.8188234555452687,0.2658605907677399,1.5559295959968287,1.0113786285352542,-0.9718299928258278,1.267782866548965,-0.2910724881500066,3.104134732019544,2.294797658920288
+97101,1,-0.24026763009093757,-0.3623194500333156,0.24821562598564237,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.5123608112335205
+97101,2,-0.7681343199482997,-0.6512159154852555,-0.6219348111021723,,,,,,,,,,,,,1.5123608112335205
+97102,0,-0.2608380242528609,0.03485367321088963,-0.4647859241484716,-0.23157210285545515,0.8984862936387031,-0.1115128652856221,0.4846357856901046,0.8188234555452687,0.2658605907677399,1.5559295959968287,1.0113786285352542,-0.9718299928258278,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.5123608112335205
+97102,1,0.33645689517439314,1.419433751497502,0.963091186925524,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.9227378368377686
+97102,2,0.41257502093087217,0.43869402077594005,1.3581208752804623,,,,,,,,,,,,,2.9227378368377686
+97401,0,-0.2608380242528609,-0.1952625786238314,0.3994061548106614,0.5058215882616662,1.0242044815289095,0.17294631652479245,0.3021739562728989,1.4817255375591245,1.4181186940025035,0.9581833684000187,-0.5613165400266386,-0.9718299928258278,1.267782866548965,0.806708965813594,-0.24148216009104212,2.4766666889190674
+97401,1,-0.04802612166916067,-0.5404947701863974,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.995732307434082
+97401,2,0.31418257585760784,-1.5075737225476233,-0.08191962390690835,,,,,,,,,,,,,2.995732307434082
+97402,0,0.07800989058673549,-0.1952625786238314,0.029038120971032973,0.5058215882616662,1.0242044815289095,0.17294631652479245,0.3021739562728989,1.4817255375591245,1.4181186940025035,0.9581833684000187,-0.5613165400266386,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.995732307434082
+97402,1,-0.9131129095671567,-0.09505646980369299,-0.7730351753570456,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.6431045532226562
+97402,2,0.7077523561506651,0.1272911818441699,-0.35192721750454037,,,,,,,,,,,,,2.6431045532226562
+98102,0,0.6427564153193962,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,-0.35869558526336154,0.17294631652479245,0.6670976151073104,0.6380319786323989,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.5694485902786255
+98102,1,0.4325776493852816,-1.2531960507987243,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,1.7443128824234009
+98102,2,1.0029296913704582,-0.8847680446840831,-0.441929748703751,,,,,,,,,,,,,1.7443128824234009
+99203,0,0.07800989058673549,-0.6554950822932735,-0.4647859241484716,0.06338537359139342,-0.2329773973731551,0.457405498335207,-0.61013519081313,-0.08513392901908017,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.235105514526367
+99203,1,0.6248191578070585,0.6176448108086341,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.19112267045651915,2.356497049331665
+99203,2,0.41257502093087217,0.282992601310055,0.368093032089145,,,,,,,,,,,,,2.356497049331665
+99802,0,0.6427564153193962,2.3360161915581,1.016686211210042,1.833130232272485,1.2756408573093225,1.3107830437664505,0.7583285298159133,0.3969766760819059,1.2535103935403944,0.9581833684000187,0.6182048363947807,0.7083640674756347,-0.27221658086938805,0.806708965813594,0.6506823444717807,1.4747430086135864
+99802,1,0.52869840359617,0.7067324708851749,2.392842308805287,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,1.553134560585022
+99802,2,-0.5713494298017712,0.5165447305088826,0.7281031568859877,,,,,,,,,,,,,1.553134560585022
+101503,0,0.6427564153193962,1.1854349323844948,1.757422278889299,0.358342850038242,1.0242044815289095,1.3107830437664505,-0.2452115319787184,0.2161851991690361,1.2535103935403944,-0.23730908679360116,-0.16814274788616518,1.1284125825510003,-1.812216028287741,0.806708965813594,0.8737234706124865,2.337639808654785
+101503,1,1.0093021746506123,1.1521707712678793,0.7588410266569864,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.1024258136749268
+101503,2,1.4948919167367798,0.8279475694406527,0.7281031568859877,,,,,,,,,,,,,2.1024258136749268
+101701,0,-0.14788871930632877,-0.1952625786238314,-0.5882419354283478,0.8007790647085149,0.6470499178582901,0.7418646801456215,0.4846357856901046,0.6380319786323989,1.5827269944646125,-0.835055314390411,-0.16814274788616518,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.9106055385131593,2.0623013973236084
+101701,1,0.2403361409635047,-0.2732317899567748,0.14609054585137357,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.129575252532959
+101701,2,-0.07938720443544948,-0.10626094735465771,0.008082907292302316,,,,,,,,,,,,,2.129575252532959
+102401,0,0.3039085004797998,-0.1952625786238314,-0.09441789030884316,0.358342850038242,1.149922669419116,0.457405498335207,1.3057140180675306,0.8790872811828919,1.9119435953888306,-0.835055314390411,-0.16814274788616518,1.9685096127017316,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.5585708618164062
+102401,1,0.4325776493852816,0.5285571507320932,0.14609054585137357,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.471315622329712
+102401,2,1.3964994716635155,0.43869402077594005,0.18808796969072364,,,,,,,,,,,,,2.471315622329712
+103002,0,0.19095919553326762,-0.770553208210634,-0.8351539579881,-0.8214870557491524,-1.4901592762752198,-0.6804312289064511,-0.2452115319787184,-0.26592540593194997,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,1.9044904197771946,-0.24148216009104212,0.33869513869285583
+103002,1,-0.33638838430182605,-0.80775775041602,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-1.0630639836617988,1.010522723197937
+103002,2,-0.37456453965524245,-0.33981307655348536,-0.26192468630532967,,,,,,,,,,,,,1.010522723197937
+103003,0,-0.7126352440389895,-0.770553208210634,-0.8351539579881,-0.8214870557491524,-1.4901592762752198,-0.6804312289064511,-0.2452115319787184,-0.26592540593194997,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.0874730348587036
+103003,1,0.33645689517439314,-1.0750207306456427,-1.079410415759852,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,0.464670866727829
+103003,2,-0.4729569847285068,-1.1183201738829107,-1.0719474670982256,,,,,,,,,,,,,0.464670866727829
+103301,0,-1.7291789885577786,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,-1.867313839945839,-0.9648904107168657,-0.9750588496475414,0.15592137353141286,-1.3802224138533508,-0.23730908679360116,1.4045524206757267,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,0.8240689635276794
+103301,1,-1.8743204516760412,-2.1440726515641333,-2.10066121710254,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,0.237135648727417
+103301,2,-3.1295530017066437,-2.597483658808819,-2.601990497484807,,,,,,,,,,,,,0.237135648727417
+103801,0,-0.8255845489855216,-0.8856113341279945,-0.7116979467082238,0.5058215882616662,0.1441771662974643,0.17294631652479245,-0.42767336139592416,-0.38645305720719647,1.4181186940025035,-0.23730908679360116,1.4045524206757267,-2.6520240531272905,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.389700174331665
+103801,1,-0.14414687588004912,-1.6986343511814288,-1.4879107362969273,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.0630639836617988,2.3722729682922363
+103801,2,-0.5713494298017712,-1.741125851746451,-1.7019651854927003,,,,,,,,,,,,,2.3722729682922363
+104001,0,-1.0514831588785858,-1.1157275859627156,-0.9586099692679761,1.2432152793787876,0.5213317299680837,0.457405498335207,0.11971212685569313,-0.38645305720719647,0.2658605907677399,-1.432801541987221,-1.3476641243075844,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.4645232862317478,-0.12789948284626007
+104001,1,-1.201475172199822,-0.80775775041602,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.059714660367144415,0.3457123041152954
+104001,2,-1.0633116551680928,-1.2740215933487957,-0.5319322799029617,,,,,,,,,,,,,0.3457123041152954
+104902,0,1.7722494647847176,1.5306093101365763,2.1277903127289273,1.833130232272485,0.7727681057484966,1.3107830437664505,-0.1539806172701155,0.3367128504442826,0.7596854921540671,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.6506823444717807,2.492948293685913
+104902,1,1.8743889625486083,0.4394694906555523,1.2694664273283303,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,2.52586030960083
+104902,2,0.5109674660041365,0.9057982791735953,-0.08191962390690835,,,,,,,,,,,,,2.52586030960083
+104903,0,2.6758439043569746,1.875783687888658,0.3994061548106614,1.833130232272485,0.7727681057484966,1.3107830437664505,-0.1539806172701155,0.3367128504442826,0.7596854921540671,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.6506823444717807,2.492948293685913
+104903,1,1.77826820833772,0.4394694906555523,1.6779667478654055,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.52586030960083
+104903,2,0.9045372462971938,0.282992601310055,0.2780905008899343,,,,,,,,,,,,,2.52586030960083
+105603,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-0.8615683368241874,0.17294631652479245,-0.518904276104527,0.3969766760819059,-0.7217892120049145,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,1.267782866548965,0.806708965813594,0.8737234706124865,1.9461102485656738
+105603,1,-2.1626827143087066,-1.1641083907221836,-0.8751602554913144,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,1.098388910293579
+105603,2,-0.6697418748750354,-0.6512159154852555,-0.981944935899015,,,,,,,,,,,,,1.098388910293579
+106302,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,0.5058215882616662,0.6470499178582901,0.457405498335207,-0.7013661055217327,0.3367128504442826,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.1228485107421875
+106302,1,-0.33638838430182605,-1.3422837108752652,-1.079410415759852,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,1.022963523864746
+106302,2,-0.5713494298017712,-0.4955144960193704,-0.35192721750454037,,,,,,,,,,,,,1.022963523864746
+107002,0,-1.5032803786647144,-0.8856113341279945,-0.5882419354283478,-1.4114020086428494,-0.48441377315356804,-0.6804312289064511,-0.518904276104527,0.15592137353141286,-1.5448307143154598,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-1.812216028287741,0.806708965813594,-0.6875644123724536,0.19280338287353516
+107002,1,-0.04802612166916067,-0.6295824302629383,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,1.154919147491455
+107002,2,-1.3584889903878858,-0.4955144960193704,-0.441929748703751,,,,,,,,,,,,,1.154919147491455
+107103,0,-0.37378732919939306,-0.42537883045855246,-0.2178739015887193,-0.9689657939725767,-1.9930320278360456,-0.1115128652856221,-1.6136752526077616,-0.5672445341200663,-1.2156141133912417,-1.432801541987221,-0.5613165400266386,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,0.9276532530784607
+107103,1,-0.24026763009093757,0.08311885034938876,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,-0.04779261723160744
+107103,2,-0.7681343199482997,-0.33981307655348536,0.368093032089145,,,,,,,,,,,,,-0.04779261723160744
+108003,0,2.1110973796243138,0.14991179912825014,-0.09441789030884316,0.5058215882616662,-0.10725920948294862,0.7418646801456215,0.028481212147090252,0.3367128504442826,1.0889020930782853,-1.432801541987221,-1.740837916448057,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-1.133646664653865,2.3619370460510254
+108003,1,1.0093021746506123,-0.4514071101098565,0.35034070611991114,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.858985424041748
+108003,2,1.3964994716635155,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,1.858985424041748
+108201,0,-1.164432463825118,-0.5404369563759129,-0.7116979467082238,1.390694017602212,0.8984862936387031,-0.3959720470960366,0.4846357856901046,0.2161851991690361,1.5827269944646125,0.36043714080320877,0.22503104425430823,0.7083640674756347,1.267782866548965,0.806708965813594,0.8737234706124865,2.721698760986328
+108201,1,1.6821474541268315,-0.00596880972715211,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.4851884841918945
+108201,2,1.8884616970298371,0.20514189157711243,0.638100625686777,,,,,,,,,,,,,2.4851884841918945
+108701,0,1.207502940052057,-0.42537883045855246,-0.5882419354283478,2.1280877087193333,1.401359045199529,1.3107830437664505,-0.06274970256151263,0.3367128504442826,2.07655189585094,-0.835055314390411,-0.16814274788616518,1.1284125825510003,1.267782866548965,0.806708965813594,-0.24148216009104212,1.9477083683013916
+108701,1,0.14421538675261625,-0.6295824302629383,-0.9772853356255832,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,2.1183431148529053
+108701,2,-0.07938720443544948,-0.4955144960193704,0.638100625686777,,,,,,,,,,,,,2.1183431148529053
+111102,0,0.19095919553326762,1.3004930583018552,0.3994061548106614,0.6533003264850905,0.2698953541876708,0.7418646801456215,1.0320212739417218,-1.1096189648586756,-0.06335601015647824,-0.835055314390411,0.6182048363947807,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,2.17103910446167
+111102,1,0.33645689517439314,1.1521707712678793,1.0652162670597927,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.167799234390259
+111102,2,-0.4729569847285068,0.43869402077594005,0.368093032089145,,,,,,,,,,,,,2.167799234390259
+113101,0,-0.2608380242528609,-0.3103207045411919,-0.3413299128685955,-0.23157210285545515,-1.2387229004948068,0.457405498335207,0.3934048709815018,0.3367128504442826,-0.7217892120049145,0.36043714080320877,1.0113786285352542,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.6875644123724536,1.771365761756897
+113101,1,-0.8169921553562683,-0.3623194500333156,0.24821562598564237,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,1.8207908868789673
+113101,2,-0.4729569847285068,0.04944047211122737,0.9981107504836196,,,,,,,,,,,,,1.8207908868789673
+114102,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-1.4114020086428494,0.39561354207787724,0.17294631652479245,0.7583285298159133,0.3969766760819059,-1.3802224138533508,0.9581833684000187,0.6182048363947807,0.7083640674756347,0.49778314283978853,0.806708965813594,0.8737234706124865,1.0818039178848267
+114102,1,0.2403361409635047,-0.4514071101098565,0.04396546571710477,,,,,,,,,,0.9503768127628092,1.8141914255436393,3.7028453019878094,2.3035826683044434
+114102,2,0.019005240637814846,0.04944047211122737,-0.17192215510611902,,,,,,,,,,,,,2.3035826683044434
+115801,0,-0.5996859390924573,-0.6554950822932735,-0.5882419354283478,-0.5265295793023037,-0.48441377315356804,-1.2493495925272802,1.3969449327761334,1.3009340606462547,0.10125229030563083,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.438478946685791
+115801,1,0.8170606662288354,-0.7186700903394792,1.371591507462599,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.1561801433563232
+115801,2,-0.4729569847285068,-0.6512159154852555,-0.8019398735005937,,,,,,,,,,,,,1.1561801433563232
+115802,0,2.1110973796243138,0.2649699250456107,0.893230199930166,-0.5265295793023037,-0.48441377315356804,-1.2493495925272802,1.3969449327761334,1.3009340606462547,0.10125229030563083,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.1561801433563232
+115802,1,-0.14414687588004912,-0.2732317899567748,-0.9772853356255832,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,2.0192418098449707
+115802,2,-3.818300117219494,-1.1183201738829107,-0.6219348111021723,,,,,,,,,,,,,2.0192418098449707
+116004,0,1.207502940052057,0.7252024287150527,0.3994061548106614,-1.1164445321960008,-0.2329773973731551,-0.3959720470960366,-0.2452115319787184,-0.6275083597576895,0.2658605907677399,-0.835055314390411,-0.16814274788616518,1.548461097626366,1.267782866548965,-0.2910724881500066,0.20460009219036931,-0.6931471824645996
+116004,1,1.1054229288615007,0.4394694906555523,0.7588410266569864,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,2.361442804336548
+116004,2,1.4948919167367798,1.6843053765030207,1.0881132816828303,,,,,,,,,,,,,2.361442804336548
+116006,0,0.7557057202659283,0.03485367321088963,0.15249413225090913,-1.1164445321960008,-0.2329773973731551,-0.3959720470960366,-0.2452115319787184,-0.6275083597576895,0.2658605907677399,-0.835055314390411,-0.16814274788616518,1.548461097626366,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.6495054960250854
+116006,1,-0.14414687588004912,-0.18414412988023388,0.14609054585137357,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.5494349002838135
+116006,2,0.2157901307843435,-0.33981307655348536,0.368093032089145,,,,,,,,,,,,,1.5494349002838135
+116602,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.6470499178582901,0.457405498335207,-0.9750588496475414,-0.4467168828448197,0.430468891229849,0.9581833684000187,1.4045524206757267,0.28831555240026907,-0.27221658086938805,-1.388853942113607,0.20460009219036931,1.6335792541503906
+116602,1,-1.0092336637780452,-1.7877220112579697,-1.9985361369682713,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.638952374458313
+116602,2,-0.27617209458197817,-1.2740215933487957,-1.6119626542934897,,,,,,,,,,,,,1.638952374458313
+117203,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,0.5058215882616662,1.149922669419116,1.026323861956036,0.5758667003987075,1.120142583733385,0.595077191691958,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,1.627432942390442
+117203,1,0.33645689517439314,-0.5404947701863974,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.1145520210266113
+117203,2,0.11739768571107917,-0.41766378628642786,-0.17192215510611902,,,,,,,,,,,,,2.1145520210266113
+118101,0,-0.14788871930632877,0.3800280509629712,-0.3413299128685955,0.8007790647085149,1.0242044815289095,0.7418646801456215,0.11971212685569313,0.2161851991690361,0.10125229030563083,1.5559295959968287,0.6182048363947807,-0.13173296267509654,0.49778314283978853,0.806708965813594,1.7658879751753094,2.306126832962036
+118101,1,0.14421538675261625,0.7067324708851749,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,2.995732307434082
+118101,2,-0.27617209458197817,0.6722461499747677,0.9981107504836196,,,,,,,,,,,,,2.995732307434082
+118401,0,1.6593001598381854,1.3004930583018552,2.745070369128308,1.9806089704959091,1.401359045199529,0.7418646801456215,0.940790359233119,-2.4956869545240106,1.2535103935403944,1.5559295959968287,0.6182048363947807,0.7083640674756347,1.267782866548965,0.806708965813594,0.8737234706124865,2.995732307434082
+118401,1,1.4899059457050545,1.2412584313444202,1.0652162670597927,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.492652416229248
+118401,2,1.4948919167367798,1.6843053765030207,0.45809556328835566,,,,,,,,,,,,,1.492652416229248
+118402,0,0.4168578054263319,0.6101443027976923,0.5228621660905376,1.9806089704959091,1.401359045199529,0.7418646801456215,0.940790359233119,-2.4956869545240106,1.2535103935403944,1.5559295959968287,0.6182048363947807,0.7083640674756347,0.49778314283978853,0.806708965813594,0.8737234706124865,1.492652416229248
+118402,1,1.0093021746506123,1.419433751497502,0.963091186925524,,,,,,,,,,0.2373400917434395,0.7456311526478686,2.4486586478694914,2.7123889923095703
+118402,2,1.4948919167367798,1.0614996986394805,0.18808796969072364,,,,,,,,,,,,,2.7123889923095703
+118701,0,0.3039085004797998,2.3360161915581,1.6339662676094229,1.390694017602212,1.149922669419116,1.026323861956036,-0.518904276104527,-0.26592540593194997,1.7473352949267216,-0.835055314390411,1.0113786285352542,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.018441033950336395,1.9890892505645752
+118701,1,2.0666304709703853,1.330346091420961,0.24821562598564237,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.4465408325195312
+118701,2,1.7900692519565728,1.7621560862359633,1.718131000077305,,,,,,,,,,,,,1.4465408325195312
+118702,0,0.9816043301589925,0.03485367321088963,0.5228621660905376,1.390694017602212,1.149922669419116,1.026323861956036,-0.518904276104527,-0.26592540593194997,1.7473352949267216,-0.835055314390411,1.0113786285352542,1.1284125825510003,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.6683763265609741
+118702,1,0.6248191578070585,0.4394694906555523,0.5545908663884488,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.0785746574401855
+118702,2,0.7077523561506651,0.8279475694406527,0.45809556328835566,,,,,,,,,,,,,2.0785746574401855
+118703,0,-0.48673663414592516,0.2649699250456107,-0.4647859241484716,1.390694017602212,1.149922669419116,1.026323861956036,-0.518904276104527,-0.26592540593194997,1.7473352949267216,-0.835055314390411,1.0113786285352542,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.0785746574401855
+118703,1,0.8170606662288354,-0.00596880972715211,-0.568785015088508,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,3.7028453019878094,2.2474722862243652
+118703,2,0.2157901307843435,0.43869402077594005,0.8181056880851983,,,,,,,,,,,,,2.2474722862243652
+120903,0,-0.2608380242528609,0.03485367321088963,0.3994061548106614,-0.9689657939725767,-1.3644410883850133,-0.9648904107168657,-1.8873679967335701,-1.1698827904962987,-1.2156141133912417,1.5559295959968287,0.22503104425430823,1.9685096127017316,0.49778314283978853,0.806708965813594,-0.018441033950336395,1.824009656906128
+120903,1,0.2403361409635047,-0.2732317899567748,-0.568785015088508,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.6927973321038463,1.6037263870239258
+120903,2,0.5109674660041365,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,1.6037263870239258
+121603,0,-0.8255845489855216,0.6101443027976923,1.2635982337697944,-0.9689657939725767,-1.3644410883850133,-0.9648904107168657,-1.0662897643561442,-1.5917295699596616,-0.8863975124670236,-0.23730908679360116,-1.3476641243075844,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.8859505653381348
+121603,1,0.2403361409635047,0.7067324708851749,0.24821562598564237,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,0.7983524799346924
+121603,2,-0.6697418748750354,0.20514189157711243,-0.35192721750454037,,,,,,,,,,,,,0.7983524799346924
+122103,0,-0.5996859390924573,-0.770553208210634,-0.7116979467082238,-1.8538382233131223,-2.4959047793968714,-1.8182679561481092,-2.1610607408593787,-1.3506742674091685,-1.3802224138533508,0.36043714080320877,-2.920359292869476,-2.2319755380519246,1.267782866548965,1.9044904197771946,-0.9106055385131593,0.8185967803001404
+122103,1,-0.7208714011453798,-1.7877220112579697,-1.8964110568340025,,,,,,,,,,1.663413533782179,1.8141914255436393,-0.5613893220144716,0.802704393863678
+122103,2,-0.8665267650215641,-1.8968272712123362,-2.151977841488754,,,,,,,,,,,,,0.802704393863678
+122403,0,-0.5996859390924573,-0.42537883045855246,-0.5882419354283478,-0.5265295793023037,-0.6101319610437744,-0.1115128652856221,-1.5224443378991586,-1.712257221234908,-1.0510058129291326,1.5559295959968287,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.014155626296997
+122403,1,-0.33638838430182605,-1.2531960507987243,-1.079410415759852,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.1704227924346924
+122403,2,-0.27617209458197817,-1.429723012814681,-0.8919424046998043,,,,,,,,,,,,,1.1704227924346924
+123101,0,1.207502940052057,1.5306093101365763,1.8808782901691752,0.358342850038242,1.0242044815289095,1.026323861956036,0.028481212147090252,-0.024870103381456905,1.4181186940025035,-0.835055314390411,-0.16814274788616518,0.7083640674756347,0.49778314283978853,1.9044904197771946,0.8737234706124865,2.7062835693359375
+123101,1,0.9131814204397238,1.7757843918036655,1.7800918279996742,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.059714660367144415,2.4643607139587402
+123101,2,2.18363903224963,0.7500968597077102,1.718131000077305,,,,,,,,,,,,,2.4643607139587402
+123102,0,0.8686550252124604,-0.1952625786238314,0.5228621660905376,0.358342850038242,1.0242044815289095,1.026323861956036,0.028481212147090252,-0.024870103381456905,1.4181186940025035,-0.835055314390411,-0.16814274788616518,0.7083640674756347,1.267782866548965,1.9044904197771946,-0.24148216009104212,2.4643607139587402
+123102,1,2.1627512251812737,-0.5404947701863974,-0.26240977468570165,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.310551991190808,2.741000175476074
+123102,2,0.6093599110774008,0.5165447305088826,1.3581208752804623,,,,,,,,,,,,,2.741000175476074
+123302,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,0.6470499178582901,0.457405498335207,-0.7925970202303356,-1.712257221234908,-0.5571809115428055,1.5559295959968287,0.22503104425430823,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.42764121833107505,2.0460681915283203
+123302,1,-1.585958189043376,-1.6986343511814288,-1.6921608965654649,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.7378649711608887
+123302,2,-0.9649192100948284,-0.18411165708760024,-0.6219348111021723,,,,,,,,,,,,,1.7378649711608887
+123603,0,1.320452244998589,1.4155511842192159,0.7697741886502898,-0.37905084107887943,-1.2387229004948068,0.17294631652479245,1.2144831033589276,0.9996149324581385,0.10125229030563083,0.9581833684000187,0.6182048363947807,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.24148216009104212,1.4369440078735352
+123603,1,0.4325776493852816,1.6866967317271246,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,1.5297653675079346
+123603,2,0.9045372462971938,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,1.5297653675079346
+123803,0,0.07800989058673549,0.2649699250456107,-0.09441789030884316,0.6533003264850905,1.2756408573093225,0.17294631652479245,-0.518904276104527,-0.4467168828448197,0.10125229030563083,-0.835055314390411,-0.5613165400266386,1.548461097626366,-1.812216028287741,0.806708965813594,0.6506823444717807,1.4444228410720825
+123803,1,-0.4325091385127145,-0.6295824302629383,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,1.2991278171539307
+123803,2,-0.07938720443544948,-0.10626094735465771,-0.17192215510611902,,,,,,,,,,,,,1.2991278171539307
+123805,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,0.6533003264850905,1.2756408573093225,0.17294631652479245,-0.518904276104527,-0.4467168828448197,0.10125229030563083,-0.835055314390411,-0.5613165400266386,1.548461097626366,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.051041841506958
+123805,1,-1.585958189043376,-1.431371370951806,-1.590035816431196,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,1.7644270658493042
+123805,2,-0.27617209458197817,-1.040469464149968,0.45809556328835566,,,,,,,,,,,,,1.7644270658493042
+124104,0,-1.164432463825118,-0.770553208210634,-0.7116979467082238,-0.9689657939725767,-1.615877464165426,-1.5338087743376947,-1.339982508481953,-2.0135763494230243,-1.0510058129291326,0.36043714080320877,-1.3476641243075844,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,-0.10102174431085587
+124104,1,-0.9131129095671567,-1.2531960507987243,-1.7942859766997337,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,0.029514562338590622
+124104,2,-0.37456453965524245,-1.5075737225476233,-1.521960123094279,,,,,,,,,,,,,0.029514562338590622
+124201,0,-1.0514831588785858,0.6101443027976923,-0.2178739015887193,-0.8214870557491524,-1.3644410883850133,-1.5338087743376947,0.4846357856901046,-1.4712019186844152,-0.8863975124670236,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.270140528678894
+124201,1,-0.528629892723603,0.3503818305790114,-0.8751602554913144,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,0.6282013654708862
+124201,2,-0.4729569847285068,0.04944047211122737,-0.26192468630532967,,,,,,,,,,,,,0.6282013654708862
+124402,0,-1.27738176877165,-0.5404369563759129,-0.2178739015887193,-0.8214870557491524,-1.3644410883850133,-1.8182679561481092,-1.6136752526077616,-0.38645305720719647,-1.2156141133912417,-2.628293997180841,-1.3476641243075844,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,0.4817827343940735
+124402,1,-1.1053544179889336,-0.4514071101098565,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,0.826286256313324
+124402,2,-0.8665267650215641,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,0.826286256313324
+124602,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-0.37905084107887943,-0.10725920948294862,0.7418646801456215,0.210943041564296,-0.20566158029432668,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,1.2448941469192505
+124602,1,-0.4325091385127145,-0.9859330705691017,-1.3857856561626585,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,0.7013409733772278
+124602,2,1.3964994716635155,-0.2619623668205428,0.18808796969072364,,,,,,,,,,,,,0.7013409733772278
+125003,0,-0.03493941435979663,0.8402605546324132,0.029038120971032973,-0.08409336463203088,0.39561354207787724,0.457405498335207,-0.61013519081313,-1.8930486981477779,0.2658605907677399,1.5559295959968287,0.22503104425430823,1.548461097626366,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,2.2894675731658936
+125003,1,0.52869840359617,-0.18414412988023388,-0.36453485481997044,,,,,,,,,,-1.1887333502953,0.7456311526478686,-1.0630639836617988,2.530747890472412
+125003,2,0.5109674660041365,0.5165447305088826,0.368093032089145,,,,,,,,,,,,,2.530747890472412
+125101,0,0.07800989058673549,-0.8856113341279945,-0.8351539579881,-0.674008317525728,-0.10725920948294862,0.457405498335207,0.3934048709815018,0.15592137353141286,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,-1.3918785079011935,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,1.802241325378418
+125101,1,-1.2975959264107106,-1.3422837108752652,-0.568785015088508,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,1.6807416677474976
+125101,2,-0.4729569847285068,-0.18411165708760024,-0.5319322799029617,,,,,,,,,,,,,1.6807416677474976
+125801,0,1.207502940052057,-0.08020445270647089,1.5105102563295467,1.5381727558256364,0.7727681057484966,0.17294631652479245,1.3057140180675306,0.9393511068205153,1.0889020930782853,1.5559295959968287,1.4045524206757267,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.090804100036621
+125801,1,1.1054229288615007,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.0630639836617988,1.619914174079895
+125801,2,1.298107026590251,0.5165447305088826,1.718131000077305,,,,,,,,,,,,,1.619914174079895
+125802,0,1.320452244998589,1.9908418138060184,2.4981583465685557,1.5381727558256364,0.7727681057484966,0.17294631652479245,1.3057140180675306,0.9393511068205153,1.0889020930782853,1.5559295959968287,1.4045524206757267,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,1.619914174079895
+125802,1,1.3937851914941661,0.4394694906555523,1.371591507462599,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.2503535747528076
+125802,2,0.31418257585760784,0.5943954402418251,0.18808796969072364,,,,,,,,,,,,,2.2503535747528076
+126101,0,0.19095919553326762,-0.42537883045855246,0.029038120971032973,0.8007790647085149,0.7727681057484966,1.026323861956036,1.4881758474847362,1.120142583733385,1.4181186940025035,1.5559295959968287,1.4045524206757267,1.9685096127017316,1.267782866548965,0.806708965813594,-0.24148216009104212,2.1642074584960938
+126101,1,0.048094632541727786,-0.18414412988023388,0.14609054585137357,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,1.449941873550415
+126101,2,-0.27617209458197817,-0.729066625218198,0.18808796969072364,,,,,,,,,,,,,1.449941873550415
+126301,0,-0.7126352440389895,-0.5404369563759129,-0.4647859241484716,0.5058215882616662,1.0242044815289095,0.7418646801456215,-0.7925970202303356,0.5777681529947757,0.9242937926161762,0.9581833684000187,0.6182048363947807,1.1284125825510003,1.267782866548965,0.806708965813594,0.42764121833107505,1.8870034217834473
+126301,1,-0.9131129095671567,-1.3422837108752652,-1.2836605760283897,,,,,,,,,,1.663413533782179,-0.3229291202479022,3.7028453019878094,1.824009656906128
+126301,2,-0.7681343199482997,-1.3518723030817383,-0.26192468630532967,,,,,,,,,,,,,1.824009656906128
+128602,0,-0.14788871930632877,-0.770553208210634,-0.7116979467082238,-1.2639232704194252,-0.2329773973731551,-1.5338087743376947,-1.339982508481953,0.035393722256166354,-1.8740473152396782,-0.835055314390411,-1.740837916448057,-0.13173296267509654,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.4025218486785889
+128602,1,-0.6247506469344914,-0.4514071101098565,-1.1815354958941209,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,1.45352041721344
+128602,2,-0.5713494298017712,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,1.45352041721344
+129002,0,-0.5996859390924573,0.8402605546324132,0.5228621660905376,-0.37905084107887943,0.2698953541876708,0.7418646801456215,-0.61013519081313,-1.1698827904962987,0.10125229030563083,0.9581833684000187,-0.16814274788616518,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.5571691393852234
+129002,1,0.2403361409635047,-0.00596880972715211,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,0.30004340410232544
+129002,2,-0.27617209458197817,-0.33981307655348536,-0.6219348111021723,,,,,,,,,,,,,0.30004340410232544
+129601,0,-0.14788871930632877,-0.3103207045411919,-0.3413299128685955,-0.9689657939725767,-0.6101319610437744,0.7418646801456215,1.4881758474847362,0.7585596299076455,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-1.133646664653865,0.8586603403091431
+129601,1,0.14421538675261625,-0.896845410492561,-1.079410415759852,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,0.9936612844467163
+129601,2,-0.7681343199482997,-0.729066625218198,-0.5319322799029617,,,,,,,,,,,,,0.9936612844467163
+130604,0,0.4168578054263319,1.1854349323844948,1.5105102563295467,0.06338537359139342,0.018458978407257843,0.17294631652479245,-0.33644244668732126,-0.08513392901908017,0.10125229030563083,0.9581833684000187,1.4045524206757267,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.9863250255584717
+130604,1,1.0093021746506123,1.5085214115740428,-0.36453485481997044,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.8397740125656128
+130604,2,1.593284361810044,0.9836489889065378,-0.17192215510611902,,,,,,,,,,,,,1.8397740125656128
+132404,0,0.19095919553326762,1.645667436053937,2.621614357848432,-0.674008317525728,-0.10725920948294862,-0.6804312289064511,0.6670976151073104,-0.14539775465670343,-0.22796431061858732,0.9581833684000187,-0.16814274788616518,0.28831555240026907,1.267782866548965,0.806708965813594,0.8737234706124865,2.160510778427124
+132404,1,0.048094632541727786,1.7757843918036655,0.8609661067912552,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.077674627304077
+132404,2,0.9045372462971938,1.3729025375712505,1.178115812882041,,,,,,,,,,,,,2.077674627304077
+132405,0,-1.164432463825118,-0.08020445270647089,0.029038120971032973,-0.674008317525728,-0.10725920948294862,-0.6804312289064511,0.6670976151073104,-0.14539775465670343,-0.22796431061858732,0.9581833684000187,-0.16814274788616518,0.28831555240026907,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.4024853706359863
+132405,1,0.52869840359617,0.7958201309617158,0.24821562598564237,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.1300911903381348
+132405,2,-0.6697418748750354,0.5165447305088826,0.09808543849151298,,,,,,,,,,,,,2.1300911903381348
+132701,0,0.6427564153193962,1.5306093101365763,1.3870542450496706,0.06338537359139342,1.0242044815289095,0.457405498335207,0.5758667003987075,1.120142583733385,0.10125229030563083,-0.835055314390411,-0.9544903321671111,1.1284125825510003,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.1718566417694092
+132701,1,0.6248191578070585,1.1521707712678793,0.04396546571710477,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.2935713529586792
+132701,2,0.6093599110774008,1.2172011181053655,0.09808543849151298,,,,,,,,,,,,,1.2935713529586792
+135202,0,-0.37378732919939306,-0.1952625786238314,0.15249413225090913,-0.9689657939725767,1.2756408573093225,0.457405498335207,-0.518904276104527,-0.14539775465670343,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,1.1284125825510003,0.49778314283978853,0.806708965813594,3.104134732019544,1.69688081741333
+135202,1,0.048094632541727786,0.17220651042592966,-0.568785015088508,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.839806318283081
+135202,2,0.41257502093087217,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,1.839806318283081
+135203,0,0.6427564153193962,0.3800280509629712,0.3994061548106614,-0.9689657939725767,1.2756408573093225,0.457405498335207,-0.518904276104527,-0.14539775465670343,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.6506823444717807,1.8251008987426758
+135203,1,0.6248191578070585,0.6176448108086341,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,1.7980340719223022
+135203,2,1.3964994716635155,0.5943954402418251,-0.17192215510611902,,,,,,,,,,,,,1.7980340719223022
+136201,0,1.6593001598381854,1.7607255619712974,1.5105102563295467,1.9806089704959091,1.2756408573093225,1.026323861956036,1.3057140180675306,0.8188234555452687,2.07655189585094,0.36043714080320877,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-1.388853942113607,0.20460009219036931,2.211974620819092
+136201,1,1.2976644372832777,2.132135032109829,1.2694664273283303,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.2083611488342285
+136201,2,1.593284361810044,1.9178575057018483,0.9981107504836196,,,,,,,,,,,,,2.2083611488342285
+138902,0,0.6427564153193962,-0.08020445270647089,0.15249413225090913,-0.5265295793023037,0.1441771662974643,-0.1115128652856221,-1.339982508481953,-1.712257221234908,0.430468891229849,0.9581833684000187,1.4045524206757267,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.7960983514785767
+138902,1,-0.24026763009093757,2.132135032109829,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.0807852745056152
+138902,2,-0.4729569847285068,0.5943954402418251,0.18808796969072364,,,,,,,,,,,,,2.0807852745056152
+139901,0,-0.2608380242528609,-0.5404369563759129,-0.09441789030884316,0.6533003264850905,0.7727681057484966,1.026323861956036,1.3057140180675306,1.120142583733385,0.430468891229849,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.4645232862317478,2.0522682666778564
+139901,1,0.14421538675261625,0.5285571507320932,0.14609054585137357,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.26688289642334
+139901,2,-0.07938720443544948,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,2.26688289642334
+140107,0,-1.6162296836112464,-1.1157275859627156,-0.9586099692679761,-0.37905084107887943,-0.48441377315356804,0.17294631652479245,-0.518904276104527,-0.14539775465670343,-0.7217892120049145,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,0.8737234706124865,0.2869720458984375
+140107,1,-1.393716680621599,-0.896845410492561,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,1.1944719937511734,0.5687434673309326
+140107,2,-0.6697418748750354,1.2172011181053655,-0.981944935899015,,,,,,,,,,,,,0.5687434673309326
+140901,0,-0.5996859390924573,0.3800280509629712,0.15249413225090913,-1.4114020086428494,0.2698953541876708,0.7418646801456215,-0.33644244668732126,-0.024870103381456905,-0.8863975124670236,0.9581833684000187,-1.3476641243075844,-0.5517814777504622,-2.5822157519969178,-0.2910724881500066,-0.9106055385131593,0.7815454006195068
+140901,1,0.6248191578070585,0.7958201309617158,0.7588410266569864,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.19112267045651915,1.310645580291748
+140901,2,0.6093599110774008,0.36084331104299755,0.908108219284409,,,,,,,,,,,,,1.310645580291748
+141404,0,1.5463508548916531,-0.5404369563759129,-0.4647859241484716,-0.8214870557491524,-1.867313839945839,-0.9648904107168657,-2.2522916555679817,-0.20566158029432668,-1.0510058129291326,-0.23730908679360116,-2.13401170858853,-2.2319755380519246,-0.27221658086938805,1.9044904197771946,-0.4645232862317478,2.489370346069336
+141404,1,-0.14414687588004912,-0.80775775041602,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,3.2011706403404823,2.7082395553588867
+141404,2,-0.7681343199482997,-0.6512159154852555,-0.26192468630532967,,,,,,,,,,,,,2.7082395553588867
+141503,0,-1.3903310737181822,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,-1.615877464165426,-1.5338087743376947,-1.339982508481953,-0.748036011032936,-1.2156141133912417,-0.23730908679360116,-0.9544903321671111,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,-0.4976807236671448
+141503,1,-2.0665619600978182,-1.1641083907221836,-1.3857856561626585,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,0.5752089619636536
+141503,2,-1.0633116551680928,-1.6632751420135086,-1.7019651854927003,,,,,,,,,,,,,0.5752089619636536
+141602,0,-0.2608380242528609,-0.3103207045411919,-0.2178739015887193,-0.8214870557491524,-1.3644410883850133,0.17294631652479245,-0.61013519081313,-0.024870103381456905,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,0.5635619759559631
+141602,1,1.1054229288615007,-0.00596880972715211,0.7588410266569864,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,-0.6931471824645996
+141602,2,0.11739768571107917,-0.6512159154852555,0.18808796969072364,,,,,,,,,,,,,-0.6931471824645996
+142303,0,0.7557057202659283,1.5306093101365763,0.3994061548106614,0.2108641118148177,1.0242044815289095,0.7418646801456215,0.4846357856901046,0.09565754789378961,0.10125229030563083,-0.835055314390411,-0.16814274788616518,1.548461097626366,1.267782866548965,-1.388853942113607,0.20460009219036931,2.0065417289733887
+142303,1,1.4899059457050545,1.419433751497502,2.392842308805287,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,1.8687939643859863
+142303,2,1.1013221364437225,1.1393504083724229,1.8081335312765157,,,,,,,,,,,,,1.8687939643859863
+142304,0,2.44994529446391,0.2649699250456107,2.1277903127289273,0.2108641118148177,1.0242044815289095,0.7418646801456215,0.4846357856901046,0.09565754789378961,0.10125229030563083,-0.835055314390411,-0.16814274788616518,1.548461097626366,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.8687939643859863
+142304,1,0.4325776493852816,1.0630831111913384,0.5545908663884488,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.7430180311203003
+142304,2,-0.37456453965524245,0.20514189157711243,0.638100625686777,,,,,,,,,,,,,1.7430180311203003
+142305,0,0.9816043301589925,-0.42537883045855246,0.5228621660905376,0.2108641118148177,1.0242044815289095,0.7418646801456215,0.4846357856901046,0.09565754789378961,0.10125229030563083,-0.835055314390411,-0.16814274788616518,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.0508196353912354
+142305,1,0.4325776493852816,0.3503818305790114,1.2694664273283303,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,1.8567229509353638
+142305,2,-0.37456453965524245,0.5165447305088826,1.2681183440812516,,,,,,,,,,,,,1.8567229509353638
+143601,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-0.9689657939725767,-1.7415956520556326,-1.5338087743376947,-1.7961370820249674,-2.134104000698271,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,-1.388853942113607,0.20460009219036931,-0.02262800745666027
+143601,1,-1.9704412058869298,-2.054984991487592,-1.9985361369682713,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.059714660367144415,-0.4602424204349518
+143601,2,-2.932768111560115,-2.0525286906782214,-1.7019651854927003,,,,,,,,,,,,,-0.4602424204349518
+143603,0,-1.164432463825118,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,-1.7415956520556326,-1.5338087743376947,-1.7961370820249674,-2.134104000698271,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-1.133646664653865,0.40815433859825134
+143603,1,-1.9704412058869298,-1.431371370951806,-1.1815354958941209,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,0.37023109197616577
+143603,2,-0.9649192100948284,-1.3518723030817383,-1.0719474670982256,,,,,,,,,,,,,0.37023109197616577
+143701,0,-0.37378732919939306,-0.1952625786238314,-0.09441789030884316,-1.5588807468662738,-0.2329773973731551,-1.8182679561481092,-0.9750588496475414,-0.989091313583429,-1.3802224138533508,1.5559295959968287,1.4045524206757267,0.7083640674756347,-1.812216028287741,-0.2910724881500066,0.8737234706124865,0.24148297309875488
+143701,1,-0.04802612166916067,-0.00596880972715211,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,-0.10143303126096725
+143701,2,-0.07938720443544948,-0.10626094735465771,-1.521960123094279,,,,,,,,,,,,,-0.10143303126096725
+143702,0,-1.6162296836112464,-0.770553208210634,-0.8351539579881,-1.5588807468662738,-0.2329773973731551,-1.8182679561481092,-0.9750588496475414,-0.989091313583429,-1.3802224138533508,1.5559295959968287,1.4045524206757267,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,-0.10143303126096725
+143702,1,-1.9704412058869298,-1.609546691104888,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,0.310580849647522
+143702,2,-1.2600965453146213,-1.2740215933487957,-1.251952529496647,,,,,,,,,,,,,0.310580849647522
+144002,0,0.9816043301589925,-0.3103207045411919,-0.4647859241484716,-1.1164445321960008,-1.1130047126046003,-0.9648904107168657,-1.4312134231905558,-1.0493551392210523,-0.8863975124670236,0.9581833684000187,1.0113786285352542,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.20460009219036931,0.9307687282562256
+144002,1,0.2403361409635047,-0.00596880972715211,0.45246578625417994,,,,,,,,,,1.663413533782179,1.8141914255436393,-0.5613893220144716,0.6179527044296265
+144002,2,-0.27617209458197817,-0.028410237621715174,0.8181056880851983,,,,,,,,,,,,,0.6179527044296265
+144202,0,-0.03493941435979663,-0.770553208210634,-0.7116979467082238,-1.4114020086428494,-1.3644410883850133,-0.9648904107168657,-1.1575206790647472,-0.5672445341200663,-0.5571809115428055,-1.432801541987221,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,0.806708965813594,-0.018441033950336395,1.9301546812057495
+144202,1,-2.5471657311522606,-1.1641083907221836,-1.4879107362969273,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,1.964345932006836
+144202,2,-0.6697418748750354,-1.1183201738829107,-0.8919424046998043,,,,,,,,,,,,,1.964345932006836
+144301,0,1.4334015499451211,1.4155511842192159,0.5228621660905376,1.5381727558256364,1.149922669419116,1.026323861956036,1.1232521886503248,-0.024870103381456905,1.9119435953888306,-0.23730908679360116,-1.740837916448057,-0.5517814777504622,1.267782866548965,-0.2910724881500066,1.9889291013160153,1.5996063947677612
+144301,1,0.2403361409635047,1.1521707712678793,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,1.6301895380020142
+144301,2,1.1997145815169867,1.0614996986394805,1.178115812882041,,,,,,,,,,,,,1.6301895380020142
+147401,0,0.07800989058673549,0.03485367321088963,0.6463181773704137,0.358342850038242,1.149922669419116,1.3107830437664505,1.4881758474847362,1.0598787580957618,-0.06335601015647824,1.5559295959968287,1.7977262128162,1.548461097626366,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.028951644897461
+147401,1,-0.33638838430182605,0.17220651042592966,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,2.4486586478694914,1.656307578086853
+147401,2,0.11739768571107917,0.7500968597077102,0.908108219284409,,,,,,,,,,,,,1.656307578086853
+149102,0,0.3039085004797998,-0.6554950822932735,-0.2178739015887193,-0.9689657939725767,-0.7358501489339809,-0.6804312289064511,-1.0662897643561442,-0.5069807084824429,-0.7217892120049145,0.36043714080320877,-0.5613165400266386,-0.13173296267509654,-1.812216028287741,0.806708965813594,-1.3566877907945707,0.4297013282775879
+149102,1,-0.4325091385127145,-1.431371370951806,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.0046143531799316
+149102,2,-0.07938720443544948,-1.1183201738829107,-1.1619499982974364,,,,,,,,,,,,,1.0046143531799316
+149901,0,0.7557057202659283,0.8402605546324132,0.3994061548106614,0.06338537359139342,0.39561354207787724,1.3107830437664505,1.2144831033589276,1.4214617119215014,0.10125229030563083,0.36043714080320877,0.6182048363947807,1.9685096127017316,1.267782866548965,-0.2910724881500066,0.6506823444717807,1.4157878160476685
+149901,1,-0.528629892723603,0.17220651042592966,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.275018334388733
+149901,2,-0.27617209458197817,-0.028410237621715174,-0.5319322799029617,,,,,,,,,,,,,1.275018334388733
+151902,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,0.1441771662974643,1.026323861956036,-1.7049061673163644,-1.8930486981477779,-0.3925726110806964,0.9581833684000187,-1.3476641243075844,-0.13173296267509654,1.267782866548965,1.9044904197771946,0.8737234706124865,1.8266615867614746
+151902,1,-1.4898374348324874,-1.431371370951806,-1.7942859766997337,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,-0.6931471824645996
+151902,2,-0.7681343199482997,-1.2740215933487957,-0.441929748703751,,,,,,,,,,,,,-0.6931471824645996
+152403,0,-0.7126352440389895,-0.6554950822932735,-0.8351539579881,-1.2639232704194252,-1.867313839945839,-2.3871863197689382,-1.5224443378991586,-2.6764784314368804,-0.8863975124670236,-0.23730908679360116,-1.3476641243075844,-0.9718299928258278,-1.812216028287741,-1.388853942113607,-1.3566877907945707,1.5715423822402954
+152403,1,-0.04802612166916067,-0.9859330705691017,-1.1815354958941209,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.059714660367144415,0.8586603403091431
+152403,2,-0.27617209458197817,-1.585424432280566,-1.4319575918950684,,,,,,,,,,,,,0.8586603403091431
+153204,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.08409336463203088,-1.2387229004948068,1.3107830437664505,1.3057140180675306,-0.38645305720719647,0.9242937926161762,0.36043714080320877,1.4045524206757267,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,1.5457956790924072
+153204,1,-2.5471657311522606,-1.431371370951806,-1.4879107362969273,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,0.7773395776748657
+153204,2,-2.4408058861937936,-1.741125851746451,-2.061975310289543,,,,,,,,,,,,,0.7773395776748657
+154101,0,-0.48673663414592516,-1.1157275859627156,-0.9586099692679761,-1.2639232704194252,0.018458978407257843,0.17294631652479245,-0.1539806172701155,0.4572405017195292,-0.8863975124670236,1.5559295959968287,1.4045524206757267,0.7083640674756347,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.8111647367477417
+154101,1,-0.24026763009093757,-1.6986343511814288,-0.05815961441716403,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.0504159927368164
+154101,2,-0.27617209458197817,-0.8069173349511406,-0.26192468630532967,,,,,,,,,,,,,2.0504159927368164
+154102,0,1.5463508548916531,-1.000669460045355,-0.8351539579881,-1.2639232704194252,0.018458978407257843,0.17294631652479245,-0.1539806172701155,0.4572405017195292,-0.8863975124670236,1.5559295959968287,1.4045524206757267,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.0504159927368164
+154102,1,-1.201475172199822,-0.4514071101098565,-0.568785015088508,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.0522682666778564
+154102,2,-1.2600965453146213,-0.573365205752313,-0.441929748703751,,,,,,,,,,,,,2.0522682666778564
+154802,0,-0.7126352440389895,-0.3103207045411919,0.15249413225090913,-0.08409336463203088,0.2698953541876708,0.17294631652479245,-0.06274970256151263,-0.5672445341200663,-0.22796431061858732,-0.835055314390411,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.747433066368103
+154802,1,-0.4325091385127145,0.08311885034938876,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.2641254663467407
+154802,2,-0.37456453965524245,0.1272911818441699,-0.6219348111021723,,,,,,,,,,,,,1.2641254663467407
+155102,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-0.9689657939725767,0.6470499178582901,0.17294631652479245,-0.1539806172701155,0.5175043273571525,-0.5571809115428055,0.9581833684000187,0.22503104425430823,0.28831555240026907,-1.0422163045785646,0.806708965813594,1.9889291013160153,1.984562873840332
+155102,1,-0.4325091385127145,-0.80775775041602,-1.3857856561626585,,,,,,,,,,-1.1887333502953,1.8141914255436393,3.7028453019878094,1.8380401134490967
+155102,2,0.11739768571107917,-0.4955144960193704,-0.7119373423013831,,,,,,,,,,,,,1.8380401134490967
+156602,0,0.529807110372864,0.14991179912825014,0.2759501435307853,0.5058215882616662,1.149922669419116,0.7418646801456215,0.3021739562728989,0.9393511068205153,0.595077191691958,1.5559295959968287,-1.3476641243075844,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.9563919305801392
+156602,1,0.7209399120179469,0.17220651042592966,1.4737165875968679,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.407790422439575
+156602,2,1.1997145815169867,0.7500968597077102,0.5480980944875663,,,,,,,,,,,,,2.407790422439575
+158101,0,1.0945536351055247,0.03485367321088963,0.029038120971032973,-1.7063594850896981,-0.48441377315356804,-0.9648904107168657,-0.42767336139592416,-0.989091313583429,-1.2156141133912417,1.5559295959968287,0.6182048363947807,-0.9718299928258278,-1.0422163045785646,0.806708965813594,0.8737234706124865,2.02457594871521
+158101,1,0.6248191578070585,0.5285571507320932,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.9404655694961548
+158101,2,0.6093599110774008,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,1.9404655694961548
+159603,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-2.0013169615365465,-2.873059343067491,-2.671645501579353,-1.4312134231905558,-2.134104000698271,-1.5448307143154598,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,-2.5822157519969178,-1.388853942113607,-0.9106055385131593,0.8523938059806824
+159603,1,-1.1053544179889336,-1.8768096713345106,-1.8964110568340025,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.3139013144854623,0.8102810978889465
+159603,2,-0.9649192100948284,-1.8189765614793936,-1.791967716691911,,,,,,,,,,,,,0.8102810978889465
+159607,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-2.0013169615365465,-2.873059343067491,-2.671645501579353,-1.4312134231905558,-2.134104000698271,-1.5448307143154598,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,1.267782866548965,1.9044904197771946,-0.24148216009104212,0.21405862271785736
+159607,1,-0.6247506469344914,-1.9658973314110515,-1.7942859766997337,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,-0.10102174431085587
+159607,2,-0.5713494298017712,-1.8968272712123362,-2.331982903887175,,,,,,,,,,,,,-0.10102174431085587
+159802,0,0.529807110372864,-0.6554950822932735,-0.7116979467082238,0.8007790647085149,0.39561354207787724,-0.1115128652856221,0.6670976151073104,0.9393511068205153,1.4181186940025035,-0.835055314390411,-0.5613165400266386,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.261077880859375
+159802,1,-1.201475172199822,-0.896845410492561,0.14609054585137357,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.2362797260284424
+159802,2,-0.6697418748750354,0.20514189157711243,-0.981944935899015,,,,,,,,,,,,,2.2362797260284424
+159901,0,0.6427564153193962,0.7252024287150527,1.016686211210042,0.6533003264850905,0.8984862936387031,0.457405498335207,0.4846357856901046,-0.38645305720719647,0.2658605907677399,0.36043714080320877,1.0113786285352542,-0.5517814777504622,1.267782866548965,0.806708965813594,3.104134732019544,0.9044451713562012
+159901,1,-0.7208714011453798,0.7067324708851749,1.4737165875968679,,,,,,,,,,0.9503768127628092,0.7456311526478686,3.7028453019878094,1.3907580375671387
+159901,2,-0.1777796495087138,-0.10626094735465771,0.8181056880851983,,,,,,,,,,,,,1.3907580375671387
+160004,0,-0.03493941435979663,0.8402605546324132,0.029038120971032973,1.390694017602212,-0.6101319610437744,1.026323861956036,1.3057140180675306,0.4572405017195292,0.7596854921540671,0.9581833684000187,1.7977262128162,0.7083640674756347,-1.812216028287741,-1.388853942113607,0.8737234706124865,0.7065247297286987
+160004,1,0.9131814204397238,1.1521707712678793,0.35034070611991114,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,0.8678008317947388
+160004,2,1.4948919167367798,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,0.8678008317947388
+163902,0,0.19095919553326762,-0.1952625786238314,-0.7116979467082238,2.1280877087193333,1.401359045199529,0.7418646801456215,1.0320212739417218,0.2161851991690361,1.9119435953888306,0.9581833684000187,1.4045524206757267,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.995732307434082
+163902,1,0.14421538675261625,0.4394694906555523,0.04396546571710477,,,,,,,,,,0.9503768127628092,-1.3914893931436731,1.1944719937511734,2.995732307434082
+163902,2,1.7900692519565728,0.9057982791735953,0.18808796969072364,,,,,,,,,,,,,2.995732307434082
+164203,0,-0.03493941435979663,1.5306093101365763,2.1277903127289273,-1.1164445321960008,-1.3644410883850133,-2.3871863197689382,-1.9785989114421731,-0.989091313583429,-1.5448307143154598,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.9884235858917236
+164203,1,0.8170606662288354,0.6176448108086341,0.24821562598564237,,,,,,,,,,-0.47569662927593015,1.8141914255436393,0.4419600012801827,1.5679306983947754
+164203,2,-0.37456453965524245,0.6722461499747677,0.008082907292302316,,,,,,,,,,,,,1.5679306983947754
+164903,0,-1.0514831588785858,-0.770553208210634,-0.7116979467082238,-1.4114020086428494,-1.7415956520556326,-1.8182679561481092,-0.7925970202303356,-0.20566158029432668,-1.0510058129291326,0.9581833684000187,-0.9544903321671111,1.1284125825510003,1.267782866548965,-1.388853942113607,0.20460009219036931,0.4091334342956543
+164903,1,-1.1053544179889336,-1.0750207306456427,-1.4879107362969273,,,,,,,,,,-1.9017700713146695,0.7456311526478686,1.1944719937511734,0.37766513228416443
+164903,2,0.2157901307843435,-1.040469464149968,-1.3419550606958577,,,,,,,,,,,,,0.37766513228416443
+165005,0,-0.7126352440389895,-0.3103207045411919,-0.09441789030884316,-0.37905084107887943,-1.615877464165426,-0.9648904107168657,-1.24875159377335,-0.024870103381456905,-1.0510058129291326,0.36043714080320877,-0.16814274788616518,-1.8119270229765592,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,0.0647229552268982
+165005,1,-0.8169921553562683,-0.18414412988023388,-0.9772853356255832,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,0.7213913798332214
+165005,2,-0.7681343199482997,-0.18411165708760024,-0.35192721750454037,,,,,,,,,,,,,0.7213913798332214
+165802,0,-1.164432463825118,-0.6554950822932735,-0.7116979467082238,1.5381727558256364,1.401359045199529,1.3107830437664505,0.11971212685569313,0.15592137353141286,1.7473352949267216,1.5559295959968287,1.4045524206757267,-0.13173296267509654,1.267782866548965,-1.388853942113607,-0.6875644123724536,1.9095832109451294
+165802,1,0.4325776493852816,-0.00596880972715211,0.35034070611991114,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,1.9737452268600464
+165802,2,1.7900692519565728,-0.41766378628642786,0.008082907292302316,,,,,,,,,,,,,1.9737452268600464
+166201,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-0.08409336463203088,0.8984862936387031,1.026323861956036,0.940790359233119,-0.20566158029432668,-0.7217892120049145,0.9581833684000187,0.22503104425430823,0.7083640674756347,-0.27221658086938805,1.9044904197771946,0.8737234706124865,2.922832489013672
+166201,1,-0.9131129095671567,0.17220651042592966,0.35034070611991114,,,,,,,,,,0.9503768127628092,2.88275169843941,2.4486586478694914,1.3767900466918945
+166201,2,-0.7681343199482997,-0.4955144960193704,0.368093032089145,,,,,,,,,,,,,1.3767900466918945
+167501,0,0.07800989058673549,-0.5404369563759129,-0.4647859241484716,1.6856514940490606,1.0242044815289095,0.7418646801456215,1.4881758474847362,0.6380319786323989,1.4181186940025035,-0.23730908679360116,-0.9544903321671111,1.548461097626366,1.267782866548965,0.806708965813594,0.20460009219036931,2.5574629306793213
+167501,1,0.8170606662288354,0.8849077910382567,1.882216908133943,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.6723015308380127
+167501,2,1.1997145815169867,0.43869402077594005,0.368093032089145,,,,,,,,,,,,,2.6723015308380127
+167504,0,2.44994529446391,1.3004930583018552,0.893230199930166,1.6856514940490606,1.0242044815289095,0.7418646801456215,1.4881758474847362,0.6380319786323989,1.4181186940025035,-0.23730908679360116,-0.9544903321671111,1.548461097626366,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.995732307434082
+167504,1,0.4325776493852816,1.2412584313444202,1.0652162670597927,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,2.995732307434082
+167504,2,1.298107026590251,0.7500968597077102,0.908108219284409,,,,,,,,,,,,,2.995732307434082
+169004,0,0.19095919553326762,1.7607255619712974,2.004334301449051,-0.674008317525728,-1.2387229004948068,-2.3871863197689382,-0.1539806172701155,-0.38645305720719647,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,1.548461097626366,1.267782866548965,-0.2910724881500066,-0.6875644123724536,0.5221880674362183
+169004,1,-0.7208714011453798,0.7958201309617158,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.2959420680999756
+169004,2,0.9045372462971938,-0.41766378628642786,0.8181056880851983,,,,,,,,,,,,,1.2959420680999756
+172001,0,-0.7126352440389895,-0.6554950822932735,-0.7116979467082238,-0.5265295793023037,0.2698953541876708,-0.9648904107168657,0.6670976151073104,-1.5314657443220383,-0.8863975124670236,1.5559295959968287,1.4045524206757267,1.9685096127017316,1.267782866548965,1.9044904197771946,0.20460009219036931,2.3900279998779297
+172001,1,-0.4325091385127145,-1.520459031028347,-1.1815354958941209,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,2.097635507583618
+172001,2,-1.752058770680943,-1.040469464149968,-1.7019651854927003,,,,,,,,,,,,,2.097635507583618
+173302,0,2.1110973796243138,-0.3103207045411919,0.15249413225090913,1.390694017602212,0.2698953541876708,1.3107830437664505,1.2144831033589276,0.6982958042700221,1.9119435953888306,0.36043714080320877,1.7977262128162,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.6479945182800293
+173302,1,1.6821474541268315,-0.00596880972715211,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.995732307434082
+173302,2,1.593284361810044,-0.4955144960193704,0.008082907292302316,,,,,,,,,,,,,2.995732307434082
+173501,0,-0.37378732919939306,-0.08020445270647089,0.15249413225090913,0.8007790647085149,1.0242044815289095,0.7418646801456215,-0.33644244668732126,0.6982958042700221,-0.22796431061858732,-0.23730908679360116,0.22503104425430823,0.28831555240026907,1.267782866548965,0.806708965813594,3.104134732019544,1.686808466911316
+173501,1,-0.4325091385127145,-0.00596880972715211,-0.8751602554913144,,,,,,,,,,0.9503768127628092,1.8141914255436393,3.7028453019878094,2.2646634578704834
+173501,2,-0.6697418748750354,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,2.2646634578704834
+177802,0,0.8686550252124604,1.4155511842192159,1.2635982337697944,0.8007790647085149,-0.10725920948294862,0.457405498335207,1.1232521886503248,0.15592137353141286,0.10125229030563083,-0.835055314390411,-1.3476641243075844,0.28831555240026907,-2.5822157519969178,-1.388853942113607,-0.6875644123724536,0.7040417790412903
+177802,1,1.1054229288615007,-0.00596880972715211,0.5545908663884488,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,0.637300968170166
+177802,2,1.1013221364437225,-0.6512159154852555,0.368093032089145,,,,,,,,,,,,,0.637300968170166
+183303,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-1.4901592762752198,-0.6804312289064511,-1.339982508481953,-0.14539775465670343,-1.3802224138533508,-0.23730908679360116,1.0113786285352542,-0.9718299928258278,-1.0422163045785646,-1.388853942113607,0.42764121833107505,1.8630633354187012
+183303,1,-1.393716680621599,-0.3623194500333156,-0.36453485481997044,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.059714660367144415,1.5841364860534668
+183303,2,-0.4729569847285068,-0.729066625218198,0.008082907292302316,,,,,,,,,,,,,1.5841364860534668
+183803,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-1.1130047126046003,0.17294631652479245,0.5758667003987075,0.3969766760819059,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,1.8281036615371704
+183803,1,-2.1626827143087066,-1.3422837108752652,-1.4879107362969273,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,1.822934865951538
+183803,2,-1.4568814354611501,-1.429723012814681,-1.7019651854927003,,,,,,,,,,,,,1.822934865951538
+183902,0,0.9816043301589925,-0.6554950822932735,0.5228621660905376,-0.5265295793023037,-1.615877464165426,-2.102727137958524,-0.33644244668732126,-1.4712019186844152,-1.3802224138533508,-2.030547769584031,-0.5613165400266386,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,3.104134732019544,0.5763617157936096
+183902,1,0.2403361409635047,-1.1641083907221836,-0.6709100952227768,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.1382217407226562
+183902,2,0.6093599110774008,-0.2619623668205428,0.8181056880851983,,,,,,,,,,,,,1.1382217407226562
+185304,0,0.6427564153193962,0.8402605546324132,0.029038120971032973,0.8007790647085149,0.2698953541876708,0.7418646801456215,1.3057140180675306,0.9996149324581385,0.9242937926161762,0.36043714080320877,0.22503104425430823,0.28831555240026907,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.2362797260284424
+185304,1,0.33645689517439314,0.3503818305790114,1.1673413471940615,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,2.869825839996338
+185304,2,-0.4729569847285068,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,2.869825839996338
+186301,0,-0.14788871930632877,-0.42537883045855246,0.893230199930166,0.6533003264850905,0.8984862936387031,1.3107830437664505,1.0320212739417218,1.6625170144719943,-0.3925726110806964,-0.23730908679360116,1.7977262128162,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.6875644123724536,1.3385016918182373
+186301,1,0.14421538675261625,-0.3623194500333156,-0.6709100952227768,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,1.5084161758422852
+186301,2,-1.161704100241357,-0.2619623668205428,-0.981944935899015,,,,,,,,,,,,,1.5084161758422852
+186601,0,0.07800989058673549,-1.000669460045355,-0.8351539579881,0.8007790647085149,-0.2329773973731551,0.457405498335207,0.7583285298159133,0.5175043273571525,-0.22796431061858732,-0.835055314390411,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.4488497972488403
+186601,1,-0.6247506469344914,-0.5404947701863974,-0.568785015088508,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.19112267045651915,1.1517411470413208
+186601,2,-0.1777796495087138,-0.41766378628642786,0.368093032089145,,,,,,,,,,,,,1.1517411470413208
+187603,0,-1.0514831588785858,-0.6554950822932735,-0.7116979467082238,1.390694017602212,0.6470499178582901,1.3107830437664505,0.210943041564296,0.8790872811828919,1.2535103935403944,0.36043714080320877,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.6668524742126465
+187603,1,-0.33638838430182605,-0.9859330705691017,-1.4879107362969273,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.7716599702835083
+187603,2,-0.9649192100948284,-0.8847680446840831,-1.1619499982974364,,,,,,,,,,,,,1.7716599702835083
+187802,0,-0.03493941435979663,1.1854349323844948,1.016686211210042,-0.08409336463203088,0.39561354207787724,0.457405498335207,-0.8838279349389385,-0.26592540593194997,-0.5571809115428055,-0.835055314390411,1.4045524206757267,-0.13173296267509654,1.267782866548965,1.9044904197771946,-0.4645232862317478,1.6465427875518799
+187802,1,-0.24026763009093757,1.2412584313444202,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.6927973321038463,1.7459635734558105
+187802,2,0.019005240637814846,0.9057982791735953,0.008082907292302316,,,,,,,,,,,,,1.7459635734558105
+188502,0,1.7722494647847176,0.14991179912825014,-0.09441789030884316,0.2108641118148177,1.0242044815289095,0.7418646801456215,0.5758667003987075,0.3969766760819059,0.7596854921540671,-0.835055314390411,-0.16814274788616518,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.6875644123724536,2.572751998901367
+188502,1,0.7209399120179469,0.6176448108086341,0.45246578625417994,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.8122266528381351,2.604991912841797
+188502,2,1.3964994716635155,0.9057982791735953,1.5381259376788836,,,,,,,,,,,,,2.604991912841797
+190201,0,0.07800989058673549,-0.8856113341279945,-0.7116979467082238,0.358342850038242,0.2698953541876708,0.17294631652479245,0.3934048709815018,-0.5069807084824429,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,2.267198085784912
+190201,1,-0.6247506469344914,-0.2732317899567748,-0.05815961441716403,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.227269411087036
+190201,2,-0.5713494298017712,0.04944047211122737,-0.17192215510611902,,,,,,,,,,,,,2.227269411087036
+190202,0,0.8686550252124604,0.2649699250456107,0.15249413225090913,0.358342850038242,0.2698953541876708,0.17294631652479245,0.3934048709815018,-0.5069807084824429,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,2.123857259750366
+190202,1,-0.04802612166916067,-0.00596880972715211,0.14609054585137357,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,2.2190356254577637
+190202,2,0.019005240637814846,-0.41766378628642786,-0.26192468630532967,,,,,,,,,,,,,2.2190356254577637
+190501,0,-0.2608380242528609,-1.1157275859627156,-0.9586099692679761,0.358342850038242,-0.10725920948294862,0.17294631652479245,1.0320212739417218,0.6380319786323989,1.0889020930782853,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,1.267782866548965,0.806708965813594,0.20460009219036931,2.3242218494415283
+190501,1,0.6248191578070585,-0.00596880972715211,-0.16028469455143282,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,2.4082157611846924
+190501,2,1.7900692519565728,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,2.4082157611846924
+190502,0,0.4168578054263319,-0.770553208210634,-0.7116979467082238,0.358342850038242,-0.10725920948294862,0.17294631652479245,1.0320212739417218,0.6380319786323989,1.0889020930782853,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,-2.5822157519969178,-0.2910724881500066,-1.3566877907945707,2.4082157611846924
+190502,1,0.8170606662288354,0.08311885034938876,-0.26240977468570165,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,2.1412363052368164
+190502,2,0.6093599110774008,0.36084331104299755,0.45809556328835566,,,,,,,,,,,,,2.1412363052368164
+190601,0,1.0945536351055247,0.7252024287150527,0.3994061548106614,1.9806089704959091,1.2756408573093225,1.026323861956036,1.3057140180675306,1.6625170144719943,2.07655189585094,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,0.806708965813594,0.20460009219036931,2.995732307434082
+190601,1,0.4325776493852816,1.330346091420961,-1.3857856561626585,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.995732307434082
+190601,2,-0.4729569847285068,0.8279475694406527,0.638100625686777,,,,,,,,,,,,,2.995732307434082
+190603,0,2.1110973796243138,0.6101443027976923,0.2759501435307853,1.9806089704959091,1.2756408573093225,1.026323861956036,1.3057140180675306,1.6625170144719943,2.07655189585094,-0.835055314390411,0.22503104425430823,0.28831555240026907,-0.27221658086938805,0.806708965813594,0.20460009219036931,2.995732307434082
+190603,1,0.33645689517439314,1.2412584313444202,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.995732307434082
+190603,2,-0.4729569847285068,0.7500968597077102,-0.08191962390690835,,,,,,,,,,,,,2.995732307434082
+190604,0,-0.2608380242528609,-0.08020445270647089,-0.09441789030884316,1.9806089704959091,1.2756408573093225,1.026323861956036,1.3057140180675306,1.6625170144719943,2.07655189585094,-0.835055314390411,0.22503104425430823,0.28831555240026907,-0.27221658086938805,0.806708965813594,0.20460009219036931,2.995732307434082
+190604,1,0.6248191578070585,1.0630831111913384,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.995732307434082
+190604,2,1.1013221364437225,1.1393504083724229,0.908108219284409,,,,,,,,,,,,,2.995732307434082
+192602,0,-0.48673663414592516,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,0.1441771662974643,1.026323861956036,-0.7013661055217327,-0.024870103381456905,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.4892454147338867
+192602,1,0.048094632541727786,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.374253988265991
+192602,2,-0.27617209458197817,0.5165447305088826,0.45809556328835566,,,,,,,,,,,,,2.374253988265991
+192704,0,0.19095919553326762,-0.3103207045411919,-0.5882419354283478,0.2108641118148177,-0.2329773973731551,1.026323861956036,1.2144831033589276,0.5175043273571525,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-1.3566877907945707,1.7510279417037964
+192704,1,0.52869840359617,-0.7186700903394792,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,1.8531097173690796
+192704,2,-0.07938720443544948,-0.028410237621715174,0.8181056880851983,,,,,,,,,,,,,1.8531097173690796
+193502,0,3.014691819196571,1.875783687888658,2.3747023352886796,2.1280877087193333,1.0242044815289095,1.026323861956036,-0.8838279349389385,0.15592137353141286,1.0889020930782853,0.9581833684000187,1.7977262128162,1.1284125825510003,0.49778314283978853,0.806708965813594,-1.133646664653865,1.7215558290481567
+193502,1,1.2015436830723893,1.2412584313444202,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.161266326904297
+193502,2,1.4948919167367798,0.8279475694406527,1.6281284688780944,,,,,,,,,,,,,2.161266326904297
+193602,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,1.2432152793787876,0.7727681057484966,0.7418646801456215,0.8495594445245161,0.3367128504442826,1.7473352949267216,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,1.267782866548965,1.9044904197771946,0.20460009219036931,1.763675332069397
+193602,1,0.048094632541727786,-0.3623194500333156,-0.6709100952227768,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,1.47413969039917
+193602,2,1.298107026590251,1.0614996986394805,0.09808543849151298,,,,,,,,,,,,,1.47413969039917
+193801,0,-0.48673663414592516,-1.230785711880076,-1.0820659805478523,1.390694017602212,0.7727681057484966,0.17294631652479245,-0.1539806172701155,-1.8327848725101548,1.2535103935403944,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,1.267782866548965,-0.2910724881500066,-0.4645232862317478,1.561645269393921
+193801,1,0.6248191578070585,0.7958201309617158,1.1673413471940615,,,,,,,,,,0.2373400917434395,-0.3229291202479022,3.7028453019878094,1.5084161758422852
+193801,2,0.11739768571107917,1.450753247304193,0.638100625686777,,,,,,,,,,,,,1.5084161758422852
+193803,0,-0.9385338539320537,-0.3103207045411919,-0.09441789030884316,1.390694017602212,0.7727681057484966,0.17294631652479245,-0.1539806172701155,-1.8327848725101548,1.2535103935403944,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,1.267782866548965,0.806708965813594,0.20460009219036931,2.9597740173339844
+193803,1,0.048094632541727786,0.5285571507320932,0.963091186925524,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.310551991190808,2.3390393257141113
+193803,2,1.1013221364437225,0.8279475694406527,1.718131000077305,,,,,,,,,,,,,2.3390393257141113
+195101,0,1.207502940052057,-0.08020445270647089,-0.3413299128685955,0.06338537359139342,0.39561354207787724,0.17294631652479245,0.5758667003987075,1.361197886283878,-0.06335601015647824,0.36043714080320877,0.6182048363947807,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.7019448280334473
+195101,1,0.9131814204397238,0.4394694906555523,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.373138904571533
+195101,2,1.1997145815169867,0.6722461499747677,0.008082907292302316,,,,,,,,,,,,,2.373138904571533
+195102,0,1.6593001598381854,0.6101443027976923,1.6339662676094229,0.06338537359139342,0.39561354207787724,0.17294631652479245,0.5758667003987075,1.361197886283878,-0.06335601015647824,0.36043714080320877,0.6182048363947807,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.373138904571533
+195102,1,2.1627512251812737,0.17220651042592966,0.963091186925524,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.4643607139587402
+195102,2,1.4948919167367798,0.1272911818441699,0.908108219284409,,,,,,,,,,,,,2.4643607139587402
+195401,0,0.3039085004797998,1.3004930583018552,1.8808782901691752,1.2432152793787876,1.401359045199529,1.026323861956036,1.3969449327761334,1.843308491384864,1.0889020930782853,-0.23730908679360116,0.22503104425430823,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.135617971420288
+195401,1,0.14421538675261625,0.9739954511147976,1.1673413471940615,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.1804280281066895
+195401,2,0.019005240637814846,-0.18411165708760024,0.008082907292302316,,,,,,,,,,,,,2.1804280281066895
+195402,0,0.07800989058673549,-0.5404369563759129,-0.5882419354283478,1.2432152793787876,1.401359045199529,1.026323861956036,1.3969449327761334,1.843308491384864,1.0889020930782853,-0.23730908679360116,0.22503104425430823,-0.5517814777504622,0.49778314283978853,0.806708965813594,3.104134732019544,2.1804280281066895
+195402,1,-0.24026763009093757,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.5580716133117676
+195402,2,-0.27617209458197817,0.8279475694406527,0.09808543849151298,,,,,,,,,,,,,2.5580716133117676
+196001,0,-0.03493941435979663,-0.42537883045855246,-0.09441789030884316,0.06338537359139342,0.2698953541876708,0.7418646801456215,0.4846357856901046,0.2764490248066594,-0.22796431061858732,0.9581833684000187,-0.9544903321671111,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.6875644123724536,2.615027666091919
+196001,1,-0.14414687588004912,0.3503818305790114,0.6567159465227176,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,2.214808464050293
+196001,2,-0.27617209458197817,0.20514189157711243,0.008082907292302316,,,,,,,,,,,,,2.214808464050293
+196002,0,-1.0514831588785858,-0.3103207045411919,-0.5882419354283478,0.06338537359139342,0.2698953541876708,0.7418646801456215,0.4846357856901046,0.2764490248066594,-0.22796431061858732,0.9581833684000187,-0.9544903321671111,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.018441033950336395,2.1368277072906494
+196002,1,-0.9131129095671567,-0.80775775041602,-1.1815354958941209,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,-0.6931471824645996
+196002,2,-1.2600965453146213,-1.040469464149968,-1.791967716691911,,,,,,,,,,,,,-0.6931471824645996
+196502,0,-0.03493941435979663,0.4950861768803317,0.15249413225090913,0.06338537359139342,0.2698953541876708,0.7418646801456215,0.4846357856901046,0.09565754789378961,0.430468891229849,0.9581833684000187,0.6182048363947807,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,1.5365381240844727
+196502,1,-0.24026763009093757,-0.00596880972715211,0.7588410266569864,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.9243637323379517
+196502,2,-0.5713494298017712,-0.028410237621715174,0.368093032089145,,,,,,,,,,,,,1.9243637323379517
+197201,0,-1.5032803786647144,-0.42537883045855246,-0.3413299128685955,-0.5265295793023037,1.149922669419116,0.17294631652479245,0.7583285298159133,-0.5069807084824429,0.9242937926161762,1.5559295959968287,-2.13401170858853,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.666351318359375
+197201,1,-2.5471657311522606,-0.80775775041602,-1.2836605760283897,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.8250607252120972
+197201,2,-2.932768111560115,-1.5075737225476233,-0.8019398735005937,,,,,,,,,,,,,1.8250607252120972
+199001,0,0.3039085004797998,0.4950861768803317,0.6463181773704137,1.5381727558256364,1.0242044815289095,0.457405498335207,1.2144831033589276,0.9996149324581385,1.5827269944646125,0.36043714080320877,1.4045524206757267,1.1284125825510003,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,2.0584843158721924
+199001,1,0.7209399120179469,0.4394694906555523,0.5545908663884488,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.8122266528381351,1.9562814235687256
+199001,2,1.0029296913704582,0.7500968597077102,0.7281031568859877,,,,,,,,,,,,,1.9562814235687256
+199002,0,-0.03493941435979663,0.7252024287150527,0.5228621660905376,1.5381727558256364,1.0242044815289095,0.457405498335207,1.2144831033589276,0.9996149324581385,1.5827269944646125,0.36043714080320877,1.4045524206757267,1.1284125825510003,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,1.9562814235687256
+199002,1,0.33645689517439314,0.7958201309617158,0.14609054585137357,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.22629976272583
+199002,2,0.9045372462971938,0.1272911818441699,0.368093032089145,,,,,,,,,,,,,2.22629976272583
+199302,0,-0.14788871930632877,0.3800280509629712,0.5228621660905376,-0.08409336463203088,0.39561354207787724,0.7418646801456215,0.5758667003987075,0.8188234555452687,-0.5571809115428055,1.5559295959968287,-0.5613165400266386,1.9685096127017316,1.267782866548965,-0.2910724881500066,0.20460009219036931,0.2918941080570221
+199302,1,-0.04802612166916067,0.7067324708851749,0.04396546571710477,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,-0.6931471824645996
+199302,2,-0.8665267650215641,-0.4955144960193704,0.5480980944875663,,,,,,,,,,,,,-0.6931471824645996
+199402,0,0.7557057202659283,0.7252024287150527,0.3994061548106614,1.2432152793787876,0.8984862936387031,1.3107830437664505,1.2144831033589276,1.120142583733385,1.4181186940025035,0.36043714080320877,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.9772381782531738
+199402,1,0.33645689517439314,0.8849077910382567,0.45246578625417994,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,1.9572726488113403
+199402,2,0.31418257585760784,1.450753247304193,-0.08191962390690835,,,,,,,,,,,,,1.9572726488113403
+199501,0,-0.37378732919939306,0.03485367321088963,-0.5882419354283478,0.5058215882616662,-0.10725920948294862,-0.3959720470960366,0.210943041564296,-1.5314657443220383,-0.8863975124670236,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.6202976703643799
+199501,1,-1.0092336637780452,0.7958201309617158,1.0652162670597927,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,1.5605579614639282
+199501,2,-1.4568814354611501,0.43869402077594005,0.368093032089145,,,,,,,,,,,,,1.5605579614639282
+200202,0,-0.48673663414592516,-0.5404369563759129,-0.5882419354283478,-0.08409336463203088,0.1441771662974643,0.457405498335207,-0.2452115319787184,0.035393722256166354,-1.0510058129291326,0.9581833684000187,-0.16814274788616518,1.548461097626366,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.7694168090820312
+200202,1,0.2403361409635047,0.8849077910382567,1.2694664273283303,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,0.5486081838607788
+200202,2,0.11739768571107917,0.8279475694406527,0.7281031568859877,,,,,,,,,,,,,0.5486081838607788
+200209,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,-0.08409336463203088,0.1441771662974643,0.457405498335207,-0.2452115319787184,0.035393722256166354,-1.0510058129291326,0.9581833684000187,-0.16814274788616518,1.548461097626366,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,0.7855092287063599
+200209,1,-3.4122525190502566,-1.609546691104888,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,0.6116605401039124
+200209,2,-1.6536663256076787,-1.741125851746451,-2.151977841488754,,,,,,,,,,,,,0.6116605401039124
+200210,0,0.7557057202659283,1.645667436053937,1.6339662676094229,-0.08409336463203088,0.1441771662974643,0.457405498335207,-0.2452115319787184,0.035393722256166354,-1.0510058129291326,0.9581833684000187,-0.16814274788616518,1.548461097626366,-0.27221658086938805,-1.388853942113607,0.20460009219036931,0.6116605401039124
+200210,1,0.9131814204397238,1.0630831111913384,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.4419600012801827,0.34409716725349426
+200210,2,2.18363903224963,0.282992601310055,0.09808543849151298,,,,,,,,,,,,,0.34409716725349426
+201601,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,0.9482578029319392,0.39561354207787724,1.3107830437664505,0.5758667003987075,-0.5069807084824429,0.595077191691958,-0.23730908679360116,0.6182048363947807,-0.5517814777504622,1.267782866548965,0.806708965813594,0.20460009219036931,1.8451265096664429
+201601,1,-0.7208714011453798,-0.9859330705691017,-1.1815354958941209,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,2.096728801727295
+201601,2,0.8061448012239295,-0.573365205752313,-0.441929748703751,,,,,,,,,,,,,2.096728801727295
+201602,0,-0.2608380242528609,0.03485367321088963,-0.5882419354283478,0.9482578029319392,0.39561354207787724,1.3107830437664505,0.5758667003987075,-0.5069807084824429,0.595077191691958,-0.23730908679360116,0.6182048363947807,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.194056272506714
+201602,1,0.4325776493852816,-0.2732317899567748,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,2.5625829696655273
+201602,2,0.41257502093087217,-0.10626094735465771,-0.17192215510611902,,,,,,,,,,,,,2.5625829696655273
+203001,0,1.4334015499451211,0.6101443027976923,0.15249413225090913,0.9482578029319392,1.0242044815289095,1.026323861956036,0.11971212685569313,1.6625170144719943,1.2535103935403944,-0.23730908679360116,0.22503104425430823,1.9685096127017316,1.267782866548965,0.806708965813594,3.104134732019544,2.119049549102783
+203001,1,1.2976644372832777,0.3503818305790114,1.1673413471940615,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,2.123490333557129
+203001,2,1.7900692519565728,0.20514189157711243,0.09808543849151298,,,,,,,,,,,,,2.123490333557129
+204201,0,1.0945536351055247,0.7252024287150527,0.3994061548106614,1.2432152793787876,1.2756408573093225,1.026323861956036,1.2144831033589276,-0.20566158029432668,1.9119435953888306,0.9581833684000187,0.6182048363947807,0.28831555240026907,1.267782866548965,0.806708965813594,0.8737234706124865,2.995732307434082
+204201,1,1.2015436830723893,0.5285571507320932,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.7470014095306396
+204201,2,1.1013221364437225,-0.33981307655348536,2.258146187272569,,,,,,,,,,,,,2.7470014095306396
+204202,0,0.07800989058673549,1.4155511842192159,2.004334301449051,1.2432152793787876,1.2756408573093225,1.026323861956036,1.2144831033589276,-0.20566158029432668,1.9119435953888306,0.9581833684000187,0.6182048363947807,0.28831555240026907,1.267782866548965,0.806708965813594,3.104134732019544,2.443748712539673
+204202,1,0.52869840359617,1.330346091420961,1.0652162670597927,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.330634593963623
+204202,2,1.3964994716635155,1.606454666770078,1.8081335312765157,,,,,,,,,,,,,2.330634593963623
+204602,0,0.7557057202659283,-0.08020445270647089,-0.7116979467082238,-0.8214870557491524,-0.9872865247143939,-1.5338087743376947,-0.61013519081313,-0.3261892315695732,-1.0510058129291326,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-1.3566877907945707,1.2509961128234863
+204602,1,1.0093021746506123,-0.5404947701863974,-0.6709100952227768,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,2.1358566284179688
+204602,2,0.9045372462971938,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,2.1358566284179688
+205801,0,0.7557057202659283,0.6101443027976923,0.6463181773704137,1.0957365411553635,0.7727681057484966,1.026323861956036,0.4846357856901046,0.4572405017195292,0.7596854921540671,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.4117963314056396
+205801,1,0.8170606662288354,1.419433751497502,1.1673413471940615,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,2.4326751232147217
+205801,2,-0.27617209458197817,0.282992601310055,0.908108219284409,,,,,,,,,,,,,2.4326751232147217
+206401,0,0.4168578054263319,1.1854349323844948,2.621614357848432,0.6533003264850905,0.39561354207787724,-0.1115128652856221,1.3057140180675306,-0.38645305720719647,-0.7217892120049145,-0.835055314390411,-0.9544903321671111,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.0017013549804688
+206401,1,0.9131814204397238,1.8648720518802064,0.8609661067912552,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.19112267045651915,1.0539921522140503
+206401,2,-0.07938720443544948,1.295051827838308,0.368093032089145,,,,,,,,,,,,,1.0539921522140503
+207001,0,-0.37378732919939306,-0.1952625786238314,0.15249413225090913,-0.9689657939725767,-0.6101319610437744,-2.3871863197689382,0.8495594445245161,1.1804064093710083,-0.7217892120049145,0.9581833684000187,1.4045524206757267,1.1284125825510003,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.1718077659606934
+207001,1,0.4325776493852816,-0.7186700903394792,-0.05815961441716403,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,2.110806703567505
+207001,2,-0.37456453965524245,-0.33981307655348536,-0.8019398735005937,,,,,,,,,,,,,2.110806703567505
+207301,0,-0.5996859390924573,-0.8856113341279945,-0.8351539579881,1.5381727558256364,1.149922669419116,1.026323861956036,1.0320212739417218,1.7227808401096176,1.4181186940025035,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.018441033950336395,1.3997167348861694
+207301,1,-0.4325091385127145,-0.5404947701863974,0.35034070611991114,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,1.212433934211731
+207301,2,-0.07938720443544948,-0.028410237621715174,0.45809556328835566,,,,,,,,,,,,,1.212433934211731
+207602,0,0.07800989058673549,0.9553186805497738,2.004334301449051,0.5058215882616662,0.5213317299680837,-0.1115128652856221,0.3934048709815018,0.6380319786323989,-0.7217892120049145,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.0628407001495361
+207602,1,0.14421538675261625,1.419433751497502,1.1673413471940615,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,2.5144002437591553
+207602,2,0.8061448012239295,1.9178575057018483,0.09808543849151298,,,,,,,,,,,,,2.5144002437591553
+207901,0,-0.37378732919939306,-1.000669460045355,-0.8351539579881,-0.674008317525728,0.7727681057484966,0.7418646801456215,-1.0662897643561442,0.3367128504442826,-0.8863975124670236,0.9581833684000187,1.4045524206757267,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.8114674091339111
+207901,1,-0.528629892723603,0.4394694906555523,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,1.5518075227737427
+207901,2,-1.0633116551680928,0.282992601310055,0.368093032089145,,,,,,,,,,,,,1.5518075227737427
+208201,0,0.4168578054263319,-1.000669460045355,-0.8351539579881,0.5058215882616662,0.7727681057484966,0.7418646801456215,0.6670976151073104,0.09565754789378961,-0.5571809115428055,-0.835055314390411,-1.740837916448057,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,0.7045097947120667
+208201,1,-0.4325091385127145,-0.4514071101098565,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-1.0630639836617988,0.5003288388252258
+208201,2,0.41257502093087217,-0.4955144960193704,0.368093032089145,,,,,,,,,,,,,0.5003288388252258
+210205,0,0.3039085004797998,-0.1952625786238314,0.3994061548106614,-0.8214870557491524,0.6470499178582901,1.026323861956036,0.3934048709815018,0.2764490248066594,-0.5571809115428055,0.36043714080320877,0.22503104425430823,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-1.3566877907945707,2.7511134147644043
+210205,1,0.8170606662288354,0.5285571507320932,1.0652162670597927,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.19112267045651915,2.995732307434082
+210205,2,0.019005240637814846,0.6722461499747677,0.7281031568859877,,,,,,,,,,,,,2.995732307434082
+210301,0,-0.03493941435979663,-1.000669460045355,-0.8351539579881,-0.37905084107887943,0.6470499178582901,0.7418646801456215,0.4846357856901046,0.5777681529947757,0.7596854921540671,1.5559295959968287,0.6182048363947807,1.1284125825510003,0.49778314283978853,0.806708965813594,0.20460009219036931,2.3709535598754883
+210301,1,-0.14414687588004912,-1.1641083907221836,-1.4879107362969273,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.317275285720825
+210301,2,0.019005240637814846,-0.33981307655348536,-0.7119373423013831,,,,,,,,,,,,,2.317275285720825
+210302,0,0.4168578054263319,0.4950861768803317,-0.3413299128685955,-0.37905084107887943,0.6470499178582901,0.7418646801456215,0.4846357856901046,0.5777681529947757,0.7596854921540671,1.5559295959968287,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,2.317275285720825
+210302,1,0.14421538675261625,0.6176448108086341,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.2844321727752686
+210302,2,1.1013221364437225,0.7500968597077102,0.368093032089145,,,,,,,,,,,,,2.2844321727752686
+210303,0,0.4168578054263319,-0.1952625786238314,-0.3413299128685955,-0.37905084107887943,0.6470499178582901,0.7418646801456215,0.4846357856901046,0.5777681529947757,0.7596854921540671,1.5559295959968287,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,2.2844321727752686
+210303,1,0.7209399120179469,0.6176448108086341,0.24821562598564237,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,2.235513687133789
+210303,2,0.41257502093087217,-0.10626094735465771,-0.6219348111021723,,,,,,,,,,,,,2.235513687133789
+210304,0,-0.03493941435979663,-0.8856113341279945,-0.7116979467082238,-0.37905084107887943,0.6470499178582901,0.7418646801456215,0.4846357856901046,0.5777681529947757,0.7596854921540671,1.5559295959968287,0.6182048363947807,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.4645232862317478,2.3318495750427246
+210304,1,-0.4325091385127145,-0.09505646980369299,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.3457021713256836
+210304,2,0.2157901307843435,-0.2619623668205428,-0.08191962390690835,,,,,,,,,,,,,2.3457021713256836
+210502,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,0.06338537359139342,-0.35869558526336154,0.457405498335207,-0.06274970256151263,-2.0135763494230243,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.8747963905334473
+210502,1,-1.585958189043376,-1.520459031028347,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.6077970266342163
+210502,2,-0.9649192100948284,-1.585424432280566,-1.791967716691911,,,,,,,,,,,,,1.6077970266342163
+210503,0,1.0945536351055247,-1.000669460045355,-0.8351539579881,0.06338537359139342,-0.35869558526336154,0.457405498335207,-0.06274970256151263,-2.0135763494230243,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.9138813018798828
+210503,1,-1.1053544179889336,-1.0750207306456427,-1.1815354958941209,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.8166335821151733
+210503,2,-0.37456453965524245,-1.2740215933487957,-0.35192721750454037,,,,,,,,,,,,,1.8166335821151733
+211203,0,0.8686550252124604,1.4155511842192159,1.2635982337697944,1.0957365411553635,1.401359045199529,1.026323861956036,1.3057140180675306,1.361197886283878,1.0889020930782853,-0.23730908679360116,-0.5613165400266386,1.1284125825510003,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.1502699851989746
+211203,1,1.4899059457050545,0.3503818305790114,2.494967388939556,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.19112267045651915,2.5552432537078857
+211203,2,0.8061448012239295,0.7500968597077102,0.7281031568859877,,,,,,,,,,,,,2.5552432537078857
+211903,0,-0.37378732919939306,-0.770553208210634,-0.7116979467082238,1.390694017602212,0.5213317299680837,1.026323861956036,0.7583285298159133,0.9996149324581385,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.745882511138916
+211903,1,0.048094632541727786,-0.80775775041602,-0.16028469455143282,,,,,,,,,,-1.9017700713146695,0.7456311526478686,0.4419600012801827,1.9377866983413696
+211903,2,-0.7681343199482997,-0.729066625218198,-0.8919424046998043,,,,,,,,,,,,,1.9377866983413696
+211904,0,0.9816043301589925,-0.770553208210634,-0.8351539579881,1.390694017602212,0.5213317299680837,1.026323861956036,0.7583285298159133,0.9996149324581385,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-1.3918785079011935,1.267782866548965,0.806708965813594,0.20460009219036931,1.9377866983413696
+211904,1,-0.6247506469344914,-1.431371370951806,0.35034070611991114,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.310551991190808,2.0661697387695312
+211904,2,-0.7681343199482997,-0.8847680446840831,-0.8919424046998043,,,,,,,,,,,,,2.0661697387695312
+212301,0,1.207502940052057,-0.5404369563759129,0.2759501435307853,0.2108641118148177,0.5213317299680837,0.7418646801456215,0.3021739562728989,0.6380319786323989,0.595077191691958,-0.835055314390411,-0.16814274788616518,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.8737234706124865,1.8401150703430176
+212301,1,-0.4325091385127145,-0.3623194500333156,0.8609661067912552,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,1.817098617553711
+212301,2,-0.07938720443544948,-0.33981307655348536,-2.5119879662855964,,,,,,,,,,,,,1.817098617553711
+212401,0,1.0945536351055247,0.4950861768803317,0.029038120971032973,0.6533003264850905,0.6470499178582901,1.026323861956036,0.11971212685569313,0.035393722256166354,1.0889020930782853,-0.835055314390411,0.22503104425430823,1.9685096127017316,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,2.4590423107147217
+212401,1,0.4325776493852816,0.17220651042592966,-0.568785015088508,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,2.576079845428467
+212401,2,0.31418257585760784,0.7500968597077102,0.18808796969072364,,,,,,,,,,,,,2.576079845428467
+212502,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,0.06338537359139342,1.0242044815289095,0.17294631652479245,1.3057140180675306,0.09565754789378961,-0.7217892120049145,0.36043714080320877,-0.9544903321671111,-1.8119270229765592,-1.812216028287741,-1.388853942113607,-0.24148216009104212,1.311554193496704
+212502,1,0.2403361409635047,0.7067324708851749,-0.568785015088508,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.008375883102417
+212502,2,0.41257502093087217,0.1272911818441699,-0.8919424046998043,,,,,,,,,,,,,1.008375883102417
+212601,0,2.44994529446391,0.7252024287150527,2.004334301449051,1.2432152793787876,0.6470499178582901,0.7418646801456215,1.4881758474847362,1.602253188834371,0.595077191691958,-0.23730908679360116,1.4045524206757267,1.9685096127017316,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.6705849170684814
+212601,1,1.0093021746506123,0.7067324708851749,1.4737165875968679,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,1.620093584060669
+212601,2,0.019005240637814846,0.9057982791735953,0.5480980944875663,,,,,,,,,,,,,1.620093584060669
+212801,0,0.6427564153193962,0.14991179912825014,-0.2178739015887193,-1.4114020086428494,-1.2387229004948068,-0.1115128652856221,-0.7013661055217327,0.035393722256166354,-1.2156141133912417,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-1.388853942113607,1.319805722893898,0.5803626775741577
+212801,1,-0.8169921553562683,-0.3623194500333156,-0.6709100952227768,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.310551991190808,0.7051945924758911
+212801,2,0.019005240637814846,0.20514189157711243,0.008082907292302316,,,,,,,,,,,,,0.7051945924758911
+213402,0,0.07800989058673549,-0.6554950822932735,-0.7116979467082238,-0.8214870557491524,-1.7415956520556326,-0.9648904107168657,-2.069829826150776,-2.194367826335894,-1.2156141133912417,-0.835055314390411,1.4045524206757267,0.28831555240026907,1.267782866548965,-1.388853942113607,-0.4645232862317478,1.4532784223556519
+213402,1,-0.14414687588004912,-1.2531960507987243,-0.8751602554913144,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,0.9142302870750427
+213402,2,-0.27617209458197817,-1.5075737225476233,-0.441929748703751,,,,,,,,,,,,,0.9142302870750427
+213702,0,-1.0514831588785858,0.4950861768803317,0.15249413225090913,-0.5265295793023037,0.1441771662974643,1.026323861956036,0.210943041564296,0.2161851991690361,0.9242937926161762,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,1.267782866548965,0.806708965813594,-0.24148216009104212,2.113461971282959
+213702,1,0.52869840359617,0.4394694906555523,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,2.2875821590423584
+213702,2,-0.27617209458197817,0.20514189157711243,0.908108219284409,,,,,,,,,,,,,2.2875821590423584
+213901,0,-0.03493941435979663,0.7252024287150527,0.2759501435307853,1.2432152793787876,0.8984862936387031,1.026323861956036,0.028481212147090252,0.6380319786323989,1.5827269944646125,1.5559295959968287,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.9106055385131593,2.497934341430664
+213901,1,1.0093021746506123,0.3503818305790114,0.14609054585137357,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,2.995732307434082
+213901,2,0.5109674660041365,0.6722461499747677,0.2780905008899343,,,,,,,,,,,,,2.995732307434082
+215302,0,0.529807110372864,0.8402605546324132,1.2635982337697944,0.2108641118148177,0.018458978407257843,-0.1115128652856221,0.3021739562728989,0.3969766760819059,0.10125229030563083,0.9581833684000187,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.2121824026107788
+215302,1,1.0093021746506123,0.7067324708851749,1.2694664273283303,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.4358454942703247
+215302,2,0.41257502093087217,0.8279475694406527,1.3581208752804623,,,,,,,,,,,,,1.4358454942703247
+215303,0,0.9816043301589925,1.875783687888658,0.3994061548106614,0.2108641118148177,0.018458978407257843,-0.1115128652856221,0.3021739562728989,0.3969766760819059,0.10125229030563083,0.9581833684000187,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.2121824026107788
+215303,1,1.2976644372832777,1.419433751497502,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.4358454942703247
+215303,2,0.11739768571107917,1.1393504083724229,0.18808796969072364,,,,,,,,,,,,,1.4358454942703247
+215501,0,-0.5996859390924573,-0.8856113341279945,-0.3413299128685955,0.06338537359139342,1.401359045199529,1.026323861956036,-0.518904276104527,-0.024870103381456905,0.7596854921540671,1.5559295959968287,0.22503104425430823,-0.13173296267509654,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.9676480293273926
+215501,1,-1.393716680621599,-1.1641083907221836,-0.568785015088508,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,2.995732307434082
+215501,2,-0.5713494298017712,-1.1183201738829107,-1.521960123094279,,,,,,,,,,,,,2.995732307434082
+215802,0,0.19095919553326762,-0.08020445270647089,0.029038120971032973,0.6533003264850905,1.2756408573093225,1.026323861956036,-0.06274970256151263,0.5777681529947757,0.10125229030563083,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.4645232862317478,1.9563919305801392
+215802,1,0.14421538675261625,0.6176448108086341,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.747433066368103
+215802,2,0.11739768571107917,0.5165447305088826,0.09808543849151298,,,,,,,,,,,,,1.747433066368103
+216401,0,1.320452244998589,0.8402605546324132,-0.3413299128685955,-0.37905084107887943,0.7727681057484966,1.026323861956036,-0.1539806172701155,0.7585596299076455,-0.06335601015647824,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.9143301248550415
+216401,1,0.6248191578070585,0.4394694906555523,0.35034070611991114,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.5613893220144716,2.371264696121216
+216401,2,1.1997145815169867,0.282992601310055,0.368093032089145,,,,,,,,,,,,,2.371264696121216
+216701,0,-0.37378732919939306,-0.770553208210634,-0.5882419354283478,-0.23157210285545515,-0.35869558526336154,0.17294631652479245,0.7583285298159133,1.4817255375591245,0.10125229030563083,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,1.6107815504074097
+216701,1,0.8170606662288354,-0.18414412988023388,0.7588410266569864,,,,,,,,,,1.663413533782179,-1.3914893931436731,1.1944719937511734,1.8091163635253906
+216701,2,0.5109674660041365,-0.028410237621715174,0.09808543849151298,,,,,,,,,,,,,1.8091163635253906
+219003,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.018458978407257843,0.457405498335207,0.940790359233119,1.4817255375591245,-1.2156141133912417,1.5559295959968287,0.6182048363947807,-0.13173296267509654,1.267782866548965,1.9044904197771946,1.9889291013160153,1.9998550415039062
+219003,1,-0.7208714011453798,-0.09505646980369299,-0.7730351753570456,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.98921799659729
+219003,2,0.6093599110774008,0.8279475694406527,1.178115812882041,,,,,,,,,,,,,1.98921799659729
+220301,0,0.529807110372864,0.3800280509629712,0.15249413225090913,0.2108641118148177,0.018458978407257843,-1.2493495925272802,0.4846357856901046,-0.024870103381456905,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.9106055385131593,1.2697359323501587
+220301,1,1.970509716759497,0.5285571507320932,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,1.463937520980835
+220301,2,1.1997145815169867,-0.2619623668205428,0.5480980944875663,,,,,,,,,,,,,1.463937520980835
+220402,0,-1.0514831588785858,-0.3103207045411919,0.029038120971032973,1.2432152793787876,0.7727681057484966,0.457405498335207,-0.06274970256151263,-0.024870103381456905,0.10125229030563083,1.5559295959968287,1.0113786285352542,-1.8119270229765592,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.90995192527771
+220402,1,-0.14414687588004912,-0.4514071101098565,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,2.2336788177490234
+220402,2,-0.7681343199482997,0.282992601310055,-0.441929748703751,,,,,,,,,,,,,2.2336788177490234
+221401,0,-0.37378732919939306,-0.42537883045855246,-0.8351539579881,-0.674008317525728,-0.10725920948294862,0.457405498335207,1.2144831033589276,-0.20566158029432668,-0.7217892120049145,0.36043714080320877,0.22503104425430823,-2.2319755380519246,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.6755558252334595
+221401,1,-0.4325091385127145,-0.09505646980369299,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,1.9282851219177246
+221401,2,-0.6697418748750354,0.36084331104299755,0.18808796969072364,,,,,,,,,,,,,1.9282851219177246
+221402,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.10725920948294862,0.457405498335207,1.2144831033589276,-0.20566158029432668,-0.7217892120049145,0.36043714080320877,0.22503104425430823,-2.2319755380519246,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.1510770320892334
+221402,1,-1.393716680621599,-1.431371370951806,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,2.2393290996551514
+221402,2,-0.37456453965524245,-1.1961708836158533,-0.7119373423013831,,,,,,,,,,,,,2.2393290996551514
+221702,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,0.6533003264850905,0.39561354207787724,0.457405498335207,0.210943041564296,1.2406702350086316,0.430468891229849,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.0973960161209106
+221702,1,-0.6247506469344914,-1.609546691104888,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,1.0036698579788208
+221702,2,-0.6697418748750354,-1.6632751420135086,-0.441929748703751,,,,,,,,,,,,,1.0036698579788208
+223701,0,0.3039085004797998,0.3800280509629712,-0.2178739015887193,1.6856514940490606,1.0242044815289095,1.3107830437664505,0.3934048709815018,1.9035723170224874,1.5827269944646125,-0.835055314390411,-0.9544903321671111,1.9685096127017316,1.267782866548965,0.806708965813594,1.7658879751753094,2.1875836849212646
+223701,1,0.9131814204397238,0.7958201309617158,1.2694664273283303,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.3642489910125732
+223701,2,0.8061448012239295,2.307111054366561,0.908108219284409,,,,,,,,,,,,,2.3642489910125732
+223702,0,0.6427564153193962,1.3004930583018552,2.1277903127289273,1.6856514940490606,1.0242044815289095,1.3107830437664505,0.3934048709815018,1.9035723170224874,1.5827269944646125,-0.835055314390411,-0.9544903321671111,1.9685096127017316,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.3642489910125732
+223702,1,0.4325776493852816,2.4884856724159925,2.1885921485367494,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.310551991190808,2.375584602355957
+223702,2,1.593284361810044,1.606454666770078,2.3481487184717795,,,,,,,,,,,,,2.375584602355957
+223703,0,0.4168578054263319,2.6811905693101816,2.621614357848432,1.6856514940490606,1.0242044815289095,1.3107830437664505,0.3934048709815018,1.9035723170224874,1.5827269944646125,-0.835055314390411,-0.9544903321671111,1.9685096127017316,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.274500846862793
+223703,1,0.8170606662288354,1.2412584313444202,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,2.3008182048797607
+223703,2,-0.07938720443544948,0.7500968597077102,0.5480980944875663,,,,,,,,,,,,,2.3008182048797607
+224901,0,0.19095919553326762,-0.08020445270647089,-0.2178739015887193,-1.4114020086428494,-1.615877464165426,-1.5338087743376947,0.11971212685569313,-0.3261892315695732,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,3.104134732019544,2.0023252964019775
+224901,1,-0.528629892723603,-0.00596880972715211,-0.16028469455143282,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.0037927627563477
+224901,2,-0.07938720443544948,-1.1183201738829107,-0.8019398735005937,,,,,,,,,,,,,2.0037927627563477
+225401,0,-1.9550775984508428,-1.460901963714797,-1.3289780031076046,-1.5588807468662738,-0.9872865247143939,-2.102727137958524,-1.4312134231905558,-0.4467168828448197,-1.0510058129291326,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,-0.6875644123724536,0.9632202386856079
+225401,1,-2.258803468519595,-1.8768096713345106,-1.6921608965654649,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.0630639836617988,0.6160309314727783
+225401,2,-2.5391983312670576,-2.0525286906782214,-1.8819702478911218,,,,,,,,,,,,,0.6160309314727783
+225701,0,0.19095919553326762,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.7358501489339809,-0.3959720470960366,-0.61013519081313,-2.073840175060648,-0.06335601015647824,1.5559295959968287,0.22503104425430823,0.28831555240026907,0.49778314283978853,1.9044904197771946,3.104134732019544,-0.15356546640396118
+225701,1,0.9131814204397238,-0.9859330705691017,-0.46665993495423924,,,,,,,,,,0.2373400917434395,1.8141914255436393,1.1944719937511734,-0.1325078010559082
+225701,2,0.8061448012239295,-0.4955144960193704,-0.17192215510611902,,,,,,,,,,,,,-0.1325078010559082
+226002,0,0.19095919553326762,0.7252024287150527,0.3994061548106614,-0.9689657939725767,-0.8615683368241874,-0.1115128652856221,-0.518904276104527,-0.5069807084824429,-1.0510058129291326,0.36043714080320877,0.6182048363947807,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.5481950044631958
+226002,1,0.33645689517439314,0.5285571507320932,0.6567159465227176,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.4967477321624756
+226002,2,-0.4729569847285068,0.04944047211122737,0.2780905008899343,,,,,,,,,,,,,1.4967477321624756
+226502,0,-1.8421282935043108,-0.770553208210634,-0.8351539579881,-0.8214870557491524,-0.2329773973731551,-0.9648904107168657,-0.1539806172701155,-0.6275083597576895,-0.7217892120049145,0.9581833684000187,1.7977262128162,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,0.20776191353797913
+226502,1,-1.393716680621599,-0.7186700903394792,-1.079410415759852,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.3139013144854623,0.12469127029180527
+226502,2,-0.7681343199482997,-0.573365205752313,-0.5319322799029617,,,,,,,,,,,,,0.12469127029180527
+226705,0,-1.164432463825118,-1.3458438377974367,-1.2055219918277285,-1.2639232704194252,-1.2387229004948068,-1.8182679561481092,-1.5224443378991586,-2.2546316519735177,-1.3802224138533508,-2.628293997180841,0.6182048363947807,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,0.8737234706124865,0.4794849455356598
+226705,1,-1.393716680621599,-1.0750207306456427,-1.8964110568340025,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.19112267045651915,0.6314120292663574
+226705,2,-0.7681343199482997,-1.9746779809452786,-1.251952529496647,,,,,,,,,,,,,0.6314120292663574
+226706,0,-0.5996859390924573,-0.1952625786238314,-0.8351539579881,-1.2639232704194252,-1.2387229004948068,-1.8182679561481092,-1.5224443378991586,-2.2546316519735177,-1.3802224138533508,-2.628293997180841,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-1.388853942113607,0.20460009219036931,0.6314120292663574
+226706,1,0.048094632541727786,-0.00596880972715211,0.24821562598564237,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-1.3139013144854623,-0.1256033331155777
+226706,2,-0.07938720443544948,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,-0.1256033331155777
+226707,0,-0.37378732919939306,-0.42537883045855246,0.15249413225090913,-1.2639232704194252,-1.2387229004948068,-1.8182679561481092,-1.5224443378991586,-2.2546316519735177,-1.3802224138533508,-2.628293997180841,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-1.3566877907945707,0.3013274669647217
+226707,1,0.8170606662288354,-0.3623194500333156,-0.9772853356255832,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,0.012707451358437538
+226707,2,-1.2600965453146213,-0.028410237621715174,-1.6119626542934897,,,,,,,,,,,,,0.012707451358437538
+227101,0,-0.48673663414592516,-0.770553208210634,-0.09441789030884316,-1.1164445321960008,-0.8615683368241874,0.457405498335207,-0.7013661055217327,-0.38645305720719647,-1.0510058129291326,0.36043714080320877,0.22503104425430823,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.24148216009104212,-0.6931471824645996
+227101,1,-2.258803468519595,-1.2531960507987243,-1.590035816431196,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,-0.6931471824645996
+227101,2,-0.5713494298017712,-0.4955144960193704,-1.6119626542934897,,,,,,,,,,,,,-0.6931471824645996
+227102,0,-0.14788871930632877,-2.0361925933015996,-1.9462580595069854,-1.1164445321960008,-0.8615683368241874,0.457405498335207,-0.7013661055217327,-0.38645305720719647,-1.0510058129291326,0.36043714080320877,0.22503104425430823,-0.5517814777504622,1.267782866548965,-0.2910724881500066,-0.24148216009104212,-0.6931471824645996
+227102,1,0.52869840359617,-0.3623194500333156,0.963091186925524,,,,,,,,,,1.663413533782179,0.7456311526478686,0.19112267045651915,1.45352041721344
+227102,2,-0.4729569847285068,-0.6512159154852555,-0.17192215510611902,,,,,,,,,,,,,1.45352041721344
+227802,0,1.207502940052057,0.4950861768803317,0.029038120971032973,2.1280877087193333,0.7727681057484966,0.457405498335207,0.5758667003987075,0.8790872811828919,2.07655189585094,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.2269363403320312
+227802,1,1.1054229288615007,0.9739954511147976,0.8609661067912552,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.3035826683044434
+227802,2,1.298107026590251,0.6722461499747677,-0.17192215510611902,,,,,,,,,,,,,2.3035826683044434
+228502,0,-0.48673663414592516,-0.6554950822932735,-0.7116979467082238,1.390694017602212,1.149922669419116,1.026323861956036,1.3969449327761334,1.3009340606462547,0.7596854921540671,0.36043714080320877,1.4045524206757267,1.9685096127017316,0.49778314283978853,0.806708965813594,0.8737234706124865,2.8056232929229736
+228502,1,-1.2975959264107106,0.08311885034938876,0.14609054585137357,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.3390393257141113
+228502,2,-0.37456453965524245,0.9057982791735953,0.008082907292302316,,,,,,,,,,,,,2.3390393257141113
+229601,0,1.9981480746777818,0.6101443027976923,0.6463181773704137,-0.8214870557491524,-0.6101319610437744,0.457405498335207,-0.7013661055217327,-0.8685636623081825,-0.8863975124670236,-0.23730908679360116,-0.9544903321671111,-0.9718299928258278,1.267782866548965,0.806708965813594,0.20460009219036931,2.7691972255706787
+229601,1,1.970509716759497,0.08311885034938876,0.5545908663884488,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.995732307434082
+229601,2,2.478816367469423,-0.41766378628642786,0.18808796969072364,,,,,,,,,,,,,2.995732307434082
+230101,0,0.07800989058673549,0.8402605546324132,2.004334301449051,1.390694017602212,1.0242044815289095,1.026323861956036,1.3969449327761334,1.361197886283878,1.9119435953888306,0.9581833684000187,-0.5613165400266386,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.4346892833709717
+230101,1,1.0093021746506123,0.5285571507320932,0.6567159465227176,,,,,,,,,,-0.47569662927593015,1.8141914255436393,1.1944719937511734,2.665797710418701
+230101,2,0.2157901307843435,0.04944047211122737,1.448123406479673,,,,,,,,,,,,,2.665797710418701
+230102,0,-0.2608380242528609,-0.3103207045411919,-0.3413299128685955,1.390694017602212,1.0242044815289095,1.026323861956036,1.3969449327761334,1.361197886283878,1.9119435953888306,0.9581833684000187,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,1.9044904197771946,0.8737234706124865,2.665797710418701
+230102,1,0.2403361409635047,-0.7186700903394792,-0.05815961441716403,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.415329694747925
+230102,2,1.0029296913704582,-0.41766378628642786,0.008082907292302316,,,,,,,,,,,,,2.415329694747925
+232201,0,0.8686550252124604,2.3360161915581,1.6339662676094229,0.6533003264850905,0.5213317299680837,1.3107830437664505,1.3057140180675306,0.035393722256166354,-0.06335601015647824,0.9581833684000187,1.7977262128162,1.1284125825510003,-2.5822157519969178,-0.2910724881500066,0.8737234706124865,2.390430450439453
+232201,1,1.1054229288615007,0.7958201309617158,1.371591507462599,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.2659099102020264
+232201,2,0.8061448012239295,0.5165447305088826,0.8181056880851983,,,,,,,,,,,,,2.2659099102020264
+233301,0,-0.48673663414592516,-0.3103207045411919,0.15249413225090913,0.2108641118148177,0.5213317299680837,1.026323861956036,0.3934048709815018,0.6982958042700221,0.2658605907677399,-0.835055314390411,0.6182048363947807,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.2816061973571777
+233301,1,0.14421538675261625,-0.09505646980369299,-0.8751602554913144,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,2.4504997730255127
+233301,2,-2.1456285509740005,-0.33981307655348536,-0.5319322799029617,,,,,,,,,,,,,2.4504997730255127
+235901,0,-0.7126352440389895,-0.42537883045855246,-0.4647859241484716,-1.5588807468662738,-0.10725920948294862,-1.8182679561481092,0.5758667003987075,-0.3261892315695732,-0.8863975124670236,-1.432801541987221,0.22503104425430823,0.7083640674756347,-0.27221658086938805,0.806708965813594,-0.6875644123724536,1.6407814025878906
+235901,1,-0.7208714011453798,-0.09505646980369299,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.3976569175720215
+235901,2,-0.5713494298017712,0.1272911818441699,0.18808796969072364,,,,,,,,,,,,,1.3976569175720215
+235903,0,-0.8255845489855216,-0.3103207045411919,-0.4647859241484716,-1.5588807468662738,-0.10725920948294862,-1.8182679561481092,0.5758667003987075,-0.3261892315695732,-0.8863975124670236,-1.432801541987221,0.22503104425430823,0.7083640674756347,-0.27221658086938805,0.806708965813594,3.104134732019544,2.0522682666778564
+235903,1,-2.0665619600978182,-0.9859330705691017,-0.6709100952227768,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.059714660367144415,-0.28334322571754456
+235903,2,-0.27617209458197817,-1.1961708836158533,-0.35192721750454037,,,,,,,,,,,,,-0.28334322571754456
+236002,0,1.320452244998589,-1.1157275859627156,-0.9586099692679761,-0.37905084107887943,-0.10725920948294862,0.7418646801456215,1.3057140180675306,0.09565754789378961,0.10125229030563083,1.5559295959968287,1.4045524206757267,1.548461097626366,-1.0422163045785646,0.806708965813594,0.6506823444717807,0.33895906805992126
+236002,1,-0.24026763009093757,-1.520459031028347,-1.8964110568340025,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,1.5765001773834229
+236002,2,-0.6697418748750354,-1.429723012814681,-1.4319575918950684,,,,,,,,,,,,,1.5765001773834229
+236203,0,-0.14788871930632877,-0.770553208210634,-0.7116979467082238,-0.9689657939725767,-0.6101319610437744,0.17294631652479245,1.3969449327761334,1.2406702350086316,-0.5571809115428055,0.9581833684000187,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.9458051919937134
+236203,1,0.52869840359617,-1.1641083907221836,-0.568785015088508,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.0908249616622925
+236203,2,0.019005240637814846,-0.4955144960193704,-0.6219348111021723,,,,,,,,,,,,,1.0908249616622925
+236901,0,0.07800989058673549,-1.000669460045355,-0.8351539579881,0.8007790647085149,1.2756408573093225,0.17294631652479245,-0.2452115319787184,0.2161851991690361,0.2658605907677399,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.136242389678955
+236901,1,0.4325776493852816,0.08311885034938876,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.279343366622925
+236901,2,0.9045372462971938,-0.41766378628642786,0.7281031568859877,,,,,,,,,,,,,2.279343366622925
+238301,0,-0.9385338539320537,0.03485367321088963,-0.5882419354283478,0.8007790647085149,-0.6101319610437744,-0.1115128652856221,1.2144831033589276,-0.08513392901908017,0.10125229030563083,-0.835055314390411,0.22503104425430823,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.3579683303833008
+238301,1,0.14421538675261625,0.17220651042592966,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.183586597442627
+238301,2,-0.7681343199482997,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,1.183586597442627
+239401,0,-0.03493941435979663,0.2649699250456107,0.6463181773704137,1.390694017602212,1.2756408573093225,1.3107830437664505,1.4881758474847362,2.265155270848227,-0.8863975124670236,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-1.388853942113607,0.8737234706124865,2.130058765411377
+239401,1,0.4325776493852816,1.0630831111913384,1.0652162670597927,,,,,,,,,,-1.1887333502953,-0.3229291202479022,2.4486586478694914,2.0262656211853027
+239401,2,0.019005240637814846,1.995708215434791,0.638100625686777,,,,,,,,,,,,,2.0262656211853027
+240001,0,-0.5996859390924573,-0.3103207045411919,-0.3413299128685955,1.0957365411553635,1.149922669419116,1.026323861956036,-0.518904276104527,-0.14539775465670343,1.0889020930782853,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.094225287437439
+240001,1,0.33645689517439314,0.08311885034938876,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.2762281894683838
+240001,2,0.2157901307843435,0.5165447305088826,-0.08191962390690835,,,,,,,,,,,,,1.2762281894683838
+240202,0,1.8851987697312496,0.9553186805497738,0.3994061548106614,0.5058215882616662,1.0242044815289095,0.7418646801456215,-0.1539806172701155,0.2161851991690361,-0.06335601015647824,-0.23730908679360116,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-0.4645232862317478,2.302612543106079
+240202,1,0.4325776493852816,0.7958201309617158,0.24821562598564237,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,1.7916042804718018
+240202,2,1.6916768068833083,0.5165447305088826,1.8981360624757264,,,,,,,,,,,,,1.7916042804718018
+241002,0,-0.03493941435979663,-0.42537883045855246,-0.7116979467082238,-0.23157210285545515,-0.35869558526336154,0.7418646801456215,-0.61013519081313,-1.651993395597285,-0.5571809115428055,-0.23730908679360116,0.22503104425430823,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,2.7916319370269775
+241002,1,-0.04802612166916067,-1.2531960507987243,-0.05815961441716403,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,2.777738332748413
+241002,2,0.2157901307843435,-0.8069173349511406,0.008082907292302316,,,,,,,,,,,,,2.777738332748413
+241203,0,-0.14788871930632877,0.14991179912825014,0.5228621660905376,-0.23157210285545515,-1.2387229004948068,-0.1115128652856221,-0.518904276104527,-0.08513392901908017,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,2.2376391887664795
+241203,1,-0.9131129095671567,0.6176448108086341,-0.05815961441716403,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.763675332069397
+241203,2,-0.4729569847285068,0.282992601310055,0.09808543849151298,,,,,,,,,,,,,1.763675332069397
+241801,0,-1.27738176877165,-0.5404369563759129,-0.7116979467082238,0.06338537359139342,0.1441771662974643,0.7418646801456215,0.210943041564296,1.4214617119215014,-1.0510058129291326,0.9581833684000187,0.22503104425430823,-0.13173296267509654,1.267782866548965,-1.388853942113607,-0.4645232862317478,2.0918450355529785
+241801,1,-0.04802612166916067,-0.6295824302629383,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,2.046003818511963
+241801,2,-0.4729569847285068,-0.573365205752313,0.008082907292302316,,,,,,,,,,,,,2.046003818511963
+243601,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,0.358342850038242,-0.7358501489339809,0.7418646801456215,0.3021739562728989,0.3367128504442826,-0.22796431061858732,0.9581833684000187,1.0113786285352542,0.7083640674756347,1.267782866548965,0.806708965813594,0.8737234706124865,1.6203197240829468
+243601,1,-2.1626827143087066,-1.8768096713345106,-1.8964110568340025,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,1.616662859916687
+243601,2,-0.6697418748750354,-1.5075737225476233,-0.981944935899015,,,,,,,,,,,,,1.616662859916687
+243701,0,0.9816043301589925,0.3800280509629712,-0.09441789030884316,1.2432152793787876,0.39561354207787724,1.3107830437664505,0.5758667003987075,1.4214617119215014,1.4181186940025035,1.5559295959968287,1.0113786285352542,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.4766807556152344
+243701,1,1.6821474541268315,-0.2732317899567748,-1.079410415759852,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.784501791000366
+243701,2,0.019005240637814846,-0.028410237621715174,-0.26192468630532967,,,,,,,,,,,,,2.784501791000366
+244201,0,-0.37378732919939306,-0.8856113341279945,-0.8351539579881,0.5058215882616662,0.8984862936387031,0.457405498335207,-0.06274970256151263,0.7585596299076455,0.10125229030563083,1.5559295959968287,1.4045524206757267,1.1284125825510003,1.267782866548965,1.9044904197771946,-0.24148216009104212,2.6384437084198
+244201,1,0.14421538675261625,-0.2732317899567748,0.04396546571710477,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,2.995732307434082
+244201,2,-0.27617209458197817,0.20514189157711243,0.2780905008899343,,,,,,,,,,,,,2.995732307434082
+244703,0,-0.03493941435979663,-0.770553208210634,-0.8351539579881,0.06338537359139342,1.149922669419116,0.17294631652479245,0.210943041564296,0.2764490248066594,0.2658605907677399,0.9581833684000187,0.22503104425430823,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.2138744592666626
+244703,1,-1.1053544179889336,-1.431371370951806,-1.1815354958941209,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,1.353195071220398
+244703,2,-0.6697418748750354,-0.9626187544170256,-0.441929748703751,,,,,,,,,,,,,1.353195071220398
+246201,0,0.19095919553326762,-0.42537883045855246,0.029038120971032973,-0.8214870557491524,0.018458978407257843,0.457405498335207,0.5758667003987075,0.8790872811828919,-0.22796431061858732,0.36043714080320877,-1.740837916448057,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.018441033950336395,0.8798626065254211
+246201,1,0.048094632541727786,-0.18414412988023388,0.35034070611991114,,,,,,,,,,0.9503768127628092,0.7456311526478686,3.7028453019878094,0.9608949422836304
+246201,2,-0.5713494298017712,-0.18411165708760024,-0.17192215510611902,,,,,,,,,,,,,0.9608949422836304
+247101,0,-1.9550775984508428,-1.3458438377974367,-1.2055219918277285,-1.5588807468662738,-1.2387229004948068,-0.3959720470960366,0.11971212685569313,0.09565754789378961,0.2658605907677399,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,1.267782866548965,1.9044904197771946,-0.6875644123724536,1.0670093297958374
+247101,1,0.4325776493852816,-1.1641083907221836,-1.079410415759852,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,0.9760961532592773
+247101,2,-0.37456453965524245,-1.3518723030817383,-1.4319575918950684,,,,,,,,,,,,,0.9760961532592773
+247402,0,-0.5996859390924573,1.7607255619712974,0.7697741886502898,2.1280877087193333,1.149922669419116,0.7418646801456215,0.3021739562728989,-0.9288274879458058,1.4181186940025035,1.5559295959968287,1.4045524206757267,1.9685096127017316,0.49778314283978853,0.806708965813594,1.9889291013160153,1.69688081741333
+247402,1,0.14421538675261625,0.7958201309617158,1.1673413471940615,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.1044304370880127
+247402,2,-0.27617209458197817,1.3729025375712505,2.0781411248741475,,,,,,,,,,,,,2.1044304370880127
+248002,0,0.07800989058673549,0.14991179912825014,0.2759501435307853,-0.37905084107887943,0.8984862936387031,1.026323861956036,0.11971212685569313,-0.5672445341200663,0.9242937926161762,-1.432801541987221,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,0.806708965813594,0.8737234706124865,1.573009729385376
+248002,1,0.4325776493852816,0.08311885034938876,0.35034070611991114,,,,,,,,,,-1.1887333502953,1.8141914255436393,0.4419600012801827,1.2695088386535645
+248002,2,0.31418257585760784,-0.18411165708760024,-0.26192468630532967,,,,,,,,,,,,,1.2695088386535645
+248301,0,-0.5996859390924573,-0.770553208210634,-0.8351539579881,-1.1164445321960008,0.5213317299680837,-0.9648904107168657,0.6670976151073104,0.035393722256166354,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.1288968324661255
+248301,1,-0.4325091385127145,-0.80775775041602,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.4044883251190186
+248301,2,-0.4729569847285068,-0.2619623668205428,0.45809556328835566,,,,,,,,,,,,,1.4044883251190186
+248403,0,0.19095919553326762,-0.1952625786238314,-0.4647859241484716,-0.08409336463203088,0.39561354207787724,0.7418646801456215,1.3057140180675306,1.2406702350086316,0.2658605907677399,-0.835055314390411,-1.3476641243075844,0.28831555240026907,0.49778314283978853,0.806708965813594,0.20460009219036931,1.8654093742370605
+248403,1,1.1054229288615007,0.3503818305790114,1.1673413471940615,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,1.1944719937511734,2.268345832824707
+248403,2,0.31418257585760784,0.5943954402418251,0.368093032089145,,,,,,,,,,,,,2.268345832824707
+248501,0,-0.03493941435979663,1.9908418138060184,0.029038120971032973,-0.08409336463203088,0.018458978407257843,-1.8182679561481092,0.028481212147090252,0.15592137353141286,-1.0510058129291326,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,1.267782866548965,0.806708965813594,-0.24148216009104212,1.5715423822402954
+248501,1,0.7209399120179469,1.330346091420961,0.6567159465227176,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.19112267045651915,1.7891356945037842
+248501,2,0.31418257585760784,1.995708215434791,0.8181056880851983,,,,,,,,,,,,,1.7891356945037842
+249204,0,-0.2608380242528609,-0.8856113341279945,1.3870542450496706,-0.5265295793023037,-0.10725920948294862,-0.1115128652856221,-0.06274970256151263,-0.5069807084824429,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,-1.3918785079011935,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.5213608741760254
+249204,1,-0.4325091385127145,-0.6295824302629383,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.781624436378479
+249204,2,-0.5713494298017712,-0.729066625218198,-0.17192215510611902,,,,,,,,,,,,,1.781624436378479
+249205,0,-0.8255845489855216,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,-0.10725920948294862,-0.1115128652856221,-0.06274970256151263,-0.5069807084824429,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.8294824361801147
+249205,1,0.8170606662288354,-0.4514071101098565,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,1.9003468751907349
+249205,2,-0.07938720443544948,-0.41766378628642786,-0.5319322799029617,,,,,,,,,,,,,1.9003468751907349
+250101,0,-0.03493941435979663,-0.3103207045411919,0.15249413225090913,-0.23157210285545515,0.6470499178582901,-0.6804312289064511,0.8495594445245161,0.035393722256166354,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,0.7083640674756347,1.267782866548965,-1.388853942113607,0.6506823444717807,0.27013063430786133
+250101,1,0.14421538675261625,0.2612941705024705,0.6567159465227176,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.6927973321038463,0.20322546362876892
+250101,2,0.2157901307843435,1.2172011181053655,0.9981107504836196,,,,,,,,,,,,,0.20322546362876892
+250502,0,0.7557057202659283,-0.6554950822932735,-0.4647859241484716,0.5058215882616662,1.149922669419116,1.026323861956036,-0.06274970256151263,1.120142583733385,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,0.8737234706124865,0.9017882943153381
+250502,1,0.2403361409635047,-1.431371370951806,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,0.5118231773376465
+250502,2,0.11739768571107917,-0.6512159154852555,-0.35192721750454037,,,,,,,,,,,,,0.5118231773376465
+251401,0,0.9816043301589925,-1.3458438377974367,-1.2055219918277285,1.833130232272485,0.7727681057484966,0.7418646801456215,1.4881758474847362,1.120142583733385,1.0889020930782853,1.5559295959968287,1.7977262128162,-0.5517814777504622,1.267782866548965,1.9044904197771946,3.104134732019544,1.5887019634246826
+251401,1,0.33645689517439314,-0.18414412988023388,-1.2836605760283897,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,1.8439439535140991
+251401,2,-0.37456453965524245,0.04944047211122737,0.09808543849151298,,,,,,,,,,,,,1.8439439535140991
+252101,0,1.0945536351055247,-0.6554950822932735,-0.5882419354283478,-1.1164445321960008,-0.7358501489339809,-0.9648904107168657,0.11971212685569313,0.3367128504442826,-0.8863975124670236,0.36043714080320877,-0.16814274788616518,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.8137001991271973
+252101,1,0.8170606662288354,0.5285571507320932,1.882216908133943,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.7720615863800049
+252101,2,1.0029296913704582,0.5943954402418251,0.45809556328835566,,,,,,,,,,,,,1.7720615863800049
+252802,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.7415956520556326,-0.6804312289064511,0.5758667003987075,-0.6275083597576895,-0.5571809115428055,-0.23730908679360116,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,-0.6931471824645996
+252802,1,-1.4898374348324874,-1.7877220112579697,-1.079410415759852,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.4402341842651367
+252802,2,-1.752058770680943,-1.8968272712123362,-2.151977841488754,,,,,,,,,,,,,2.4402341842651367
+252901,0,-1.3903310737181822,-0.770553208210634,-0.7116979467082238,-0.23157210285545515,-0.9872865247143939,-0.3959720470960366,0.3021739562728989,-0.4467168828448197,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.5700432062149048
+252901,1,-1.201475172199822,-0.80775775041602,-1.590035816431196,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.0630639836617988,1.4394233226776123
+252901,2,-1.161704100241357,-1.1183201738829107,-0.5319322799029617,,,,,,,,,,,,,1.4394233226776123
+252902,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.23157210285545515,-0.9872865247143939,-0.3959720470960366,0.3021739562728989,-0.4467168828448197,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,0.7083640674756347,0.49778314283978853,1.9044904197771946,-1.133646664653865,1.5579833984375
+252902,1,-1.1053544179889336,-1.2531960507987243,-0.9772853356255832,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,1.8585296869277954
+252902,2,-1.6536663256076787,-1.1183201738829107,-1.9719727790903323,,,,,,,,,,,,,1.8585296869277954
+253604,0,0.19095919553326762,-0.1952625786238314,-0.5882419354283478,-0.8214870557491524,-0.10725920948294862,-0.9648904107168657,-0.42767336139592416,-0.26592540593194997,0.2658605907677399,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,1.69688081741333
+253604,1,0.33645689517439314,-0.4514071101098565,1.9843419882682118,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.1835016012191772
+253604,2,-0.37456453965524245,-0.8069173349511406,0.008082907292302316,,,,,,,,,,,,,1.1835016012191772
+253803,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-1.7415956520556326,-2.3871863197689382,0.11971212685569313,-0.3261892315695732,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,0.28831555240026907,1.267782866548965,-1.388853942113607,-1.3566877907945707,0.9730418920516968
+253803,1,-0.9131129095671567,-0.18414412988023388,-0.8751602554913144,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.0630639836617988,1.7182129621505737
+253803,2,-0.27617209458197817,0.282992601310055,0.09808543849151298,,,,,,,,,,,,,1.7182129621505737
+254401,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,0.06338537359139342,0.2698953541876708,0.17294631652479245,1.4881758474847362,1.4214617119215014,-0.06335601015647824,0.9581833684000187,0.6182048363947807,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,2.427276372909546
+254401,1,-0.14414687588004912,-1.3422837108752652,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.4060819149017334
+254401,2,-0.5713494298017712,-1.040469464149968,-2.331982903887175,,,,,,,,,,,,,2.4060819149017334
+255101,0,1.320452244998589,1.5306093101365763,1.1401422224899183,2.1280877087193333,1.2756408573093225,1.3107830437664505,0.8495594445245161,-0.024870103381456905,2.07655189585094,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,0.42764121833107505,1.4684271812438965
+255101,1,0.6248191578070585,0.7958201309617158,0.14609054585137357,,,,,,,,,,0.2373400917434395,-0.3229291202479022,2.699495978693155,2.0198781490325928
+255101,2,0.41257502093087217,0.8279475694406527,-0.981944935899015,,,,,,,,,,,,,2.0198781490325928
+255901,0,-1.27738176877165,-1.230785711880076,-1.0820659805478523,0.358342850038242,1.149922669419116,0.7418646801456215,-0.33644244668732126,-0.08513392901908017,-0.22796431061858732,-0.835055314390411,0.22503104425430823,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.8737234706124865,0.5032249689102173
+255901,1,-2.643286485363149,-1.8768096713345106,-1.8964110568340025,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,0.7554450631141663
+255901,2,-1.161704100241357,-1.1961708836158533,-1.521960123094279,,,,,,,,,,,,,0.7554450631141663
+255902,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,0.358342850038242,1.149922669419116,0.7418646801456215,-0.33644244668732126,-0.08513392901908017,-0.22796431061858732,-0.835055314390411,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-1.388853942113607,0.20460009219036931,0.7554450631141663
+255902,1,-1.0092336637780452,-1.8768096713345106,-1.6921608965654649,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,0.4119267165660858
+255902,2,-0.8665267650215641,-0.573365205752313,-0.8919424046998043,,,,,,,,,,,,,0.4119267165660858
+256401,0,0.529807110372864,1.7607255619712974,1.3870542450496706,0.358342850038242,0.5213317299680837,-0.3959720470960366,1.4881758474847362,1.4817255375591245,-0.06335601015647824,-2.030547769584031,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,3.104134732019544,2.1459927558898926
+256401,1,0.33645689517439314,0.4394694906555523,1.371591507462599,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.7227551937103271
+256401,2,-0.27617209458197817,0.5165447305088826,0.5480980944875663,,,,,,,,,,,,,1.7227551937103271
+256403,0,0.19095919553326762,0.2649699250456107,-0.5882419354283478,0.358342850038242,0.5213317299680837,-0.3959720470960366,1.4881758474847362,1.4817255375591245,-0.06335601015647824,-2.030547769584031,-1.3476641243075844,-0.5517814777504622,-1.812216028287741,0.806708965813594,-0.24148216009104212,-0.2544068694114685
+256403,1,-0.04802612166916067,-0.00596880972715211,0.14609054585137357,,,,,,,,,,-1.9017700713146695,0.7456311526478686,0.4419600012801827,2.218092679977417
+256403,2,-0.1777796495087138,-0.4955144960193704,0.008082907292302316,,,,,,,,,,,,,2.218092679977417
+256903,0,-0.37378732919939306,0.6101443027976923,1.1401422224899183,1.833130232272485,1.0242044815289095,1.026323861956036,1.4881758474847362,0.8790872811828919,1.5827269944646125,-0.835055314390411,-0.16814274788616518,0.7083640674756347,1.267782866548965,0.806708965813594,0.8737234706124865,2.6283113956451416
+256903,1,-0.33638838430182605,0.08311885034938876,-0.46665993495423924,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.947028636932373
+256903,2,-0.9649192100948284,-0.10626094735465771,-1.3419550606958577,,,,,,,,,,,,,2.947028636932373
+258801,0,1.8851987697312496,2.566132443392821,1.8808782901691752,1.6856514940490606,1.401359045199529,1.3107830437664505,1.4881758474847362,0.9996149324581385,2.07655189585094,0.36043714080320877,0.6182048363947807,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,2.6510133743286133
+258801,1,1.1054229288615007,1.7757843918036655,1.371591507462599,,,,,,,,,,1.663413533782179,-0.3229291202479022,-1.3139013144854623,2.80902361869812
+258801,2,1.4948919167367798,1.295051827838308,0.9981107504836196,,,,,,,,,,,,,2.80902361869812
+259201,0,-0.5996859390924573,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,0.6470499178582901,0.17294631652479245,1.4881758474847362,0.5175043273571525,-0.3925726110806964,-0.835055314390411,0.22503104425430823,-0.9718299928258278,-1.812216028287741,-1.388853942113607,-0.24148216009104212,1.1223393678665161
+259201,1,-1.201475172199822,-0.09505646980369299,1.2694664273283303,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.4997984170913696
+259201,2,-0.37456453965524245,0.20514189157711243,-0.08191962390690835,,,,,,,,,,,,,1.4997984170913696
+260501,0,0.529807110372864,-0.08020445270647089,0.5228621660905376,-1.1164445321960008,-0.2329773973731551,-0.1115128652856221,-0.1539806172701155,-0.20566158029432668,-1.0510058129291326,0.9581833684000187,-0.9544903321671111,-0.13173296267509654,1.267782866548965,1.9044904197771946,-0.4645232862317478,2.2122840881347656
+260501,1,0.048094632541727786,0.08311885034938876,-0.7730351753570456,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.8122266528381351,1.743966817855835
+260501,2,-0.1777796495087138,0.36084331104299755,0.2780905008899343,,,,,,,,,,,,,1.743966817855835
+260701,0,0.529807110372864,-0.42537883045855246,-0.2178739015887193,1.9806089704959091,1.149922669419116,1.3107830437664505,1.2144831033589276,1.4817255375591245,1.0889020930782853,0.9581833684000187,1.4045524206757267,1.9685096127017316,0.49778314283978853,-1.388853942113607,0.8737234706124865,2.115279197692871
+260701,1,0.4325776493852816,0.08311885034938876,-0.05815961441716403,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,2.1371991634368896
+260701,2,0.31418257585760784,-0.4955144960193704,-0.5319322799029617,,,,,,,,,,,,,2.1371991634368896
+260702,0,0.7557057202659283,-1.000669460045355,-0.8351539579881,1.9806089704959091,1.149922669419116,1.3107830437664505,1.2144831033589276,1.4817255375591245,1.0889020930782853,0.9581833684000187,1.4045524206757267,1.9685096127017316,0.49778314283978853,-0.2910724881500066,3.104134732019544,2.1371991634368896
+260702,1,0.7209399120179469,-0.09505646980369299,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,2.1516969203948975
+260702,2,1.593284361810044,0.43869402077594005,1.178115812882041,,,,,,,,,,,,,2.1516969203948975
+261501,0,-0.2608380242528609,-0.3103207045411919,-0.09441789030884316,0.2108641118148177,1.149922669419116,0.457405498335207,0.028481212147090252,-0.26592540593194997,1.0889020930782853,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.747433066368103
+261501,1,-0.9131129095671567,-0.2732317899567748,0.6567159465227176,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.8981175422668457
+261501,2,-1.161704100241357,-0.6512159154852555,-0.08191962390690835,,,,,,,,,,,,,1.8981175422668457
+261503,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,0.2108641118148177,1.149922669419116,0.457405498335207,0.028481212147090252,-0.26592540593194997,1.0889020930782853,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.9763343334197998
+261503,1,-0.6247506469344914,-1.6986343511814288,-1.8964110568340025,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,0.8703630566596985
+261503,2,-0.27617209458197817,-2.130379400411164,-2.331982903887175,,,,,,,,,,,,,0.8703630566596985
+262602,0,1.207502940052057,2.4510743174754603,3.2388944142478127,0.8007790647085149,1.0242044815289095,0.457405498335207,1.1232521886503248,0.6380319786323989,0.7596854921540671,-0.835055314390411,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,-0.6875644123724536,2.508848190307617
+262602,1,1.77826820833772,1.5976090716505837,1.0652162670597927,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,2.7570302486419678
+262602,2,1.3964994716635155,1.450753247304193,0.908108219284409,,,,,,,,,,,,,2.7570302486419678
+265505,0,-1.5032803786647144,-0.1952625786238314,-0.4647859241484716,-1.2639232704194252,-1.2387229004948068,-1.2493495925272802,-1.0662897643561442,-1.9533125237854012,-1.2156141133912417,-3.8237864523744607,-1.740837916448057,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,1.2762281894683838
+265505,1,-0.9131129095671567,-0.2732317899567748,-0.05815961441716403,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.3806238174438477
+265505,2,-0.6697418748750354,-0.41766378628642786,0.008082907292302316,,,,,,,,,,,,,1.3806238174438477
+266201,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,0.5058215882616662,-0.2329773973731551,-0.9648904107168657,-0.7013661055217327,-0.5672445341200663,0.10125229030563083,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,0.3314051926136017
+266201,1,-1.6820789432542644,-1.1641083907221836,-0.26240977468570165,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.310551991190808,0.43594688177108765
+266201,2,-2.637590776340322,-0.8847680446840831,-1.0719474670982256,,,,,,,,,,,,,0.43594688177108765
+266202,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,0.5058215882616662,-0.2329773973731551,-0.9648904107168657,-0.7013661055217327,-0.5672445341200663,0.10125229030563083,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.4645232862317478,0.43594688177108765
+266202,1,-1.1053544179889336,-0.896845410492561,-0.568785015088508,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,0.06490328907966614
+266202,2,-0.37456453965524245,-0.8069173349511406,-0.35192721750454037,,,,,,,,,,,,,0.06490328907966614
+266303,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,-1.3644410883850133,-1.5338087743376947,0.11971212685569313,-0.5069807084824429,-1.2156141133912417,-1.432801541987221,-0.16814274788616518,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,0.8236952424049377
+266303,1,-0.528629892723603,-0.4514071101098565,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.3139013144854623,0.8683277368545532
+266303,2,-0.5713494298017712,-1.040469464149968,-0.6219348111021723,,,,,,,,,,,,,0.8683277368545532
+266304,0,-0.48673663414592516,-0.8856113341279945,-0.7116979467082238,-1.4114020086428494,-1.3644410883850133,-1.5338087743376947,0.11971212685569313,-0.5069807084824429,-1.2156141133912417,-1.432801541987221,-0.16814274788616518,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.7806863784790039
+266304,1,-1.6820789432542644,-1.609546691104888,-1.590035816431196,,,,,,,,,,1.663413533782179,0.7456311526478686,-1.3139013144854623,0.894449770450592
+266304,2,-2.5391983312670576,-2.208230110144106,-2.151977841488754,,,,,,,,,,,,,0.894449770450592
+266902,0,0.529807110372864,0.4950861768803317,0.029038120971032973,-0.8214870557491524,-0.9872865247143939,-0.6804312289064511,-1.0662897643561442,0.15592137353141286,-1.7094390147775689,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,-1.0422163045785646,-1.388853942113607,-1.3566877907945707,1.8219681978225708
+266902,1,0.6248191578070585,1.330346091420961,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.9460279941558838
+266902,2,1.3964994716635155,1.6843053765030207,-0.441929748703751,,,,,,,,,,,,,1.9460279941558838
+267902,0,-0.5996859390924573,1.4155511842192159,0.15249413225090913,-0.23157210285545515,1.0242044815289095,0.457405498335207,-0.06274970256151263,-1.4109380930467919,-0.7217892120049145,-0.23730908679360116,-0.5613165400266386,-0.9718299928258278,-1.812216028287741,-1.388853942113607,-0.24148216009104212,0.7345461249351501
+267902,1,0.2403361409635047,1.0630831111913384,1.4737165875968679,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,1.1944719937511734,0.7856049537658691
+267902,2,-1.161704100241357,0.20514189157711243,2.258146187272569,,,,,,,,,,,,,0.7856049537658691
+268302,0,-1.27738176877165,-0.6554950822932735,-0.7116979467082238,-1.4114020086428494,-1.3644410883850133,-1.8182679561481092,-1.4312134231905558,0.3367128504442826,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,1.319805722893898,2.5061264038085938
+268302,1,-1.393716680621599,-1.520459031028347,-0.8751602554913144,,,,,,,,,,0.2373400917434395,1.8141914255436393,-1.0630639836617988,1.259352207183838
+268302,2,-0.4729569847285068,-0.6512159154852555,-0.5319322799029617,,,,,,,,,,,,,1.259352207183838
+268303,0,-0.37378732919939306,-0.8856113341279945,-0.7116979467082238,-1.4114020086428494,-1.3644410883850133,-1.8182679561481092,-1.4312134231905558,0.3367128504442826,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,1.259352207183838
+268303,1,-0.528629892723603,-0.80775775041602,-1.590035816431196,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,0.8762017488479614
+268303,2,-0.37456453965524245,-1.6632751420135086,-1.8819702478911218,,,,,,,,,,,,,0.8762017488479614
+268305,0,-0.48673663414592516,-0.3103207045411919,-0.2178739015887193,-1.4114020086428494,-1.3644410883850133,-1.8182679561481092,-1.4312134231905558,0.3367128504442826,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.24148216009104212,1.7343038320541382
+268305,1,-0.04802612166916067,-0.4514071101098565,0.5545908663884488,,,,,,,,,,0.9503768127628092,-1.3914893931436731,1.1944719937511734,1.9535350799560547
+268305,2,-0.8665267650215641,-0.41766378628642786,-0.17192215510611902,,,,,,,,,,,,,1.9535350799560547
+268901,0,-1.0514831588785858,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,-0.35869558526336154,0.457405498335207,1.3969449327761334,0.5175043273571525,-0.3925726110806964,-0.23730908679360116,0.22503104425430823,0.28831555240026907,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.974244475364685
+268901,1,-0.528629892723603,-0.3623194500333156,-0.46665993495423924,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.9055811166763306
+268901,2,-0.5713494298017712,1.606454666770078,1.448123406479673,,,,,,,,,,,,,1.9055811166763306
+268902,0,0.529807110372864,-0.1952625786238314,-0.5882419354283478,-0.08409336463203088,-0.35869558526336154,0.457405498335207,1.3969449327761334,0.5175043273571525,-0.3925726110806964,-0.23730908679360116,0.22503104425430823,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,1.9055811166763306
+268902,1,0.33645689517439314,-0.4514071101098565,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,1.868279218673706
+268902,2,-0.07938720443544948,-0.8847680446840831,-0.8919424046998043,,,,,,,,,,,,,1.868279218673706
+269001,0,-1.5032803786647144,0.4950861768803317,1.1401422224899183,-0.37905084107887943,-0.48441377315356804,0.17294631652479245,0.3021739562728989,0.4572405017195292,-0.3925726110806964,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,1.9044904197771946,-0.9106055385131593,2.2296853065490723
+269001,1,-0.4325091385127145,0.3503818305790114,0.6567159465227176,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.8460452556610107
+269001,2,-1.8504512157542075,0.20514189157711243,0.368093032089145,,,,,,,,,,,,,2.8460452556610107
+269002,0,-1.7291789885577786,-1.000669460045355,-0.8351539579881,-0.37905084107887943,-0.48441377315356804,0.17294631652479245,0.3021739562728989,0.4572405017195292,-0.3925726110806964,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,1.9044904197771946,-0.6875644123724536,1.7135076522827148
+269002,1,-1.9704412058869298,-1.431371370951806,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.660278558731079
+269002,2,-2.735983221413586,-2.0525286906782214,-1.521960123094279,,,,,,,,,,,,,1.660278558731079
+269202,0,-0.7126352440389895,-0.42537883045855246,-0.8351539579881,-0.8214870557491524,-0.8615683368241874,-0.6804312289064511,-1.1575206790647472,-0.08513392901908017,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.30991792678833
+269202,1,-0.8169921553562683,-0.2732317899567748,0.35034070611991114,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.6927973321038463,1.7517145872116089
+269202,2,-0.1777796495087138,1.0614996986394805,0.5480980944875663,,,,,,,,,,,,,1.7517145872116089
+270101,0,0.3039085004797998,0.8402605546324132,0.5228621660905376,-0.37905084107887943,-0.2329773973731551,-0.3959720470960366,0.028481212147090252,0.2764490248066594,-0.06335601015647824,1.5559295959968287,-1.3476641243075844,1.9685096127017316,1.267782866548965,0.806708965813594,-0.4645232862317478,2.74456524848938
+270101,1,0.52869840359617,0.08311885034938876,0.14609054585137357,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.310551991190808,2.782525062561035
+270101,2,1.6916768068833083,0.7500968597077102,0.8181056880851983,,,,,,,,,,,,,2.782525062561035
+270601,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.1130047126046003,-1.2493495925272802,-0.8838279349389385,-0.6275083597576895,0.430468891229849,-2.628293997180841,-0.9544903321671111,-2.2319755380519246,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.0258479118347168
+270601,1,-1.2975959264107106,-0.18414412988023388,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.059714660367144415,1.1536258459091187
+270601,2,-0.07938720443544948,0.5165447305088826,0.45809556328835566,,,,,,,,,,,,,1.1536258459091187
+270901,0,0.7557057202659283,-0.1952625786238314,-0.5882419354283478,-0.08409336463203088,-0.48441377315356804,-0.3959720470960366,-0.518904276104527,-0.08513392901908017,-0.22796431061858732,-1.432801541987221,0.22503104425430823,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.5082229971885681
+270901,1,0.6248191578070585,0.9739954511147976,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,0.6017383337020874
+270901,2,0.6093599110774008,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,0.6017383337020874
+271001,0,-0.48673663414592516,-0.8856113341279945,-0.8351539579881,-1.2639232704194252,-1.2387229004948068,-1.5338087743376947,-1.1575206790647472,0.035393722256166354,-1.0510058129291326,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,-1.812216028287741,-1.388853942113607,-0.9106055385131593,0.5752089619636536
+271001,1,-0.6247506469344914,-1.1641083907221836,-1.3857856561626585,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,0.5644810199737549
+271001,2,-0.7681343199482997,-1.3518723030817383,-0.6219348111021723,,,,,,,,,,,,,0.5644810199737549
+272201,0,-0.03493941435979663,1.1854349323844948,0.3994061548106614,-0.674008317525728,-0.35869558526336154,-0.3959720470960366,-0.61013519081313,0.09565754789378961,-1.2156141133912417,0.9581833684000187,-0.5613165400266386,0.28831555240026907,0.49778314283978853,0.806708965813594,0.8737234706124865,1.7332484722137451
+272201,1,0.6248191578070585,0.08311885034938876,1.371591507462599,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,1.512118935585022
+272201,2,-0.27617209458197817,-0.41766378628642786,0.5480980944875663,,,,,,,,,,,,,1.512118935585022
+272301,0,0.19095919553326762,-0.6554950822932735,-0.7116979467082238,-1.5588807468662738,0.5213317299680837,0.17294631652479245,-0.33644244668732126,-0.14539775465670343,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.192518949508667
+272301,1,1.4899059457050545,0.9739954511147976,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.411360025405884
+272301,2,0.2157901307843435,1.1393504083724229,0.09808543849151298,,,,,,,,,,,,,2.411360025405884
+272302,0,-0.48673663414592516,-0.8856113341279945,-0.7116979467082238,-1.5588807468662738,0.5213317299680837,0.17294631652479245,-0.33644244668732126,-0.14539775465670343,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.192518949508667
+272302,1,0.7209399120179469,0.08311885034938876,-0.7730351753570456,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.411360025405884
+272302,2,0.2157901307843435,0.5943954402418251,0.7281031568859877,,,,,,,,,,,,,2.411360025405884
+273102,0,-1.164432463825118,0.7252024287150527,-0.5882419354283478,-0.8214870557491524,0.5213317299680837,0.7418646801456215,0.210943041564296,0.5175043273571525,0.7596854921540671,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.6930196285247803
+273102,1,-0.33638838430182605,0.7067324708851749,-1.079410415759852,,,,,,,,,,-1.1887333502953,0.7456311526478686,-1.0630639836617988,1.707011103630066
+273102,2,-0.1777796495087138,0.7500968597077102,0.2780905008899343,,,,,,,,,,,,,1.707011103630066
+273702,0,-0.5996859390924573,-0.08020445270647089,0.2759501435307853,1.2432152793787876,0.8984862936387031,0.7418646801456215,0.5758667003987075,1.2406702350086316,1.2535103935403944,0.36043714080320877,1.0113786285352542,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.1201083660125732
+273702,1,0.4325776493852816,0.7067324708851749,1.0652162670597927,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.090804100036621
+273702,2,-0.6697418748750354,-0.18411165708760024,0.9981107504836196,,,,,,,,,,,,,2.090804100036621
+273902,0,4.483032783501489,4.061888080318508,3.485806436807565,1.390694017602212,1.0242044815289095,1.026323861956036,1.4881758474847362,0.5175043273571525,1.0889020930782853,-0.23730908679360116,-0.16814274788616518,-2.2319755380519246,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.1421117782592773
+273902,1,0.6248191578070585,0.4394694906555523,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.327946901321411
+273902,2,0.41257502093087217,0.8279475694406527,-0.26192468630532967,,,,,,,,,,,,,2.327946901321411
+274301,0,-0.9385338539320537,-0.6554950822932735,-0.4647859241484716,-0.8214870557491524,-0.2329773973731551,-0.1115128652856221,-0.8838279349389385,-0.5672445341200663,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,-2.2319755380519246,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,-0.24699436128139496
+274301,1,-1.585958189043376,-1.431371370951806,-0.6709100952227768,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,0.37013041973114014
+274301,2,-0.6697418748750354,-1.5075737225476233,-0.8919424046998043,,,,,,,,,,,,,0.37013041973114014
+276901,0,-1.3903310737181822,-1.1157275859627156,-0.9586099692679761,-1.1164445321960008,-1.9930320278360456,-2.102727137958524,-2.1610607408593787,-1.8930486981477779,-0.3925726110806964,-3.226040224777651,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,-0.6931471824645996
+276901,1,-2.643286485363149,-1.8768096713345106,-1.6921608965654649,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.3139013144854623,0.3299475908279419
+276901,2,-2.4408058861937936,-2.0525286906782214,-1.9719727790903323,,,,,,,,,,,,,0.3299475908279419
+278103,0,0.3039085004797998,-0.08020445270647089,0.029038120971032973,0.6533003264850905,0.7727681057484966,0.7418646801456215,0.4846357856901046,1.2406702350086316,-0.22796431061858732,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.0409818887710571
+278103,1,0.2403361409635047,-0.4514071101098565,-0.05815961441716403,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,0.8276761174201965
+278103,2,-0.27617209458197817,-0.41766378628642786,0.368093032089145,,,,,,,,,,,,,0.8276761174201965
+280402,0,0.07800989058673549,-0.5404369563759129,-0.7116979467082238,-1.1164445321960008,-0.7358501489339809,0.17294631652479245,1.1232521886503248,1.3009340606462547,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.90995192527771
+280402,1,-0.04802612166916067,-0.5404947701863974,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,2.6755118370056152
+280402,2,0.7077523561506651,-0.2619623668205428,-0.17192215510611902,,,,,,,,,,,,,2.6755118370056152
+280902,0,0.7557057202659283,0.4950861768803317,0.5228621660905376,1.6856514940490606,0.8984862936387031,0.7418646801456215,1.3969449327761334,1.4817255375591245,1.9119435953888306,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,0.806708965813594,1.9889291013160153,2.717111587524414
+280902,1,0.6248191578070585,0.17220651042592966,-0.568785015088508,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.0660202503204346
+280902,2,-0.07938720443544948,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,2.0660202503204346
+281802,0,2.5628945994104426,1.9908418138060184,2.621614357848432,1.2432152793787876,0.5213317299680837,0.7418646801456215,-0.1539806172701155,-0.38645305720719647,0.2658605907677399,-0.835055314390411,-1.3476641243075844,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.0044825077056885
+281802,1,-0.04802612166916067,1.419433751497502,0.8609661067912552,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.2808115482330322
+281802,2,0.019005240637814846,1.450753247304193,0.2780905008899343,,,,,,,,,,,,,2.2808115482330322
+282302,0,1.320452244998589,0.9553186805497738,0.893230199930166,0.9482578029319392,1.149922669419116,0.457405498335207,0.940790359233119,1.0598787580957618,0.2658605907677399,-1.432801541987221,0.6182048363947807,1.1284125825510003,-1.812216028287741,0.806708965813594,-0.6875644123724536,1.5383766889572144
+282302,1,1.2015436830723893,0.7067324708851749,2.086467068402481,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.310551991190808,1.365315318107605
+282302,2,-0.1777796495087138,0.6722461499747677,1.8981360624757264,,,,,,,,,,,,,1.365315318107605
+282601,0,-0.2608380242528609,-1.000669460045355,-0.8351539579881,0.06338537359139342,0.8984862936387031,0.17294631652479245,0.3021739562728989,0.5175043273571525,-0.22796431061858732,0.9581833684000187,0.22503104425430823,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.20460009219036931,0.8285142183303833
+282601,1,-1.201475172199822,-0.2732317899567748,-1.079410415759852,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,1.401822566986084
+282601,2,-0.27617209458197817,1.0614996986394805,-0.441929748703751,,,,,,,,,,,,,1.401822566986084
+282802,0,-1.3903310737181822,1.0703768064671344,1.1401422224899183,-0.37905084107887943,-0.35869558526336154,-1.2493495925272802,-0.06274970256151263,-0.6877721853953127,-1.0510058129291326,0.36043714080320877,-1.740837916448057,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,0.6682090759277344
+282802,1,-0.9131129095671567,-0.18414412988023388,0.14609054585137357,,,,,,,,,,-1.1887333502953,-1.3914893931436731,2.4486586478694914,0.8506286144256592
+282802,2,-1.6536663256076787,-0.18411165708760024,-0.35192721750454037,,,,,,,,,,,,,0.8506286144256592
+283502,0,0.07800989058673549,1.7607255619712974,1.757422278889299,0.06338537359139342,0.5213317299680837,0.17294631652479245,-0.518904276104527,1.1804064093710083,-0.5571809115428055,0.36043714080320877,1.4045524206757267,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.9289238452911377
+283502,1,0.2403361409635047,1.330346091420961,1.2694664273283303,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.4419600012801827,2.096202850341797
+283502,2,0.41257502093087217,0.6722461499747677,1.6281284688780944,,,,,,,,,,,,,2.096202850341797
+284102,0,0.07800989058673549,0.7252024287150527,1.8808782901691752,1.9806089704959091,1.401359045199529,1.026323861956036,1.4881758474847362,2.084363793935357,1.7473352949267216,1.5559295959968287,1.7977262128162,-0.5517814777504622,1.267782866548965,0.806708965813594,3.104134732019544,2.357661485671997
+284102,1,1.0093021746506123,0.8849077910382567,1.5758416677311367,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.4486586478694914,2.504253387451172
+284102,2,0.31418257585760784,0.9836489889065378,1.6281284688780944,,,,,,,,,,,,,2.504253387451172
+284103,0,0.19095919553326762,-1.000669460045355,-0.8351539579881,1.9806089704959091,1.401359045199529,1.026323861956036,1.4881758474847362,2.084363793935357,1.7473352949267216,1.5559295959968287,1.7977262128162,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.8737234706124865,2.504253387451172
+284103,1,0.33645689517439314,0.08311885034938876,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.590221405029297
+284103,2,-0.07938720443544948,-0.41766378628642786,0.09808543849151298,,,,,,,,,,,,,2.590221405029297
+287701,0,0.07800989058673549,0.7252024287150527,1.5105102563295467,1.6856514940490606,1.401359045199529,1.026323861956036,1.2144831033589276,0.5777681529947757,0.7596854921540671,0.36043714080320877,0.6182048363947807,1.548461097626366,1.267782866548965,-0.2910724881500066,-0.4645232862317478,2.4399569034576416
+287701,1,-0.24026763009093757,1.1521707712678793,1.371591507462599,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.310551991190808,2.6243011951446533
+287701,2,1.298107026590251,1.450753247304193,1.2681183440812516,,,,,,,,,,,,,2.6243011951446533
+287805,0,-1.6162296836112464,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-2.621622967287078,-2.671645501579353,-2.799677143819599,-2.7970060827121266,-0.7217892120049145,0.36043714080320877,-1.740837916448057,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-1.3566877907945707,0.13484059274196625
+287805,1,-1.393716680621599,-1.0750207306456427,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-1.3139013144854623,0.5785989165306091
+287805,2,-2.5391983312670576,-0.18411165708760024,-1.4319575918950684,,,,,,,,,,,,,0.5785989165306091
+294601,0,0.7557057202659283,1.1854349323844948,1.1401422224899183,1.390694017602212,0.6470499178582901,0.7418646801456215,0.7583285298159133,0.8790872811828919,1.7473352949267216,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.312692403793335
+294601,1,1.6821474541268315,1.5976090716505837,0.5545908663884488,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.5613893220144716,2.3137216567993164
+294601,2,1.6916768068833083,1.9178575057018483,0.908108219284409,,,,,,,,,,,,,2.3137216567993164
+296101,0,1.0945536351055247,0.14991179912825014,0.2759501435307853,1.2432152793787876,0.6470499178582901,1.3107830437664505,-0.2452115319787184,0.2764490248066594,1.0889020930782853,0.9581833684000187,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,-1.388853942113607,0.42764121833107505,2.702605724334717
+296101,1,0.2403361409635047,-0.09505646980369299,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.995732307434082
+296101,2,2.085246587176366,0.43869402077594005,0.638100625686777,,,,,,,,,,,,,2.995732307434082
+296401,0,1.207502940052057,0.6101443027976923,0.15249413225090913,0.358342850038242,0.6470499178582901,0.7418646801456215,1.3969449327761334,0.7585596299076455,0.2658605907677399,0.9581833684000187,1.0113786285352542,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.8989408016204834
+296401,1,0.8170606662288354,0.08311885034938876,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.789398431777954
+296401,2,-0.4729569847285068,-0.028410237621715174,0.45809556328835566,,,,,,,,,,,,,2.789398431777954
+299002,0,0.07800989058673549,0.9553186805497738,-0.7116979467082238,0.6533003264850905,0.39561354207787724,1.026323861956036,0.3934048709815018,0.2161851991690361,1.2535103935403944,-0.835055314390411,1.0113786285352542,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.20460009219036931,1.9792346954345703
+299002,1,0.33645689517439314,0.7958201309617158,-1.2836605760283897,,,,,,,,,,0.2373400917434395,0.7456311526478686,2.197821317045828,1.8104342222213745
+299002,2,0.11739768571107917,-0.41766378628642786,0.8181056880851983,,,,,,,,,,,,,1.8104342222213745
+302301,0,-0.2608380242528609,-0.3103207045411919,-0.4647859241484716,-0.08409336463203088,0.2698953541876708,-0.1115128652856221,0.4846357856901046,0.6380319786323989,-0.3925726110806964,-1.432801541987221,-1.740837916448057,-1.3918785079011935,0.49778314283978853,0.806708965813594,-0.9106055385131593,2.2343530654907227
+302301,1,-0.24026763009093757,-0.80775775041602,-1.3857856561626585,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.345892906188965
+302301,2,-0.07938720443544948,-0.9626187544170256,-0.35192721750454037,,,,,,,,,,,,,2.345892906188965
+305702,0,1.9981480746777818,3.256481198896984,2.004334301449051,-1.2639232704194252,0.2698953541876708,0.7418646801456215,-0.518904276104527,0.15592137353141286,-1.3802224138533508,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,-1.0422163045785646,0.806708965813594,0.8737234706124865,1.7005776166915894
+305702,1,0.048094632541727786,-0.00596880972715211,-0.16028469455143282,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,1.798677921295166
+305702,2,-0.5713494298017712,-0.028410237621715174,-0.08191962390690835,,,,,,,,,,,,,1.798677921295166
+305804,0,-0.5996859390924573,-0.6554950822932735,-0.4647859241484716,0.06338537359139342,0.6470499178582901,-0.1115128652856221,1.1232521886503248,0.8790872811828919,0.10125229030563083,-0.835055314390411,-0.9544903321671111,-2.2319755380519246,0.49778314283978853,-1.388853942113607,1.319805722893898,2.504253387451172
+305804,1,-0.4325091385127145,-0.00596880972715211,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,2.197821317045828,2.502408504486084
+305804,2,0.31418257585760784,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,2.502408504486084
+307901,0,1.8851987697312496,0.03485367321088963,0.15249413225090913,1.2432152793787876,1.0242044815289095,0.17294631652479245,0.5758667003987075,0.2161851991690361,0.595077191691958,-0.23730908679360116,0.22503104425430823,1.548461097626366,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.5535916090011597
+307901,1,1.2015436830723893,1.0630831111913384,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.5944350957870483
+307901,2,0.019005240637814846,0.20514189157711243,0.7281031568859877,,,,,,,,,,,,,1.5944350957870483
+308101,0,2.336995989517378,1.0703768064671344,2.1277903127289273,0.06338537359139342,0.8984862936387031,0.17294631652479245,0.7583285298159133,0.9996149324581385,0.595077191691958,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,1.7605624198913574
+308101,1,0.7209399120179469,1.330346091420961,1.4737165875968679,,,,,,,,,,1.663413533782179,2.88275169843941,0.4419600012801827,1.619914174079895
+308101,2,0.5109674660041365,0.5165447305088826,1.178115812882041,,,,,,,,,,,,,1.619914174079895
+309302,0,-1.8421282935043108,-1.1157275859627156,-0.9586099692679761,-0.8214870557491524,-0.8615683368241874,-0.6804312289064511,-0.06274970256151263,-0.20566158029432668,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.8567993640899658
+309302,1,-2.643286485363149,-1.9658973314110515,-2.10066121710254,,,,,,,,,,0.9503768127628092,1.8141914255436393,1.1944719937511734,2.0291919708251953
+309302,2,-3.227945446779908,-2.441782239342934,-2.5119879662855964,,,,,,,,,,,,,2.0291919708251953
+309802,0,0.6427564153193962,1.1854349323844948,0.893230199930166,1.390694017602212,1.0242044815289095,1.026323861956036,1.2144831033589276,0.8790872811828919,1.0889020930782853,0.9581833684000187,0.6182048363947807,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.30010724067688
+309802,1,1.2976644372832777,0.2612941705024705,0.6567159465227176,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.8788613080978394
+309802,2,1.3964994716635155,0.5165447305088826,0.09808543849151298,,,,,,,,,,,,,1.8788613080978394
+310103,0,0.4168578054263319,-0.3103207045411919,-0.4647859241484716,0.5058215882616662,0.7727681057484966,0.457405498335207,0.028481212147090252,-0.5069807084824429,-0.3925726110806964,0.9581833684000187,-2.13401170858853,-1.8119270229765592,0.49778314283978853,0.806708965813594,0.8737234706124865,0.2278168648481369
+310103,1,1.3937851914941661,0.2612941705024705,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,0.3576681613922119
+310103,2,2.3804239223961585,-0.573365205752313,0.09808543849151298,,,,,,,,,,,,,0.3576681613922119
+311101,0,-0.2608380242528609,0.7252024287150527,0.893230199930166,1.9806089704959091,0.5213317299680837,1.3107830437664505,1.3057140180675306,0.09565754789378961,0.430468891229849,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.2004055976867676
+311101,1,-0.24026763009093757,0.5285571507320932,0.04396546571710477,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.982546091079712
+311101,2,-0.37456453965524245,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,1.982546091079712
+311102,0,1.207502940052057,1.645667436053937,2.2512463240088034,1.9806089704959091,0.5213317299680837,1.3107830437664505,1.3057140180675306,0.09565754789378961,0.430468891229849,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.577911138534546
+311102,1,1.6821474541268315,0.17220651042592966,0.6567159465227176,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.7022401094436646
+311102,2,0.6093599110774008,0.6722461499747677,2.978166436866254,,,,,,,,,,,,,1.7022401094436646
+312001,0,1.0945536351055247,1.3004930583018552,2.1277903127289273,-0.9689657939725767,0.1441771662974643,0.7418646801456215,-0.2452115319787184,1.120142583733385,-1.2156141133912417,-0.835055314390411,0.22503104425430823,-0.9718299928258278,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.8690358400344849
+312001,1,1.1054229288615007,0.3503818305790114,1.4737165875968679,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,2.1672868728637695
+312001,2,1.298107026590251,0.1272911818441699,0.7281031568859877,,,,,,,,,,,,,2.1672868728637695
+315101,0,-1.164432463825118,-0.5404369563759129,-0.09441789030884316,-0.8214870557491524,0.1441771662974643,0.17294631652479245,1.4881758474847362,0.9393511068205153,0.10125229030563083,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.883164644241333
+315101,1,-1.7781996974651528,-0.80775775041602,-1.079410415759852,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.1604819297790527
+315101,2,-0.5713494298017712,0.5165447305088826,-0.6219348111021723,,,,,,,,,,,,,2.1604819297790527
+315102,0,-0.7126352440389895,-0.42537883045855246,-0.2178739015887193,-0.8214870557491524,0.1441771662974643,0.17294631652479245,1.4881758474847362,0.9393511068205153,0.10125229030563083,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.883164644241333
+315102,1,-0.04802612166916067,-0.5404947701863974,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.1604819297790527
+315102,2,-1.5552738805344144,-0.8069173349511406,-0.7119373423013831,,,,,,,,,,,,,2.1604819297790527
+316202,0,0.9816043301589925,-0.5404369563759129,-0.5882419354283478,2.1280877087193333,1.0242044815289095,0.7418646801456215,1.1232521886503248,1.0598787580957618,1.9119435953888306,-0.23730908679360116,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,1.7658879751753094,2.2751617431640625
+316202,1,0.9131814204397238,0.3503818305790114,0.35034070611991114,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.4486586478694914,2.2474722862243652
+316202,2,1.7900692519565728,0.04944047211122737,1.5381259376788836,,,,,,,,,,,,,2.2474722862243652
+316401,0,1.7722494647847176,0.2649699250456107,0.3994061548106614,-1.2639232704194252,-0.35869558526336154,-0.6804312289064511,-1.5224443378991586,-0.5069807084824429,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.0035743713378906
+316401,1,1.2976644372832777,-0.18414412988023388,0.04396546571710477,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,0.8454303741455078
+316401,2,0.31418257585760784,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,0.8454303741455078
+316501,0,1.5463508548916531,0.4950861768803317,1.2635982337697944,-0.23157210285545515,0.2698953541876708,-0.6804312289064511,0.210943041564296,-0.6877721853953127,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.0513575077056885
+316501,1,0.33645689517439314,-0.3623194500333156,0.6567159465227176,,,,,,,,,,0.9503768127628092,-0.3229291202479022,2.4486586478694914,1.2509961128234863
+316501,2,0.6093599110774008,0.36084331104299755,0.2780905008899343,,,,,,,,,,,,,1.2509961128234863
+316503,0,0.4168578054263319,0.03485367321088963,-0.2178739015887193,-0.23157210285545515,0.2698953541876708,-0.6804312289064511,0.210943041564296,-0.6877721853953127,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.4145385026931763
+316503,1,0.14421538675261625,1.419433751497502,0.5545908663884488,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,2.1168458461761475
+316503,2,-0.9649192100948284,0.20514189157711243,-0.35192721750454037,,,,,,,,,,,,,2.1168458461761475
+319802,0,0.8686550252124604,0.03485367321088963,0.15249413225090913,0.358342850038242,1.0242044815289095,0.7418646801456215,0.3934048709815018,0.5777681529947757,1.0889020930782853,0.36043714080320877,-0.5613165400266386,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.990103006362915
+319802,1,0.14421538675261625,-0.00596880972715211,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.0023252964019775
+319802,2,0.019005240637814846,-0.028410237621715174,1.718131000077305,,,,,,,,,,,,,2.0023252964019775
+320102,0,1.8851987697312496,1.1854349323844948,1.5105102563295467,1.6856514940490606,1.149922669419116,0.7418646801456215,-0.1539806172701155,-0.26592540593194997,1.7473352949267216,1.5559295959968287,0.6182048363947807,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.3488645553588867
+320102,1,0.7209399120179469,0.8849077910382567,1.5758416677311367,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.9436346629275099,1.9990390539169312
+320102,2,0.8061448012239295,1.0614996986394805,0.5480980944875663,,,,,,,,,,,,,1.9990390539169312
+320601,0,-1.0514831588785858,-0.8856113341279945,-0.2178739015887193,0.06338537359139342,0.018458978407257843,0.7418646801456215,0.028481212147090252,0.3367128504442826,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-0.27221658086938805,0.806708965813594,-0.6875644123724536,2.4297170639038086
+320601,1,-0.33638838430182605,-0.9859330705691017,0.24821562598564237,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,1.982364535331726
+320601,2,0.8061448012239295,-0.729066625218198,-0.6219348111021723,,,,,,,,,,,,,1.982364535331726
+322501,0,0.3039085004797998,1.0703768064671344,-0.2178739015887193,0.5058215882616662,0.8984862936387031,1.3107830437664505,1.4881758474847362,1.3009340606462547,1.5827269944646125,1.5559295959968287,1.0113786285352542,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.24148216009104212,2.219636917114258
+322501,1,0.4325776493852816,0.7067324708851749,1.0652162670597927,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.178631067276001
+322501,2,1.3964994716635155,0.36084331104299755,0.8181056880851983,,,,,,,,,,,,,2.178631067276001
+322502,0,0.19095919553326762,0.03485367321088963,-0.3413299128685955,0.5058215882616662,0.8984862936387031,1.3107830437664505,1.4881758474847362,1.3009340606462547,1.5827269944646125,1.5559295959968287,1.0113786285352542,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,2.178631067276001
+322502,1,0.4325776493852816,0.08311885034938876,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.077982187271118
+322502,2,0.7077523561506651,0.5165447305088826,-0.26192468630532967,,,,,,,,,,,,,2.077982187271118
+322503,0,1.0945536351055247,1.7607255619712974,0.5228621660905376,0.5058215882616662,0.8984862936387031,1.3107830437664505,1.4881758474847362,1.3009340606462547,1.5827269944646125,1.5559295959968287,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,0.806708965813594,0.20460009219036931,2.077982187271118
+322503,1,0.048094632541727786,1.6866967317271246,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,1.9513272047042847
+322503,2,0.2157901307843435,2.384961764099504,0.7281031568859877,,,,,,,,,,,,,1.9513272047042847
+322505,0,-0.48673663414592516,-0.770553208210634,-0.7116979467082238,0.5058215882616662,0.8984862936387031,1.3107830437664505,1.4881758474847362,1.3009340606462547,1.5827269944646125,1.5559295959968287,1.0113786285352542,-0.13173296267509654,1.267782866548965,-1.388853942113607,-0.24148216009104212,2.275500535964966
+322505,1,0.2403361409635047,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,0.5103175640106201
+322505,2,1.4948919167367798,0.43869402077594005,0.7281031568859877,,,,,,,,,,,,,0.5103175640106201
+324202,0,0.3039085004797998,0.6101443027976923,0.2759501435307853,0.358342850038242,0.7727681057484966,0.457405498335207,0.940790359233119,0.5175043273571525,-0.06335601015647824,-0.23730908679360116,-0.9544903321671111,1.548461097626366,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.9758213758468628
+324202,1,0.048094632541727786,1.419433751497502,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.1420512199401855
+324202,2,0.11739768571107917,0.9836489889065378,0.008082907292302316,,,,,,,,,,,,,2.1420512199401855
+324401,0,1.4334015499451211,1.3004930583018552,0.3994061548106614,0.5058215882616662,0.6470499178582901,1.026323861956036,-0.42767336139592416,0.15592137353141286,1.4181186940025035,0.9581833684000187,1.0113786285352542,0.28831555240026907,1.267782866548965,0.806708965813594,-0.9106055385131593,2.345892906188965
+324401,1,1.0093021746506123,1.419433751497502,0.963091186925524,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.9301546812057495
+324401,2,1.6916768068833083,1.5286039570371357,0.8181056880851983,,,,,,,,,,,,,1.9301546812057495
+324802,0,0.19095919553326762,0.03485367321088963,0.5228621660905376,0.8007790647085149,0.5213317299680837,0.457405498335207,0.3934048709815018,0.3367128504442826,1.5827269944646125,0.36043714080320877,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.0354888439178467
+324802,1,0.14421538675261625,-0.18414412988023388,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.3102200031280518
+324802,2,-0.1777796495087138,0.36084331104299755,0.008082907292302316,,,,,,,,,,,,,2.3102200031280518
+325003,0,-0.8255845489855216,2.566132443392821,2.745070369128308,1.9806089704959091,1.401359045199529,1.3107830437664505,0.8495594445245161,0.7585596299076455,1.9119435953888306,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.3250024318695068
+325003,1,0.9131814204397238,2.577573332492533,1.6779667478654055,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.2522380352020264
+325003,2,0.9045372462971938,1.295051827838308,0.5480980944875663,,,,,,,,,,,,,2.2522380352020264
+325004,0,0.9816043301589925,0.8402605546324132,1.1401422224899183,1.9806089704959091,1.401359045199529,1.3107830437664505,0.8495594445245161,0.7585596299076455,1.9119435953888306,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.2522380352020264
+325004,1,-0.528629892723603,0.7067324708851749,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.7187941074371338
+325004,2,-1.0633116551680928,0.5165447305088826,0.09808543849151298,,,,,,,,,,,,,1.7187941074371338
+325201,0,-0.9385338539320537,-1.230785711880076,-1.0820659805478523,-0.37905084107887943,-0.8615683368241874,0.17294631652479245,1.3969449327761334,0.2764490248066594,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.0613034963607788
+325201,1,-0.528629892723603,-1.520459031028347,-1.7942859766997337,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,1.1699161529541016
+325201,2,-0.8665267650215641,-1.8968272712123362,-1.7019651854927003,,,,,,,,,,,,,1.1699161529541016
+325402,0,1.6593001598381854,-0.3103207045411919,-0.4647859241484716,0.5058215882616662,-0.2329773973731551,1.026323861956036,1.4881758474847362,0.8790872811828919,0.430468891229849,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.945996880531311
+325402,1,1.5860266999159431,-0.00596880972715211,1.0652162670597927,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.3139013144854623,2.013136386871338
+325402,2,1.9868541421031014,-0.33981307655348536,0.7281031568859877,,,,,,,,,,,,,2.013136386871338
+326805,0,-1.5032803786647144,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,-1.2387229004948068,-1.5338087743376947,-0.61013519081313,-0.3261892315695732,-0.5571809115428055,-1.432801541987221,-1.3476641243075844,-0.9718299928258278,0.49778314283978853,3.002271873740795,-1.3566877907945707,0.09782905876636505
+326805,1,-1.585958189043376,-0.7186700903394792,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.3139013144854623,1.259723424911499
+326805,2,-1.2600965453146213,-0.8069173349511406,-0.8919424046998043,,,,,,,,,,,,,1.259723424911499
+328702,0,0.6427564153193962,0.7252024287150527,0.2759501435307853,0.2108641118148177,-0.9872865247143939,-0.1115128652856221,-1.0662897643561442,-1.2904104417715454,0.10125229030563083,0.9581833684000187,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,2.0513789653778076
+328702,1,1.2976644372832777,0.08311885034938876,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,1.749560832977295
+328702,2,-0.37456453965524245,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,1.749560832977295
+330303,0,1.0945536351055247,0.14991179912825014,0.7697741886502898,2.1280877087193333,1.0242044815289095,1.3107830437664505,1.2144831033589276,0.035393722256166354,2.07655189585094,1.5559295959968287,1.0113786285352542,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.018441033950336395,2.4231276512145996
+330303,1,0.2403361409635047,-0.09505646980369299,0.04396546571710477,,,,,,,,,,-1.1887333502953,-0.3229291202479022,2.197821317045828,2.4247069358825684
+330303,2,1.1997145815169867,0.282992601310055,0.908108219284409,,,,,,,,,,,,,2.4247069358825684
+330401,0,0.19095919553326762,0.03485367321088963,0.2759501435307853,1.0957365411553635,1.401359045199529,0.457405498335207,-0.42767336139592416,0.3367128504442826,1.4181186940025035,0.9581833684000187,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.9241365194320679
+330401,1,0.9131814204397238,0.4394694906555523,0.7588410266569864,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,2.2664687633514404
+330401,2,-4.605439677805609,-3.9987964340017847,-4.132033527871388,,,,,,,,,,,,,2.2664687633514404
+334201,0,0.19095919553326762,-0.6554950822932735,0.6463181773704137,-0.9689657939725767,0.39561354207787724,0.17294631652479245,-0.33644244668732126,0.8188234555452687,-1.3802224138533508,1.5559295959968287,0.6182048363947807,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.769005537033081
+334201,1,0.7209399120179469,-0.7186700903394792,-0.16028469455143282,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.7558012008666992
+334201,2,-0.37456453965524245,-0.4955144960193704,-0.08191962390690835,,,,,,,,,,,,,1.7558012008666992
+334701,0,-0.37378732919939306,-0.1952625786238314,-0.8351539579881,0.2108641118148177,1.149922669419116,0.17294631652479245,0.5758667003987075,0.3969766760819059,-0.22796431061858732,0.9581833684000187,1.0113786285352542,1.9685096127017316,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.8728997707366943
+334701,1,0.8170606662288354,-0.5404947701863974,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.885725498199463
+334701,2,0.41257502093087217,-0.18411165708760024,0.18808796969072364,,,,,,,,,,,,,1.885725498199463
+335001,0,0.529807110372864,0.8402605546324132,2.2512463240088034,0.5058215882616662,0.2698953541876708,-0.3959720470960366,-0.33644244668732126,-0.14539775465670343,1.2535103935403944,0.36043714080320877,-0.16814274788616518,0.28831555240026907,1.267782866548965,-1.388853942113607,-0.4645232862317478,1.4585497379302979
+335001,1,1.2976644372832777,0.7958201309617158,1.2694664273283303,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.717049479484558
+335001,2,0.31418257585760784,0.282992601310055,0.008082907292302316,,,,,,,,,,,,,1.717049479484558
+335501,0,0.07800989058673549,-0.42537883045855246,-0.3413299128685955,1.2432152793787876,0.8984862936387031,0.457405498335207,1.4881758474847362,2.265155270848227,0.9242937926161762,1.5559295959968287,0.6182048363947807,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.713841676712036
+335501,1,-0.04802612166916067,-0.09505646980369299,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,2.995732307434082
+335501,2,0.019005240637814846,-0.33981307655348536,0.008082907292302316,,,,,,,,,,,,,2.995732307434082
+336002,0,-1.27738176877165,-1.230785711880076,-1.0820659805478523,0.06338537359139342,0.39561354207787724,0.17294631652479245,0.210943041564296,-0.5069807084824429,0.9242937926161762,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,1.267782866548965,0.806708965813594,3.104134732019544,1.4701085090637207
+336002,1,-0.14414687588004912,-1.609546691104888,-1.3857856561626585,,,,,,,,,,1.663413533782179,0.7456311526478686,-1.3139013144854623,1.8103207349777222
+336002,2,-0.5713494298017712,-1.9746779809452786,-1.6119626542934897,,,,,,,,,,,,,1.8103207349777222
+336902,0,-0.2608380242528609,-1.000669460045355,-0.8351539579881,1.833130232272485,1.401359045199529,0.7418646801456215,0.11971212685569313,0.6380319786323989,1.9119435953888306,0.36043714080320877,0.6182048363947807,0.28831555240026907,1.267782866548965,0.806708965813594,0.8737234706124865,2.9252729415893555
+336902,1,-0.04802612166916067,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.995732307434082
+336902,2,0.41257502093087217,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,2.995732307434082
+338701,0,1.7722494647847176,0.9553186805497738,2.3747023352886796,0.8007790647085149,1.149922669419116,0.17294631652479245,0.3934048709815018,0.7585596299076455,1.0889020930782853,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.5807307958602905
+338701,1,1.2015436830723893,1.330346091420961,0.963091186925524,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.537781000137329
+338701,2,0.8061448012239295,0.5165447305088826,2.1681436560733585,,,,,,,,,,,,,1.537781000137329
+338702,0,2.1110973796243138,1.4155511842192159,2.621614357848432,0.8007790647085149,1.149922669419116,0.17294631652479245,0.3934048709815018,0.7585596299076455,1.0889020930782853,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.5807307958602905
+338702,1,1.8743889625486083,1.330346091420961,2.5970924690738246,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.6961466553985005,1.537781000137329
+338702,2,1.3964994716635155,0.7500968597077102,1.988138593674937,,,,,,,,,,,,,1.537781000137329
+339301,0,1.207502940052057,1.5306093101365763,2.2512463240088034,-1.2639232704194252,0.2698953541876708,-0.9648904107168657,-0.33644244668732126,-0.6877721853953127,-0.5571809115428055,1.5559295959968287,1.7977262128162,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.361442804336548
+339301,1,2.3549927336030505,1.5085214115740428,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,2.0335779190063477
+339301,2,1.4948919167367798,1.3729025375712505,0.45809556328835566,,,,,,,,,,,,,2.0335779190063477
+340202,0,0.4168578054263319,1.1854349323844948,0.6463181773704137,0.358342850038242,0.7727681057484966,0.457405498335207,1.0320212739417218,0.9393511068205153,0.430468891229849,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,1.267782866548965,-1.388853942113607,1.7658879751753094,2.4643607139587402
+340202,1,1.2015436830723893,0.6176448108086341,1.2694664273283303,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.5613893220144716,2.5002925395965576
+340202,2,0.9045372462971938,0.5165447305088826,0.9981107504836196,,,,,,,,,,,,,2.5002925395965576
+341302,0,0.3039085004797998,-0.1952625786238314,-0.09441789030884316,1.9806089704959091,1.0242044815289095,0.7418646801456215,0.940790359233119,1.3009340606462547,1.5827269944646125,1.5559295959968287,1.0113786285352542,-1.3918785079011935,-0.27221658086938805,0.806708965813594,0.20460009219036931,2.1657187938690186
+341302,1,0.048094632541727786,0.08311885034938876,0.24821562598564237,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.203946828842163
+341302,2,-0.37456453965524245,-0.028410237621715174,0.008082907292302316,,,,,,,,,,,,,2.203946828842163
+341601,0,0.07800989058673549,0.8402605546324132,0.7697741886502898,0.06338537359139342,0.6470499178582901,0.7418646801456215,0.940790359233119,1.9035723170224874,-1.0510058129291326,0.9581833684000187,-0.16814274788616518,1.1284125825510003,1.267782866548965,0.806708965813594,-0.6875644123724536,2.995732307434082
+341601,1,0.2403361409635047,0.5285571507320932,0.5545908663884488,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.6927973321038463,2.520127534866333
+341601,2,-0.27617209458197817,0.6722461499747677,0.2780905008899343,,,,,,,,,,,,,2.520127534866333
+342301,0,0.4168578054263319,0.4950861768803317,0.5228621660905376,1.6856514940490606,1.2756408573093225,0.7418646801456215,1.3969449327761334,1.3009340606462547,1.7473352949267216,0.36043714080320877,0.6182048363947807,1.548461097626366,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.380889654159546
+342301,1,0.7209399120179469,0.8849077910382567,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,2.6711392402648926
+342301,2,1.6916768068833083,1.1393504083724229,1.718131000077305,,,,,,,,,,,,,2.6711392402648926
+342302,0,-0.03493941435979663,0.14991179912825014,1.5105102563295467,1.6856514940490606,1.2756408573093225,0.7418646801456215,1.3969449327761334,1.3009340606462547,1.7473352949267216,0.36043714080320877,0.6182048363947807,1.548461097626366,0.49778314283978853,0.806708965813594,-0.9106055385131593,2.380889654159546
+342302,1,0.4325776493852816,1.0630831111913384,1.1673413471940615,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.6711392402648926
+342302,2,-0.07938720443544948,0.6722461499747677,0.368093032089145,,,,,,,,,,,,,2.6711392402648926
+342603,0,1.5463508548916531,0.3800280509629712,0.5228621660905376,1.390694017602212,1.0242044815289095,1.3107830437664505,0.940790359233119,0.9393511068205153,1.7473352949267216,1.5559295959968287,1.0113786285352542,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.995732307434082
+342603,1,2.4511134878139393,0.3503818305790114,1.2694664273283303,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.995732307434082
+342603,2,2.085246587176366,1.3729025375712505,1.988138593674937,,,,,,,,,,,,,2.995732307434082
+342801,0,1.8851987697312496,2.9113068211449025,4.843822560886203,1.9806089704959091,1.401359045199529,1.3107830437664505,1.3969449327761334,0.8188234555452687,1.5827269944646125,0.36043714080320877,1.4045524206757267,0.28831555240026907,1.267782866548965,0.806708965813594,-0.9106055385131593,2.995732307434082
+342801,1,2.7394757504466045,3.3793622731814015,2.1885921485367494,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.641754150390625
+342801,2,1.7900692519565728,2.462812473832446,2.0781411248741475,,,,,,,,,,,,,2.641754150390625
+342802,0,0.4168578054263319,0.4950861768803317,0.5228621660905376,1.9806089704959091,1.401359045199529,1.3107830437664505,1.3969449327761334,0.8188234555452687,1.5827269944646125,0.36043714080320877,1.4045524206757267,0.28831555240026907,1.267782866548965,1.9044904197771946,-1.133646664653865,2.641754150390625
+342802,1,1.5860266999159431,0.9739954511147976,1.0652162670597927,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,2.7415497303009033
+342802,2,1.4948919167367798,1.0614996986394805,1.448123406479673,,,,,,,,,,,,,2.7415497303009033
+342901,0,1.4334015499451211,2.105899939723379,2.621614357848432,2.1280877087193333,1.401359045199529,0.7418646801456215,1.0320212739417218,1.361197886283878,1.4181186940025035,-0.835055314390411,-0.16814274788616518,1.1284125825510003,1.267782866548965,0.806708965813594,-0.9106055385131593,1.2027058601379395
+342901,1,0.4325776493852816,1.2412584313444202,1.882216908133943,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.138601779937744
+342901,2,1.4948919167367798,1.1393504083724229,1.988138593674937,,,,,,,,,,,,,2.138601779937744
+342902,0,1.4334015499451211,1.5306093101365763,2.2512463240088034,2.1280877087193333,1.401359045199529,0.7418646801456215,1.0320212739417218,1.361197886283878,1.4181186940025035,-0.835055314390411,-0.16814274788616518,1.1284125825510003,1.267782866548965,-0.2910724881500066,-1.133646664653865,1.2027058601379395
+342902,1,0.8170606662288354,0.7067324708851749,2.2907172286710185,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.0630639836617988,2.138601779937744
+342902,2,0.9045372462971938,0.5943954402418251,1.718131000077305,,,,,,,,,,,,,2.138601779937744
+342904,0,0.529807110372864,-0.6554950822932735,-0.5882419354283478,2.1280877087193333,1.401359045199529,0.7418646801456215,1.0320212739417218,1.361197886283878,1.4181186940025035,-0.835055314390411,-0.16814274788616518,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.619781732559204
+342904,1,0.33645689517439314,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.506767988204956
+342904,2,-0.27617209458197817,-0.33981307655348536,-0.441929748703751,,,,,,,,,,,,,2.506767988204956
+343001,0,1.5463508548916531,0.8402605546324132,1.2635982337697944,2.1280877087193333,1.401359045199529,1.026323861956036,1.3969449327761334,1.9035723170224874,2.07655189585094,0.36043714080320877,-1.3476641243075844,0.28831555240026907,1.267782866548965,0.806708965813594,0.42764121833107505,2.094464063644409
+343001,1,0.4325776493852816,0.7958201309617158,1.371591507462599,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,1.9216480255126953
+343001,2,1.3964994716635155,0.7500968597077102,1.178115812882041,,,,,,,,,,,,,1.9216480255126953
+343004,0,0.3039085004797998,0.6101443027976923,0.3994061548106614,2.1280877087193333,1.401359045199529,1.026323861956036,1.3969449327761334,1.9035723170224874,2.07655189585094,0.36043714080320877,-1.3476641243075844,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.4645232862317478,2.345892906188965
+343004,1,1.1054229288615007,-0.00596880972715211,0.14609054585137357,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.8270138502120972
+343004,2,0.8061448012239295,-0.18411165708760024,0.2780905008899343,,,,,,,,,,,,,1.8270138502120972
+343005,0,1.320452244998589,-0.6554950822932735,-0.7116979467082238,2.1280877087193333,1.401359045199529,1.026323861956036,1.3969449327761334,1.9035723170224874,2.07655189585094,0.36043714080320877,-1.3476641243075844,0.28831555240026907,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.8270138502120972
+343005,1,1.77826820833772,-0.7186700903394792,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.261077880859375
+343005,2,0.8061448012239295,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,2.261077880859375
+343008,0,-0.37378732919939306,-0.6554950822932735,-0.3413299128685955,2.1280877087193333,1.401359045199529,1.026323861956036,1.3969449327761334,1.9035723170224874,2.07655189585094,0.36043714080320877,-1.3476641243075844,0.28831555240026907,1.267782866548965,0.806708965813594,-0.6875644123724536,2.182009220123291
+343008,1,1.1054229288615007,0.08311885034938876,0.04396546571710477,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,2.1472718715667725
+343008,2,0.11739768571107917,-0.33981307655348536,0.45809556328835566,,,,,,,,,,,,,2.1472718715667725
+343203,0,0.19095919553326762,1.7607255619712974,2.1277903127289273,1.9806089704959091,1.2756408573093225,1.026323861956036,1.0320212739417218,0.2764490248066594,1.7473352949267216,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-2.5822157519969178,0.806708965813594,-0.6875644123724536,2.286059856414795
+343203,1,0.2403361409635047,0.4394694906555523,0.6567159465227176,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.310551991190808,2.4651904106140137
+343203,2,-0.5713494298017712,-0.41766378628642786,0.638100625686777,,,,,,,,,,,,,2.4651904106140137
+344602,0,0.4168578054263319,-0.1952625786238314,-0.3413299128685955,-0.08409336463203088,0.7727681057484966,0.7418646801456215,0.5758667003987075,0.3367128504442826,-0.22796431061858732,1.5559295959968287,1.4045524206757267,0.28831555240026907,-1.812216028287741,0.806708965813594,0.8737234706124865,-0.17892752587795258
+344602,1,1.2015436830723893,0.08311885034938876,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.0046143531799316
+344602,2,0.2157901307843435,0.5943954402418251,-0.17192215510611902,,,,,,,,,,,,,1.0046143531799316
+344703,0,-1.3903310737181822,-1.460901963714797,-1.3289780031076046,-1.2639232704194252,-1.9930320278360456,-0.6804312289064511,-1.4312134231905558,-1.9533125237854012,-0.8863975124670236,1.5559295959968287,-0.16814274788616518,-1.3918785079011935,-2.5822157519969178,-0.2910724881500066,-1.133646664653865,1.9592450857162476
+344703,1,-2.1626827143087066,-1.6986343511814288,-1.590035816431196,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,1.8744919300079346
+344703,2,-0.7681343199482997,-2.130379400411164,-2.151977841488754,,,,,,,,,,,,,1.8744919300079346
+345802,0,-0.03493941435979663,1.645667436053937,0.029038120971032973,-0.674008317525728,-0.48441377315356804,0.17294631652479245,-0.42767336139592416,0.2764490248066594,-1.0510058129291326,0.36043714080320877,1.0113786285352542,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.2808115482330322
+345802,1,0.2403361409635047,0.2612941705024705,-0.05815961441716403,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,1.926398754119873
+345802,2,-0.07938720443544948,2.151409634900676,0.008082907292302316,,,,,,,,,,,,,1.926398754119873
+345803,0,-0.7126352440389895,0.7252024287150527,0.893230199930166,-0.674008317525728,-0.48441377315356804,0.17294631652479245,-0.42767336139592416,0.2764490248066594,-1.0510058129291326,0.36043714080320877,1.0113786285352542,-1.3918785079011935,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.2808115482330322
+345803,1,-0.33638838430182605,1.2412584313444202,-0.7730351753570456,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,1.926398754119873
+345803,2,-0.9649192100948284,0.8279475694406527,0.09808543849151298,,,,,,,,,,,,,1.926398754119873
+346501,0,0.3039085004797998,1.3004930583018552,1.3870542450496706,1.5381727558256364,0.7727681057484966,0.7418646801456215,0.7583285298159133,0.3969766760819059,1.0889020930782853,0.9581833684000187,1.0113786285352542,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-1.133646664653865,1.7980340719223022
+346501,1,1.0093021746506123,1.5085214115740428,1.0652162670597927,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.7835195064544678
+346501,2,0.31418257585760784,0.6722461499747677,0.45809556328835566,,,,,,,,,,,,,1.7835195064544678
+346503,0,1.4334015499451211,1.1854349323844948,2.1277903127289273,1.5381727558256364,0.7727681057484966,0.7418646801456215,0.7583285298159133,0.3969766760819059,1.0889020930782853,0.9581833684000187,1.0113786285352542,0.28831555240026907,0.49778314283978853,-1.388853942113607,-1.133646664653865,2.3729214668273926
+346503,1,0.9131814204397238,0.7958201309617158,1.2694664273283303,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,0.5113371014595032
+346503,2,0.9045372462971938,0.7500968597077102,1.448123406479673,,,,,,,,,,,,,0.5113371014595032
+346902,0,2.44994529446391,1.3004930583018552,2.868526380408184,1.6856514940490606,1.149922669419116,1.3107830437664505,0.940790359233119,1.4817255375591245,1.9119435953888306,0.9581833684000187,0.22503104425430823,1.1284125825510003,-1.812216028287741,0.806708965813594,-0.24148216009104212,2.3107686042785645
+346902,1,1.4899059457050545,1.8648720518802064,0.8609661067912552,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,2.3030176162719727
+346902,2,1.6916768068833083,2.0735589251677333,0.2780905008899343,,,,,,,,,,,,,2.3030176162719727
+347601,0,0.9816043301589925,0.14991179912825014,0.029038120971032973,-1.1164445321960008,0.018458978407257843,0.17294631652479245,-0.1539806172701155,-0.26592540593194997,-0.06335601015647824,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.102941870689392
+347601,1,-0.14414687588004912,0.4394694906555523,0.963091186925524,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,1.8279719352722168
+347601,2,-0.6697418748750354,0.43869402077594005,1.5381259376788836,,,,,,,,,,,,,1.8279719352722168
+349102,0,-1.27738176877165,-0.3103207045411919,-0.2178739015887193,-0.23157210285545515,-0.6101319610437744,-0.3959720470960366,0.210943041564296,0.2161851991690361,-0.7217892120049145,-0.23730908679360116,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,2.166635274887085
+349102,1,-0.6247506469344914,-0.18414412988023388,0.6567159465227176,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.6927973321038463,1.9808478355407715
+349102,2,-1.3584889903878858,-0.18411165708760024,0.09808543849151298,,,,,,,,,,,,,1.9808478355407715
+350201,0,0.8686550252124604,0.6101443027976923,0.5228621660905376,0.5058215882616662,0.5213317299680837,0.457405498335207,0.3934048709815018,1.2406702350086316,-0.3925726110806964,1.5559295959968287,0.22503104425430823,0.7083640674756347,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.39080548286438
+350201,1,0.048094632541727786,0.3503818305790114,0.7588410266569864,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.5496721267700195
+350201,2,-0.6697418748750354,0.43869402077594005,0.9981107504836196,,,,,,,,,,,,,2.5496721267700195
+350202,0,0.07800989058673549,-0.08020445270647089,0.15249413225090913,0.5058215882616662,0.5213317299680837,0.457405498335207,0.3934048709815018,1.2406702350086316,-0.3925726110806964,1.5559295959968287,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,2.6109731197357178
+350202,1,0.4325776493852816,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,2.5663986206054688
+350202,2,-0.4729569847285068,0.1272911818441699,0.638100625686777,,,,,,,,,,,,,2.5663986206054688
+350602,0,0.19095919553326762,-0.08020445270647089,-0.3413299128685955,0.9482578029319392,1.2756408573093225,1.026323861956036,0.3021739562728989,-0.08513392901908017,0.9242937926161762,-0.23730908679360116,1.0113786285352542,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.326242446899414
+350602,1,0.8170606662288354,-0.18414412988023388,-0.568785015088508,,,,,,,,,,0.2373400917434395,-0.3229291202479022,3.7028453019878094,0.03645429387688637
+350602,2,0.8061448012239295,-0.41766378628642786,0.09808543849151298,,,,,,,,,,,,,0.03645429387688637
+350603,0,0.3039085004797998,0.14991179912825014,0.5228621660905376,0.9482578029319392,1.2756408573093225,1.026323861956036,0.3021739562728989,-0.08513392901908017,0.9242937926161762,-0.23730908679360116,1.0113786285352542,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.326242446899414
+350603,1,1.970509716759497,2.132135032109829,1.1673413471940615,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,0.03645429387688637
+350603,2,0.2157901307843435,-0.18411165708760024,0.2780905008899343,,,,,,,,,,,,,0.03645429387688637
+352202,0,0.529807110372864,0.9553186805497738,-0.2178739015887193,-0.8214870557491524,-0.9872865247143939,-2.102727137958524,-0.9750588496475414,-2.134104000698271,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.9106055385131593,2.064629077911377
+352202,1,0.52869840359617,0.6176448108086341,-0.36453485481997044,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,2.5910074710845947
+352202,2,0.8061448012239295,0.1272911818441699,0.008082907292302316,,,,,,,,,,,,,2.5910074710845947
+353202,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,0.358342850038242,0.5213317299680837,1.026323861956036,1.4881758474847362,0.7585596299076455,-0.5571809115428055,0.9581833684000187,1.0113786285352542,-0.13173296267509654,1.267782866548965,0.806708965813594,0.8737234706124865,1.6536773443222046
+353202,1,0.33645689517439314,-1.2531960507987243,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,0.6565077304840088
+353202,2,-0.4729569847285068,-0.9626187544170256,-0.5319322799029617,,,,,,,,,,,,,0.6565077304840088
+353204,0,-0.37378732919939306,-0.8856113341279945,-0.7116979467082238,0.358342850038242,0.5213317299680837,1.026323861956036,1.4881758474847362,0.7585596299076455,-0.5571809115428055,0.9581833684000187,1.0113786285352542,-0.13173296267509654,0.49778314283978853,-1.388853942113607,0.8737234706124865,2.1532981395721436
+353204,1,0.6248191578070585,0.17220651042592966,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.1158957481384277
+353204,2,0.2157901307843435,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,2.1158957481384277
+354303,0,-0.7126352440389895,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,-0.8615683368241874,-1.2493495925272802,-0.33644244668732126,-0.20566158029432668,-0.3925726110806964,0.36043714080320877,-0.16814274788616518,0.28831555240026907,-1.812216028287741,-0.2910724881500066,-0.4645232862317478,0.6399627923965454
+354303,1,-0.8169921553562683,-0.3623194500333156,0.24821562598564237,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,0.8063516616821289
+354303,2,-0.5713494298017712,-0.729066625218198,-0.35192721750454037,,,,,,,,,,,,,0.8063516616821289
+354501,0,1.9981480746777818,1.5306093101365763,1.5105102563295467,-0.8214870557491524,0.2698953541876708,0.17294631652479245,0.028481212147090252,-0.024870103381456905,-0.3925726110806964,1.5559295959968287,1.0113786285352542,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.018441033950336395,2.137608051300049
+354501,1,0.9131814204397238,1.5976090716505837,0.8609661067912552,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,2.3348352909088135
+354501,2,0.5109674660041365,0.6722461499747677,0.368093032089145,,,,,,,,,,,,,2.3348352909088135
+355201,0,-0.5996859390924573,-1.1157275859627156,-0.9586099692679761,0.8007790647085149,0.8984862936387031,0.457405498335207,1.1232521886503248,0.8790872811828919,1.4181186940025035,1.5559295959968287,1.4045524206757267,1.1284125825510003,1.267782866548965,-0.2910724881500066,3.104134732019544,2.1955909729003906
+355201,1,0.2403361409635047,-0.7186700903394792,-0.6709100952227768,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.2943034172058105
+355201,2,0.41257502093087217,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,2.2943034172058105
+355701,0,-0.48673663414592516,-0.42537883045855246,0.3994061548106614,-0.674008317525728,-0.6101319610437744,0.17294631652479245,-0.518904276104527,0.09565754789378961,0.2658605907677399,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,1.267782866548965,-0.2910724881500066,-1.133646664653865,1.8914084434509277
+355701,1,-1.393716680621599,-0.2732317899567748,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.7443128824234009
+355701,2,-2.2440209960472646,-0.2619623668205428,-0.26192468630532967,,,,,,,,,,,,,1.7443128824234009
+355703,0,-1.164432463825118,-1.3458438377974367,-1.2055219918277285,-0.674008317525728,-0.6101319610437744,0.17294631652479245,-0.518904276104527,0.09565754789378961,0.2658605907677399,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.7443128824234009
+355703,1,-1.2975959264107106,-0.80775775041602,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.7558012008666992
+355703,2,-1.8504512157542075,-0.33981307655348536,-0.981944935899015,,,,,,,,,,,,,1.7558012008666992
+355801,0,1.0945536351055247,-1.1157275859627156,-0.9586099692679761,0.8007790647085149,0.018458978407257843,1.026323861956036,1.3969449327761334,1.361197886283878,0.9242937926161762,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.9216480255126953
+355801,1,0.6248191578070585,0.5285571507320932,1.2694664273283303,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.453618288040161
+355801,2,0.019005240637814846,0.5943954402418251,0.368093032089145,,,,,,,,,,,,,2.453618288040161
+356502,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,1.390694017602212,0.8984862936387031,1.026323861956036,1.4881758474847362,1.4214617119215014,1.7473352949267216,0.36043714080320877,0.22503104425430823,1.9685096127017316,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,1.2153352499008179
+356502,1,-0.6247506469344914,-0.6295824302629383,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.3106164932250977
+356502,2,-1.6536663256076787,-0.028410237621715174,0.8181056880851983,,,,,,,,,,,,,1.3106164932250977
+356601,0,-0.03493941435979663,0.8402605546324132,0.6463181773704137,0.8007790647085149,0.8984862936387031,0.457405498335207,0.940790359233119,0.4572405017195292,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.5101048946380615
+356601,1,0.4325776493852816,0.8849077910382567,1.5758416677311367,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.9973127841949463
+356601,2,-0.07938720443544948,0.9057982791735953,0.18808796969072364,,,,,,,,,,,,,1.9973127841949463
+356602,0,-0.37378732919939306,0.2649699250456107,0.893230199930166,0.8007790647085149,0.8984862936387031,0.457405498335207,0.940790359233119,0.4572405017195292,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,2.0262656211853027
+356602,1,0.8170606662288354,0.4394694906555523,0.35034070611991114,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,2.008892059326172
+356602,2,0.11739768571107917,0.5165447305088826,0.7281031568859877,,,,,,,,,,,,,2.008892059326172
+356603,0,-0.03493941435979663,-0.08020445270647089,0.3994061548106614,0.8007790647085149,0.8984862936387031,0.457405498335207,0.940790359233119,0.4572405017195292,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,2.008892059326172
+356603,1,0.14421538675261625,0.7958201309617158,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,2.096665620803833
+356603,2,0.019005240637814846,0.5165447305088826,1.8981360624757264,,,,,,,,,,,,,2.096665620803833
+359703,0,-1.0514831588785858,-1.460901963714797,-1.3289780031076046,0.358342850038242,1.149922669419116,0.17294631652479245,0.5758667003987075,0.2161851991690361,1.0889020930782853,0.36043714080320877,-0.5613165400266386,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,1.7749511003494263
+359703,1,-1.393716680621599,-1.520459031028347,-1.590035816431196,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.7780998945236206
+359703,2,-1.5552738805344144,-2.286080819877049,-1.9719727790903323,,,,,,,,,,,,,1.7780998945236206
+359704,0,1.207502940052057,0.14991179912825014,-0.3413299128685955,0.358342850038242,1.149922669419116,0.17294631652479245,0.5758667003987075,0.2161851991690361,1.0889020930782853,0.36043714080320877,-0.5613165400266386,-0.9718299928258278,0.49778314283978853,0.806708965813594,0.8737234706124865,1.7780998945236206
+359704,1,0.8170606662288354,-0.09505646980369299,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,0.18666033446788788
+359704,2,1.1013221364437225,-0.573365205752313,0.2780905008899343,,,,,,,,,,,,,0.18666033446788788
+360102,0,0.8686550252124604,0.6101443027976923,2.004334301449051,1.5381727558256364,0.7727681057484966,0.457405498335207,1.3057140180675306,1.9035723170224874,1.5827269944646125,0.9581833684000187,1.4045524206757267,0.28831555240026907,1.267782866548965,0.806708965813594,-0.6875644123724536,2.3417599201202393
+360102,1,0.14421538675261625,0.17220651042592966,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.3465776443481445
+360102,2,0.9045372462971938,1.995708215434791,1.718131000077305,,,,,,,,,,,,,2.3465776443481445
+360301,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,0.358342850038242,0.39561354207787724,1.026323861956036,0.940790359233119,1.1804064093710083,0.595077191691958,-0.835055314390411,-1.3476641243075844,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-1.133646664653865,1.9232232570648193
+360301,1,-0.14414687588004912,-0.09505646980369299,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.456284761428833
+360301,2,-0.5713494298017712,0.04944047211122737,-0.17192215510611902,,,,,,,,,,,,,1.456284761428833
+360303,0,-0.8255845489855216,-1.230785711880076,-1.0820659805478523,0.358342850038242,0.39561354207787724,1.026323861956036,0.940790359233119,1.1804064093710083,0.595077191691958,-0.835055314390411,-1.3476641243075844,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,2.182210683822632
+360303,1,-1.201475172199822,-0.6295824302629383,-1.2836605760283897,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,2.1514432430267334
+360303,2,-0.27617209458197817,-0.41766378628642786,-0.5319322799029617,,,,,,,,,,,,,2.1514432430267334
+360901,0,-0.2608380242528609,-0.08020445270647089,0.2759501435307853,-0.37905084107887943,1.2756408573093225,0.457405498335207,0.4846357856901046,-0.26592540593194997,0.10125229030563083,-0.23730908679360116,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.9205257892608643
+360901,1,0.7209399120179469,0.17220651042592966,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.797853708267212
+360901,2,0.7077523561506651,0.1272911818441699,0.368093032089145,,,,,,,,,,,,,1.797853708267212
+360903,0,-0.03493941435979663,-0.8856113341279945,-0.7116979467082238,-0.37905084107887943,1.2756408573093225,0.457405498335207,0.4846357856901046,-0.26592540593194997,0.10125229030563083,-0.23730908679360116,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,1.620093584060669
+360903,1,-0.04802612166916067,-0.09505646980369299,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.6910876035690308
+360903,2,0.11739768571107917,-0.2619623668205428,-0.6219348111021723,,,,,,,,,,,,,1.6910876035690308
+361101,0,0.529807110372864,-0.8856113341279945,-0.8351539579881,0.5058215882616662,0.1441771662974643,0.17294631652479245,0.5758667003987075,0.6982958042700221,0.595077191691958,-0.23730908679360116,0.6182048363947807,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.2931275367736816
+361101,1,0.8170606662288354,0.08311885034938876,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.2545337677001953
+361101,2,0.31418257585760784,0.20514189157711243,-0.26192468630532967,,,,,,,,,,,,,2.2545337677001953
+361102,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,0.5058215882616662,0.1441771662974643,0.17294631652479245,0.5758667003987075,0.6982958042700221,0.595077191691958,-0.23730908679360116,0.6182048363947807,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.2545337677001953
+361102,1,-0.528629892723603,1.0630831111913384,0.5545908663884488,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.973534107208252
+361102,2,-0.27617209458197817,0.43869402077594005,0.18808796969072364,,,,,,,,,,,,,1.973534107208252
+361301,0,-0.2608380242528609,-0.1952625786238314,0.029038120971032973,1.2432152793787876,1.401359045199529,1.026323861956036,0.8495594445245161,0.3367128504442826,0.2658605907677399,-0.23730908679360116,-1.740837916448057,1.1284125825510003,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.9892631769180298
+361301,1,0.4325776493852816,0.4394694906555523,0.35034070611991114,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,2.09648060798645
+361301,2,0.6093599110774008,0.7500968597077102,-0.08191962390690835,,,,,,,,,,,,,2.09648060798645
+362602,0,-0.5996859390924573,-1.1157275859627156,-0.9586099692679761,0.06338537359139342,1.0242044815289095,0.7418646801456215,1.2144831033589276,0.15592137353141286,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.0422163045785646,0.806708965813594,0.20460009219036931,1.4595760107040405
+362602,1,-0.4325091385127145,-1.6986343511814288,-0.36453485481997044,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,1.640062928199768
+362602,2,0.6093599110774008,-0.8847680446840831,0.008082907292302316,,,,,,,,,,,,,1.640062928199768
+364101,0,0.3039085004797998,1.1854349323844948,2.4981583465685557,0.6533003264850905,0.39561354207787724,0.17294631652479245,-0.61013519081313,0.6982958042700221,0.10125229030563083,0.36043714080320877,-0.5613165400266386,0.28831555240026907,-1.812216028287741,-0.2910724881500066,0.8737234706124865,2.386503219604492
+364101,1,0.7209399120179469,1.2412584313444202,0.963091186925524,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.5333211421966553
+364101,2,-0.37456453965524245,0.8279475694406527,1.988138593674937,,,,,,,,,,,,,1.5333211421966553
+365001,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,0.06338537359139342,0.2698953541876708,-0.1115128652856221,0.4846357856901046,1.602253188834371,-0.3925726110806964,0.9581833684000187,1.7977262128162,0.28831555240026907,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.5726954936981201
+365001,1,-1.0092336637780452,-0.80775775041602,-0.36453485481997044,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,1.6208003759384155
+365001,2,-0.7681343199482997,-0.573365205752313,-0.17192215510611902,,,,,,,,,,,,,1.6208003759384155
+365002,0,-0.5996859390924573,-0.5404369563759129,-0.4647859241484716,0.06338537359139342,0.2698953541876708,-0.1115128652856221,0.4846357856901046,1.602253188834371,-0.3925726110806964,0.9581833684000187,1.7977262128162,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.6208003759384155
+365002,1,-0.14414687588004912,-0.9859330705691017,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.350102663040161
+365002,2,0.2157901307843435,-0.6512159154852555,0.368093032089145,,,,,,,,,,,,,2.350102663040161
+365502,0,-0.14788871930632877,-0.08020445270647089,-0.3413299128685955,-0.37905084107887943,-1.3644410883850133,-0.3959720470960366,0.11971212685569313,0.3367128504442826,-0.5571809115428055,-0.23730908679360116,1.0113786285352542,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.4645232862317478,2.1316261291503906
+365502,1,-0.4325091385127145,0.08311885034938876,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.8498271703720093
+365502,2,-0.37456453965524245,0.04944047211122737,1.178115812882041,,,,,,,,,,,,,1.8498271703720093
+366101,0,-0.5996859390924573,0.2649699250456107,0.15249413225090913,-0.37905084107887943,0.2698953541876708,0.457405498335207,-0.42767336139592416,-0.14539775465670343,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,0.7083640674756347,1.267782866548965,0.806708965813594,-0.6875644123724536,1.7194336652755737
+366101,1,0.33645689517439314,0.17220651042592966,0.24821562598564237,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,1.7525019645690918
+366101,2,-0.1777796495087138,-0.4955144960193704,-0.7119373423013831,,,,,,,,,,,,,1.7525019645690918
+366301,0,0.3039085004797998,-0.42537883045855246,-0.5882419354283478,0.6533003264850905,0.7727681057484966,0.457405498335207,1.3969449327761334,1.6625170144719943,1.7473352949267216,0.36043714080320877,-0.16814274788616518,0.28831555240026907,1.267782866548965,1.9044904197771946,0.8737234706124865,2.316704034805298
+366301,1,1.6821474541268315,-0.2732317899567748,-0.7730351753570456,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.440580129623413
+366301,2,1.4948919167367798,-0.729066625218198,0.008082907292302316,,,,,,,,,,,,,2.440580129623413
+367701,0,0.19095919553326762,-0.770553208210634,-0.3413299128685955,1.0957365411553635,1.149922669419116,1.026323861956036,1.4881758474847362,0.9393511068205153,2.07655189585094,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,1.9044904197771946,3.104134732019544,2.5150914192199707
+367701,1,0.33645689517439314,-0.00596880972715211,0.04396546571710477,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.059714660367144415,2.4513912200927734
+367701,2,0.11739768571107917,0.1272911818441699,0.8181056880851983,,,,,,,,,,,,,2.4513912200927734
+367702,0,0.9816043301589925,0.3800280509629712,-0.2178739015887193,1.0957365411553635,1.149922669419116,1.026323861956036,1.4881758474847362,0.9393511068205153,2.07655189585094,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,1.267782866548965,1.9044904197771946,-0.018441033950336395,2.695869207382202
+367702,1,0.4325776493852816,0.17220651042592966,0.6567159465227176,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.4419600012801827,1.9582409858703613
+367702,2,1.1997145815169867,0.43869402077594005,0.45809556328835566,,,,,,,,,,,,,1.9582409858703613
+367901,0,0.529807110372864,-1.000669460045355,-0.8351539579881,0.06338537359139342,0.2698953541876708,1.026323861956036,1.3057140180675306,1.4214617119215014,0.9242937926161762,1.5559295959968287,0.22503104425430823,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.00026273727417
+367901,1,-0.7208714011453798,-0.9859330705691017,1.371591507462599,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.8131392002105713
+367901,2,-0.27617209458197817,0.6722461499747677,0.9981107504836196,,,,,,,,,,,,,1.8131392002105713
+369701,0,-0.37378732919939306,-0.770553208210634,-0.5882419354283478,-0.08409336463203088,-1.2387229004948068,-1.2493495925272802,1.3969449327761334,-1.4712019186844152,-0.8863975124670236,-0.835055314390411,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.24148216009104212,0.546037495136261
+369701,1,0.14421538675261625,-0.4514071101098565,-1.1815354958941209,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,0.4208196699619293
+369701,2,0.2157901307843435,-0.41766378628642786,-0.981944935899015,,,,,,,,,,,,,0.4208196699619293
+369704,0,-1.164432463825118,-0.5404369563759129,-0.7116979467082238,-0.08409336463203088,-1.2387229004948068,-1.2493495925272802,1.3969449327761334,-1.4712019186844152,-0.8863975124670236,-0.835055314390411,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,0.006005931179970503
+369704,1,-0.6247506469344914,0.6176448108086341,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,0.14306415617465973
+369704,2,-0.8665267650215641,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,0.14306415617465973
+370502,0,-0.2608380242528609,-0.08020445270647089,-0.3413299128685955,0.9482578029319392,0.7727681057484966,1.3107830437664505,0.6670976151073104,0.7585596299076455,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,0.28831555240026907,0.49778314283978853,1.9044904197771946,0.20460009219036931,2.3928020000457764
+370502,1,-0.528629892723603,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.951032042503357
+370502,2,-0.1777796495087138,0.5165447305088826,0.008082907292302316,,,,,,,,,,,,,1.951032042503357
+371501,0,-0.48673663414592516,-1.000669460045355,-0.8351539579881,1.5381727558256364,1.0242044815289095,1.3107830437664505,1.3969449327761334,1.0598787580957618,0.595077191691958,0.9581833684000187,-0.16814274788616518,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.8737234706124865,1.4690967798233032
+371501,1,-0.528629892723603,-0.3623194500333156,0.963091186925524,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,1.7570639848709106
+371501,2,0.6093599110774008,-0.33981307655348536,0.8181056880851983,,,,,,,,,,,,,1.7570639848709106
+371502,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,1.5381727558256364,1.0242044815289095,1.3107830437664505,1.3969449327761334,1.0598787580957618,0.595077191691958,0.9581833684000187,-0.16814274788616518,1.1284125825510003,1.267782866548965,-0.2910724881500066,-0.4645232862317478,1.7570639848709106
+371502,1,-0.8169921553562683,-0.7186700903394792,0.24821562598564237,,,,,,,,,,1.663413533782179,0.7456311526478686,0.19112267045651915,1.310645580291748
+371502,2,0.31418257585760784,0.20514189157711243,0.908108219284409,,,,,,,,,,,,,1.310645580291748
+371902,0,0.19095919553326762,0.14991179912825014,0.6463181773704137,-0.23157210285545515,0.1441771662974643,-0.6804312289064511,-0.7013661055217327,-0.4467168828448197,0.10125229030563083,0.36043714080320877,-1.3476641243075844,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,0.7557929158210754
+371902,1,-0.24026763009093757,-0.3623194500333156,-0.36453485481997044,,,,,,,,,,0.2373400917434395,1.8141914255436393,1.1944719937511734,0.9921917915344238
+371902,2,-0.9649192100948284,-0.18411165708760024,-0.26192468630532967,,,,,,,,,,,,,0.9921917915344238
+372602,0,1.4334015499451211,-0.08020445270647089,-0.2178739015887193,0.358342850038242,1.2756408573093225,1.026323861956036,1.2144831033589276,0.3367128504442826,0.430468891229849,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.3459150791168213
+372602,1,-0.7208714011453798,-0.3623194500333156,-0.568785015088508,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.4317307472229004
+372602,2,-0.27617209458197817,-0.33981307655348536,-0.7119373423013831,,,,,,,,,,,,,2.4317307472229004
+372903,0,-1.27738176877165,-1.6910182155495181,-1.575890025667357,0.2108641118148177,0.7727681057484966,0.457405498335207,-0.33644244668732126,-0.5672445341200663,0.430468891229849,0.9581833684000187,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.6481906771659851
+372903,1,-1.4898374348324874,-1.431371370951806,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,0.4209933280944824
+372903,2,-1.8504512157542075,-0.573365205752313,-0.5319322799029617,,,,,,,,,,,,,0.4209933280944824
+373602,0,2.1110973796243138,0.14991179912825014,-0.4647859241484716,0.5058215882616662,1.0242044815289095,1.026323861956036,0.8495594445245161,0.2161851991690361,0.430468891229849,0.36043714080320877,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.9859296083450317
+373602,1,1.3937851914941661,0.2612941705024705,1.882216908133943,,,,,,,,,,0.9503768127628092,-1.3914893931436731,1.1944719937511734,1.8328126668930054
+373602,2,1.6916768068833083,2.462812473832446,1.178115812882041,,,,,,,,,,,,,1.8328126668930054
+373701,0,-1.3903310737181822,-0.08020445270647089,-0.7116979467082238,0.8007790647085149,0.2698953541876708,0.17294631652479245,0.6670976151073104,0.5175043273571525,-0.3925726110806964,0.36043714080320877,0.6182048363947807,1.1284125825510003,1.267782866548965,0.806708965813594,-0.4645232862317478,2.2613625526428223
+373701,1,-0.14414687588004912,-0.9859330705691017,-0.05815961441716403,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,2.2412171363830566
+373701,2,-0.1777796495087138,-0.8069173349511406,-1.251952529496647,,,,,,,,,,,,,2.2412171363830566
+374001,0,-0.5996859390924573,0.9553186805497738,-0.4647859241484716,-0.674008317525728,-0.8615683368241874,-1.8182679561481092,-0.1539806172701155,-0.14539775465670343,-0.22796431061858732,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.235137939453125
+374001,1,-0.24026763009093757,-0.4514071101098565,-0.26240977468570165,,,,,,,,,,0.2373400917434395,2.88275169843941,-0.8122266528381351,1.6508764028549194
+374001,2,0.41257502093087217,0.282992601310055,0.2780905008899343,,,,,,,,,,,,,1.6508764028549194
+374002,0,0.8686550252124604,-0.08020445270647089,-0.5882419354283478,-0.674008317525728,-0.8615683368241874,-1.8182679561481092,-0.1539806172701155,-0.14539775465670343,-0.22796431061858732,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.6508764028549194
+374002,1,0.048094632541727786,0.2612941705024705,0.8609661067912552,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.310551991190808,1.6335792541503906
+374002,2,0.6093599110774008,-0.4955144960193704,-0.08191962390690835,,,,,,,,,,,,,1.6335792541503906
+374601,0,0.6427564153193962,0.4950861768803317,1.016686211210042,-0.8214870557491524,0.7727681057484966,-0.1115128652856221,0.028481212147090252,0.6380319786323989,-1.0510058129291326,-0.835055314390411,-1.3476641243075844,-1.8119270229765592,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.0023252964019775
+374601,1,0.9131814204397238,0.2612941705024705,-0.16028469455143282,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.8122266528381351,2.071876049041748
+374601,2,0.41257502093087217,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,2.071876049041748
+374603,0,0.3039085004797998,0.9553186805497738,1.3870542450496706,-0.8214870557491524,0.7727681057484966,-0.1115128652856221,0.028481212147090252,0.6380319786323989,-1.0510058129291326,-0.835055314390411,-1.3476641243075844,-1.8119270229765592,-1.0422163045785646,3.002271873740795,0.8737234706124865,2.3044207096099854
+374603,1,1.6821474541268315,1.6866967317271246,1.0652162670597927,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,2.7559139728546143
+374603,2,2.085246587176366,0.9836489889065378,0.45809556328835566,,,,,,,,,,,,,2.7559139728546143
+377002,0,-0.03493941435979663,-1.000669460045355,-0.8351539579881,0.5058215882616662,0.5213317299680837,0.7418646801456215,0.210943041564296,0.9393511068205153,0.2658605907677399,1.5559295959968287,1.4045524206757267,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.804591417312622
+377002,1,0.9131814204397238,-0.4514071101098565,0.24821562598564237,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.0588855743408203
+377002,2,-0.5713494298017712,-0.4955144960193704,0.18808796969072364,,,,,,,,,,,,,2.0588855743408203
+377103,0,-0.03493941435979663,-0.42537883045855246,-0.3413299128685955,1.0957365411553635,0.39561354207787724,1.026323861956036,1.1232521886503248,1.1804064093710083,1.5827269944646125,-0.23730908679360116,-1.3476641243075844,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.3846526145935059
+377103,1,-0.04802612166916067,0.17220651042592966,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.6207859516143799
+377103,2,-0.27617209458197817,1.5286039570371357,-0.08191962390690835,,,,,,,,,,,,,1.6207859516143799
+377201,0,-0.8255845489855216,-1.1157275859627156,-0.9586099692679761,0.2108641118148177,0.7727681057484966,0.7418646801456215,0.3934048709815018,0.6982958042700221,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.9718299928258278,0.49778314283978853,1.9044904197771946,0.20460009219036931,1.3550971746444702
+377201,1,-0.24026763009093757,-1.520459031028347,-0.46665993495423924,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.5613893220144716,1.437592625617981
+377201,2,0.2157901307843435,-1.1961708836158533,-0.441929748703751,,,,,,,,,,,,,1.437592625617981
+378601,0,-1.0514831588785858,1.1854349323844948,0.893230199930166,-0.5265295793023037,0.018458978407257843,0.17294631652479245,0.028481212147090252,-0.9288274879458058,-0.7217892120049145,-0.835055314390411,-0.16814274788616518,1.9685096127017316,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.9674564599990845
+378601,1,0.52869840359617,0.7958201309617158,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.8467730283737183
+378601,2,-0.07938720443544948,0.20514189157711243,0.5480980944875663,,,,,,,,,,,,,1.8467730283737183
+379002,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-0.23157210285545515,-0.2329773973731551,0.457405498335207,-0.8838279349389385,-0.6877721853953127,0.2658605907677399,-0.835055314390411,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.0226292610168457
+379002,1,0.52869840359617,-0.7186700903394792,0.24821562598564237,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.792592167854309
+379002,2,-0.1777796495087138,-0.6512159154852555,0.368093032089145,,,,,,,,,,,,,1.792592167854309
+379103,0,1.6593001598381854,0.14991179912825014,0.15249413225090913,1.390694017602212,0.8984862936387031,0.7418646801456215,1.4881758474847362,0.7585596299076455,1.2535103935403944,0.9581833684000187,-0.5613165400266386,1.548461097626366,1.267782866548965,0.806708965813594,1.7658879751753094,2.995732307434082
+379103,1,1.1054229288615007,0.5285571507320932,1.1673413471940615,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.702275276184082
+379103,2,1.4948919167367798,1.295051827838308,0.638100625686777,,,,,,,,,,,,,2.702275276184082
+379701,0,0.3039085004797998,-0.08020445270647089,-0.4647859241484716,1.390694017602212,1.149922669419116,0.7418646801456215,0.4846357856901046,0.9996149324581385,0.9242937926161762,-0.23730908679360116,0.6182048363947807,-2.2319755380519246,0.49778314283978853,1.9044904197771946,3.104134732019544,2.0105955600738525
+379701,1,0.2403361409635047,0.17220651042592966,0.8609661067912552,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.3077685832977295
+379701,2,-0.1777796495087138,1.2172011181053655,0.7281031568859877,,,,,,,,,,,,,2.3077685832977295
+379801,0,0.9816043301589925,3.256481198896984,2.004334301449051,0.5058215882616662,0.1441771662974643,0.457405498335207,1.3057140180675306,1.843308491384864,0.10125229030563083,0.36043714080320877,1.4045524206757267,-0.13173296267509654,1.267782866548965,0.806708965813594,0.8737234706124865,2.2294747829437256
+379801,1,0.4325776493852816,2.3103103522629107,1.371591507462599,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.463927745819092
+379801,2,0.019005240637814846,1.0614996986394805,0.45809556328835566,,,,,,,,,,,,,2.463927745819092
+380401,0,1.0945536351055247,-0.1952625786238314,-0.09441789030884316,1.6856514940490606,1.401359045199529,0.457405498335207,0.6670976151073104,0.2161851991690361,1.2535103935403944,0.9581833684000187,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,1.64962637424469
+380401,1,0.2403361409635047,0.7958201309617158,0.24821562598564237,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.056382656097412
+380401,2,0.6093599110774008,1.606454666770078,2.1681436560733585,,,,,,,,,,,,,2.056382656097412
+381201,0,1.7722494647847176,0.6101443027976923,2.1277903127289273,2.1280877087193333,1.401359045199529,1.3107830437664505,1.3969449327761334,1.9638361426601105,2.07655189585094,1.5559295959968287,1.7977262128162,1.9685096127017316,1.267782866548965,0.806708965813594,0.8737234706124865,2.995732307434082
+381201,1,0.9131814204397238,1.2412584313444202,2.086467068402481,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,2.158076763153076
+381201,2,0.7077523561506651,0.9057982791735953,1.6281284688780944,,,,,,,,,,,,,2.158076763153076
+381903,0,-0.9385338539320537,-0.3103207045411919,-0.09441789030884316,-1.1164445321960008,-1.2387229004948068,-0.6804312289064511,-0.8838279349389385,-0.8685636623081825,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-1.3566877907945707,1.102951169013977
+381903,1,-0.6247506469344914,0.08311885034938876,-0.36453485481997044,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,1.7378169298171997
+381903,2,0.5109674660041365,-0.4955144960193704,-0.17192215510611902,,,,,,,,,,,,,1.7378169298171997
+381904,0,0.6427564153193962,0.03485367321088963,0.15249413225090913,-1.1164445321960008,-1.2387229004948068,-0.6804312289064511,-0.8838279349389385,-0.8685636623081825,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-1.133646664653865,1.7378169298171997
+381904,1,0.6248191578070585,-0.2732317899567748,-0.05815961441716403,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,1.5590909719467163
+381904,2,-0.7681343199482997,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,1.5590909719467163
+384202,0,1.8851987697312496,0.7252024287150527,-0.09441789030884316,0.358342850038242,0.39561354207787724,0.7418646801456215,-0.8838279349389385,-0.26592540593194997,0.2658605907677399,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,-0.3430551588535309
+384202,1,1.5860266999159431,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,2.4486586478694914,-0.6713234186172485
+384202,2,1.593284361810044,1.606454666770078,1.6281284688780944,,,,,,,,,,,,,-0.6713234186172485
+385102,0,1.9981480746777818,0.6101443027976923,0.15249413225090913,-0.23157210285545515,0.2698953541876708,0.457405498335207,0.3934048709815018,-1.4109380930467919,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,1.9572726488113403
+385102,1,0.33645689517439314,0.9739954511147976,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.19112267045651915,2.08242130279541
+385102,2,1.1013221364437225,-0.33981307655348536,0.5480980944875663,,,,,,,,,,,,,2.08242130279541
+385301,0,2.336995989517378,1.875783687888658,1.6339662676094229,1.9806089704959091,0.8984862936387031,1.026323861956036,-0.33644244668732126,0.8188234555452687,1.9119435953888306,-0.835055314390411,-0.5613165400266386,1.1284125825510003,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.852005958557129
+385301,1,1.77826820833772,1.6866967317271246,2.1885921485367494,,,,,,,,,,1.663413533782179,-0.3229291202479022,2.197821317045828,2.0444176197052
+385301,2,1.7900692519565728,2.2292603446336186,3.068168968065465,,,,,,,,,,,,,2.0444176197052
+387702,0,2.336995989517378,2.4510743174754603,2.4981583465685557,0.6533003264850905,1.149922669419116,1.3107830437664505,1.3969449327761334,0.5777681529947757,1.0889020930782853,1.5559295959968287,1.4045524206757267,1.1284125825510003,-1.812216028287741,0.806708965813594,0.8737234706124865,2.523668050765991
+387702,1,1.2015436830723893,0.9739954511147976,0.963091186925524,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.5613893220144716,0.5763617157936096
+387702,2,1.3964994716635155,0.7500968597077102,0.638100625686777,,,,,,,,,,,,,0.5763617157936096
+388901,0,1.6593001598381854,0.03485367321088963,0.3994061548106614,0.6533003264850905,1.401359045199529,1.026323861956036,0.210943041564296,0.3367128504442826,0.7596854921540671,0.36043714080320877,-0.16814274788616518,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.24148216009104212,1.743966817855835
+388901,1,1.8743889625486083,1.1521707712678793,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.7368788719177246
+388901,2,0.8061448012239295,1.0614996986394805,0.45809556328835566,,,,,,,,,,,,,1.7368788719177246
+389904,0,0.7557057202659283,0.2649699250456107,0.5228621660905376,0.5058215882616662,0.6470499178582901,1.026323861956036,1.2144831033589276,0.8188234555452687,-0.06335601015647824,-0.23730908679360116,1.4045524206757267,0.28831555240026907,1.267782866548965,0.806708965813594,0.20460009219036931,2.757091760635376
+389904,1,1.4899059457050545,1.2412584313444202,1.4737165875968679,,,,,,,,,,1.663413533782179,0.7456311526478686,2.197821317045828,2.814704179763794
+389904,2,1.3964994716635155,0.43869402077594005,0.5480980944875663,,,,,,,,,,,,,2.814704179763794
+391301,0,0.6427564153193962,0.8402605546324132,1.8808782901691752,1.2432152793787876,0.8984862936387031,1.026323861956036,0.210943041564296,0.3969766760819059,2.07655189585094,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,2.4296512603759766
+391301,1,1.8743889625486083,0.3503818305790114,1.1673413471940615,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,2.647099018096924
+391301,2,1.298107026590251,-0.18411165708760024,0.45809556328835566,,,,,,,,,,,,,2.647099018096924
+391801,0,2.336995989517378,1.5306093101365763,2.2512463240088034,2.1280877087193333,1.401359045199529,1.3107830437664505,0.8495594445245161,0.6982958042700221,2.07655189585094,0.9581833684000187,-0.9544903321671111,0.7083640674756347,1.267782866548965,1.9044904197771946,0.20460009219036931,2.5554604530334473
+391801,1,2.835596504657493,0.5285571507320932,1.1673413471940615,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.2843964099884033
+391801,2,3.167563482982273,1.5286039570371357,2.0781411248741475,,,,,,,,,,,,,2.2843964099884033
+392201,0,2.224046684570846,3.0263649470622633,2.3747023352886796,1.2432152793787876,1.401359045199529,1.026323861956036,0.210943041564296,-0.08513392901908017,1.0889020930782853,1.5559295959968287,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,1.7658879751753094,1.8687939643859863
+392201,1,1.2015436830723893,2.22122269218637,1.882216908133943,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,1.8571891784667969
+392201,2,0.5109674660041365,0.9057982791735953,0.7281031568859877,,,,,,,,,,,,,1.8571891784667969
+392301,0,1.4334015499451211,0.9553186805497738,0.3994061548106614,0.8007790647085149,0.39561354207787724,-0.1115128652856221,0.4846357856901046,-0.20566158029432668,0.9242937926161762,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,1.267782866548965,-0.2910724881500066,1.7658879751753094,2.6046924591064453
+392301,1,-0.14414687588004912,0.17220651042592966,0.24821562598564237,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.6961466553985005,2.379566192626953
+392301,2,1.298107026590251,1.2172011181053655,0.8181056880851983,,,,,,,,,,,,,2.379566192626953
+392302,0,1.7722494647847176,1.3004930583018552,-0.09441789030884316,0.8007790647085149,0.39561354207787724,-0.1115128652856221,0.4846357856901046,-0.20566158029432668,0.9242937926161762,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,0.49778314283978853,0.806708965813594,1.7658879751753094,2.379566192626953
+392302,1,1.970509716759497,0.7958201309617158,0.45246578625417994,,,,,,,,,,-1.1887333502953,-1.3914893931436731,2.197821317045828,2.6233017444610596
+392302,2,1.7900692519565728,1.9178575057018483,2.7081588432686226,,,,,,,,,,,,,2.6233017444610596
+394402,0,-0.8255845489855216,-0.5404369563759129,-0.5882419354283478,-1.1164445321960008,-0.9872865247143939,-1.5338087743376947,-1.8873679967335701,-0.5672445341200663,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.03350917249917984
+394402,1,-1.2975959264107106,-0.2732317899567748,0.35034070611991114,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,-0.6931471824645996
+394402,2,-0.7681343199482997,-0.4955144960193704,-0.08191962390690835,,,,,,,,,,,,,-0.6931471824645996
+395301,0,0.8686550252124604,-0.42537883045855246,-0.09441789030884316,0.358342850038242,-1.4901592762752198,0.17294631652479245,0.4846357856901046,0.3969766760819059,1.0889020930782853,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.4882946014404297
+395301,1,0.6248191578070585,-0.7186700903394792,-1.2836605760283897,,,,,,,,,,-1.1887333502953,2.88275169843941,-0.8122266528381351,2.3939902782440186
+395301,2,-0.07938720443544948,-0.41766378628642786,0.008082907292302316,,,,,,,,,,,,,2.3939902782440186
+395303,0,-0.7126352440389895,-0.3103207045411919,-0.4647859241484716,0.358342850038242,-1.4901592762752198,0.17294631652479245,0.4846357856901046,0.3969766760819059,1.0889020930782853,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-1.133646664653865,2.6311542987823486
+395303,1,0.048094632541727786,3.7357129134875646,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,1.9712965488433838
+395303,2,-0.4729569847285068,0.9057982791735953,0.09808543849151298,,,,,,,,,,,,,1.9712965488433838
+395304,0,-0.2608380242528609,-0.1952625786238314,-0.5882419354283478,0.358342850038242,-1.4901592762752198,0.17294631652479245,0.4846357856901046,0.3969766760819059,1.0889020930782853,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.9712965488433838
+395304,1,0.048094632541727786,-0.6295824302629383,0.35034070611991114,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.8122266528381351,2.4788014888763428
+395304,2,-0.1777796495087138,-1.1183201738829107,0.008082907292302316,,,,,,,,,,,,,2.4788014888763428
+396401,0,-0.2608380242528609,-0.42537883045855246,-0.3413299128685955,1.2432152793787876,1.149922669419116,1.026323861956036,0.940790359233119,1.2406702350086316,1.2535103935403944,1.5559295959968287,1.7977262128162,1.1284125825510003,1.267782866548965,0.806708965813594,0.20460009219036931,2.3854928016662598
+396401,1,0.8170606662288354,0.7067324708851749,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.533055305480957
+396401,2,0.9045372462971938,1.2172011181053655,0.09808543849151298,,,,,,,,,,,,,2.533055305480957
+396402,0,1.5463508548916531,-0.3103207045411919,-0.2178739015887193,1.2432152793787876,1.149922669419116,1.026323861956036,0.940790359233119,1.2406702350086316,1.2535103935403944,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,0.806708965813594,0.8737234706124865,2.533055305480957
+396402,1,0.9131814204397238,-0.7186700903394792,-0.36453485481997044,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.5320653915405273
+396402,2,0.41257502093087217,-0.729066625218198,-0.35192721750454037,,,,,,,,,,,,,2.5320653915405273
+397201,0,2.1110973796243138,1.7607255619712974,0.7697741886502898,0.9482578029319392,1.0242044815289095,1.3107830437664505,1.3057140180675306,0.9393511068205153,0.595077191691958,-0.835055314390411,1.0113786285352542,0.7083640674756347,0.49778314283978853,0.806708965813594,0.8737234706124865,1.5515949726104736
+397201,1,1.77826820833772,0.7958201309617158,0.24821562598564237,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,1.5729546546936035
+397201,2,0.8061448012239295,0.5943954402418251,1.0881132816828303,,,,,,,,,,,,,1.5729546546936035
+399502,0,0.8686550252124604,2.3360161915581,1.6339662676094229,-0.5265295793023037,-0.7358501489339809,-0.1115128652856221,0.11971212685569313,-0.14539775465670343,-0.7217892120049145,-0.23730908679360116,1.4045524206757267,-1.8119270229765592,-2.5822157519969178,0.806708965813594,-0.24148216009104212,1.8687939643859863
+399502,1,1.3937851914941661,0.8849077910382567,1.882216908133943,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.0630639836617988,2.2894840240478516
+399502,2,-0.07938720443544948,0.7500968597077102,0.368093032089145,,,,,,,,,,,,,2.2894840240478516
+400202,0,0.529807110372864,0.4950861768803317,2.2512463240088034,-1.2639232704194252,-0.35869558526336154,0.7418646801456215,1.2144831033589276,0.8188234555452687,0.430468891229849,0.9581833684000187,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.666351318359375
+400202,1,0.6248191578070585,1.330346091420961,1.6779667478654055,,,,,,,,,,-1.1887333502953,-1.3914893931436731,1.1944719937511734,0.7907203435897827
+400202,2,0.5109674660041365,0.8279475694406527,1.3581208752804623,,,,,,,,,,,,,0.7907203435897827
+401902,0,1.9981480746777818,2.105899939723379,1.1401422224899183,1.6856514940490606,1.149922669419116,1.026323861956036,1.2144831033589276,0.5175043273571525,1.9119435953888306,0.9581833684000187,0.22503104425430823,1.548461097626366,-0.27221658086938805,0.806708965813594,1.7658879751753094,2.8181228637695312
+401902,1,1.3937851914941661,2.4884856724159925,1.882216908133943,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,2.989089250564575
+401902,2,1.3964994716635155,1.6843053765030207,2.528153780870201,,,,,,,,,,,,,2.989089250564575
+402301,0,0.3039085004797998,1.4155511842192159,1.8808782901691752,1.6856514940490606,1.0242044815289095,1.026323861956036,1.4881758474847362,1.1804064093710083,1.7473352949267216,0.9581833684000187,0.6182048363947807,1.548461097626366,0.49778314283978853,0.806708965813594,0.20460009219036931,2.6204519271850586
+402301,1,0.6248191578070585,1.330346091420961,0.7588410266569864,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,2.6113314628601074
+402301,2,1.7900692519565728,1.2172011181053655,0.2780905008899343,,,,,,,,,,,,,2.6113314628601074
+403801,0,-0.03493941435979663,-0.3103207045411919,0.15249413225090913,-0.5265295793023037,0.1441771662974643,0.17294631652479245,-1.5224443378991586,-0.8685636623081825,-0.7217892120049145,0.9581833684000187,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,1.7658879751753094,2.034792423248291
+403801,1,-0.6247506469344914,-0.5404947701863974,0.24821562598564237,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.5737087726593018
+403801,2,-0.07938720443544948,-0.10626094735465771,-0.441929748703751,,,,,,,,,,,,,1.5737087726593018
+405002,0,1.5463508548916531,0.14991179912825014,0.893230199930166,0.06338537359139342,0.8984862936387031,1.3107830437664505,0.4846357856901046,1.0598787580957618,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,1.267782866548965,-0.2910724881500066,1.9889291013160153,2.26753830909729
+405002,1,0.6248191578070585,-0.18414412988023388,-0.46665993495423924,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.1929972171783447
+405002,2,1.1013221364437225,0.20514189157711243,-0.17192215510611902,,,,,,,,,,,,,2.1929972171783447
+406503,0,0.3039085004797998,0.6101443027976923,0.15249413225090913,0.2108641118148177,0.2698953541876708,1.3107830437664505,-0.2452115319787184,-0.08513392901908017,0.2658605907677399,-2.030547769584031,-1.3476641243075844,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.2362797260284424
+406503,1,0.2403361409635047,0.7067324708851749,1.371591507462599,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,2.197821317045828,2.506270170211792
+406503,2,-0.07938720443544948,0.20514189157711243,-0.08191962390690835,,,,,,,,,,,,,2.506270170211792
+407101,0,1.9981480746777818,0.14991179912825014,0.029038120971032973,-1.2639232704194252,-1.3644410883850133,-0.1115128652856221,-0.9750588496475414,-0.3261892315695732,-0.7217892120049145,-0.23730908679360116,1.0113786285352542,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-1.133646664653865,1.8768951892852783
+407101,1,0.52869840359617,0.3503818305790114,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,1.2309811115264893
+407101,2,-0.07938720443544948,-0.10626094735465771,0.008082907292302316,,,,,,,,,,,,,1.2309811115264893
+407702,0,-0.7126352440389895,-0.1952625786238314,-0.09441789030884316,0.2108641118148177,0.8984862936387031,0.17294631652479245,1.4881758474847362,0.5175043273571525,1.5827269944646125,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,1.0660737752914429
+407702,1,-1.8743204516760412,-1.431371370951806,-1.6921608965654649,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,0.8419532775878906
+407702,2,-0.7681343199482997,-1.1961708836158533,-1.0719474670982256,,,,,,,,,,,,,0.8419532775878906
+409501,0,2.44994529446391,0.2649699250456107,0.5228621660905376,0.2108641118148177,0.1441771662974643,1.026323861956036,1.2144831033589276,1.0598787580957618,1.9119435953888306,0.36043714080320877,-1.3476641243075844,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.018441033950336395,-0.19010883569717407
+409501,1,0.2403361409635047,1.5976090716505837,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.9676480293273926
+409501,2,1.593284361810044,0.8279475694406527,0.9981107504836196,,,,,,,,,,,,,2.9676480293273926
+410801,0,-0.37378732919939306,-0.42537883045855246,-0.4647859241484716,0.8007790647085149,0.6470499178582901,0.457405498335207,0.11971212685569313,0.6380319786323989,0.595077191691958,1.5559295959968287,1.7977262128162,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.7181367874145508
+410801,1,-0.33638838430182605,-0.80775775041602,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,1.8166335821151733
+410801,2,0.41257502093087217,-0.18411165708760024,0.368093032089145,,,,,,,,,,,,,1.8166335821151733
+410902,0,0.07800989058673549,1.3004930583018552,0.6463181773704137,1.390694017602212,0.7727681057484966,0.7418646801456215,0.028481212147090252,0.15592137353141286,1.9119435953888306,-0.835055314390411,-0.5613165400266386,0.28831555240026907,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.6708627939224243
+410902,1,0.4325776493852816,0.8849077910382567,0.6567159465227176,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.6642892360687256
+410902,2,0.8061448012239295,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,1.6642892360687256
+411001,0,0.07800989058673549,-0.3103207045411919,0.5228621660905376,0.2108641118148177,-0.35869558526336154,0.17294631652479245,-0.42767336139592416,-0.08513392901908017,-1.0510058129291326,0.9581833684000187,0.22503104425430823,-1.8119270229765592,0.49778314283978853,0.806708965813594,0.8737234706124865,0.610198974609375
+411001,1,-0.24026763009093757,-0.18414412988023388,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,-0.3973500728607178
+411001,2,-0.37456453965524245,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,-0.3973500728607178
+411002,0,-0.37378732919939306,-0.770553208210634,-0.8351539579881,0.2108641118148177,-0.35869558526336154,0.17294631652479245,-0.42767336139592416,-0.08513392901908017,-1.0510058129291326,0.9581833684000187,0.22503104425430823,-1.8119270229765592,0.49778314283978853,-1.388853942113607,-0.24148216009104212,0.5800528526306152
+411002,1,0.048094632541727786,-0.3623194500333156,-0.568785015088508,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.19112267045651915,1.820347547531128
+411002,2,-0.27617209458197817,-0.729066625218198,0.18808796969072364,,,,,,,,,,,,,1.820347547531128
+412301,0,-0.8255845489855216,-0.3103207045411919,-0.09441789030884316,-0.37905084107887943,-1.4901592762752198,-1.5338087743376947,-2.069829826150776,-1.3506742674091685,-0.7217892120049145,0.36043714080320877,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-1.133646664653865,0.7248023152351379
+412301,1,-1.0092336637780452,-0.6295824302629383,-0.8751602554913144,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,0.19906748831272125
+412301,2,-1.0633116551680928,-0.8847680446840831,-0.26192468630532967,,,,,,,,,,,,,0.19906748831272125
+412302,0,0.4168578054263319,-0.42537883045855246,-0.2178739015887193,-0.37905084107887943,-1.4901592762752198,-1.5338087743376947,-2.069829826150776,-1.3506742674091685,-0.7217892120049145,0.36043714080320877,-1.3476641243075844,-0.5517814777504622,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.012588620185852
+412302,1,0.048094632541727786,-1.0750207306456427,0.14609054585137357,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,0.7100828886032104
+412302,2,0.31418257585760784,-0.6512159154852555,-0.981944935899015,,,,,,,,,,,,,0.7100828886032104
+413302,0,0.6427564153193962,0.03485367321088963,-0.4647859241484716,-0.674008317525728,-0.7358501489339809,-2.102727137958524,-1.7049061673163644,-1.1698827904962987,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,2.51191782951355
+413302,1,0.6248191578070585,0.17220651042592966,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.2837376594543457
+413302,2,1.3964994716635155,0.1272911818441699,-0.8019398735005937,,,,,,,,,,,,,2.2837376594543457
+413303,0,-0.03493941435979663,-0.3103207045411919,-3.0573621610258708,-0.674008317525728,-0.7358501489339809,-2.102727137958524,-1.7049061673163644,-1.1698827904962987,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.24148216009104212,2.365140438079834
+413303,1,-0.6247506469344914,-0.18414412988023388,-0.6709100952227768,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.2968735694885254
+413303,2,0.31418257585760784,-0.33981307655348536,-0.08191962390690835,,,,,,,,,,,,,2.2968735694885254
+413602,0,-0.37378732919939306,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-2.118750215726252,-2.102727137958524,-0.2452115319787184,-1.3506742674091685,-1.2156141133912417,-1.432801541987221,-1.3476641243075844,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,1.4455662965774536
+413602,1,-1.201475172199822,-1.0750207306456427,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.19112267045651915,1.309178113937378
+413602,2,0.11739768571107917,-0.8069173349511406,-0.5319322799029617,,,,,,,,,,,,,1.309178113937378
+414201,0,-0.14788871930632877,1.5306093101365763,0.15249413225090913,-0.8214870557491524,0.018458978407257843,0.17294631652479245,-0.9750588496475414,-0.748036011032936,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-1.133646664653865,-0.15278279781341553
+414201,1,0.4325776493852816,0.4394694906555523,1.5758416677311367,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.0959265232086182
+414201,2,-0.4729569847285068,0.43869402077594005,0.09808543849151298,,,,,,,,,,,,,1.0959265232086182
+414803,0,-0.48673663414592516,-0.8856113341279945,-0.7116979467082238,-0.9689657939725767,0.2698953541876708,-0.3959720470960366,0.3934048709815018,0.7585596299076455,0.2658605907677399,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,1.267782866548965,0.806708965813594,0.20460009219036931,2.0188655853271484
+414803,1,0.048094632541727786,0.5285571507320932,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.19112267045651915,1.9993517398834229
+414803,2,0.2157901307843435,1.3729025375712505,0.368093032089145,,,,,,,,,,,,,1.9993517398834229
+415403,0,-0.5996859390924573,0.7252024287150527,-0.09441789030884316,-0.23157210285545515,0.018458978407257843,1.026323861956036,0.028481212147090252,0.5777681529947757,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,0.28831555240026907,1.267782866548965,-0.2910724881500066,1.9889291013160153,2.995732307434082
+415403,1,0.33645689517439314,0.4394694906555523,0.5545908663884488,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,2.995732307434082
+415403,2,0.6093599110774008,0.6722461499747677,0.638100625686777,,,,,,,,,,,,,2.995732307434082
+416301,0,-0.14788871930632877,-0.770553208210634,-0.7116979467082238,0.358342850038242,0.8984862936387031,1.3107830437664505,-0.42767336139592416,0.2161851991690361,0.595077191691958,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,1.267782866548965,0.806708965813594,3.104134732019544,2.0854475498199463
+416301,1,0.33645689517439314,0.5285571507320932,1.0652162670597927,,,,,,,,,,1.663413533782179,-1.3914893931436731,0.4419600012801827,1.9101778268814087
+416301,2,1.1997145815169867,1.5286039570371357,0.7281031568859877,,,,,,,,,,,,,1.9101778268814087
+417003,0,0.529807110372864,0.8402605546324132,2.2512463240088034,1.5381727558256364,0.8984862936387031,-0.3959720470960366,0.5758667003987075,0.6982958042700221,1.0889020930782853,1.5559295959968287,1.4045524206757267,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.4645232862317478,2.3039286136627197
+417003,1,0.048094632541727786,1.419433751497502,0.8609661067912552,,,,,,,,,,-0.47569662927593015,1.8141914255436393,1.1944719937511734,2.893328905105591
+417003,2,-0.5713494298017712,0.5165447305088826,-0.35192721750454037,,,,,,,,,,,,,2.893328905105591
+417803,0,0.6427564153193962,-0.5404369563759129,-0.3413299128685955,-1.2639232704194252,-1.9930320278360456,-1.5338087743376947,-1.7049061673163644,-2.2546316519735177,-0.8863975124670236,-2.030547769584031,-0.9544903321671111,0.7083640674756347,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,-0.5100955963134766
+417803,1,-1.1053544179889336,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,-0.6931471824645996
+417803,2,-0.5713494298017712,-0.573365205752313,-0.8919424046998043,,,,,,,,,,,,,-0.6931471824645996
+418001,0,1.207502940052057,0.2649699250456107,0.15249413225090913,0.5058215882616662,0.5213317299680837,-0.9648904107168657,-0.42767336139592416,-0.38645305720719647,0.2658605907677399,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,-0.9106055385131593,1.3867257833480835
+418001,1,-0.14414687588004912,0.7067324708851749,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,1.5039221048355103
+418001,2,0.8061448012239295,0.6722461499747677,1.178115812882041,,,,,,,,,,,,,1.5039221048355103
+418002,0,-0.9385338539320537,-0.8856113341279945,-0.8351539579881,0.5058215882616662,0.5213317299680837,-0.9648904107168657,-0.42767336139592416,-0.38645305720719647,0.2658605907677399,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,1.5154399871826172
+418002,1,-0.4325091385127145,-0.00596880972715211,-0.8751602554913144,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.3139013144854623,1.568289875984192
+418002,2,-0.07938720443544948,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,1.568289875984192
+418003,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,0.5058215882616662,0.5213317299680837,-0.9648904107168657,-0.42767336139592416,-0.38645305720719647,0.2658605907677399,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,1.568289875984192
+418003,1,0.33645689517439314,-0.7186700903394792,-0.36453485481997044,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.6957805156707764
+418003,2,0.019005240637814846,-0.9626187544170256,-0.8019398735005937,,,,,,,,,,,,,1.6957805156707764
+418202,0,-0.2608380242528609,-0.1952625786238314,-0.09441789030884316,-1.2639232704194252,-0.6101319610437744,-0.3959720470960366,-0.61013519081313,0.4572405017195292,-0.8863975124670236,-0.23730908679360116,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.4645232862317478,2.2121410369873047
+418202,1,0.2403361409635047,-0.4514071101098565,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.1635935306549072
+418202,2,0.11739768571107917,-0.2619623668205428,1.0881132816828303,,,,,,,,,,,,,2.1635935306549072
+418602,0,0.19095919553326762,-0.42537883045855246,0.5228621660905376,1.0957365411553635,0.018458978407257843,0.457405498335207,-0.9750588496475414,1.120142583733385,1.2535103935403944,0.36043714080320877,1.7977262128162,1.1284125825510003,0.49778314283978853,0.806708965813594,0.20460009219036931,2.300654172897339
+418602,1,0.7209399120179469,0.4394694906555523,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.5585708618164062
+418602,2,0.31418257585760784,1.295051827838308,0.7281031568859877,,,,,,,,,,,,,2.5585708618164062
+419201,0,1.5463508548916531,-0.42537883045855246,-0.3413299128685955,0.9482578029319392,0.5213317299680837,0.457405498335207,0.7583285298159133,1.4817255375591245,1.9119435953888306,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,1.267782866548965,3.002271873740795,0.8737234706124865,2.995732307434082
+419201,1,0.7209399120179469,0.17220651042592966,0.04396546571710477,,,,,,,,,,1.663413533782179,1.8141914255436393,3.7028453019878094,2.995732307434082
+419201,2,0.2157901307843435,0.1272911818441699,0.18808796969072364,,,,,,,,,,,,,2.995732307434082
+419202,0,-0.8255845489855216,-0.42537883045855246,-0.09441789030884316,0.9482578029319392,0.5213317299680837,0.457405498335207,0.7583285298159133,1.4817255375591245,1.9119435953888306,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,2.211970227456721,2.995732307434082
+419202,1,-0.14414687588004912,-0.00596880972715211,0.5545908663884488,,,,,,,,,,0.2373400917434395,0.7456311526478686,3.7028453019878094,2.995732307434082
+419202,2,1.298107026590251,0.8279475694406527,1.5381259376788836,,,,,,,,,,,,,2.995732307434082
+420001,0,-0.8255845489855216,-0.1952625786238314,-0.3413299128685955,-0.674008317525728,-1.3644410883850133,-1.2493495925272802,-0.61013519081313,-0.4467168828448197,-0.7217892120049145,0.9581833684000187,1.0113786285352542,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,1.319805722893898,0.9975906014442444
+420001,1,-1.0092336637780452,-0.9859330705691017,-0.05815961441716403,,,,,,,,,,1.663413533782179,0.7456311526478686,-1.3139013144854623,1.7189950942993164
+420001,2,-0.5713494298017712,-0.9626187544170256,-1.3419550606958577,,,,,,,,,,,,,1.7189950942993164
+421205,0,-1.164432463825118,1.5306093101365763,2.1277903127289273,-0.08409336463203088,-0.7358501489339809,-0.3959720470960366,0.3934048709815018,-0.3261892315695732,-0.5571809115428055,-0.23730908679360116,1.7977262128162,-0.5517814777504622,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.3567883968353271
+421205,1,0.6248191578070585,2.3103103522629107,1.0652162670597927,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.2650938034057617
+421205,2,0.8061448012239295,0.9057982791735953,0.638100625686777,,,,,,,,,,,,,1.2650938034057617
+421901,0,1.6593001598381854,0.8402605546324132,1.5105102563295467,-0.9689657939725767,0.018458978407257843,-0.1115128652856221,0.210943041564296,0.2764490248066594,0.10125229030563083,-0.835055314390411,0.22503104425430823,0.7083640674756347,-1.0422163045785646,0.806708965813594,0.8737234706124865,0.9504891037940979
+421901,1,0.2403361409635047,1.2412584313444202,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.4498093128204346
+421901,2,-0.07938720443544948,0.43869402077594005,0.638100625686777,,,,,,,,,,,,,1.4498093128204346
+422002,0,0.6427564153193962,-0.08020445270647089,0.029038120971032973,0.2108641118148177,0.6470499178582901,0.17294631652479245,-0.06274970256151263,-0.748036011032936,-0.5571809115428055,0.9581833684000187,1.0113786285352542,-0.9718299928258278,0.49778314283978853,1.9044904197771946,-0.4645232862317478,2.1227493286132812
+422002,1,0.4325776493852816,0.08311885034938876,0.24821562598564237,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,-0.5868620276451111
+422002,2,0.2157901307843435,-0.10626094735465771,-0.35192721750454037,,,,,,,,,,,,,-0.5868620276451111
+422003,0,0.3039085004797998,-0.8856113341279945,-0.5882419354283478,0.2108641118148177,0.6470499178582901,0.17294631652479245,-0.06274970256151263,-0.748036011032936,-0.5571809115428055,0.9581833684000187,1.0113786285352542,-0.9718299928258278,0.49778314283978853,1.9044904197771946,-0.24148216009104212,-0.5868620276451111
+422003,1,0.2403361409635047,-0.5404947701863974,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.6927973321038463,1.1758886575698853
+422003,2,0.41257502093087217,0.1272911818441699,0.638100625686777,,,,,,,,,,,,,1.1758886575698853
+422301,0,-0.9385338539320537,-0.6554950822932735,-0.5882419354283478,-0.9689657939725767,0.5213317299680837,0.17294631652479245,-0.9750588496475414,-0.5069807084824429,0.10125229030563083,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.995732307434082
+422301,1,-1.1053544179889336,-0.00596880972715211,0.8609661067912552,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.19112267045651915,2.995732307434082
+422301,2,0.41257502093087217,0.9836489889065378,1.3581208752804623,,,,,,,,,,,,,2.995732307434082
+422401,0,0.4168578054263319,-0.08020445270647089,-0.8351539579881,0.8007790647085149,1.401359045199529,0.7418646801456215,1.2144831033589276,0.15592137353141286,1.0889020930782853,0.36043714080320877,0.22503104425430823,0.7083640674756347,0.49778314283978853,0.806708965813594,0.20460009219036931,2.995732307434082
+422401,1,0.4325776493852816,0.7958201309617158,0.6567159465227176,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.995732307434082
+422401,2,0.9045372462971938,1.5286039570371357,1.988138593674937,,,,,,,,,,,,,2.995732307434082
+422701,0,-0.14788871930632877,-0.3103207045411919,-0.09441789030884316,1.0957365411553635,1.0242044815289095,1.3107830437664505,0.7583285298159133,0.4572405017195292,1.0889020930782853,-0.23730908679360116,-0.5613165400266386,1.1284125825510003,1.267782866548965,0.806708965813594,1.7658879751753094,2.5399203300476074
+422701,1,0.4325776493852816,0.4394694906555523,-0.26240977468570165,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.7019448280334473
+422701,2,-0.37456453965524245,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,2.7019448280334473
+423102,0,-0.5996859390924573,-0.6554950822932735,-0.4647859241484716,0.06338537359139342,0.2698953541876708,1.026323861956036,-0.9750588496475414,-0.6877721853953127,-1.0510058129291326,-1.432801541987221,-1.740837916448057,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,3.104134732019544,0.5852506756782532
+423102,1,0.2403361409635047,-1.609546691104888,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,0.3044434189796448
+423102,2,0.41257502093087217,-0.8847680446840831,0.18808796969072364,,,,,,,,,,,,,0.3044434189796448
+423204,0,0.6427564153193962,-0.1952625786238314,0.2759501435307853,0.358342850038242,1.401359045199529,0.7418646801456215,0.028481212147090252,0.3367128504442826,-0.22796431061858732,1.5559295959968287,1.0113786285352542,1.1284125825510003,0.49778314283978853,-1.388853942113607,0.8737234706124865,1.1011650562286377
+423204,1,-0.33638838430182605,0.8849077910382567,0.6567159465227176,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.310551991190808,1.7029812335968018
+423204,2,-0.37456453965524245,0.5165447305088826,0.09808543849151298,,,,,,,,,,,,,1.7029812335968018
+423602,0,0.9816043301589925,1.3004930583018552,1.8808782901691752,1.5381727558256364,1.149922669419116,1.026323861956036,1.4881758474847362,0.5175043273571525,1.4181186940025035,0.9581833684000187,1.4045524206757267,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.0581302642822266
+423602,1,1.1054229288615007,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.1919236183166504
+423602,2,-0.07938720443544948,1.7621560862359633,0.2780905008899343,,,,,,,,,,,,,2.1919236183166504
+426204,0,0.19095919553326762,-0.42537883045855246,-0.7116979467082238,0.5058215882616662,0.2698953541876708,0.457405498335207,0.11971212685569313,-1.7725210468725314,-0.7217892120049145,0.9581833684000187,1.0113786285352542,-0.5517814777504622,0.49778314283978853,0.806708965813594,-0.018441033950336395,1.4177618026733398
+426204,1,0.14421538675261625,-0.7186700903394792,-0.7730351753570456,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.19112267045651915,1.258180022239685
+426204,2,-0.6697418748750354,-0.8847680446840831,-1.0719474670982256,,,,,,,,,,,,,1.258180022239685
+427002,0,-1.3903310737181822,-0.5404369563759129,-0.8351539579881,-0.674008317525728,-0.9872865247143939,0.17294631652479245,-2.069829826150776,-0.4467168828448197,-0.22796431061858732,1.5559295959968287,1.7977262128162,1.548461097626366,0.49778314283978853,-1.388853942113607,3.104134732019544,1.8667798042297363
+427002,1,-1.9704412058869298,-0.7186700903394792,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.6456503868103027
+427002,2,-1.161704100241357,-0.8847680446840831,0.09808543849151298,,,,,,,,,,,,,1.6456503868103027
+427003,0,-1.27738176877165,-0.770553208210634,-0.8351539579881,-0.674008317525728,-0.9872865247143939,0.17294631652479245,-2.069829826150776,-0.4467168828448197,-0.22796431061858732,1.5559295959968287,1.7977262128162,1.548461097626366,-0.27221658086938805,-0.2910724881500066,3.104134732019544,0.2308487594127655
+427003,1,-0.9131129095671567,-0.4514071101098565,-0.9772853356255832,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,0.40980395674705505
+427003,2,-0.1777796495087138,-0.6512159154852555,-0.441929748703751,,,,,,,,,,,,,0.40980395674705505
+428202,0,-0.03493941435979663,-0.1952625786238314,-0.4647859241484716,-0.5265295793023037,0.1441771662974643,0.17294631652479245,1.3969449327761334,0.035393722256166354,0.10125229030563083,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,2.1316261291503906
+428202,1,-0.9131129095671567,-0.18414412988023388,-0.568785015088508,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,2.1857995986938477
+428202,2,-0.37456453965524245,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,2.1857995986938477
+429001,0,0.529807110372864,0.4950861768803317,1.1401422224899183,1.2432152793787876,1.2756408573093225,1.026323861956036,0.6670976151073104,1.2406702350086316,2.07655189585094,0.36043714080320877,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.0590553283691406
+429001,1,1.0093021746506123,0.3503818305790114,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,3.7028453019878094,2.2547924518585205
+429001,2,1.298107026590251,0.282992601310055,-0.26192468630532967,,,,,,,,,,,,,2.2547924518585205
+429201,0,0.7557057202659283,1.875783687888658,2.1277903127289273,0.8007790647085149,0.2698953541876708,1.3107830437664505,0.210943041564296,0.4572405017195292,1.0889020930782853,1.5559295959968287,1.7977262128162,1.9685096127017316,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,2.2915284633636475
+429201,1,0.33645689517439314,1.419433751497502,1.5758416677311367,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,2.25608229637146
+429201,2,2.3804239223961585,1.8400067959689057,1.5381259376788836,,,,,,,,,,,,,2.25608229637146
+431901,0,-1.0514831588785858,-0.770553208210634,-0.4647859241484716,-0.08409336463203088,0.5213317299680837,0.457405498335207,0.5758667003987075,0.6982958042700221,0.2658605907677399,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,1.267782866548965,0.806708965813594,-0.24148216009104212,1.986107587814331
+431901,1,-1.585958189043376,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,1.663413533782179,-1.3914893931436731,0.4419600012801827,1.8892632722854614
+431901,2,-3.523122781999701,-1.8968272712123362,-2.151977841488754,,,,,,,,,,,,,1.8892632722854614
+432001,0,-0.2608380242528609,-0.3103207045411919,0.029038120971032973,0.2108641118148177,0.018458978407257843,0.7418646801456215,0.6670976151073104,0.3969766760819059,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,1.1284125825510003,1.267782866548965,0.806708965813594,0.20460009219036931,2.237460136413574
+432001,1,0.9131814204397238,0.2612941705024705,0.45246578625417994,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,2.0188655853271484
+432001,2,-0.1777796495087138,0.20514189157711243,-1.521960123094279,,,,,,,,,,,,,2.0188655853271484
+432303,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.08409336463203088,0.5213317299680837,0.457405498335207,-0.33644244668732126,0.09565754789378961,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-1.8119270229765592,0.49778314283978853,-0.2910724881500066,3.104134732019544,1.3856761455535889
+432303,1,-1.2975959264107106,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.6927973321038463,1.3697717189788818
+432303,2,-0.9649192100948284,-0.6512159154852555,0.5480980944875663,,,,,,,,,,,,,1.3697717189788818
+432304,0,1.8851987697312496,-0.42537883045855246,-0.7116979467082238,-0.08409336463203088,0.5213317299680837,0.457405498335207,-0.33644244668732126,0.09565754789378961,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.018441033950336395,1.3697717189788818
+432304,1,0.2403361409635047,-0.2732317899567748,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,1.4837558269500732
+432304,2,1.0029296913704582,0.1272911818441699,-0.441929748703751,,,,,,,,,,,,,1.4837558269500732
+433701,0,-0.7126352440389895,0.7252024287150527,0.3994061548106614,0.5058215882616662,1.0242044815289095,0.7418646801456215,-0.7925970202303356,0.2161851991690361,0.595077191691958,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.492652416229248
+433701,1,1.0093021746506123,0.2612941705024705,0.7588410266569864,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.0390443801879883
+433701,2,-0.07938720443544948,1.1393504083724229,0.368093032089145,,,,,,,,,,,,,2.0390443801879883
+433901,0,1.207502940052057,0.3800280509629712,1.6339662676094229,0.6533003264850905,0.5213317299680837,0.17294631652479245,1.2144831033589276,0.9996149324581385,0.7596854921540671,0.9581833684000187,0.22503104425430823,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.6875644123724536,1.858985424041748
+433901,1,2.4511134878139393,0.5285571507320932,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.1054115295410156
+433901,2,1.4948919167367798,0.7500968597077102,2.258146187272569,,,,,,,,,,,,,2.1054115295410156
+434101,0,-0.03493941435979663,2.105899939723379,1.8808782901691752,-0.23157210285545515,-0.9872865247143939,-1.5338087743376947,-0.7013661055217327,-1.0493551392210523,-0.7217892120049145,-0.23730908679360116,0.22503104425430823,-0.9718299928258278,1.267782866548965,-1.388853942113607,-1.133646664653865,1.1090941429138184
+434101,1,0.048094632541727786,0.08311885034938876,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,1.021496057510376
+434101,2,0.11739768571107917,0.04944047211122737,0.368093032089145,,,,,,,,,,,,,1.021496057510376
+435201,0,-0.9385338539320537,-0.42537883045855246,-0.4647859241484716,1.2432152793787876,1.2756408573093225,0.7418646801456215,-0.2452115319787184,0.09565754789378961,1.5827269944646125,0.36043714080320877,1.0113786285352542,-0.13173296267509654,1.267782866548965,-0.2910724881500066,1.7658879751753094,2.995732307434082
+435201,1,0.2403361409635047,0.3503818305790114,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,1.7214014530181885
+435201,2,0.7077523561506651,2.151409634900676,0.18808796969072364,,,,,,,,,,,,,1.7214014530181885
+435202,0,0.529807110372864,1.4155511842192159,1.3870542450496706,1.2432152793787876,1.2756408573093225,0.7418646801456215,-0.2452115319787184,0.09565754789378961,1.5827269944646125,0.36043714080320877,1.0113786285352542,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.7214014530181885
+435202,1,0.9131814204397238,0.9739954511147976,0.6567159465227176,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,2.995732307434082
+435202,2,1.8884616970298371,1.3729025375712505,0.45809556328835566,,,,,,,,,,,,,2.995732307434082
+437101,0,0.4168578054263319,1.3004930583018552,0.6463181773704137,-0.37905084107887943,1.0242044815289095,0.457405498335207,-0.33644244668732126,0.5777681529947757,0.430468891229849,-0.23730908679360116,1.4045524206757267,-1.8119270229765592,1.267782866548965,0.806708965813594,-0.24148216009104212,2.049330949783325
+437101,1,-0.33638838430182605,1.8648720518802064,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.1682355403900146
+437101,2,-0.37456453965524245,1.7621560862359633,0.7281031568859877,,,,,,,,,,,,,2.1682355403900146
+437201,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,2.1280877087193333,1.149922669419116,1.026323861956036,1.4881758474847362,0.9393511068205153,2.07655189585094,0.36043714080320877,1.7977262128162,1.548461097626366,0.49778314283978853,0.806708965813594,0.8737234706124865,2.8372581005096436
+437201,1,0.4325776493852816,-0.00596880972715211,1.1673413471940615,,,,,,,,,,-0.47569662927593015,1.8141914255436393,2.197821317045828,2.860273838043213
+437201,2,1.1013221364437225,0.8279475694406527,0.908108219284409,,,,,,,,,,,,,2.860273838043213
+437801,0,2.224046684570846,1.7607255619712974,2.9919823916880603,-0.08409336463203088,-0.7358501489339809,0.17294631652479245,-0.1539806172701155,-0.5672445341200663,0.430468891229849,0.9581833684000187,1.4045524206757267,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.2077064514160156
+437801,1,0.6248191578070585,2.0430473720332882,1.882216908133943,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,2.487833023071289
+437801,2,1.298107026590251,1.6843053765030207,1.3581208752804623,,,,,,,,,,,,,2.487833023071289
+438302,0,-0.2608380242528609,-0.3103207045411919,-0.8351539579881,-0.9689657939725767,1.0242044815289095,-0.6804312289064511,-0.33644244668732126,0.3367128504442826,-0.8863975124670236,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,-0.2910724881500066,3.104134732019544,0.040273863822221756
+438302,1,-1.4898374348324874,-0.896845410492561,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,0.1483222395181656
+438302,2,-0.7681343199482997,-1.5075737225476233,-1.3419550606958577,,,,,,,,,,,,,0.1483222395181656
+439602,0,-0.48673663414592516,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.10725920948294862,0.17294631652479245,-0.06274970256151263,-0.8685636623081825,-0.3925726110806964,0.36043714080320877,1.4045524206757267,1.9685096127017316,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,1.2922964096069336
+439602,1,-0.24026763009093757,-1.7877220112579697,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.2959420680999756
+439602,2,-0.07938720443544948,-1.2740215933487957,-0.441929748703751,,,,,,,,,,,,,1.2959420680999756
+442301,0,1.4334015499451211,1.3004930583018552,0.5228621660905376,0.9482578029319392,1.2756408573093225,1.3107830437664505,1.2144831033589276,-0.024870103381456905,1.2535103935403944,0.9581833684000187,1.0113786285352542,0.7083640674756347,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,2.995732307434082
+442301,1,0.6248191578070585,1.5085214115740428,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.119755506515503
+442301,2,1.6916768068833083,1.1393504083724229,1.178115812882041,,,,,,,,,,,,,2.119755506515503
+442801,0,1.6593001598381854,0.14991179912825014,0.029038120971032973,1.9806089704959091,1.401359045199529,1.3107830437664505,1.3969449327761334,2.265155270848227,1.9119435953888306,1.5559295959968287,1.7977262128162,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,2.7716007232666016
+442801,1,1.2015436830723893,1.330346091420961,2.1885921485367494,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,2.874908208847046
+442801,2,1.4948919167367798,1.5286039570371357,1.3581208752804623,,,,,,,,,,,,,2.874908208847046
+442803,0,1.6593001598381854,-0.08020445270647089,0.15249413225090913,1.9806089704959091,1.401359045199529,1.3107830437664505,1.3969449327761334,2.265155270848227,1.9119435953888306,1.5559295959968287,1.7977262128162,1.1284125825510003,1.267782866548965,1.9044904197771946,1.319805722893898,2.995732307434082
+442803,1,1.5860266999159431,1.2412584313444202,1.4737165875968679,,,,,,,,,,1.663413533782179,0.7456311526478686,2.4486586478694914,2.995732307434082
+442803,2,1.298107026590251,1.606454666770078,0.9981107504836196,,,,,,,,,,,,,2.995732307434082
+443701,0,0.7557057202659283,1.3004930583018552,1.5105102563295467,1.9806089704959091,1.401359045199529,1.026323861956036,1.4881758474847362,2.265155270848227,2.07655189585094,1.5559295959968287,1.7977262128162,1.9685096127017316,0.49778314283978853,0.806708965813594,0.8737234706124865,2.412580728530884
+443701,1,0.9131814204397238,1.2412584313444202,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.409031867980957
+443701,2,-0.27617209458197817,1.1393504083724229,0.368093032089145,,,,,,,,,,,,,2.409031867980957
+443702,0,1.4334015499451211,0.4950861768803317,0.029038120971032973,1.9806089704959091,1.401359045199529,1.026323861956036,1.4881758474847362,2.265155270848227,2.07655189585094,1.5559295959968287,1.7977262128162,1.9685096127017316,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,2.5037591457366943
+443702,1,-0.04802612166916067,-1.1641083907221836,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,0.38491925597190857
+443702,2,0.9045372462971938,0.7500968597077102,-0.441929748703751,,,,,,,,,,,,,0.38491925597190857
+445002,0,-0.5996859390924573,-0.6554950822932735,-0.8351539579881,-0.5265295793023037,1.0242044815289095,0.7418646801456215,-0.2452115319787184,-1.2904104417715454,-0.5571809115428055,0.9581833684000187,0.6182048363947807,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,1.2883927822113037
+445002,1,-1.393716680621599,-1.2531960507987243,-0.05815961441716403,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,1.8396230936050415
+445002,2,-0.5713494298017712,-0.41766378628642786,-0.08191962390690835,,,,,,,,,,,,,1.8396230936050415
+446502,0,1.0945536351055247,0.03485367321088963,-0.5882419354283478,-0.08409336463203088,0.7727681057484966,0.17294631652479245,0.5758667003987075,0.8790872811828919,0.9242937926161762,-0.23730908679360116,-0.16814274788616518,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.4788014888763428
+446502,1,2.258871979392162,0.4394694906555523,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,2.7062835693359375
+446502,2,1.298107026590251,-0.2619623668205428,0.008082907292302316,,,,,,,,,,,,,2.7062835693359375
+447303,0,0.19095919553326762,-0.770553208210634,-0.7116979467082238,-1.2639232704194252,-1.3644410883850133,-1.8182679561481092,-2.2522916555679817,-1.1698827904962987,-0.8863975124670236,0.9581833684000187,0.6182048363947807,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,0.6340665817260742
+447303,1,0.14421538675261625,-1.2531960507987243,-0.8751602554913144,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.0630639836617988,0.6634617447853088
+447303,2,0.5109674660041365,-1.040469464149968,-1.521960123094279,,,,,,,,,,,,,0.6634617447853088
+447902,0,1.9981480746777818,0.3800280509629712,-0.09441789030884316,-0.23157210285545515,1.2756408573093225,1.026323861956036,0.7583285298159133,-0.3261892315695732,0.7596854921540671,0.9581833684000187,1.0113786285352542,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.326094627380371
+447902,1,0.33645689517439314,0.7067324708851749,2.392842308805287,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,2.036982536315918
+447902,2,1.593284361810044,1.3729025375712505,1.8081335312765157,,,,,,,,,,,,,2.036982536315918
+448102,0,0.19095919553326762,1.3004930583018552,0.6463181773704137,0.5058215882616662,1.401359045199529,1.026323861956036,0.7583285298159133,-0.38645305720719647,0.2658605907677399,0.9581833684000187,-0.16814274788616518,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.8719691038131714
+448102,1,0.8170606662288354,0.7958201309617158,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.197821317045828,1.8826428651809692
+448102,2,-0.07938720443544948,1.6843053765030207,0.9981107504836196,,,,,,,,,,,,,1.8826428651809692
+448701,0,-1.27738176877165,0.14991179912825014,0.029038120971032973,0.358342850038242,0.8984862936387031,0.7418646801456215,0.3934048709815018,-0.4467168828448197,0.430468891229849,0.9581833684000187,1.0113786285352542,-0.13173296267509654,-1.812216028287741,-1.388853942113607,0.20460009219036931,2.196287155151367
+448701,1,0.2403361409635047,0.17220651042592966,0.14609054585137357,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,2.0590553283691406
+448701,2,0.2157901307843435,0.6722461499747677,0.09808543849151298,,,,,,,,,,,,,2.0590553283691406
+449003,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.018458978407257843,-0.3959720470960366,-0.06274970256151263,-0.3261892315695732,-1.0510058129291326,1.5559295959968287,1.4045524206757267,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.690948247909546
+449003,1,-1.8743204516760412,-1.609546691104888,-1.7942859766997337,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.995732307434082
+449003,2,-0.5713494298017712,-1.585424432280566,-0.8919424046998043,,,,,,,,,,,,,2.995732307434082
+449903,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,0.358342850038242,-0.2329773973731551,-0.1115128652856221,-0.7925970202303356,0.3969766760819059,-0.06335601015647824,1.5559295959968287,1.7977262128162,-0.13173296267509654,0.49778314283978853,0.806708965813594,1.9889291013160153,2.498084783554077
+449903,1,-0.9131129095671567,-1.3422837108752652,-1.1815354958941209,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.90995192527771
+449903,2,-0.1777796495087138,-0.8069173349511406,-0.8019398735005937,,,,,,,,,,,,,1.90995192527771
+450601,0,0.9816043301589925,-0.08020445270647089,0.2759501435307853,-1.1164445321960008,-0.2329773973731551,-0.1115128652856221,-0.42767336139592416,-0.5672445341200663,-1.3802224138533508,1.5559295959968287,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,0.806708965813594,0.8737234706124865,1.779181718826294
+450601,1,0.6248191578070585,-0.00596880972715211,0.35034070611991114,,,,,,,,,,0.9503768127628092,1.8141914255436393,1.1944719937511734,2.0482444763183594
+450601,2,0.019005240637814846,-0.18411165708760024,0.8181056880851983,,,,,,,,,,,,,2.0482444763183594
+452601,0,0.07800989058673549,1.3004930583018552,1.6339662676094229,1.2432152793787876,0.39561354207787724,0.7418646801456215,0.7583285298159133,0.6982958042700221,-0.06335601015647824,1.5559295959968287,1.7977262128162,-0.13173296267509654,1.267782866548965,-0.2910724881500066,-0.4645232862317478,1.9530322551727295
+452601,1,0.7209399120179469,1.5085214115740428,0.5545908663884488,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,2.018073558807373
+452601,2,0.7077523561506651,0.7500968597077102,0.638100625686777,,,,,,,,,,,,,2.018073558807373
+452801,0,0.7557057202659283,0.6101443027976923,-0.09441789030884316,1.5381727558256364,1.149922669419116,0.7418646801456215,1.0320212739417218,1.7227808401096176,0.9242937926161762,1.5559295959968287,1.0113786285352542,1.548461097626366,0.49778314283978853,-1.388853942113607,0.8737234706124865,1.6019283533096313
+452801,1,1.1054229288615007,0.9739954511147976,1.1673413471940615,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.769834041595459
+452801,2,0.5109674660041365,1.7621560862359633,1.8081335312765157,,,,,,,,,,,,,1.769834041595459
+453401,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,1.6856514940490606,1.149922669419116,0.7418646801456215,1.3969449327761334,2.1446276195729803,-0.06335601015647824,-0.835055314390411,0.6182048363947807,-0.5517814777504622,-1.812216028287741,0.806708965813594,0.20460009219036931,2.3427183628082275
+453401,1,-1.1053544179889336,0.4394694906555523,1.0652162670597927,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.4031786918640137
+453401,2,-0.07938720443544948,0.8279475694406527,0.09808543849151298,,,,,,,,,,,,,2.4031786918640137
+453602,0,-0.48673663414592516,-0.6554950822932735,-0.7116979467082238,0.8007790647085149,1.0242044815289095,0.7418646801456215,1.0320212739417218,1.2406702350086316,0.10125229030563083,-0.23730908679360116,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.6575614213943481
+453602,1,-1.4898374348324874,-0.2732317899567748,1.371591507462599,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.059714660367144415,1.9419935941696167
+453602,2,-0.27617209458197817,-0.4955144960193704,0.18808796969072364,,,,,,,,,,,,,1.9419935941696167
+453605,0,0.4168578054263319,0.14991179912825014,-0.7116979467082238,0.8007790647085149,1.0242044815289095,0.7418646801456215,1.0320212739417218,1.2406702350086316,0.10125229030563083,-0.23730908679360116,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,0.992061972618103
+453605,1,0.9131814204397238,-1.2531960507987243,-1.3857856561626585,,,,,,,,,,-1.1887333502953,-1.3914893931436731,1.1944719937511734,1.1255948543548584
+453605,2,1.593284361810044,-0.9626187544170256,-1.0719474670982256,,,,,,,,,,,,,1.1255948543548584
+453901,0,0.19095919553326762,0.4950861768803317,0.5228621660905376,0.358342850038242,0.5213317299680837,0.7418646801456215,0.7583285298159133,0.09565754789378961,1.4181186940025035,0.36043714080320877,1.0113786285352542,1.9685096127017316,1.267782866548965,0.806708965813594,1.319805722893898,1.774619221687317
+453901,1,0.6248191578070585,0.7958201309617158,0.6567159465227176,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.4582960605621338
+453901,2,1.1013221364437225,0.5943954402418251,0.908108219284409,,,,,,,,,,,,,1.4582960605621338
+454101,0,-0.48673663414592516,0.8402605546324132,0.7697741886502898,-0.5265295793023037,-0.8615683368241874,-1.8182679561481092,-1.7049061673163644,-1.8930486981477779,-1.3802224138533508,-1.432801541987221,-2.13401170858853,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.42764121833107505,-0.6931471824645996
+454101,1,0.2403361409635047,-0.00596880972715211,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,1.1412327289581299
+454101,2,-0.6697418748750354,0.7500968597077102,0.2780905008899343,,,,,,,,,,,,,1.1412327289581299
+455102,0,-1.3903310737181822,-0.6554950822932735,-0.7116979467082238,0.06338537359139342,0.1441771662974643,0.17294631652479245,-0.33644244668732126,-0.024870103381456905,-1.0510058129291326,-0.23730908679360116,0.22503104425430823,-1.3918785079011935,0.49778314283978853,0.806708965813594,0.8737234706124865,2.092665672302246
+455102,1,-0.24026763009093757,-0.09505646980369299,-0.6709100952227768,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.4486586478694914,2.1520228385925293
+455102,2,0.2157901307843435,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,2.1520228385925293
+456101,0,0.07800989058673549,-0.08020445270647089,-0.4647859241484716,-0.23157210285545515,0.018458978407257843,1.026323861956036,-0.1539806172701155,-0.6275083597576895,0.430468891229849,0.36043714080320877,1.7977262128162,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,0.46773192286491394
+456101,1,0.33645689517439314,0.9739954511147976,0.8609661067912552,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,1.1944719937511734,0.20218756794929504
+456101,2,-0.4729569847285068,0.36084331104299755,-0.08191962390690835,,,,,,,,,,,,,0.20218756794929504
+456102,0,-0.37378732919939306,1.0703768064671344,0.2759501435307853,-0.23157210285545515,0.018458978407257843,1.026323861956036,-0.1539806172701155,-0.6275083597576895,0.430468891229849,0.36043714080320877,1.7977262128162,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.218948245048523
+456102,1,-0.4325091385127145,1.330346091420961,0.35034070611991114,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,0.8632307052612305
+456102,2,-0.37456453965524245,0.43869402077594005,0.368093032089145,,,,,,,,,,,,,0.8632307052612305
+459001,0,0.07800989058673549,-1.000669460045355,-0.8351539579881,0.9482578029319392,1.149922669419116,1.026323861956036,1.4881758474847362,1.1804064093710083,1.4181186940025035,0.9581833684000187,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.185788631439209
+459001,1,0.52869840359617,-0.80775775041602,-0.36453485481997044,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.6927973321038463,2.087158441543579
+459001,2,-0.37456453965524245,-1.2740215933487957,-0.35192721750454037,,,,,,,,,,,,,2.087158441543579
+459002,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,0.9482578029319392,1.149922669419116,1.026323861956036,1.4881758474847362,1.1804064093710083,1.4181186940025035,0.9581833684000187,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.087158441543579
+459002,1,-2.1626827143087066,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.0513575077056885
+459002,2,-1.0633116551680928,-2.208230110144106,-2.151977841488754,,,,,,,,,,,,,2.0513575077056885
+459201,0,0.529807110372864,-0.770553208210634,-0.7116979467082238,-0.5265295793023037,0.1441771662974643,0.17294631652479245,1.3969449327761334,0.3367128504442826,0.2658605907677399,1.5559295959968287,1.4045524206757267,1.548461097626366,1.267782866548965,1.9044904197771946,0.8737234706124865,1.9671103954315186
+459201,1,1.1054229288615007,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.9436346629275099,1.8146746158599854
+459201,2,0.8061448012239295,-0.10626094735465771,0.638100625686777,,,,,,,,,,,,,1.8146746158599854
+459301,0,0.19095919553326762,-1.000669460045355,-0.8351539579881,0.06338537359139342,1.0242044815289095,-0.1115128652856221,0.210943041564296,-1.3506742674091685,-0.22796431061858732,0.9581833684000187,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,1.9889291013160153,0.5357965230941772
+459301,1,0.4325776493852816,0.17220651042592966,0.24821562598564237,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.059714660367144415,0.5019853711128235
+459301,2,-0.1777796495087138,0.04944047211122737,0.368093032089145,,,,,,,,,,,,,0.5019853711128235
+460201,0,-0.14788871930632877,-0.5404369563759129,0.029038120971032973,0.358342850038242,1.2756408573093225,0.7418646801456215,1.4881758474847362,0.9393511068205153,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.995732307434082
+460201,1,1.2015436830723893,0.7067324708851749,-0.05815961441716403,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,2.269479990005493
+460201,2,0.11739768571107917,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,2.269479990005493
+463202,0,0.7557057202659283,-0.08020445270647089,-0.4647859241484716,0.358342850038242,0.39561354207787724,0.7418646801456215,0.7583285298159133,0.5777681529947757,-0.06335601015647824,0.9581833684000187,0.6182048363947807,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.4788014888763428
+463202,1,-0.14414687588004912,0.5285571507320932,0.24821562598564237,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.6927973321038463,2.440580368041992
+463202,2,-0.07938720443544948,0.43869402077594005,0.008082907292302316,,,,,,,,,,,,,2.440580368041992
+463702,0,-1.0514831588785858,-0.770553208210634,-0.8351539579881,-1.7063594850896981,-1.867313839945839,-2.102727137958524,-1.9785989114421731,-2.375159303248764,-1.0510058129291326,1.5559295959968287,1.0113786285352542,1.548461097626366,0.49778314283978853,-0.2910724881500066,0.20460009219036931,0.9939402341842651
+463702,1,-0.04802612166916067,-0.896845410492561,0.04396546571710477,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.2285008430480957
+463702,2,0.31418257585760784,-0.729066625218198,0.09808543849151298,,,,,,,,,,,,,1.2285008430480957
+463703,0,-0.2608380242528609,-0.5404369563759129,-0.5882419354283478,-1.7063594850896981,-1.867313839945839,-2.102727137958524,-1.9785989114421731,-2.375159303248764,-1.0510058129291326,1.5559295959968287,1.0113786285352542,1.548461097626366,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.2285008430480957
+463703,1,-0.4325091385127145,-0.3623194500333156,-0.05815961441716403,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.8030738830566406
+463703,2,-0.1777796495087138,-0.41766378628642786,-1.3419550606958577,,,,,,,,,,,,,1.8030738830566406
+464101,0,-0.8255845489855216,0.2649699250456107,0.029038120971032973,0.9482578029319392,-0.10725920948294862,-0.6804312289064511,0.3934048709815018,1.120142583733385,1.7473352949267216,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,1.9044904197771946,0.8737234706124865,0.8541025519371033
+464101,1,-0.7208714011453798,0.08311885034938876,-0.568785015088508,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,0.7045097947120667
+464101,2,-0.1777796495087138,-0.33981307655348536,0.2780905008899343,,,,,,,,,,,,,0.7045097947120667
+464103,0,-0.37378732919939306,-0.5404369563759129,-0.7116979467082238,0.9482578029319392,-0.10725920948294862,-0.6804312289064511,0.3934048709815018,1.120142583733385,1.7473352949267216,-0.835055314390411,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,0.7995052337646484
+464103,1,0.4325776493852816,-0.09505646980369299,0.7588410266569864,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,0.7843973636627197
+464103,2,0.019005240637814846,0.282992601310055,0.7281031568859877,,,,,,,,,,,,,0.7843973636627197
+465702,0,1.0945536351055247,0.9553186805497738,0.029038120971032973,-0.08409336463203088,1.2756408573093225,0.7418646801456215,0.7583285298159133,1.1804064093710083,-0.22796431061858732,0.36043714080320877,-0.16814274788616518,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.8737234706124865,1.8692766427993774
+465702,1,1.0093021746506123,0.4394694906555523,-0.568785015088508,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.5912225246429443
+465702,2,0.2157901307843435,0.36084331104299755,0.5480980944875663,,,,,,,,,,,,,2.5912225246429443
+466202,0,2.1110973796243138,0.7252024287150527,0.6463181773704137,2.1280877087193333,1.401359045199529,1.3107830437664505,1.0320212739417218,-0.38645305720719647,1.9119435953888306,-0.835055314390411,1.0113786285352542,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.20460009219036931,2.327807664871216
+466202,1,0.6248191578070585,0.17220651042592966,1.2694664273283303,,,,,,,,,,-1.9017700713146695,0.7456311526478686,0.4419600012801827,2.490705728530884
+466202,2,1.1013221364437225,0.43869402077594005,0.09808543849151298,,,,,,,,,,,,,2.490705728530884
+468301,0,0.9816043301589925,1.3004930583018552,0.5228621660905376,0.358342850038242,1.149922669419116,1.026323861956036,0.028481212147090252,-0.38645305720719647,1.0889020930782853,-0.23730908679360116,0.22503104425430823,1.1284125825510003,-2.5822157519969178,1.9044904197771946,-0.24148216009104212,2.20550799369812
+468301,1,0.7209399120179469,0.8849077910382567,-0.8751602554913144,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-1.0630639836617988,2.1672868728637695
+468301,2,1.3964994716635155,0.7500968597077102,0.368093032089145,,,,,,,,,,,,,2.1672868728637695
+468302,0,-1.27738176877165,-0.8856113341279945,-0.7116979467082238,0.358342850038242,1.149922669419116,1.026323861956036,0.028481212147090252,-0.38645305720719647,1.0889020930782853,-0.23730908679360116,0.22503104425430823,1.1284125825510003,0.49778314283978853,1.9044904197771946,3.104134732019544,2.1672868728637695
+468302,1,-2.0665619600978182,-0.5404947701863974,-0.36453485481997044,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.8122266528381351,2.3590002059936523
+468302,2,-0.6697418748750354,0.6722461499747677,-0.441929748703751,,,,,,,,,,,,,2.3590002059936523
+468303,0,-0.9385338539320537,-0.42537883045855246,-0.3413299128685955,0.358342850038242,1.149922669419116,1.026323861956036,0.028481212147090252,-0.38645305720719647,1.0889020930782853,-0.23730908679360116,0.22503104425430823,1.1284125825510003,1.267782866548965,0.806708965813594,-0.24148216009104212,2.1672868728637695
+468303,1,0.33645689517439314,-0.18414412988023388,0.14609054585137357,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.3590002059936523
+468303,2,1.0029296913704582,-0.10626094735465771,-0.08191962390690835,,,,,,,,,,,,,2.3590002059936523
+469001,0,1.5463508548916531,2.9113068211449025,2.2512463240088034,0.8007790647085149,0.8984862936387031,1.3107830437664505,-0.06274970256151263,-1.1096189648586756,1.7473352949267216,-0.835055314390411,-1.3476641243075844,1.548461097626366,0.49778314283978853,0.806708965813594,0.8737234706124865,1.438478946685791
+469001,1,2.3549927336030505,1.1521707712678793,1.4737165875968679,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,3.7028453019878094,1.8530703783035278
+469001,2,1.3964994716635155,0.43869402077594005,1.6281284688780944,,,,,,,,,,,,,1.8530703783035278
+469002,0,1.207502940052057,2.6811905693101816,1.016686211210042,0.8007790647085149,0.8984862936387031,1.3107830437664505,-0.06274970256151263,-1.1096189648586756,1.7473352949267216,-0.835055314390411,-1.3476641243075844,1.548461097626366,-1.0422163045785646,-0.2910724881500066,3.104134732019544,1.8530703783035278
+469002,1,1.1054229288615007,0.3503818305790114,0.963091186925524,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,3.7028453019878094,-0.6931471824645996
+469002,2,1.4948919167367798,1.295051827838308,2.1681436560733585,,,,,,,,,,,,,-0.6931471824645996
+469003,0,1.8851987697312496,2.9113068211449025,2.4981583465685557,0.8007790647085149,0.8984862936387031,1.3107830437664505,-0.06274970256151263,-1.1096189648586756,1.7473352949267216,-0.835055314390411,-1.3476641243075844,1.548461097626366,-1.0422163045785646,-1.388853942113607,3.104134732019544,-0.6931471824645996
+469003,1,0.8170606662288354,2.844836312722156,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,2.197821317045828,-0.4629620313644409
+469003,2,0.5109674660041365,1.295051827838308,1.6281284688780944,,,,,,,,,,,,,-0.4629620313644409
+469004,0,0.7557057202659283,0.7252024287150527,1.1401422224899183,0.8007790647085149,0.8984862936387031,1.3107830437664505,-0.06274970256151263,-1.1096189648586756,1.7473352949267216,-0.835055314390411,-1.3476641243075844,1.548461097626366,0.49778314283978853,-0.2910724881500066,1.7658879751753094,-0.4629620313644409
+469004,1,0.4325776493852816,1.7757843918036655,2.2907172286710185,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,2.0785746574401855
+469004,2,-0.1777796495087138,0.7500968597077102,0.5480980944875663,,,,,,,,,,,,,2.0785746574401855
+470002,0,0.9816043301589925,1.5306093101365763,0.3994061548106614,0.8007790647085149,0.8984862936387031,1.3107830437664505,1.4881758474847362,2.1446276195729803,1.5827269944646125,-0.835055314390411,-0.16814274788616518,1.1284125825510003,-1.812216028287741,0.806708965813594,-0.6875644123724536,2.9561963081359863
+470002,1,0.6248191578070585,0.9739954511147976,0.45246578625417994,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,2.995732307434082
+470002,2,1.4948919167367798,0.6722461499747677,0.7281031568859877,,,,,,,,,,,,,2.995732307434082
+471102,0,-1.0514831588785858,-0.1952625786238314,0.3994061548106614,-0.23157210285545515,-1.1130047126046003,-1.5338087743376947,0.5758667003987075,-0.748036011032936,-0.22796431061858732,0.9581833684000187,1.4045524206757267,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.1434955596923828
+471102,1,-1.0092336637780452,-0.80775775041602,-0.7730351753570456,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.7793538570404053
+471102,2,-0.7681343199482997,-0.8847680446840831,-0.26192468630532967,,,,,,,,,,,,,2.7793538570404053
+471103,0,-0.03493941435979663,-0.08020445270647089,-0.3413299128685955,-0.23157210285545515,-1.1130047126046003,-1.5338087743376947,0.5758667003987075,-0.748036011032936,-0.22796431061858732,0.9581833684000187,1.4045524206757267,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-1.133646664653865,1.8448883295059204
+471103,1,-0.04802612166916067,-0.80775775041602,-1.2836605760283897,,,,,,,,,,0.9503768127628092,1.8141914255436393,0.19112267045651915,0.39723923802375793
+471103,2,-0.5713494298017712,-0.573365205752313,-1.3419550606958577,,,,,,,,,,,,,0.39723923802375793
+471701,0,-0.14788871930632877,-0.770553208210634,-0.8351539579881,-0.5265295793023037,0.2698953541876708,1.3107830437664505,-0.06274970256151263,0.8188234555452687,-1.0510058129291326,0.36043714080320877,1.4045524206757267,1.1284125825510003,0.49778314283978853,0.806708965813594,0.8737234706124865,2.6125686168670654
+471701,1,-0.7208714011453798,-0.18414412988023388,-0.05815961441716403,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.6927973321038463,2.624976396560669
+471701,2,1.3964994716635155,0.1272911818441699,0.908108219284409,,,,,,,,,,,,,2.624976396560669
+472603,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.8984862936387031,-0.1115128652856221,0.3934048709815018,0.3969766760819059,-1.0510058129291326,-0.835055314390411,0.6182048363947807,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.2852725982666016
+472603,1,-1.4898374348324874,-1.6986343511814288,-1.8964110568340025,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.2334873676300049
+472603,2,-1.5552738805344144,-2.130379400411164,-1.8819702478911218,,,,,,,,,,,,,1.2334873676300049
+473402,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,0.06338537359139342,-0.48441377315356804,-0.6804312289064511,-1.24875159377335,-0.3261892315695732,-0.5571809115428055,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.24148216009104212,1.4095031023025513
+473402,1,-0.528629892723603,-1.1641083907221836,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.8535435199737549
+473402,2,-0.8665267650215641,-1.6632751420135086,-1.251952529496647,,,,,,,,,,,,,1.8535435199737549
+477401,0,-1.164432463825118,-0.5404369563759129,-0.7116979467082238,-0.08409336463203088,0.8984862936387031,0.457405498335207,0.940790359233119,1.120142583733385,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.8620959520339966
+477401,1,-0.04802612166916067,-0.3623194500333156,-0.05815961441716403,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.9311541318893433
+477401,2,-0.27617209458197817,-0.573365205752313,0.638100625686777,,,,,,,,,,,,,1.9311541318893433
+478403,0,0.07800989058673549,0.14991179912825014,-0.2178739015887193,-0.5265295793023037,-0.2329773973731551,-0.9648904107168657,-0.1539806172701155,0.5777681529947757,-0.8863975124670236,-2.030547769584031,-0.5613165400266386,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,1.437592625617981
+478403,1,0.14421538675261625,-0.18414412988023388,0.5545908663884488,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,1.2427129745483398
+478403,2,-0.5713494298017712,-0.8847680446840831,-0.35192721750454037,,,,,,,,,,,,,1.2427129745483398
+478502,0,-0.37378732919939306,0.7252024287150527,0.6463181773704137,0.358342850038242,0.7727681057484966,-0.1115128652856221,1.3057140180675306,0.7585596299076455,0.10125229030563083,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.112809419631958
+478502,1,-1.1053544179889336,0.7958201309617158,0.5545908663884488,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.8479347229003906
+478502,2,0.6093599110774008,0.20514189157711243,0.2780905008899343,,,,,,,,,,,,,1.8479347229003906
+479602,0,0.4168578054263319,-0.1952625786238314,0.029038120971032973,-0.08409336463203088,0.8984862936387031,0.7418646801456215,-0.7013661055217327,-1.4712019186844152,-0.22796431061858732,-1.432801541987221,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-1.133646664653865,1.376787781715393
+479602,1,0.048094632541727786,-0.18414412988023388,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.9042824506759644
+479602,2,0.11739768571107917,-0.4955144960193704,0.2780905008899343,,,,,,,,,,,,,1.9042824506759644
+480201,0,1.6593001598381854,2.2209580656407395,2.745070369128308,0.06338537359139342,0.2698953541876708,-0.1115128652856221,-0.518904276104527,-0.3261892315695732,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.13173296267509654,1.267782866548965,1.9044904197771946,3.104134732019544,1.778631329536438
+480201,1,1.3937851914941661,1.7757843918036655,1.882216908133943,,,,,,,,,,-0.47569662927593015,1.8141914255436393,1.1944719937511734,1.9273861646652222
+480201,2,0.9045372462971938,2.0735589251677333,1.8081335312765157,,,,,,,,,,,,,1.9273861646652222
+480202,0,1.0945536351055247,0.4950861768803317,0.6463181773704137,0.06338537359139342,0.2698953541876708,-0.1115128652856221,-0.518904276104527,-0.3261892315695732,0.430468891229849,0.9581833684000187,0.6182048363947807,-0.13173296267509654,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.9908685684204102
+480202,1,1.3937851914941661,0.3503818305790114,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,2.1840121746063232
+480202,2,1.1013221364437225,0.6722461499747677,0.368093032089145,,,,,,,,,,,,,2.1840121746063232
+481003,0,0.19095919553326762,-0.3103207045411919,-0.5882419354283478,1.833130232272485,1.2756408573093225,0.457405498335207,1.4881758474847362,2.084363793935357,1.0889020930782853,1.5559295959968287,1.4045524206757267,1.548461097626366,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,0.7253972887992859
+481003,1,0.4325776493852816,0.17220651042592966,0.04396546571710477,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.600083351135254
+481003,2,1.0029296913704582,0.1272911818441699,0.09808543849151298,,,,,,,,,,,,,1.600083351135254
+481502,0,0.529807110372864,-0.3103207045411919,0.3994061548106614,1.390694017602212,1.149922669419116,1.3107830437664505,1.4881758474847362,0.5175043273571525,1.5827269944646125,-0.23730908679360116,0.6182048363947807,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.24148216009104212,2.2816061973571777
+481502,1,0.9131814204397238,-0.09505646980369299,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.2895400524139404
+481502,2,0.8061448012239295,0.20514189157711243,1.3581208752804623,,,,,,,,,,,,,2.2895400524139404
+481901,0,1.320452244998589,1.5306093101365763,1.8808782901691752,1.6856514940490606,1.401359045199529,1.026323861956036,0.7583285298159133,1.4817255375591245,1.7473352949267216,0.9581833684000187,0.6182048363947807,1.548461097626366,-0.27221658086938805,1.9044904197771946,3.104134732019544,1.9305545091629028
+481901,1,0.9131814204397238,0.8849077910382567,0.963091186925524,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,2.17850399017334
+481901,2,1.1997145815169867,0.6722461499747677,0.2780905008899343,,,,,,,,,,,,,2.17850399017334
+481902,0,1.9981480746777818,0.2649699250456107,2.004334301449051,1.6856514940490606,1.401359045199529,1.026323861956036,0.7583285298159133,1.4817255375591245,1.7473352949267216,0.9581833684000187,0.6182048363947807,1.548461097626366,-0.27221658086938805,-0.2910724881500066,3.104134732019544,2.17850399017334
+481902,1,1.1054229288615007,-0.2732317899567748,1.2694664273283303,,,,,,,,,,-1.1887333502953,1.8141914255436393,0.4419600012801827,2.1390345096588135
+481902,2,1.3964994716635155,-0.41766378628642786,1.0881132816828303,,,,,,,,,,,,,2.1390345096588135
+482601,0,0.19095919553326762,-0.5404369563759129,-0.5882419354283478,0.6533003264850905,1.0242044815289095,0.7418646801456215,1.3969449327761334,1.602253188834371,0.430468891229849,1.5559295959968287,1.7977262128162,0.7083640674756347,1.267782866548965,1.9044904197771946,1.9889291013160153,2.4339969158172607
+482601,1,0.33645689517439314,1.0630831111913384,0.04396546571710477,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.197821317045828,2.5463144779205322
+482601,2,1.0029296913704582,0.5943954402418251,0.908108219284409,,,,,,,,,,,,,2.5463144779205322
+482602,0,-0.03493941435979663,0.14991179912825014,-0.3413299128685955,0.6533003264850905,1.0242044815289095,0.7418646801456215,1.3969449327761334,1.602253188834371,0.430468891229849,1.5559295959968287,1.7977262128162,0.7083640674756347,0.49778314283978853,1.9044904197771946,1.7658879751753094,2.5463144779205322
+482602,1,0.8170606662288354,0.2612941705024705,1.2694664273283303,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.059714660367144415,2.6243011951446533
+482602,2,0.2157901307843435,1.450753247304193,0.368093032089145,,,,,,,,,,,,,2.6243011951446533
+483802,0,-1.164432463825118,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,0.39561354207787724,0.17294631652479245,0.6670976151073104,0.2764490248066594,-0.7217892120049145,0.9581833684000187,-0.5613165400266386,-1.3918785079011935,1.267782866548965,-1.388853942113607,0.20460009219036931,0.025361914187669754
+483802,1,-1.6820789432542644,0.17220651042592966,0.45246578625417994,,,,,,,,,,1.663413533782179,-1.3914893931436731,1.1944719937511734,-0.16174083948135376
+483802,2,-0.9649192100948284,0.1272911818441699,0.18808796969072364,,,,,,,,,,,,,-0.16174083948135376
+483902,0,-0.37378732919939306,0.2649699250456107,0.6463181773704137,-0.23157210285545515,0.5213317299680837,0.7418646801456215,-0.2452115319787184,0.15592137353141286,0.2658605907677399,-0.23730908679360116,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,1.0278526544570923
+483902,1,0.4325776493852816,0.7958201309617158,1.1673413471940615,,,,,,,,,,0.9503768127628092,2.88275169843941,0.4419600012801827,1.020437240600586
+483902,2,1.9868541421031014,0.8279475694406527,1.2681183440812516,,,,,,,,,,,,,1.020437240600586
+484801,0,1.4334015499451211,0.2649699250456107,0.3994061548106614,0.06338537359139342,0.2698953541876708,0.457405498335207,0.11971212685569313,0.5777681529947757,0.595077191691958,0.9581833684000187,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.8737234706124865,2.0196738243103027
+484801,1,0.7209399120179469,0.7067324708851749,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.0295932292938232
+484801,2,0.41257502093087217,0.1272911818441699,0.2780905008899343,,,,,,,,,,,,,2.0295932292938232
+486401,0,0.07800989058673549,-0.6554950822932735,-0.3413299128685955,-0.674008317525728,0.6470499178582901,-0.1115128652856221,0.028481212147090252,0.3969766760819059,-0.3925726110806964,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.625527262687683
+486401,1,0.6248191578070585,0.2612941705024705,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.7777050733566284
+486401,2,1.1013221364437225,0.43869402077594005,0.09808543849151298,,,,,,,,,,,,,1.7777050733566284
+486502,0,-0.8255845489855216,-0.6554950822932735,-0.3413299128685955,0.5058215882616662,0.2698953541876708,0.457405498335207,0.028481212147090252,-0.26592540593194997,0.595077191691958,-1.432801541987221,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.1099605560302734
+486502,1,-0.528629892723603,-0.18414412988023388,0.6567159465227176,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,2.035268783569336
+486502,2,-0.27617209458197817,-0.33981307655348536,0.09808543849151298,,,,,,,,,,,,,2.035268783569336
+486901,0,0.4168578054263319,1.1854349323844948,2.3747023352886796,1.833130232272485,1.401359045199529,1.026323861956036,1.4881758474847362,1.6625170144719943,1.7473352949267216,1.5559295959968287,1.7977262128162,1.9685096127017316,0.49778314283978853,-1.388853942113607,0.20460009219036931,2.0128424167633057
+486901,1,0.8170606662288354,0.9739954511147976,3.3119680300137064,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.11169171333313
+486901,2,-0.27617209458197817,1.3729025375712505,1.8981360624757264,,,,,,,,,,,,,2.11169171333313
+487001,0,0.07800989058673549,0.03485367321088963,0.029038120971032973,0.358342850038242,1.2756408573093225,0.7418646801456215,0.5758667003987075,0.6380319786323989,1.0889020930782853,0.36043714080320877,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.8398503065109253
+487001,1,1.2976644372832777,0.8849077910382567,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,-0.08725151419639587
+487001,2,0.7077523561506651,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,-0.08725151419639587
+487002,0,1.0945536351055247,0.8402605546324132,0.15249413225090913,0.358342850038242,1.2756408573093225,0.7418646801456215,0.5758667003987075,0.6380319786323989,1.0889020930782853,0.36043714080320877,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,-0.6931471824645996
+487002,1,0.52869840359617,1.1521707712678793,0.7588410266569864,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,-0.0007432480342686176
+487002,2,0.9045372462971938,0.6722461499747677,1.0881132816828303,,,,,,,,,,,,,-0.0007432480342686176
+487102,0,0.8686550252124604,1.0703768064671344,0.7697741886502898,2.1280877087193333,1.2756408573093225,1.026323861956036,1.0320212739417218,0.6982958042700221,2.07655189585094,1.5559295959968287,1.7977262128162,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.6505532264709473
+487102,1,-0.04802612166916067,0.4394694906555523,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.8091163635253906
+487102,2,0.7077523561506651,0.282992601310055,0.638100625686777,,,,,,,,,,,,,1.8091163635253906
+487103,0,1.207502940052057,-0.6554950822932735,-0.5882419354283478,2.1280877087193333,1.2756408573093225,1.026323861956036,1.0320212739417218,0.6982958042700221,2.07655189585094,1.5559295959968287,1.7977262128162,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.9618428945541382
+487103,1,-0.04802612166916067,0.2612941705024705,-0.8751602554913144,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,2.093297004699707
+487103,2,-0.07938720443544948,0.04944047211122737,-0.08191962390690835,,,,,,,,,,,,,2.093297004699707
+487401,0,0.9816043301589925,2.105899939723379,2.745070369128308,1.6856514940490606,1.401359045199529,1.026323861956036,1.1232521886503248,-0.20566158029432668,1.9119435953888306,-0.835055314390411,1.0113786285352542,1.1284125825510003,1.267782866548965,-0.2910724881500066,-0.018441033950336395,2.2503535747528076
+487401,1,0.6248191578070585,1.8648720518802064,2.392842308805287,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.7951345443725586
+487401,2,0.7077523561506651,1.3729025375712505,2.3481487184717795,,,,,,,,,,,,,2.7951345443725586
+487402,0,1.6593001598381854,-1.000669460045355,-0.8351539579881,1.6856514940490606,1.401359045199529,1.026323861956036,1.1232521886503248,-0.20566158029432668,1.9119435953888306,-0.835055314390411,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,3.104134732019544,2.7951345443725586
+487402,1,-0.6247506469344914,0.2612941705024705,0.5545908663884488,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,1.8023213148117065
+487402,2,-0.1777796495087138,1.450753247304193,0.5480980944875663,,,,,,,,,,,,,1.8023213148117065
+488002,0,0.07800989058673549,-1.1157275859627156,-0.9586099692679761,0.5058215882616662,0.8984862936387031,-0.3959720470960366,0.210943041564296,1.361197886283878,0.7596854921540671,-0.835055314390411,1.4045524206757267,0.7083640674756347,1.267782866548965,0.806708965813594,1.7658879751753094,2.054685115814209
+488002,1,0.14421538675261625,-0.18414412988023388,0.35034070611991114,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.310551991190808,2.2767817974090576
+488002,2,0.41257502093087217,-0.18411165708760024,0.18808796969072364,,,,,,,,,,,,,2.2767817974090576
+488501,0,2.1110973796243138,2.3360161915581,2.3747023352886796,1.833130232272485,1.0242044815289095,0.7418646801456215,1.4881758474847362,1.9638361426601105,1.2535103935403944,1.5559295959968287,1.7977262128162,-3.072072568202656,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.0901732444763184
+488501,1,1.77826820833772,3.2011869530283197,2.9034677094766312,,,,,,,,,,1.663413533782179,-1.3914893931436731,0.4419600012801827,2.051353693008423
+488501,2,1.8884616970298371,1.3729025375712505,0.368093032089145,,,,,,,,,,,,,2.051353693008423
+489901,0,1.207502940052057,0.14991179912825014,0.029038120971032973,-1.4114020086428494,-0.6101319610437744,-1.2493495925272802,-0.61013519081313,-0.20566158029432668,-0.3925726110806964,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,1.5451785326004028
+489901,1,0.14421538675261625,0.6176448108086341,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.7375015020370483
+489901,2,-0.5713494298017712,0.282992601310055,-0.441929748703751,,,,,,,,,,,,,1.7375015020370483
+492501,0,1.320452244998589,0.7252024287150527,0.3994061548106614,0.2108641118148177,1.2756408573093225,1.026323861956036,1.0320212739417218,-0.5069807084824429,1.0889020930782853,0.9581833684000187,1.0113786285352542,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.4645232862317478,2.1269590854644775
+492501,1,0.8170606662288354,0.4394694906555523,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.2566826343536377
+492501,2,0.8061448012239295,1.606454666770078,2.4381512496709905,,,,,,,,,,,,,2.2566826343536377
+492502,0,0.7557057202659283,0.3800280509629712,0.6463181773704137,0.2108641118148177,1.2756408573093225,1.026323861956036,1.0320212739417218,-0.5069807084824429,1.0889020930782853,0.9581833684000187,1.0113786285352542,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,2.2566826343536377
+492502,1,0.6248191578070585,0.5285571507320932,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.3729214668273926
+492502,2,0.6093599110774008,0.9836489889065378,0.7281031568859877,,,,,,,,,,,,,2.3729214668273926
+492701,0,1.8851987697312496,-0.6554950822932735,-0.4647859241484716,1.5381727558256364,0.2698953541876708,1.026323861956036,0.5758667003987075,-0.08513392901908017,1.7473352949267216,0.36043714080320877,-0.16814274788616518,0.7083640674756347,1.267782866548965,-0.2910724881500066,1.7658879751753094,2.7766072750091553
+492701,1,0.2403361409635047,-0.2732317899567748,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.7186119556427
+492701,2,1.298107026590251,0.20514189157711243,0.7281031568859877,,,,,,,,,,,,,2.7186119556427
+493001,0,0.19095919553326762,0.14991179912825014,0.5228621660905376,0.06338537359139342,0.5213317299680837,0.17294631652479245,-0.33644244668732126,-0.3261892315695732,-1.0510058129291326,-0.835055314390411,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.6624723672866821
+493001,1,0.6248191578070585,0.2612941705024705,0.5545908663884488,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.6927973321038463,1.2876559495925903
+493001,2,0.8061448012239295,-0.10626094735465771,-0.08191962390690835,,,,,,,,,,,,,1.2876559495925903
+493301,0,0.8686550252124604,0.14991179912825014,-0.09441789030884316,0.06338537359139342,1.2756408573093225,0.17294631652479245,0.5758667003987075,0.9996149324581385,0.9242937926161762,0.9581833684000187,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,0.8737234706124865,1.6535903215408325
+493301,1,1.2015436830723893,-0.18414412988023388,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,1.7980340719223022
+493301,2,-0.7681343199482997,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,1.7980340719223022
+494704,0,-0.5996859390924573,-1.6910182155495181,-1.575890025667357,-1.1164445321960008,-1.615877464165426,-1.8182679561481092,-2.2522916555679817,-2.134104000698271,-1.0510058129291326,-2.030547769584031,-2.5271855007290034,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,0.09691715240478516
+494704,1,-1.8743204516760412,-1.2531960507987243,-1.2836605760283897,,,,,,,,,,1.663413533782179,-1.3914893931436731,-1.3139013144854623,-0.4088827669620514
+494704,2,-0.6697418748750354,-1.5075737225476233,-1.3419550606958577,,,,,,,,,,,,,-0.4088827669620514
+495402,0,0.19095919553326762,0.8402605546324132,0.7697741886502898,0.5058215882616662,0.018458978407257843,1.026323861956036,1.2144831033589276,0.7585596299076455,1.4181186940025035,0.36043714080320877,0.22503104425430823,0.7083640674756347,0.49778314283978853,-0.2910724881500066,1.9889291013160153,2.3356196880340576
+495402,1,0.33645689517439314,1.2412584313444202,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.274500846862793
+495402,2,0.8061448012239295,1.995708215434791,-0.35192721750454037,,,,,,,,,,,,,2.274500846862793
+495403,0,0.9816043301589925,0.4950861768803317,-0.09441789030884316,0.5058215882616662,0.018458978407257843,1.026323861956036,1.2144831033589276,0.7585596299076455,1.4181186940025035,0.36043714080320877,0.22503104425430823,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.6875644123724536,2.274500846862793
+495403,1,0.4325776493852816,1.5976090716505837,0.8609661067912552,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,2.5239617824554443
+495403,2,1.1013221364437225,0.20514189157711243,0.908108219284409,,,,,,,,,,,,,2.5239617824554443
+495404,0,-0.2608380242528609,-0.42537883045855246,-0.5882419354283478,0.5058215882616662,0.018458978407257843,1.026323861956036,1.2144831033589276,0.7585596299076455,1.4181186940025035,0.36043714080320877,0.22503104425430823,0.7083640674756347,1.267782866548965,-1.388853942113607,-0.24148216009104212,2.5239617824554443
+495404,1,-0.33638838430182605,1.330346091420961,0.35034070611991114,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.19112267045651915,2.4441580772399902
+495404,2,0.019005240637814846,1.6843053765030207,-0.17192215510611902,,,,,,,,,,,,,2.4441580772399902
+495601,0,0.19095919553326762,0.7252024287150527,0.2759501435307853,0.5058215882616662,-0.2329773973731551,0.457405498335207,1.2144831033589276,0.7585596299076455,0.430468891229849,-0.23730908679360116,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,0.20460009219036931,1.8594926595687866
+495601,1,0.33645689517439314,0.17220651042592966,0.04396546571710477,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.310551991190808,1.9301546812057495
+495601,2,0.31418257585760784,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,1.9301546812057495
+497305,0,-0.48673663414592516,-1.1157275859627156,-0.9586099692679761,0.9482578029319392,0.8984862936387031,1.026323861956036,1.1232521886503248,1.4817255375591245,0.7596854921540671,-0.835055314390411,-0.9544903321671111,1.9685096127017316,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,2.4247069358825684
+497305,1,0.4325776493852816,-0.09505646980369299,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.521341562271118
+497305,2,0.31418257585760784,1.2172011181053655,0.8181056880851983,,,,,,,,,,,,,2.521341562271118
+497403,0,-0.37378732919939306,-0.8856113341279945,-0.8351539579881,1.5381727558256364,0.7727681057484966,0.7418646801456215,1.3057140180675306,0.7585596299076455,1.0889020930782853,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,-1.3566877907945707,1.4225068092346191
+497403,1,-0.24026763009093757,-0.2732317899567748,-0.05815961441716403,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,1.1944719937511734,0.37020179629325867
+497403,2,0.9045372462971938,-0.33981307655348536,0.008082907292302316,,,,,,,,,,,,,0.37020179629325867
+497601,0,2.901742514250039,2.105899939723379,2.004334301449051,0.9482578029319392,0.8984862936387031,1.026323861956036,0.210943041564296,0.2764490248066594,0.430468891229849,0.36043714080320877,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,1.7658879751753094,2.2968735694885254
+497601,1,1.2015436830723893,1.7757843918036655,-1.9985361369682713,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,2.7093937397003174
+497601,2,0.5109674660041365,0.8279475694406527,0.2780905008899343,,,,,,,,,,,,,2.7093937397003174
+497602,0,2.1110973796243138,2.3360161915581,2.4981583465685557,0.9482578029319392,0.8984862936387031,1.026323861956036,0.210943041564296,0.2764490248066594,0.430468891229849,0.36043714080320877,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,3.104134732019544,2.7093937397003174
+497602,1,0.8170606662288354,2.22122269218637,0.04396546571710477,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.2666268348693848
+497602,2,1.8884616970298371,1.7621560862359633,1.2681183440812516,,,,,,,,,,,,,2.2666268348693848
+498701,0,1.0945536351055247,0.2649699250456107,0.3994061548106614,1.390694017602212,1.149922669419116,1.026323861956036,1.4881758474847362,0.9393511068205153,1.7473352949267216,-0.835055314390411,-0.9544903321671111,0.28831555240026907,0.49778314283978853,0.806708965813594,0.20460009219036931,2.528991222381592
+498701,1,-0.7208714011453798,0.3503818305790114,-0.26240977468570165,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,2.545036792755127
+498701,2,1.6916768068833083,-0.33981307655348536,0.9981107504836196,,,,,,,,,,,,,2.545036792755127
+499701,0,-0.7126352440389895,0.2649699250456107,0.7697741886502898,0.9482578029319392,0.7727681057484966,0.457405498335207,1.0320212739417218,-2.435423128886387,1.0889020930782853,-0.835055314390411,1.7977262128162,0.28831555240026907,-1.812216028287741,0.806708965813594,-0.9106055385131593,2.6871190071105957
+499701,1,0.52869840359617,-0.5404947701863974,0.14609054585137357,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.174919366836548
+499701,2,-0.37456453965524245,-0.6512159154852555,-0.8019398735005937,,,,,,,,,,,,,2.174919366836548
+501402,0,0.6427564153193962,1.4155511842192159,1.5105102563295467,-1.4114020086428494,-1.1130047126046003,-1.5338087743376947,-0.42767336139592416,0.035393722256166354,-0.7217892120049145,-1.432801541987221,-1.740837916448057,-0.13173296267509654,-1.0422163045785646,0.806708965813594,0.20460009219036931,0.6203828454017639
+501402,1,0.4325776493852816,0.9739954511147976,0.963091186925524,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,2.3356196880340576
+501402,2,0.2157901307843435,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,2.3356196880340576
+501601,0,0.8686550252124604,2.3360161915581,1.2635982337697944,-0.5265295793023037,1.149922669419116,-1.8182679561481092,0.028481212147090252,-0.989091313583429,-0.5571809115428055,0.9581833684000187,1.4045524206757267,1.9685096127017316,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.9563919305801392
+501601,1,0.9131814204397238,0.3503818305790114,1.371591507462599,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.1756467819213867
+501601,2,-0.07938720443544948,0.36084331104299755,1.8081335312765157,,,,,,,,,,,,,1.1756467819213867
+504101,0,1.7722494647847176,2.3360161915581,2.1277903127289273,-1.1164445321960008,-0.8615683368241874,-0.1115128652856221,0.028481212147090252,0.6380319786323989,-1.3802224138533508,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,0.49778314283978853,-1.388853942113607,-0.6875644123724536,0.992778480052948
+504101,1,2.0666304709703853,1.5976090716505837,1.0652162670597927,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,0.9178255200386047
+504101,2,1.0029296913704582,1.606454666770078,2.1681436560733585,,,,,,,,,,,,,0.9178255200386047
+506602,0,0.9816043301589925,2.2209580656407395,1.8808782901691752,-0.37905084107887943,0.7727681057484966,1.026323861956036,-0.33644244668732126,0.2161851991690361,0.595077191691958,0.9581833684000187,1.7977262128162,0.7083640674756347,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.9792346954345703
+506602,1,-0.14414687588004912,1.2412584313444202,0.24821562598564237,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.5613893220144716,2.144155502319336
+506602,2,-0.4729569847285068,0.8279475694406527,-0.26192468630532967,,,,,,,,,,,,,2.144155502319336
+508901,0,-0.9385338539320537,-0.5404369563759129,-0.7116979467082238,-1.2639232704194252,-1.867313839945839,-1.8182679561481092,-1.9785989114421731,-1.3506742674091685,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,0.806708965813594,-1.3566877907945707,1.3579683303833008
+508901,1,-1.7781996974651528,-1.3422837108752652,-1.590035816431196,,,,,,,,,,1.663413533782179,-1.3914893931436731,-1.3139013144854623,0.6626454591751099
+508901,2,-0.9649192100948284,-0.9626187544170256,-0.981944935899015,,,,,,,,,,,,,0.6626454591751099
+508902,0,-0.2608380242528609,-1.1157275859627156,-0.9586099692679761,-1.2639232704194252,-1.867313839945839,-1.8182679561481092,-1.9785989114421731,-1.3506742674091685,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,1.267782866548965,-1.388853942113607,-1.3566877907945707,1.6557177305221558
+508902,1,-1.7781996974651528,-0.6295824302629383,-0.7730351753570456,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,0.6637288331985474
+508902,2,-0.7681343199482997,-1.1961708836158533,-0.26192468630532967,,,,,,,,,,,,,0.6637288331985474
+509101,0,1.320452244998589,1.7607255619712974,2.004334301449051,0.358342850038242,-0.35869558526336154,1.026323861956036,0.7583285298159133,0.6982958042700221,1.2535103935403944,-0.23730908679360116,-0.16814274788616518,1.1284125825510003,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.7455193996429443
+509101,1,0.6248191578070585,1.419433751497502,1.371591507462599,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.310551991190808,2.761033773422241
+509101,2,0.31418257585760784,0.8279475694406527,1.988138593674937,,,,,,,,,,,,,2.761033773422241
+509603,0,1.9981480746777818,0.14991179912825014,0.5228621660905376,0.9482578029319392,0.7727681057484966,0.457405498335207,-0.06274970256151263,-1.651993395597285,0.9242937926161762,0.9581833684000187,0.22503104425430823,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.8630177974700928
+509603,1,0.8170606662288354,0.9739954511147976,1.371591507462599,,,,,,,,,,1.663413533782179,-1.3914893931436731,-1.0630639836617988,2.831446409225464
+509603,2,0.41257502093087217,1.5286039570371357,0.5480980944875663,,,,,,,,,,,,,2.831446409225464
+509902,0,2.224046684570846,3.1414230729796238,3.1154384029679365,1.6856514940490606,1.2756408573093225,1.3107830437664505,-0.2452115319787184,-0.08513392901908017,1.5827269944646125,0.9581833684000187,0.22503104425430823,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,-1.133646664653865,2.412142276763916
+509902,1,0.7209399120179469,1.1521707712678793,1.4737165875968679,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.0630639836617988,2.6644437313079834
+509902,2,0.31418257585760784,2.2292603446336186,1.718131000077305,,,,,,,,,,,,,2.6644437313079834
+510302,0,-1.27738176877165,-0.770553208210634,-0.7116979467082238,-0.23157210285545515,0.6470499178582901,0.457405498335207,1.4881758474847362,1.1804064093710083,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.6506823444717807,1.1982612609863281
+510302,1,-0.4325091385127145,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,1.3369460105895996
+510302,2,-0.27617209458197817,-0.6512159154852555,0.008082907292302316,,,,,,,,,,,,,1.3369460105895996
+510703,0,0.529807110372864,2.3360161915581,0.893230199930166,1.390694017602212,0.5213317299680837,1.3107830437664505,1.3969449327761334,0.6380319786323989,1.4181186940025035,0.9581833684000187,1.7977262128162,1.9685096127017316,-0.27221658086938805,1.9044904197771946,0.8737234706124865,2.8693926334381104
+510703,1,-0.04802612166916067,0.8849077910382567,-0.6709100952227768,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,2.719815492630005
+510703,2,0.31418257585760784,0.20514189157711243,0.368093032089145,,,,,,,,,,,,,2.719815492630005
+511001,0,0.4168578054263319,-0.1952625786238314,-0.09441789030884316,0.2108641118148177,-0.35869558526336154,-0.1115128652856221,0.5758667003987075,-0.024870103381456905,-1.2156141133912417,0.36043714080320877,1.4045524206757267,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.6506823444717807,0.29904457926750183
+511001,1,-0.04802612166916067,0.17220651042592966,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.0143966674804688
+511001,2,-0.27617209458197817,-0.028410237621715174,-0.08191962390690835,,,,,,,,,,,,,2.0143966674804688
+513101,0,1.207502940052057,0.4950861768803317,-0.09441789030884316,0.5058215882616662,0.8984862936387031,0.457405498335207,-0.42767336139592416,-0.748036011032936,1.0889020930782853,-0.835055314390411,0.22503104425430823,1.548461097626366,0.49778314283978853,-0.2910724881500066,0.8737234706124865,0.3354596197605133
+513101,1,0.33645689517439314,0.6176448108086341,1.882216908133943,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,0.35531535744667053
+513101,2,0.019005240637814846,0.20514189157711243,0.7281031568859877,,,,,,,,,,,,,0.35531535744667053
+513402,0,1.8851987697312496,0.7252024287150527,1.016686211210042,0.06338537359139342,0.6470499178582901,-0.3959720470960366,-0.7013661055217327,-0.38645305720719647,-0.3925726110806964,-0.835055314390411,-1.740837916448057,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-1.133646664653865,0.7845523953437805
+513402,1,1.0093021746506123,0.7067324708851749,0.963091186925524,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,0.9863404035568237
+513402,2,1.1013221364437225,0.9057982791735953,1.2681183440812516,,,,,,,,,,,,,0.9863404035568237
+514302,0,-1.164432463825118,0.9553186805497738,0.7697741886502898,1.5381727558256364,0.6470499178582901,1.3107830437664505,0.8495594445245161,0.8188234555452687,0.2658605907677399,-0.23730908679360116,0.6182048363947807,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.7561864852905273
+514302,1,2.0666304709703853,-0.00596880972715211,0.7588410266569864,,,,,,,,,,0.9503768127628092,-0.3229291202479022,2.4486586478694914,2.5507311820983887
+514302,2,0.5109674660041365,0.20514189157711243,0.5480980944875663,,,,,,,,,,,,,2.5507311820983887
+515101,0,1.0945536351055247,2.796248695227542,1.8808782901691752,1.0957365411553635,1.0242044815289095,0.457405498335207,0.8495594445245161,0.2161851991690361,0.430468891229849,0.9581833684000187,-0.16814274788616518,1.1284125825510003,-1.812216028287741,0.806708965813594,0.8737234706124865,1.8253065347671509
+515101,1,1.2015436830723893,1.419433751497502,1.0652162670597927,,,,,,,,,,0.2373400917434395,0.7456311526478686,2.4486586478694914,2.707895040512085
+515101,2,1.4948919167367798,1.9178575057018483,1.6281284688780944,,,,,,,,,,,,,2.707895040512085
+515202,0,0.19095919553326762,0.8402605546324132,-0.2178739015887193,-0.674008317525728,-0.2329773973731551,-0.3959720470960366,0.940790359233119,0.2161851991690361,-0.22796431061858732,-0.835055314390411,0.6182048363947807,-2.2319755380519246,0.49778314283978853,-0.2910724881500066,0.8737234706124865,0.3440210223197937
+515202,1,-0.6247506469344914,0.5285571507320932,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,0.40753647685050964
+515202,2,0.2157901307843435,0.36084331104299755,0.638100625686777,,,,,,,,,,,,,0.40753647685050964
+515203,0,-0.37378732919939306,1.0703768064671344,0.3994061548106614,-0.674008317525728,-0.2329773973731551,-0.3959720470960366,0.940790359233119,0.2161851991690361,-0.22796431061858732,-0.835055314390411,0.6182048363947807,-2.2319755380519246,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,0.40753647685050964
+515203,1,0.33645689517439314,0.3503818305790114,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,0.25959786772727966
+515203,2,0.11739768571107917,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,0.25959786772727966
+516401,0,-0.14788871930632877,0.03485367321088963,-0.09441789030884316,-1.1164445321960008,-0.7358501489339809,-0.9648904107168657,-1.5224443378991586,-0.08513392901908017,-0.5571809115428055,1.5559295959968287,1.0113786285352542,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,2.7304625511169434
+516401,1,-0.14414687588004912,-0.3623194500333156,0.35034070611991114,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,2.5171568393707275
+516401,2,0.11739768571107917,-0.2619623668205428,-0.08191962390690835,,,,,,,,,,,,,2.5171568393707275
+517601,0,0.19095919553326762,0.8402605546324132,1.016686211210042,0.358342850038242,-0.10725920948294862,0.457405498335207,0.3934048709815018,-0.024870103381456905,-0.22796431061858732,0.9581833684000187,1.0113786285352542,1.1284125825510003,1.267782866548965,-0.2910724881500066,-0.4645232862317478,0.7634837031364441
+517601,1,0.4325776493852816,0.7067324708851749,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,0.7988744974136353
+517601,2,1.1013221364437225,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,0.7988744974136353
+518002,0,1.6593001598381854,0.8402605546324132,1.016686211210042,0.6533003264850905,-0.2329773973731551,0.7418646801456215,-0.61013519081313,-0.3261892315695732,0.2658605907677399,-1.432801541987221,-1.740837916448057,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.9330366253852844
+518002,1,0.52869840359617,0.7958201309617158,0.8609661067912552,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.3729783296585083
+518002,2,0.11739768571107917,1.7621560862359633,0.638100625686777,,,,,,,,,,,,,1.3729783296585083
+518901,0,0.07800989058673549,1.1854349323844948,1.3870542450496706,-0.08409336463203088,1.0242044815289095,0.457405498335207,-0.518904276104527,-0.024870103381456905,-1.0510058129291326,-0.835055314390411,-1.740837916448057,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.018441033950336395,1.569507122039795
+518901,1,-0.14414687588004912,0.5285571507320932,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.492652416229248
+518901,2,0.2157901307843435,0.282992601310055,1.988138593674937,,,,,,,,,,,,,1.492652416229248
+518902,0,-1.27738176877165,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,1.0242044815289095,0.457405498335207,-0.518904276104527,-0.024870103381456905,-1.0510058129291326,-0.835055314390411,-1.740837916448057,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.5729546546936035
+518902,1,-2.0665619600978182,-1.609546691104888,-0.568785015088508,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,1.8468695878982544
+518902,2,-0.4729569847285068,-1.1183201738829107,-0.981944935899015,,,,,,,,,,,,,1.8468695878982544
+519801,0,-0.37378732919939306,-1.000669460045355,-0.8351539579881,0.06338537359139342,1.149922669419116,0.17294631652479245,-0.06274970256151263,-1.0493551392210523,-0.5571809115428055,0.36043714080320877,0.6182048363947807,0.28831555240026907,1.267782866548965,0.806708965813594,-0.24148216009104212,1.7691314220428467
+519801,1,-0.04802612166916067,-0.896845410492561,-1.1815354958941209,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.6927973321038463,2.267030715942383
+519801,2,-0.9649192100948284,-0.8847680446840831,-0.5319322799029617,,,,,,,,,,,,,2.267030715942383
+519902,0,1.7722494647847176,1.1854349323844948,0.2759501435307853,0.9482578029319392,1.149922669419116,0.457405498335207,-0.61013519081313,0.3969766760819059,0.2658605907677399,0.9581833684000187,0.6182048363947807,-0.5517814777504622,0.49778314283978853,1.9044904197771946,0.8737234706124865,1.9102308750152588
+519902,1,0.4325776493852816,0.7958201309617158,0.45246578625417994,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.035806894302368
+519902,2,0.41257502093087217,0.5943954402418251,0.9981107504836196,,,,,,,,,,,,,2.035806894302368
+521202,0,1.207502940052057,0.3800280509629712,-0.2178739015887193,1.833130232272485,0.7727681057484966,0.7418646801456215,0.5758667003987075,0.6982958042700221,1.7473352949267216,1.5559295959968287,1.0113786285352542,0.28831555240026907,-1.0422163045785646,-1.388853942113607,1.9889291013160153,0.6334778070449829
+521202,1,0.52869840359617,0.5285571507320932,0.14609054585137357,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,0.8001985549926758
+521202,2,1.593284361810044,1.450753247304193,-0.441929748703751,,,,,,,,,,,,,0.8001985549926758
+525602,0,0.07800989058673549,0.3800280509629712,0.3994061548106614,-0.674008317525728,0.1441771662974643,0.17294631652479245,-0.7013661055217327,0.035393722256166354,-0.7217892120049145,0.9581833684000187,1.0113786285352542,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.4604709148406982
+525602,1,-0.04802612166916067,0.4394694906555523,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,1.761005163192749
+525602,2,-0.8665267650215641,-0.18411165708760024,-0.441929748703751,,,,,,,,,,,,,1.761005163192749
+525802,0,1.8851987697312496,1.875783687888658,1.6339662676094229,-0.23157210285545515,0.39561354207787724,-0.3959720470960366,0.3021739562728989,-1.3506742674091685,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,2.1569764614105225
+525802,1,3.1239587672901585,3.2011869530283197,1.2694664273283303,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,2.2328760623931885
+525802,2,1.6916768068833083,1.5286039570371357,1.448123406479673,,,,,,,,,,,,,2.2328760623931885
+525901,0,-1.27738176877165,0.3800280509629712,0.15249413225090913,-0.674008317525728,0.2698953541876708,-0.3959720470960366,-1.7049061673163644,0.5777681529947757,-0.5571809115428055,1.5559295959968287,0.6182048363947807,0.7083640674756347,1.267782866548965,-1.388853942113607,-1.3566877907945707,1.9159194231033325
+525901,1,0.52869840359617,0.4394694906555523,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,1.3199890851974487
+525901,2,-0.27617209458197817,0.5165447305088826,-1.7019651854927003,,,,,,,,,,,,,1.3199890851974487
+526501,0,-0.03493941435979663,1.3004930583018552,-0.7116979467082238,-1.2639232704194252,-2.2444684036164584,-2.671645501579353,-0.33644244668732126,0.035393722256166354,-1.3802224138533508,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-0.27221658086938805,0.806708965813594,0.8737234706124865,2.424295663833618
+526501,1,-0.24026763009093757,0.4394694906555523,0.14609054585137357,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.4089431762695312
+526501,2,-0.27617209458197817,-0.028410237621715174,0.45809556328835566,,,,,,,,,,,,,2.4089431762695312
+527103,0,0.19095919553326762,-0.6554950822932735,-0.4647859241484716,-0.08409336463203088,0.39561354207787724,-0.1115128652856221,-0.2452115319787184,0.3367128504442826,-0.22796431061858732,0.36043714080320877,-2.13401170858853,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-0.9106055385131593,0.711704671382904
+527103,1,-0.6247506469344914,-0.18414412988023388,-0.36453485481997044,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,0.41682755947113037
+527103,2,0.019005240637814846,0.04944047211122737,-0.6219348111021723,,,,,,,,,,,,,0.41682755947113037
+527202,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.23157210285545515,0.1441771662974643,-0.9648904107168657,1.3969449327761334,1.9035723170224874,0.10125229030563083,1.5559295959968287,0.22503104425430823,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,0.5689393877983093
+527202,1,-0.4325091385127145,-1.2531960507987243,-1.3857856561626585,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,0.920964241027832
+527202,2,-0.4729569847285068,-1.2740215933487957,-0.8919424046998043,,,,,,,,,,,,,0.920964241027832
+527702,0,0.9816043301589925,1.4155511842192159,-0.09441789030884316,-0.23157210285545515,-0.7358501489339809,-1.5338087743376947,-1.339982508481953,-0.6275083597576895,-1.2156141133912417,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,1.267782866548965,-1.388853942113607,0.8737234706124865,0.2301851361989975
+527702,1,1.0093021746506123,0.3503818305790114,-0.16028469455143282,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.310551991190808,0.5518285036087036
+527702,2,0.2157901307843435,0.282992601310055,0.18808796969072364,,,,,,,,,,,,,0.5518285036087036
+528604,0,0.3039085004797998,1.4155511842192159,1.016686211210042,-0.5265295793023037,-0.10725920948294862,0.457405498335207,-1.4312134231905558,-0.8685636623081825,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-1.3918785079011935,1.267782866548965,-1.388853942113607,-0.6875644123724536,1.4882373809814453
+528604,1,0.7209399120179469,0.6176448108086341,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.320593237876892
+528604,2,0.7077523561506651,0.9057982791735953,0.9981107504836196,,,,,,,,,,,,,1.320593237876892
+528801,0,-0.14788871930632877,-0.5404369563759129,-0.4647859241484716,-0.5265295793023037,-0.10725920948294862,-0.1115128652856221,0.8495594445245161,1.120142583733385,-0.8863975124670236,0.36043714080320877,0.22503104425430823,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,2.0949621200561523
+528801,1,-0.33638838430182605,-0.9859330705691017,-0.05815961441716403,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,2.2880661487579346
+528801,2,0.11739768571107917,-1.1183201738829107,0.09808543849151298,,,,,,,,,,,,,2.2880661487579346
+528802,0,0.4168578054263319,-0.6554950822932735,-0.5882419354283478,-0.5265295793023037,-0.10725920948294862,-0.1115128652856221,0.8495594445245161,1.120142583733385,-0.8863975124670236,0.36043714080320877,0.22503104425430823,0.28831555240026907,-1.812216028287741,-1.388853942113607,-0.6875644123724536,2.4253733158111572
+528802,1,0.048094632541727786,-0.4514071101098565,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.19112267045651915,2.438709259033203
+528802,2,1.3964994716635155,0.36084331104299755,0.2780905008899343,,,,,,,,,,,,,2.438709259033203
+529802,0,-0.03493941435979663,-1.1157275859627156,-0.9586099692679761,0.2108641118148177,0.018458978407257843,-0.1115128652856221,-0.7925970202303356,-0.748036011032936,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,3.104134732019544,1.295811653137207
+529802,1,0.6248191578070585,-1.3422837108752652,-1.8964110568340025,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,1.2852725982666016
+529802,2,-0.27617209458197817,-0.8847680446840831,-0.17192215510611902,,,,,,,,,,,,,1.2852725982666016
+529804,0,-1.0514831588785858,-0.42537883045855246,-0.5882419354283478,0.2108641118148177,0.018458978407257843,-0.1115128652856221,-0.7925970202303356,-0.748036011032936,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.6717422008514404
+529804,1,0.33645689517439314,-0.2732317899567748,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,2.043483257293701
+529804,2,0.019005240637814846,0.282992601310055,1.3581208752804623,,,,,,,,,,,,,2.043483257293701
+530101,0,1.7722494647847176,-0.6554950822932735,-0.5882419354283478,0.5058215882616662,1.401359045199529,1.3107830437664505,0.4846357856901046,1.4817255375591245,0.7596854921540671,-0.835055314390411,-1.3476641243075844,-1.8119270229765592,0.49778314283978853,1.9044904197771946,-0.6875644123724536,1.93804132938385
+530101,1,1.2015436830723893,0.8849077910382567,1.5758416677311367,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.031961441040039
+530101,2,-0.07938720443544948,1.8400067959689057,1.3581208752804623,,,,,,,,,,,,,2.031961441040039
+530802,0,-0.9385338539320537,-0.1952625786238314,-0.4647859241484716,-1.2639232704194252,-0.7358501489339809,-1.5338087743376947,0.11971212685569313,0.3367128504442826,-1.3802224138533508,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-1.133646664653865,1.208250641822815
+530802,1,-1.201475172199822,-0.5404947701863974,0.35034070611991114,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.2235301733016968
+530802,2,-0.9649192100948284,-0.028410237621715174,0.09808543849151298,,,,,,,,,,,,,1.2235301733016968
+531401,0,0.4168578054263319,-0.5404369563759129,-0.8351539579881,-0.08409336463203088,0.6470499178582901,-0.6804312289064511,1.2144831033589276,0.3367128504442826,0.430468891229849,0.9581833684000187,0.22503104425430823,-0.9718299928258278,-1.0422163045785646,0.806708965813594,0.20460009219036931,2.03314471244812
+531401,1,-0.4325091385127145,0.08311885034938876,0.04396546571710477,,,,,,,,,,0.9503768127628092,1.8141914255436393,0.19112267045651915,1.9654545783996582
+531401,2,0.41257502093087217,0.9057982791735953,1.448123406479673,,,,,,,,,,,,,1.9654545783996582
+531402,0,0.8686550252124604,1.3004930583018552,-0.7116979467082238,-0.08409336463203088,0.6470499178582901,-0.6804312289064511,1.2144831033589276,0.3367128504442826,0.430468891229849,0.9581833684000187,0.22503104425430823,-0.9718299928258278,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.9654545783996582
+531402,1,0.7209399120179469,1.330346091420961,1.0652162670597927,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,2.0876882076263428
+531402,2,1.3964994716635155,2.2292603446336186,0.45809556328835566,,,,,,,,,,,,,2.0876882076263428
+531403,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,-0.08409336463203088,0.6470499178582901,-0.6804312289064511,1.2144831033589276,0.3367128504442826,0.430468891229849,0.9581833684000187,0.22503104425430823,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.0876882076263428
+531403,1,0.6248191578070585,-0.3623194500333156,0.35034070611991114,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.059714660367144415,2.0513575077056885
+531403,2,-0.07938720443544948,-1.040469464149968,0.18808796969072364,,,,,,,,,,,,,2.0513575077056885
+531701,0,0.19095919553326762,-0.1952625786238314,-0.5882419354283478,1.0957365411553635,0.8984862936387031,1.026323861956036,-0.06274970256151263,0.8790872811828919,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,0.7083640674756347,0.49778314283978853,-1.388853942113607,3.104134732019544,0.20032857358455658
+531701,1,0.14421538675261625,0.17220651042592966,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,3.7028453019878094,0.861674964427948
+531701,2,1.4948919167367798,1.295051827838308,0.09808543849151298,,,,,,,,,,,,,0.861674964427948
+531702,0,-0.5996859390924573,0.2649699250456107,0.6463181773704137,1.0957365411553635,0.8984862936387031,1.026323861956036,-0.06274970256151263,0.8790872811828919,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,0.7083640674756347,-1.0422163045785646,-1.388853942113607,3.104134732019544,0.861674964427948
+531702,1,1.1054229288615007,0.4394694906555523,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,2.197821317045828,0.36438804864883423
+531702,2,1.1013221364437225,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,0.36438804864883423
+531703,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,1.0957365411553635,0.8984862936387031,1.026323861956036,-0.06274970256151263,0.8790872811828919,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.036948323249817
+531703,1,0.4325776493852816,-0.6295824302629383,0.04396546571710477,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.059714660367144415,0.8761987686157227
+531703,2,0.019005240637814846,-0.9626187544170256,-0.08191962390690835,,,,,,,,,,,,,0.8761987686157227
+531704,0,-0.9385338539320537,0.14991179912825014,0.5228621660905376,1.0957365411553635,0.8984862936387031,1.026323861956036,-0.06274970256151263,0.8790872811828919,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.24148216009104212,0.8761987686157227
+531704,1,-0.14414687588004912,0.7958201309617158,1.6779667478654055,,,,,,,,,,1.663413533782179,-1.3914893931436731,1.1944719937511734,0.5987393856048584
+531704,2,-0.6697418748750354,0.43869402077594005,0.45809556328835566,,,,,,,,,,,,,0.5987393856048584
+532502,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,1.833130232272485,1.2756408573093225,1.026323861956036,0.5758667003987075,0.8188234555452687,0.9242937926161762,0.36043714080320877,1.0113786285352542,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.8016469478607178
+532502,1,-2.0665619600978182,-1.2531960507987243,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,2.813255548477173
+532502,2,-0.37456453965524245,-0.028410237621715174,0.9981107504836196,,,,,,,,,,,,,2.813255548477173
+532601,0,-0.37378732919939306,-0.6554950822932735,-0.7116979467082238,1.9806089704959091,1.2756408573093225,0.7418646801456215,0.5758667003987075,-1.1096189648586756,1.7473352949267216,-0.23730908679360116,-0.9544903321671111,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.521341562271118
+532601,1,0.7209399120179469,0.3503818305790114,0.7588410266569864,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,2.5614264011383057
+532601,2,0.5109674660041365,1.1393504083724229,2.1681436560733585,,,,,,,,,,,,,2.5614264011383057
+532703,0,0.8686550252124604,1.5306093101365763,1.5105102563295467,1.390694017602212,0.7727681057484966,0.457405498335207,-0.42767336139592416,0.09565754789378961,0.10125229030563083,-0.23730908679360116,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,2.1451003551483154
+532703,1,1.0093021746506123,0.3503818305790114,1.0652162670597927,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.4419600012801827,1.419329047203064
+532703,2,2.085246587176366,0.5165447305088826,0.638100625686777,,,,,,,,,,,,,1.419329047203064
+532803,0,-1.27738176877165,-0.08020445270647089,-0.3413299128685955,-0.674008317525728,0.6470499178582901,0.7418646801456215,-0.7925970202303356,0.3367128504442826,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-1.388853942113607,0.20460009219036931,2.995732307434082
+532803,1,-1.1053544179889336,-0.6295824302629383,0.04396546571710477,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.310551991190808,2.2368743419647217
+532803,2,-0.8665267650215641,1.7621560862359633,0.2780905008899343,,,,,,,,,,,,,2.2368743419647217
+533002,0,-1.164432463825118,-0.6554950822932735,-0.7116979467082238,1.390694017602212,0.018458978407257843,1.026323861956036,0.8495594445245161,0.5175043273571525,-0.22796431061858732,0.36043714080320877,0.6182048363947807,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.3321164846420288
+533002,1,-1.393716680621599,-1.6986343511814288,-1.6921608965654649,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.19112267045651915,1.5192925930023193
+533002,2,-0.1777796495087138,-0.9626187544170256,-0.7119373423013831,,,,,,,,,,,,,1.5192925930023193
+533003,0,0.7557057202659283,-0.6554950822932735,-0.7116979467082238,1.390694017602212,0.018458978407257843,1.026323861956036,0.8495594445245161,0.5175043273571525,-0.22796431061858732,0.36043714080320877,0.6182048363947807,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.24148216009104212,1.5192925930023193
+533003,1,0.9131814204397238,-1.520459031028347,-1.8964110568340025,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.5515263080596924
+533003,2,0.7077523561506651,-2.0525286906782214,-0.5319322799029617,,,,,,,,,,,,,1.5515263080596924
+533202,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,1.2432152793787876,0.8984862936387031,1.3107830437664505,1.3969449327761334,0.6982958042700221,1.2535103935403944,0.9581833684000187,-1.3476641243075844,0.28831555240026907,0.49778314283978853,-0.2910724881500066,1.9889291013160153,1.9641040563583374
+533202,1,0.048094632541727786,-0.7186700903394792,-0.9772853356255832,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,1.8754427433013916
+533202,2,-0.27617209458197817,-1.040469464149968,-0.5319322799029617,,,,,,,,,,,,,1.8754427433013916
+533802,0,-0.7126352440389895,-0.3103207045411919,-0.5882419354283478,-0.674008317525728,0.1441771662974643,1.026323861956036,-0.7925970202303356,-0.024870103381456905,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.7794625759124756
+533802,1,-0.14414687588004912,-0.00596880972715211,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,0.7015773057937622
+533802,2,-0.37456453965524245,-0.8069173349511406,-0.35192721750454037,,,,,,,,,,,,,0.7015773057937622
+533902,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,1.0957365411553635,1.149922669419116,1.026323861956036,0.028481212147090252,-0.8082998366705593,-0.06335601015647824,-0.23730908679360116,-0.9544903321671111,-1.3918785079011935,-0.27221658086938805,0.806708965813594,3.104134732019544,1.620639443397522
+533902,1,-0.7208714011453798,0.17220651042592966,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,1.6980055570602417
+533902,2,-0.07938720443544948,-0.18411165708760024,0.45809556328835566,,,,,,,,,,,,,1.6980055570602417
+534101,0,1.8851987697312496,-0.770553208210634,-0.8351539579881,1.833130232272485,0.7727681057484966,0.7418646801456215,0.7583285298159133,0.9393511068205153,1.9119435953888306,1.5559295959968287,0.22503104425430823,-0.13173296267509654,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.442047595977783
+534101,1,-0.7208714011453798,0.5285571507320932,0.7588410266569864,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.335604190826416
+534101,2,0.6093599110774008,0.7500968597077102,1.8981360624757264,,,,,,,,,,,,,2.335604190826416
+534103,0,0.3039085004797998,-0.6554950822932735,-0.7116979467082238,1.833130232272485,0.7727681057484966,0.7418646801456215,0.7583285298159133,0.9393511068205153,1.9119435953888306,1.5559295959968287,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.7019448280334473
+534103,1,1.8743889625486083,0.2612941705024705,1.0652162670597927,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.0630639836617988,2.1744043827056885
+534103,2,1.593284361810044,0.7500968597077102,0.908108219284409,,,,,,,,,,,,,2.1744043827056885
+534901,0,-0.14788871930632877,0.6101443027976923,1.5105102563295467,0.5058215882616662,0.6470499178582901,1.026323861956036,0.3021739562728989,0.2161851991690361,-0.5571809115428055,-0.835055314390411,-0.9544903321671111,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.24148216009104212,1.6821200847625732
+534901,1,0.2403361409635047,1.0630831111913384,1.1673413471940615,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.8023717403411865
+534901,2,0.2157901307843435,0.9057982791735953,0.7281031568859877,,,,,,,,,,,,,1.8023717403411865
+536902,0,0.07800989058673549,-0.770553208210634,-0.4647859241484716,0.9482578029319392,0.2698953541876708,0.7418646801456215,0.8495594445245161,0.7585596299076455,0.9242937926161762,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,0.806708965813594,0.8737234706124865,2.3146324157714844
+536902,1,0.14421538675261625,-0.6295824302629383,-0.568785015088508,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,1.7960983514785767
+536902,2,0.11739768571107917,0.43869402077594005,-0.26192468630532967,,,,,,,,,,,,,1.7960983514785767
+537301,0,0.3039085004797998,-1.1157275859627156,-0.9586099692679761,1.6856514940490606,1.2756408573093225,1.026323861956036,0.210943041564296,0.5777681529947757,1.7473352949267216,0.9581833684000187,1.4045524206757267,-0.9718299928258278,1.267782866548965,0.806708965813594,0.42764121833107505,1.3591210842132568
+537301,1,0.2403361409635047,0.5285571507320932,0.963091186925524,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,-0.6931471824645996
+537301,2,0.31418257585760784,1.3729025375712505,0.09808543849151298,,,,,,,,,,,,,-0.6931471824645996
+537302,0,-0.2608380242528609,-1.1157275859627156,-0.9586099692679761,1.6856514940490606,1.2756408573093225,1.026323861956036,0.210943041564296,0.5777681529947757,1.7473352949267216,0.9581833684000187,1.4045524206757267,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,0.8737234706124865,-0.6931471824645996
+537302,1,-0.528629892723603,0.6176448108086341,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.4927377700805664
+537302,2,0.2157901307843435,1.450753247304193,1.2681183440812516,,,,,,,,,,,,,1.4927377700805664
+537801,0,0.6427564153193962,1.1854349323844948,1.1401422224899183,-0.37905084107887943,0.018458978407257843,1.026323861956036,-0.7013661055217327,0.5175043273571525,-1.0510058129291326,-0.835055314390411,-1.740837916448057,0.7083640674756347,1.267782866548965,-0.2910724881500066,3.104134732019544,1.8637466430664062
+537801,1,0.7209399120179469,0.9739954511147976,0.963091186925524,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.799349069595337
+537801,2,-0.37456453965524245,0.04944047211122737,0.908108219284409,,,,,,,,,,,,,1.799349069595337
+537802,0,1.0945536351055247,-0.42537883045855246,-0.7116979467082238,-0.37905084107887943,0.018458978407257843,1.026323861956036,-0.7013661055217327,0.5175043273571525,-1.0510058129291326,-0.835055314390411,-1.740837916448057,0.7083640674756347,1.267782866548965,0.806708965813594,-0.24148216009104212,1.799349069595337
+537802,1,0.048094632541727786,-0.09505646980369299,-0.16028469455143282,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.574828028678894
+537802,2,-0.27617209458197817,0.5165447305088826,0.368093032089145,,,,,,,,,,,,,1.574828028678894
+538101,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,1.833130232272485,1.2756408573093225,1.026323861956036,1.2144831033589276,0.4572405017195292,1.2535103935403944,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,0.5749320387840271
+538101,1,1.1054229288615007,0.4394694906555523,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.51552414894104
+538101,2,1.4948919167367798,-0.18411165708760024,0.7281031568859877,,,,,,,,,,,,,1.51552414894104
+538704,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,0.9482578029319392,0.6470499178582901,0.7418646801456215,1.3969449327761334,-0.024870103381456905,0.7596854921540671,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,2.1656856536865234
+538704,1,0.4325776493852816,-0.4514071101098565,0.04396546571710477,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,2.4984142780303955
+538704,2,0.11739768571107917,-0.028410237621715174,1.178115812882041,,,,,,,,,,,,,2.4984142780303955
+538902,0,1.9981480746777818,2.566132443392821,2.745070369128308,2.1280877087193333,1.401359045199529,0.7418646801456215,1.3057140180675306,1.120142583733385,1.4181186940025035,1.5559295959968287,1.7977262128162,1.1284125825510003,1.267782866548965,0.806708965813594,-0.24148216009104212,2.334052562713623
+538902,1,1.0093021746506123,1.419433751497502,1.0652162670597927,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.4621527194976807
+538902,2,1.1997145815169867,1.0614996986394805,1.988138593674937,,,,,,,,,,,,,2.4621527194976807
+540801,0,-0.14788871930632877,1.5306093101365763,0.893230199930166,-0.08409336463203088,0.1441771662974643,-0.1115128652856221,-0.06274970256151263,-0.20566158029432668,-0.06335601015647824,0.9581833684000187,-0.16814274788616518,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.330476999282837
+540801,1,-0.528629892723603,2.6666609925690743,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.397448778152466
+540801,2,1.1013221364437225,2.0735589251677333,0.9981107504836196,,,,,,,,,,,,,2.397448778152466
+540802,0,0.19095919553326762,0.14991179912825014,-0.5882419354283478,-0.08409336463203088,0.1441771662974643,-0.1115128652856221,-0.06274970256151263,-0.20566158029432668,-0.06335601015647824,0.9581833684000187,-0.16814274788616518,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,-0.6931471824645996
+540802,1,0.048094632541727786,0.08311885034938876,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,-0.6931471824645996
+540802,2,-0.6697418748750354,-0.729066625218198,0.2780905008899343,,,,,,,,,,,,,-0.6931471824645996
+540902,0,-0.14788871930632877,0.14991179912825014,-0.4647859241484716,-0.9689657939725767,-0.10725920948294862,-0.1115128652856221,0.7583285298159133,-0.08513392901908017,-0.06335601015647824,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,1.267782866548965,0.806708965813594,0.42764121833107505,1.8687939643859863
+540902,1,-0.04802612166916067,-0.09505646980369299,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.8959037065505981
+540902,2,-0.1777796495087138,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,1.8959037065505981
+542101,0,0.6427564153193962,2.6811905693101816,2.1277903127289273,1.2432152793787876,1.0242044815289095,0.7418646801456215,1.2144831033589276,1.0598787580957618,1.0889020930782853,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,1.903593897819519
+542101,1,0.6248191578070585,0.6176448108086341,0.5545908663884488,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,2.060594320297241
+542101,2,1.0029296913704582,1.7621560862359633,0.9981107504836196,,,,,,,,,,,,,2.060594320297241
+542102,0,1.320452244998589,1.1854349323844948,1.8808782901691752,1.2432152793787876,1.0242044815289095,0.7418646801456215,1.2144831033589276,1.0598787580957618,1.0889020930782853,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,2.060594320297241
+542102,1,2.0666304709703853,0.08311885034938876,0.963091186925524,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.8689616918563843
+542102,2,1.1013221364437225,-0.41766378628642786,1.8081335312765157,,,,,,,,,,,,,1.8689616918563843
+542103,0,-0.2608380242528609,-1.1157275859627156,-0.9586099692679761,1.2432152793787876,1.0242044815289095,0.7418646801456215,1.2144831033589276,1.0598787580957618,1.0889020930782853,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.8689616918563843
+542103,1,0.14421538675261625,-0.4514071101098565,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,1.6324143409729004
+542103,2,1.1997145815169867,-0.028410237621715174,-0.08191962390690835,,,,,,,,,,,,,1.6324143409729004
+542104,0,0.529807110372864,1.4155511842192159,1.3870542450496706,1.2432152793787876,1.0242044815289095,0.7418646801456215,1.2144831033589276,1.0598787580957618,1.0889020930782853,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.6324143409729004
+542104,1,1.1054229288615007,1.7757843918036655,0.963091186925524,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.5439703464508057
+542104,2,1.1013221364437225,0.9057982791735953,0.638100625686777,,,,,,,,,,,,,2.5439703464508057
+542401,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,1.833130232272485,1.401359045199529,1.026323861956036,1.3969449327761334,2.024099968297734,0.430468891229849,1.5559295959968287,1.7977262128162,1.9685096127017316,-1.0422163045785646,-1.388853942113607,-0.018441033950336395,1.7341290712356567
+542401,1,0.33645689517439314,-0.7186700903394792,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.5220378637313843
+542401,2,0.11739768571107917,-0.4955144960193704,0.368093032089145,,,,,,,,,,,,,1.5220378637313843
+542402,0,-1.6162296836112464,-0.5404369563759129,-0.5882419354283478,1.833130232272485,1.401359045199529,1.026323861956036,1.3969449327761334,2.024099968297734,0.430468891229849,1.5559295959968287,1.7977262128162,1.9685096127017316,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.5220378637313843
+542402,1,-0.04802612166916067,3.023011632875238,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,2.2684428691864014
+542402,2,-0.4729569847285068,1.8400067959689057,-0.26192468630532967,,,,,,,,,,,,,2.2684428691864014
+542802,0,0.529807110372864,0.03485367321088963,0.5228621660905376,0.9482578029319392,0.1441771662974643,1.3107830437664505,0.5758667003987075,0.5777681529947757,0.595077191691958,-0.835055314390411,1.4045524206757267,-0.5517814777504622,-2.5822157519969178,0.806708965813594,0.20460009219036931,2.3881421089172363
+542802,1,1.970509716759497,0.6176448108086341,-0.568785015088508,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,2.4024853706359863
+542802,2,1.1013221364437225,0.6722461499747677,0.18808796969072364,,,,,,,,,,,,,2.4024853706359863
+543602,0,-0.9385338539320537,-0.8856113341279945,-0.7116979467082238,-0.5265295793023037,-0.35869558526336154,0.7418646801456215,-0.9750588496475414,0.5777681529947757,-0.5571809115428055,-0.23730908679360116,1.4045524206757267,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.4566309452056885
+543602,1,-1.201475172199822,-1.431371370951806,-1.7942859766997337,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,1.731703758239746
+543602,2,-1.752058770680943,-1.585424432280566,-2.061975310289543,,,,,,,,,,,,,1.731703758239746
+545202,0,0.529807110372864,0.7252024287150527,0.3994061548106614,-0.5265295793023037,0.39561354207787724,0.7418646801456215,-1.0662897643561442,-0.748036011032936,-0.7217892120049145,1.5559295959968287,1.7977262128162,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-0.24148216009104212,1.6076711416244507
+545202,1,-0.4325091385127145,0.08311885034938876,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,1.8481746912002563
+545202,2,-0.27617209458197817,0.5165447305088826,0.368093032089145,,,,,,,,,,,,,1.8481746912002563
+545301,0,-0.03493941435979663,-0.3103207045411919,-0.3413299128685955,-0.37905084107887943,-0.9872865247143939,0.457405498335207,1.3057140180675306,0.9996149324581385,-0.3925726110806964,1.5559295959968287,1.4045524206757267,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,2.285598039627075
+545301,1,0.14421538675261625,-0.7186700903394792,-0.568785015088508,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.249321699142456
+545301,2,-0.1777796495087138,-1.040469464149968,-0.981944935899015,,,,,,,,,,,,,2.249321699142456
+545402,0,0.07800989058673549,-0.6554950822932735,-0.2178739015887193,0.5058215882616662,-0.8615683368241874,-0.1115128652856221,0.5758667003987075,0.09565754789378961,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,0.8298291563987732
+545402,1,-1.2975959264107106,-1.1641083907221836,-1.3857856561626585,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.4760411977767944
+545402,2,-0.9649192100948284,-0.9626187544170256,-1.3419550606958577,,,,,,,,,,,,,1.4760411977767944
+546201,0,-0.03493941435979663,-0.42537883045855246,-0.3413299128685955,-0.9689657939725767,-0.7358501489339809,-1.5338087743376947,-0.7013661055217327,-0.989091313583429,-1.3802224138533508,-0.23730908679360116,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-1.133646664653865,-0.6931471824645996
+546201,1,-0.8169921553562683,-0.80775775041602,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,0.30692094564437866
+546201,2,-0.4729569847285068,-0.2619623668205428,1.6281284688780944,,,,,,,,,,,,,0.30692094564437866
+546203,0,-1.5032803786647144,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-0.7358501489339809,-1.5338087743376947,-0.7013661055217327,-0.989091313583429,-1.3802224138533508,-0.23730908679360116,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,0.30692094564437866
+546203,1,-0.04802612166916067,-1.431371370951806,-1.590035816431196,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,0.32178404927253723
+546203,2,-0.9649192100948284,-0.9626187544170256,-0.981944935899015,,,,,,,,,,,,,0.32178404927253723
+546401,0,-0.14788871930632877,1.645667436053937,1.757422278889299,-0.8214870557491524,-1.7415956520556326,-0.6804312289064511,-0.33644244668732126,-0.20566158029432668,-1.2156141133912417,0.9581833684000187,1.7977262128162,0.7083640674756347,-0.27221658086938805,-1.388853942113607,-0.4645232862317478,0.9276532530784607
+546401,1,-0.33638838430182605,0.8849077910382567,0.24821562598564237,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,0.8300344347953796
+546401,2,0.11739768571107917,1.450753247304193,1.988138593674937,,,,,,,,,,,,,0.8300344347953796
+546503,0,-1.164432463825118,-0.8856113341279945,-0.7116979467082238,-1.5588807468662738,-0.9872865247143939,-1.8182679561481092,-0.9750588496475414,-1.1096189648586756,-1.3802224138533508,0.9581833684000187,-0.5613165400266386,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,0.20460009219036931,2.5901119709014893
+546503,1,-2.5471657311522606,-0.9859330705691017,-1.079410415759852,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,0.37043458223342896
+546503,2,-3.6215152270729654,-0.8069173349511406,-1.9719727790903323,,,,,,,,,,,,,0.37043458223342896
+546704,0,-1.164432463825118,-0.08020445270647089,0.029038120971032973,-0.9689657939725767,-1.2387229004948068,-1.5338087743376947,-0.42767336139592416,-0.14539775465670343,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.3508932292461395
+546704,1,-1.9704412058869298,-0.2732317899567748,-1.079410415759852,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.8122266528381351,1.0138639211654663
+546704,2,-0.4729569847285068,-0.41766378628642786,-1.7019651854927003,,,,,,,,,,,,,1.0138639211654663
+546705,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.9689657939725767,-1.2387229004948068,-1.5338087743376947,-0.42767336139592416,-0.14539775465670343,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.018441033950336395,1.0138639211654663
+546705,1,-1.6820789432542644,-1.1641083907221836,-1.2836605760283897,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.3139013144854623,1.807160496711731
+546705,2,-3.3263378918531723,-1.6632751420135086,-1.791967716691911,,,,,,,,,,,,,1.807160496711731
+547702,0,0.7557057202659283,0.4950861768803317,0.5228621660905376,1.0957365411553635,0.7727681057484966,1.026323861956036,0.5758667003987075,0.5777681529947757,-0.5571809115428055,1.5559295959968287,0.22503104425430823,-0.5517814777504622,-1.0422163045785646,0.806708965813594,0.20460009219036931,1.8510314226150513
+547702,1,1.5860266999159431,0.6176448108086341,0.8609661067912552,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.1935653686523438
+547702,2,0.2157901307843435,0.20514189157711243,1.5381259376788836,,,,,,,,,,,,,2.1935653686523438
+548301,0,-0.2608380242528609,-1.000669460045355,-0.8351539579881,-0.23157210285545515,-1.2387229004948068,0.17294631652479245,-1.0662897643561442,0.15592137353141286,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.4782636165618896
+548301,1,-0.04802612166916067,-0.80775775041602,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.7960983514785767
+548301,2,0.11739768571107917,-1.1183201738829107,-0.981944935899015,,,,,,,,,,,,,1.7960983514785767
+548302,0,-0.03493941435979663,0.03485367321088963,0.029038120971032973,-0.23157210285545515,-1.2387229004948068,0.17294631652479245,-1.0662897643561442,0.15592137353141286,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,1.8851572275161743
+548302,1,-0.04802612166916067,-0.2732317899567748,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,2.0678865909576416
+548302,2,0.019005240637814846,0.1272911818441699,0.09808543849151298,,,,,,,,,,,,,2.0678865909576416
+549202,0,-1.164432463825118,-0.08020445270647089,-0.5882419354283478,-0.37905084107887943,0.6470499178582901,0.17294631652479245,0.028481212147090252,0.4572405017195292,-0.3925726110806964,-0.835055314390411,0.6182048363947807,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.1296807527542114
+549202,1,-0.04802612166916067,-0.2732317899567748,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,1.1944719937511734,1.1107271909713745
+549202,2,0.9045372462971938,-0.41766378628642786,-0.08191962390690835,,,,,,,,,,,,,1.1107271909713745
+552201,0,0.8686550252124604,0.8402605546324132,0.7697741886502898,1.0957365411553635,0.8984862936387031,0.457405498335207,0.028481212147090252,0.3367128504442826,0.595077191691958,0.9581833684000187,-0.16814274788616518,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.352120280265808
+552201,1,-0.8169921553562683,0.17220651042592966,0.04396546571710477,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.5967020988464355
+552201,2,-0.07938720443544948,-0.33981307655348536,0.2780905008899343,,,,,,,,,,,,,1.5967020988464355
+552402,0,-0.48673663414592516,-0.6554950822932735,-0.8351539579881,-0.08409336463203088,0.6470499178582901,-0.3959720470960366,-0.42767336139592416,-0.024870103381456905,-0.7217892120049145,-0.835055314390411,-0.9544903321671111,1.9685096127017316,0.49778314283978853,-1.388853942113607,-0.6875644123724536,0.9487622380256653
+552402,1,0.14421538675261625,0.2612941705024705,0.6567159465227176,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.017607569694519
+552402,2,-0.1777796495087138,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,1.017607569694519
+552403,0,-0.14788871930632877,-1.1157275859627156,-0.9586099692679761,-0.08409336463203088,0.6470499178582901,-0.3959720470960366,-0.42767336139592416,-0.024870103381456905,-0.7217892120049145,-0.835055314390411,-0.9544903321671111,1.9685096127017316,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.017607569694519
+552403,1,-1.393716680621599,-1.8768096713345106,-1.7942859766997337,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,0.886038064956665
+552403,2,-1.6536663256076787,-1.5075737225476233,-1.791967716691911,,,,,,,,,,,,,0.886038064956665
+552602,0,-0.03493941435979663,-0.42537883045855246,-0.4647859241484716,-1.2639232704194252,-0.9872865247143939,-0.3959720470960366,-0.8838279349389385,-0.3261892315695732,-1.2156141133912417,-0.23730908679360116,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.419329047203064
+552602,1,0.9131814204397238,-0.896845410492561,-0.6709100952227768,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,1.3910000324249268
+552602,2,0.6093599110774008,-1.1183201738829107,-0.8019398735005937,,,,,,,,,,,,,1.3910000324249268
+552802,0,0.6427564153193962,2.566132443392821,1.757422278889299,-0.23157210285545515,0.018458978407257843,0.17294631652479245,-1.1575206790647472,-0.8685636623081825,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,-1.0422163045785646,0.806708965813594,-0.24148216009104212,2.379955530166626
+552802,1,0.7209399120179469,1.8648720518802064,1.1673413471940615,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.52605938911438
+552802,2,1.6916768068833083,1.6843053765030207,1.3581208752804623,,,,,,,,,,,,,2.52605938911438
+554601,0,-0.03493941435979663,0.3800280509629712,0.15249413225090913,0.2108641118148177,-0.48441377315356804,0.457405498335207,0.3934048709815018,0.8188234555452687,-0.22796431061858732,-0.23730908679360116,-1.3476641243075844,-1.8119270229765592,1.267782866548965,0.806708965813594,0.42764121833107505,2.3760101795196533
+554601,1,1.1054229288615007,0.08311885034938876,0.8609661067912552,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,2.614716053009033
+554601,2,0.5109674660041365,-0.41766378628642786,0.7281031568859877,,,,,,,,,,,,,2.614716053009033
+554602,0,0.6427564153193962,0.2649699250456107,0.2759501435307853,0.2108641118148177,-0.48441377315356804,0.457405498335207,0.3934048709815018,0.8188234555452687,-0.22796431061858732,-0.23730908679360116,-1.3476641243075844,-1.8119270229765592,1.267782866548965,0.806708965813594,-0.4645232862317478,2.511244297027588
+554602,1,0.8170606662288354,0.17220651042592966,0.14609054585137357,,,,,,,,,,1.663413533782179,1.8141914255436393,-0.310551991190808,2.5870413780212402
+554602,2,1.298107026590251,0.43869402077594005,0.008082907292302316,,,,,,,,,,,,,2.5870413780212402
+555301,0,0.19095919553326762,-0.42537883045855246,-0.4647859241484716,-0.674008317525728,-0.48441377315356804,-0.1115128652856221,-0.06274970256151263,0.4572405017195292,-0.22796431061858732,0.36043714080320877,0.22503104425430823,-1.8119270229765592,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.5541508197784424
+555301,1,0.4325776493852816,-0.09505646980369299,0.35034070611991114,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.8122266528381351,2.7815067768096924
+555301,2,1.4948919167367798,-0.4955144960193704,-0.08191962390690835,,,,,,,,,,,,,2.7815067768096924
+556002,0,-0.03493941435979663,-0.6554950822932735,-0.5882419354283478,0.2108641118148177,-0.8615683368241874,0.17294631652479245,1.4881758474847362,1.0598787580957618,-0.3925726110806964,1.5559295959968287,-0.9544903321671111,-0.13173296267509654,1.267782866548965,1.9044904197771946,-0.24148216009104212,1.5084161758422852
+556002,1,-0.24026763009093757,-0.2732317899567748,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,1.8620959520339966
+556002,2,-0.4729569847285068,-0.33981307655348536,-0.08191962390690835,,,,,,,,,,,,,1.8620959520339966
+558101,0,-0.7126352440389895,-0.6554950822932735,-0.7116979467082238,0.358342850038242,-1.2387229004948068,-0.9648904107168657,1.0320212739417218,0.2764490248066594,-0.22796431061858732,0.36043714080320877,-2.920359292869476,0.28831555240026907,0.49778314283978853,0.806708965813594,3.104134732019544,0.8191350698471069
+558101,1,-0.33638838430182605,-0.5404947701863974,-0.05815961441716403,,,,,,,,,,1.663413533782179,0.7456311526478686,0.19112267045651915,1.3222147226333618
+558101,2,-0.5713494298017712,-0.41766378628642786,-0.26192468630532967,,,,,,,,,,,,,1.3222147226333618
+558302,0,-1.5032803786647144,-1.3458438377974367,-1.2055219918277285,-0.674008317525728,0.2698953541876708,-1.2493495925272802,-1.9785989114421731,-0.6275083597576895,-1.2156141133912417,-0.23730908679360116,0.6182048363947807,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.824009656906128
+558302,1,-1.393716680621599,-0.9859330705691017,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.7910857200622559
+558302,2,-0.4729569847285068,-0.10626094735465771,-0.35192721750454037,,,,,,,,,,,,,1.7910857200622559
+558904,0,-0.2608380242528609,-0.5404369563759129,-0.3413299128685955,-1.1164445321960008,-1.1130047126046003,-1.8182679561481092,0.210943041564296,-0.08513392901908017,-1.2156141133912417,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.42764121833107505,0.8788071274757385
+558904,1,0.52869840359617,-1.520459031028347,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,0.35801854729652405
+558904,2,0.11739768571107917,-1.1961708836158533,-0.7119373423013831,,,,,,,,,,,,,0.35801854729652405
+559602,0,0.07800989058673549,2.4510743174754603,0.893230199930166,2.1280877087193333,1.401359045199529,1.026323861956036,0.3021739562728989,1.5419893631967478,1.7473352949267216,0.9581833684000187,1.7977262128162,1.1284125825510003,0.49778314283978853,0.806708965813594,3.104134732019544,1.7915880680084229
+559602,1,1.0093021746506123,1.2412584313444202,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.2749412059783936
+559602,2,0.6093599110774008,1.8400067959689057,0.7281031568859877,,,,,,,,,,,,,2.2749412059783936
+560602,0,-0.03493941435979663,-0.42537883045855246,0.2759501435307853,-1.4114020086428494,-2.118750215726252,-0.9648904107168657,-1.24875159377335,-0.20566158029432668,-0.3925726110806964,0.36043714080320877,0.22503104425430823,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.8840749263763428
+560602,1,0.52869840359617,-0.3623194500333156,-0.6709100952227768,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.0626540184020996
+560602,2,-0.4729569847285068,-0.6512159154852555,-0.8019398735005937,,,,,,,,,,,,,1.0626540184020996
+561203,0,0.6427564153193962,1.645667436053937,0.2759501435307853,0.06338537359139342,0.1441771662974643,0.457405498335207,-0.7925970202303356,0.5777681529947757,0.7596854921540671,0.36043714080320877,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.6875644123724536,1.4920862913131714
+561203,1,0.8170606662288354,1.0630831111913384,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,1.477062702178955
+561203,2,-0.1777796495087138,0.36084331104299755,-0.35192721750454037,,,,,,,,,,,,,1.477062702178955
+561403,0,-0.03493941435979663,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,-0.6101319610437744,-0.6804312289064511,-1.6136752526077616,-1.2904104417715454,-0.8863975124670236,0.9581833684000187,-0.5613165400266386,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.3793237209320068
+561403,1,0.33645689517439314,1.2412584313444202,0.45246578625417994,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,1.7181367874145508
+561403,2,-0.6697418748750354,-0.8069173349511406,-0.5319322799029617,,,,,,,,,,,,,1.7181367874145508
+564802,0,-0.14788871930632877,0.3800280509629712,-0.09441789030884316,1.5381727558256364,1.2756408573093225,1.026323861956036,1.0320212739417218,1.120142583733385,1.0889020930782853,0.36043714080320877,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,1.3564748764038086
+564802,1,-0.33638838430182605,-0.09505646980369299,0.14609054585137357,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.4489400386810303
+564802,2,1.1997145815169867,0.7500968597077102,0.18808796969072364,,,,,,,,,,,,,1.4489400386810303
+568602,0,1.7722494647847176,1.0703768064671344,-0.09441789030884316,1.6856514940490606,1.0242044815289095,1.026323861956036,-0.42767336139592416,0.2161851991690361,0.9242937926161762,1.5559295959968287,0.22503104425430823,-0.9718299928258278,1.267782866548965,-1.388853942113607,-1.133646664653865,2.3619370460510254
+568602,1,2.5472342420248277,2.0430473720332882,0.24821562598564237,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.3139013144854623,2.3894474506378174
+568602,2,1.6916768068833083,1.8400067959689057,-0.08191962390690835,,,,,,,,,,,,,2.3894474506378174
+568703,0,-1.3903310737181822,-1.3458438377974367,-1.2055219918277285,-0.5265295793023037,0.2698953541876708,-0.3959720470960366,0.3021739562728989,0.5777681529947757,-0.22796431061858732,0.36043714080320877,-0.9544903321671111,-2.2319755380519246,1.267782866548965,-1.388853942113607,-0.6875644123724536,0.8239643573760986
+568703,1,-2.4510449769413722,-1.8768096713345106,-1.6921608965654649,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,1.1057013273239136
+568703,2,-2.8343756664868507,-1.9746779809452786,-1.9719727790903323,,,,,,,,,,,,,1.1057013273239136
+569502,0,1.5463508548916531,0.14991179912825014,-0.2178739015887193,0.5058215882616662,0.7727681057484966,0.457405498335207,1.2144831033589276,0.3367128504442826,0.10125229030563083,1.5559295959968287,1.4045524206757267,1.1284125825510003,0.49778314283978853,1.9044904197771946,1.9889291013160153,2.995732307434082
+569502,1,1.2015436830723893,-0.18414412988023388,-0.568785015088508,,,,,,,,,,0.9503768127628092,1.8141914255436393,3.7028453019878094,2.995732307434082
+569502,2,1.3964994716635155,-0.4955144960193704,0.368093032089145,,,,,,,,,,,,,2.995732307434082
+570101,0,2.901742514250039,1.5306093101365763,1.3870542450496706,1.6856514940490606,0.6470499178582901,0.457405498335207,1.3969449327761334,1.9638361426601105,1.4181186940025035,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-0.27221658086938805,1.9044904197771946,0.20460009219036931,2.662522554397583
+570101,1,2.3549927336030505,1.0630831111913384,1.882216908133943,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.059714660367144415,2.411360025405884
+570101,2,1.6916768068833083,0.04944047211122737,0.638100625686777,,,,,,,,,,,,,2.411360025405884
+571302,0,-0.48673663414592516,-1.1157275859627156,-0.9586099692679761,0.5058215882616662,0.39561354207787724,1.026323861956036,-0.33644244668732126,0.3367128504442826,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,1.9889291013160153,1.4737372398376465
+571302,1,-0.33638838430182605,-0.9859330705691017,-1.2836605760283897,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.310551991190808,1.721287727355957
+571302,2,-0.1777796495087138,-1.040469464149968,-0.35192721750454037,,,,,,,,,,,,,1.721287727355957
+571802,0,0.4168578054263319,1.5306093101365763,2.004334301449051,1.833130232272485,1.0242044815289095,-0.1115128652856221,-0.518904276104527,0.4572405017195292,1.4181186940025035,-0.835055314390411,0.6182048363947807,1.548461097626366,-1.0422163045785646,0.806708965813594,1.7658879751753094,2.0539581775665283
+571802,1,0.7209399120179469,0.7067324708851749,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,2.2158992290496826
+571802,2,1.0029296913704582,1.8400067959689057,0.638100625686777,,,,,,,,,,,,,2.2158992290496826
+572801,0,0.19095919553326762,1.4155511842192159,-0.09441789030884316,0.9482578029319392,-0.7358501489339809,0.457405498335207,0.3021739562728989,0.15592137353141286,0.9242937926161762,-0.835055314390411,0.6182048363947807,1.548461097626366,-0.27221658086938805,-1.388853942113607,0.8737234706124865,2.065486192703247
+572801,1,0.33645689517439314,0.7067324708851749,-0.16028469455143282,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.310551991190808,2.105905771255493
+572801,2,1.0029296913704582,2.0735589251677333,1.178115812882041,,,,,,,,,,,,,2.105905771255493
+572802,0,-0.8255845489855216,-0.3103207045411919,-0.7116979467082238,0.9482578029319392,-0.7358501489339809,0.457405498335207,0.3021739562728989,0.15592137353141286,0.9242937926161762,-0.835055314390411,0.6182048363947807,1.548461097626366,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.218092679977417
+572802,1,0.4325776493852816,-0.09505646980369299,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,2.0627667903900146
+572802,2,0.019005240637814846,-0.33981307655348536,-0.08191962390690835,,,,,,,,,,,,,2.0627667903900146
+572803,0,1.0945536351055247,-0.1952625786238314,-0.2178739015887193,0.9482578029319392,-0.7358501489339809,0.457405498335207,0.3021739562728989,0.15592137353141286,0.9242937926161762,-0.835055314390411,0.6182048363947807,1.548461097626366,-0.27221658086938805,-1.388853942113607,-0.018441033950336395,2.0627667903900146
+572803,1,0.2403361409635047,0.08311885034938876,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,2.2666268348693848
+572803,2,0.6093599110774008,0.1272911818441699,-0.6219348111021723,,,,,,,,,,,,,2.2666268348693848
+574003,0,-0.9385338539320537,-1.230785711880076,-1.0820659805478523,-1.2639232704194252,-1.9930320278360456,-2.102727137958524,-0.8838279349389385,-2.2546316519735177,-1.2156141133912417,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-1.0422163045785646,-1.388853942113607,-0.24148216009104212,1.674407958984375
+574003,1,-1.393716680621599,-1.431371370951806,-1.590035816431196,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,0.06160171702504158
+574003,2,-0.4729569847285068,-0.8069173349511406,-0.5319322799029617,,,,,,,,,,,,,0.06160171702504158
+574004,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-1.2639232704194252,-1.9930320278360456,-2.102727137958524,-0.8838279349389385,-2.2546316519735177,-1.2156141133912417,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,0.06160171702504158
+574004,1,-0.4325091385127145,0.17220651042592966,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.310551991190808,0.06585076451301575
+574004,2,-0.37456453965524245,-0.18411165708760024,-0.17192215510611902,,,,,,,,,,,,,0.06585076451301575
+578002,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.37905084107887943,-0.6101319610437744,-1.5338087743376947,0.3934048709815018,-0.3261892315695732,-0.5571809115428055,-1.432801541987221,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,2.110074996948242
+578002,1,-2.258803468519595,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.381113052368164
+578002,2,-2.5391983312670576,-1.741125851746451,-1.8819702478911218,,,,,,,,,,,,,1.381113052368164
+578103,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,-0.674008317525728,-1.7415956520556326,-0.9648904107168657,0.8495594445245161,0.8188234555452687,-1.3802224138533508,-0.835055314390411,-0.9544903321671111,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,0.9014517664909363
+578103,1,0.8170606662288354,1.5976090716505837,0.04396546571710477,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,1.3199890851974487
+578103,2,1.0029296913704582,0.7500968597077102,0.45809556328835566,,,,,,,,,,,,,1.3199890851974487
+579802,0,-0.37378732919939306,-0.08020445270647089,0.15249413225090913,-0.674008317525728,-1.3644410883850133,-0.6804312289064511,0.6670976151073104,0.3367128504442826,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,2.424295663833618
+579802,1,-0.14414687588004912,0.7067324708851749,-0.6709100952227768,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,2.379955530166626
+579802,2,0.2157901307843435,0.5943954402418251,0.908108219284409,,,,,,,,,,,,,2.379955530166626
+580202,0,1.6593001598381854,2.2209580656407395,2.2512463240088034,-0.37905084107887943,-0.35869558526336154,0.7418646801456215,0.5758667003987075,0.9393511068205153,0.595077191691958,0.36043714080320877,0.22503104425430823,-0.13173296267509654,-2.5822157519969178,0.806708965813594,0.20460009219036931,2.995732307434082
+580202,1,1.8743889625486083,1.7757843918036655,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,2.8631370067596436
+580202,2,1.1013221364437225,1.0614996986394805,0.7281031568859877,,,,,,,,,,,,,2.8631370067596436
+580502,0,-1.27738176877165,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,0.6470499178582901,-0.1115128652856221,0.3934048709815018,0.09565754789378961,-0.7217892120049145,-0.835055314390411,-1.3476641243075844,-1.8119270229765592,-2.5822157519969178,-1.388853942113607,-0.6875644123724536,1.1934351921081543
+580502,1,-0.8169921553562683,-0.80775775041602,0.14609054585137357,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,0.7815454006195068
+580502,2,-1.2600965453146213,-0.4955144960193704,-0.5319322799029617,,,,,,,,,,,,,0.7815454006195068
+580602,0,0.4168578054263319,0.3800280509629712,-0.4647859241484716,-1.2639232704194252,-1.9930320278360456,-2.671645501579353,-1.5224443378991586,-2.0135763494230243,-1.5448307143154598,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,2.2269363403320312
+580602,1,-0.14414687588004912,-0.80775775041602,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.310551991190808,2.365140438079834
+580602,2,-0.8665267650215641,-0.573365205752313,-0.26192468630532967,,,,,,,,,,,,,2.365140438079834
+582001,0,-0.37378732919939306,-0.1952625786238314,0.15249413225090913,-0.674008317525728,-1.7415956520556326,-1.5338087743376947,-0.518904276104527,0.5175043273571525,-0.5571809115428055,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.6875644123724536,1.370970606803894
+582001,1,-1.585958189043376,-0.09505646980369299,0.24821562598564237,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,1.3560141324996948
+582001,2,0.2157901307843435,-0.41766378628642786,0.5480980944875663,,,,,,,,,,,,,1.3560141324996948
+583402,0,0.19095919553326762,-1.000669460045355,-0.8351539579881,-0.5265295793023037,0.2698953541876708,-0.1115128652856221,0.210943041564296,0.5777681529947757,0.9242937926161762,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.8737234706124865,2.0745630264282227
+583402,1,-0.4325091385127145,-1.0750207306456427,0.45246578625417994,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.8122266528381351,2.087902545928955
+583402,2,1.9868541421031014,1.0614996986394805,-0.981944935899015,,,,,,,,,,,,,2.087902545928955
+583403,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,-0.5265295793023037,0.2698953541876708,-0.1115128652856221,0.210943041564296,0.5777681529947757,0.9242937926161762,-0.23730908679360116,-0.9544903321671111,-0.5517814777504622,1.267782866548965,0.806708965813594,-0.24148216009104212,2.087902545928955
+583403,1,-0.4325091385127145,-0.80775775041602,-1.4879107362969273,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.8247941732406616
+583403,2,-0.1777796495087138,-0.41766378628642786,-0.8919424046998043,,,,,,,,,,,,,1.8247941732406616
+585503,0,1.4334015499451211,-0.42537883045855246,0.3994061548106614,-1.4114020086428494,-0.9872865247143939,-0.1115128652856221,-0.7925970202303356,-0.08513392901908017,-0.3925726110806964,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,-1.133646664653865,1.5311859846115112
+585503,1,0.14421538675261625,1.419433751497502,0.7588410266569864,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,-0.38870376348495483
+585503,2,-0.7681343199482997,0.7500968597077102,-0.35192721750454037,,,,,,,,,,,,,-0.38870376348495483
+587302,0,-0.14788871930632877,-0.08020445270647089,3.362350425527689,0.6533003264850905,-0.10725920948294862,1.3107830437664505,0.8495594445245161,-0.26592540593194997,-0.22796431061858732,0.9581833684000187,1.7977262128162,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,1.548222303390503
+587302,1,1.0093021746506123,1.330346091420961,1.2694664273283303,,,,,,,,,,-1.1887333502953,1.8141914255436393,-0.8122266528381351,2.268598794937134
+587302,2,0.019005240637814846,2.0735589251677333,0.45809556328835566,,,,,,,,,,,,,2.268598794937134
+587401,0,-0.2608380242528609,-1.1157275859627156,-0.9586099692679761,1.2432152793787876,0.7727681057484966,0.7418646801456215,0.3021739562728989,-0.14539775465670343,0.10125229030563083,0.36043714080320877,-0.9544903321671111,1.9685096127017316,1.267782866548965,-0.2910724881500066,-0.6875644123724536,1.3243086338043213
+587401,1,-0.4325091385127145,0.08311885034938876,-0.16028469455143282,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,1.8308147192001343
+587401,2,-0.07938720443544948,0.5165447305088826,0.2780905008899343,,,,,,,,,,,,,1.8308147192001343
+587402,0,-0.8255845489855216,-1.1157275859627156,-0.9586099692679761,1.2432152793787876,0.7727681057484966,0.7418646801456215,0.3021739562728989,-0.14539775465670343,0.10125229030563083,0.36043714080320877,-0.9544903321671111,1.9685096127017316,1.267782866548965,0.806708965813594,-0.9106055385131593,1.8308147192001343
+587402,1,-0.8169921553562683,-1.3422837108752652,-1.4879107362969273,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.310551991190808,2.0786983966827393
+587402,2,0.31418257585760784,-1.741125851746451,-1.1619499982974364,,,,,,,,,,,,,2.0786983966827393
+589701,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.5265295793023037,-0.35869558526336154,0.457405498335207,-0.1539806172701155,-0.3261892315695732,0.10125229030563083,0.36043714080320877,0.6182048363947807,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,1.1348247528076172
+589701,1,-1.8743204516760412,-1.8768096713345106,-1.6921608965654649,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.0630639836617988,1.1791380643844604
+589701,2,-1.5552738805344144,-2.130379400411164,-2.061975310289543,,,,,,,,,,,,,1.1791380643844604
+589702,0,-1.9550775984508428,-0.6554950822932735,-0.4647859241484716,-0.5265295793023037,-0.35869558526336154,0.457405498335207,-0.1539806172701155,-0.3261892315695732,0.10125229030563083,0.36043714080320877,0.6182048363947807,-1.3918785079011935,-0.27221658086938805,0.806708965813594,-1.133646664653865,1.1791380643844604
+589702,1,0.6248191578070585,-1.2531960507987243,-1.079410415759852,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,1.2548483610153198
+589702,2,-0.07938720443544948,-0.8847680446840831,-0.6219348111021723,,,,,,,,,,,,,1.2548483610153198
+590902,0,0.4168578054263319,-0.5404369563759129,-0.4647859241484716,-0.5265295793023037,-0.7358501489339809,-0.6804312289064511,0.6670976151073104,-0.14539775465670343,-0.7217892120049145,0.36043714080320877,0.6182048363947807,-0.13173296267509654,-0.27221658086938805,3.002271873740795,0.8737234706124865,1.8555349111557007
+590902,1,-0.528629892723603,-0.00596880972715211,-0.16028469455143282,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,2.1316261291503906
+590902,2,0.11739768571107917,0.36084331104299755,-0.35192721750454037,,,,,,,,,,,,,2.1316261291503906
+591601,0,-0.37378732919939306,-0.08020445270647089,0.2759501435307853,-0.08409336463203088,0.018458978407257843,0.7418646801456215,0.3021739562728989,0.2764490248066594,-0.5571809115428055,0.9581833684000187,-0.16814274788616518,-1.8119270229765592,-1.812216028287741,0.806708965813594,0.20460009219036931,0.2639169692993164
+591601,1,-0.7208714011453798,0.7067324708851749,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,1.5301461219787598
+591601,2,-0.7681343199482997,0.1272911818441699,0.2780905008899343,,,,,,,,,,,,,1.5301461219787598
+591902,0,0.529807110372864,1.3004930583018552,1.5105102563295467,-1.4114020086428494,0.2698953541876708,-1.2493495925272802,-1.0662897643561442,-0.4467168828448197,-1.3802224138533508,0.36043714080320877,-0.5613165400266386,1.9685096127017316,1.267782866548965,0.806708965813594,0.8737234706124865,2.3900279998779297
+591902,1,0.4325776493852816,1.1521707712678793,1.1673413471940615,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.19112267045651915,2.8932981491088867
+591902,2,0.6093599110774008,0.7500968597077102,1.448123406479673,,,,,,,,,,,,,2.8932981491088867
+591903,0,-0.14788871930632877,-0.770553208210634,-0.7116979467082238,-1.4114020086428494,0.2698953541876708,-1.2493495925272802,-1.0662897643561442,-0.4467168828448197,-1.3802224138533508,0.36043714080320877,-0.5613165400266386,1.9685096127017316,-0.27221658086938805,-0.2910724881500066,0.42764121833107505,2.8932981491088867
+591903,1,0.52869840359617,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.995732307434082
+591903,2,1.1013221364437225,-0.028410237621715174,0.368093032089145,,,,,,,,,,,,,2.995732307434082
+593203,0,-0.37378732919939306,0.9553186805497738,0.893230199930166,-1.5588807468662738,-1.2387229004948068,-0.6804312289064511,-1.1575206790647472,-1.3506742674091685,-1.2156141133912417,0.9581833684000187,0.6182048363947807,0.28831555240026907,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.346407413482666
+593203,1,0.52869840359617,1.1521707712678793,-0.7730351753570456,,,,,,,,,,1.663413533782179,1.8141914255436393,0.4419600012801827,0.36564069986343384
+593203,2,-0.1777796495087138,1.606454666770078,0.8181056880851983,,,,,,,,,,,,,0.36564069986343384
+593205,0,0.19095919553326762,0.2649699250456107,0.893230199930166,-1.5588807468662738,-1.2387229004948068,-0.6804312289064511,-1.1575206790647472,-1.3506742674091685,-1.2156141133912417,0.9581833684000187,0.6182048363947807,0.28831555240026907,0.49778314283978853,3.002271873740795,-0.4645232862317478,1.129593014717102
+593205,1,0.52869840359617,1.330346091420961,0.04396546571710477,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.310551991190808,0.8435264229774475
+593205,2,0.5109674660041365,0.6722461499747677,0.18808796969072364,,,,,,,,,,,,,0.8435264229774475
+593206,0,-1.5032803786647144,-0.770553208210634,-0.7116979467082238,-1.5588807468662738,-1.2387229004948068,-0.6804312289064511,-1.1575206790647472,-1.3506742674091685,-1.2156141133912417,0.9581833684000187,0.6182048363947807,0.28831555240026907,1.267782866548965,1.9044904197771946,-0.4645232862317478,0.8435264229774475
+593206,1,-1.2975959264107106,0.17220651042592966,-0.7730351753570456,,,,,,,,,,-1.1887333502953,1.8141914255436393,-0.059714660367144415,0.9625706076622009
+593206,2,1.7900692519565728,-0.4955144960193704,0.09808543849151298,,,,,,,,,,,,,0.9625706076622009
+596503,0,2.224046684570846,-0.3103207045411919,-0.2178739015887193,-0.08409336463203088,-0.10725920948294862,-0.1115128652856221,-0.7013661055217327,-0.9288274879458058,-0.3925726110806964,-0.835055314390411,1.0113786285352542,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,0.5046901702880859
+596503,1,0.7209399120179469,-0.2732317899567748,-0.36453485481997044,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,0.515326201915741
+596503,2,0.2157901307843435,-1.1183201738829107,-1.1619499982974364,,,,,,,,,,,,,0.515326201915741
+596504,0,0.6427564153193962,-0.42537883045855246,-0.09441789030884316,-0.08409336463203088,-0.10725920948294862,-0.1115128652856221,-0.7013661055217327,-0.9288274879458058,-0.3925726110806964,-0.835055314390411,1.0113786285352542,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-0.24148216009104212,0.5744010210037231
+596504,1,0.048094632541727786,-0.00596880972715211,0.5545908663884488,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,0.6086905598640442
+596504,2,1.0029296913704582,-0.4955144960193704,-0.35192721750454037,,,,,,,,,,,,,0.6086905598640442
+596901,0,-0.2608380242528609,-0.08020445270647089,0.6463181773704137,-0.8214870557491524,-0.6101319610437744,-0.9648904107168657,-0.42767336139592416,-0.14539775465670343,-0.7217892120049145,-0.835055314390411,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,1.9044904197771946,-1.133646664653865,2.6014037132263184
+596901,1,0.4325776493852816,-0.18414412988023388,-0.46665993495423924,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.689476251602173
+596901,2,0.31418257585760784,-0.8069173349511406,0.18808796969072364,,,,,,,,,,,,,2.689476251602173
+596902,0,-0.03493941435979663,-0.3103207045411919,-0.2178739015887193,-0.8214870557491524,-0.6101319610437744,-0.9648904107168657,-0.42767336139592416,-0.14539775465670343,-0.7217892120049145,-0.835055314390411,0.6182048363947807,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-1.133646664653865,2.689476251602173
+596902,1,2.258871979392162,-0.2732317899567748,-1.1815354958941209,,,,,,,,,,0.2373400917434395,1.8141914255436393,-1.0630639836617988,2.7112207412719727
+596902,2,0.11739768571107917,-0.6512159154852555,-2.2419803726879644,,,,,,,,,,,,,2.7112207412719727
+598301,0,1.4334015499451211,3.601655576649066,2.4981583465685557,0.06338537359139342,0.2698953541876708,0.7418646801456215,0.6670976151073104,0.3367128504442826,-0.3925726110806964,0.36043714080320877,-0.16814274788616518,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.7538639307022095
+598301,1,0.048094632541727786,1.330346091420961,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.0630639836617988,1.8305209875106812
+598301,2,0.7077523561506651,2.307111054366561,0.5480980944875663,,,,,,,,,,,,,1.8305209875106812
+599801,0,1.320452244998589,-0.3103207045411919,-0.09441789030884316,-1.2639232704194252,-0.48441377315356804,0.7418646801456215,-0.06274970256151263,0.09565754789378961,-0.7217892120049145,-3.8237864523744607,-2.13401170858853,0.28831555240026907,-0.27221658086938805,0.806708965813594,-0.9106055385131593,0.2557781934738159
+599801,1,0.14421538675261625,-0.09505646980369299,0.24821562598564237,,,,,,,,,,-0.47569662927593015,2.88275169843941,-0.8122266528381351,-0.6859223246574402
+599801,2,1.1013221364437225,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,-0.6859223246574402
+599804,0,0.4168578054263319,-0.42537883045855246,-0.3413299128685955,-1.2639232704194252,-0.48441377315356804,0.7418646801456215,-0.06274970256151263,0.09565754789378961,-0.7217892120049145,-3.8237864523744607,-2.13401170858853,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,1.0626540184020996
+599804,1,-0.04802612166916067,-1.0750207306456427,-1.3857856561626585,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,1.348159909248352
+599804,2,-0.7681343199482997,-1.040469464149968,-2.331982903887175,,,,,,,,,,,,,1.348159909248352
+600302,0,-0.37378732919939306,0.6101443027976923,0.6463181773704137,-0.5265295793023037,0.018458978407257843,0.457405498335207,-0.2452115319787184,-2.0135763494230243,-0.7217892120049145,0.36043714080320877,1.7977262128162,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.6875644123724536,0.476981520652771
+600302,1,0.14421538675261625,-0.00596880972715211,0.35034070611991114,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,0.5827696919441223
+600302,2,-0.37456453965524245,-0.18411165708760024,1.448123406479673,,,,,,,,,,,,,0.5827696919441223
+600402,0,-0.7126352440389895,-0.770553208210634,-0.7116979467082238,-1.8538382233131223,-1.2387229004948068,-1.5338087743376947,-2.4347534849851873,-2.435423128886387,-1.5448307143154598,0.36043714080320877,-1.3476641243075844,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,0.2958257496356964
+600402,1,-1.2975959264107106,-0.9859330705691017,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,0.7504386305809021
+600402,2,-0.4729569847285068,-0.9626187544170256,-0.35192721750454037,,,,,,,,,,,,,0.7504386305809021
+600702,0,-0.8255845489855216,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-2.370186591506665,-2.102727137958524,-1.9785989114421731,-1.8327848725101548,-1.3802224138533508,-2.030547769584031,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.9106055385131593,0.28899428248405457
+600702,1,-2.4510449769413722,-2.054984991487592,-2.10066121710254,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,0.12503963708877563
+600702,2,-2.1456285509740005,-2.3639315296099914,-1.791967716691911,,,,,,,,,,,,,0.12503963708877563
+600703,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-2.370186591506665,-2.102727137958524,-1.9785989114421731,-1.8327848725101548,-1.3802224138533508,-2.030547769584031,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.24148216009104212,0.12503963708877563
+600703,1,-1.0092336637780452,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,-0.6931471824645996
+600703,2,-1.5552738805344144,-2.208230110144106,-2.061975310289543,,,,,,,,,,,,,-0.6931471824645996
+602201,0,-0.8255845489855216,-0.42537883045855246,-0.09441789030884316,-0.23157210285545515,-0.35869558526336154,-0.6804312289064511,-0.7013661055217327,-1.4109380930467919,-0.7217892120049145,1.5559295959968287,1.0113786285352542,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,0.7928871512413025
+602201,1,-0.528629892723603,-0.896845410492561,-1.2836605760283897,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,1.413444995880127
+602201,2,-1.0633116551680928,-0.729066625218198,-0.7119373423013831,,,,,,,,,,,,,1.413444995880127
+602302,0,-0.03493941435979663,0.03485367321088963,0.7697741886502898,-0.9689657939725767,-0.6101319610437744,-0.3959720470960366,-0.7013661055217327,-0.024870103381456905,-0.3925726110806964,0.9581833684000187,1.7977262128162,1.548461097626366,0.49778314283978853,1.9044904197771946,-0.4645232862317478,2.0511155128479004
+602302,1,-1.6820789432542644,-0.896845410492561,-1.3857856561626585,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,1.4819979667663574
+602302,2,-0.27617209458197817,-1.040469464149968,-0.441929748703751,,,,,,,,,,,,,1.4819979667663574
+602801,0,-1.27738176877165,0.3800280509629712,0.3994061548106614,-0.5265295793023037,0.2698953541876708,-0.3959720470960366,-0.33644244668732126,-0.4467168828448197,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.3843635320663452
+602801,1,-0.9131129095671567,-0.00596880972715211,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,0.8499670624732971
+602801,2,-0.4729569847285068,0.1272911818441699,-0.6219348111021723,,,,,,,,,,,,,0.8499670624732971
+603001,0,-0.37378732919939306,1.4155511842192159,0.3994061548106614,-1.2639232704194252,-1.615877464165426,-1.8182679561481092,-1.7049061673163644,-0.5672445341200663,-0.7217892120049145,-0.23730908679360116,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.4148796796798706
+603001,1,-1.0092336637780452,1.1521707712678793,0.7588410266569864,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,0.9603295922279358
+603001,2,-0.5713494298017712,0.5165447305088826,0.45809556328835566,,,,,,,,,,,,,0.9603295922279358
+604803,0,-0.8255845489855216,-0.42537883045855246,-0.7116979467082238,0.2108641118148177,-0.2329773973731551,-0.1115128652856221,-0.2452115319787184,-0.5069807084824429,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,1.9889291013160153,1.4314398765563965
+604803,1,-0.24026763009093757,-0.5404947701863974,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,1.5159953832626343
+604803,2,-0.1777796495087138,-0.41766378628642786,-0.08191962390690835,,,,,,,,,,,,,1.5159953832626343
+604804,0,1.320452244998589,0.7252024287150527,1.8808782901691752,0.2108641118148177,-0.2329773973731551,-0.1115128652856221,-0.2452115319787184,-0.5069807084824429,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.5159953832626343
+604804,1,0.6248191578070585,0.7067324708851749,0.35034070611991114,,,,,,,,,,1.663413533782179,0.7456311526478686,1.6961466553985005,1.3793237209320068
+604804,2,-0.1777796495087138,0.5165447305088826,0.2780905008899343,,,,,,,,,,,,,1.3793237209320068
+604902,0,0.07800989058673549,0.7252024287150527,0.5228621660905376,-0.9689657939725767,-0.35869558526336154,-0.6804312289064511,-1.0662897643561442,-0.6275083597576895,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.018441033950336395,1.1417871713638306
+604902,1,-0.7208714011453798,-0.00596880972715211,0.45246578625417994,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,0.35801854729652405
+604902,2,-0.5713494298017712,0.20514189157711243,0.5480980944875663,,,,,,,,,,,,,0.35801854729652405
+605301,0,0.4168578054263319,0.03485367321088963,0.3994061548106614,-0.37905084107887943,0.5213317299680837,0.457405498335207,-0.8838279349389385,-0.20566158029432668,-0.22796431061858732,0.36043714080320877,0.6182048363947807,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.8788477182388306
+605301,1,0.52869840359617,2.9339239727986968,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.7980340719223022
+605301,2,0.11739768571107917,0.5943954402418251,0.908108219284409,,,,,,,,,,,,,1.7980340719223022
+605302,0,0.07800989058673549,0.4950861768803317,0.029038120971032973,-0.37905084107887943,0.5213317299680837,0.457405498335207,-0.8838279349389385,-0.20566158029432668,-0.22796431061858732,0.36043714080320877,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.7980340719223022
+605302,1,0.14421538675261625,0.3503818305790114,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.5084161758422852
+605302,2,0.5109674660041365,0.8279475694406527,0.45809556328835566,,,,,,,,,,,,,1.5084161758422852
+606602,0,-0.8255845489855216,-0.5404369563759129,-0.4647859241484716,-0.674008317525728,0.2698953541876708,0.457405498335207,1.1232521886503248,0.2764490248066594,-0.5571809115428055,1.5559295959968287,1.0113786285352542,1.1284125825510003,0.49778314283978853,0.806708965813594,-0.24148216009104212,0.5799852609634399
+606602,1,0.33645689517439314,0.5285571507320932,0.35034070611991114,,,,,,,,,,0.9503768127628092,2.88275169843941,-0.5613893220144716,0.4412984848022461
+606602,2,0.11739768571107917,1.3729025375712505,0.008082907292302316,,,,,,,,,,,,,0.4412984848022461
+606904,0,-0.8255845489855216,-0.770553208210634,-0.4647859241484716,-1.2639232704194252,-1.1130047126046003,-0.6804312289064511,-2.3435225702765847,-2.073840175060648,-1.0510058129291326,0.36043714080320877,-0.16814274788616518,1.1284125825510003,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.6944908499717712
+606904,1,0.14421538675261625,-1.6986343511814288,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.3139013144854623,0.657188892364502
+606904,2,0.31418257585760784,-1.1183201738829107,-0.35192721750454037,,,,,,,,,,,,,0.657188892364502
+611404,0,-0.9385338539320537,-0.8856113341279945,-0.7116979467082238,-1.4114020086428494,-1.2387229004948068,-0.6804312289064511,-0.7013661055217327,-0.5069807084824429,-1.0510058129291326,0.36043714080320877,0.6182048363947807,0.7083640674756347,-1.812216028287741,-0.2910724881500066,-1.3566877907945707,1.360993504524231
+611404,1,-1.393716680621599,-0.896845410492561,-0.6709100952227768,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.6333134174346924
+611404,2,-1.2600965453146213,-0.6512159154852555,-1.251952529496647,,,,,,,,,,,,,1.6333134174346924
+611902,0,-1.0514831588785858,-0.770553208210634,-0.2178739015887193,-0.8214870557491524,-1.4901592762752198,-2.671645501579353,-1.7049061673163644,-0.5672445341200663,-1.3802224138533508,-0.23730908679360116,1.0113786285352542,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.9770625829696655
+611902,1,-2.5471657311522606,-1.3422837108752652,-1.6921608965654649,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.059714660367144415,1.7056697607040405
+611902,2,-3.0311605566333792,-1.6632751420135086,-1.8819702478911218,,,,,,,,,,,,,1.7056697607040405
+616103,0,-0.37378732919939306,1.645667436053937,0.893230199930166,-0.9689657939725767,-0.10725920948294862,0.7418646801456215,-1.6136752526077616,0.2161851991690361,-1.7094390147775689,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-2.5822157519969178,-0.2910724881500066,-0.6875644123724536,0.07124947011470795
+616103,1,0.4325776493852816,1.330346091420961,0.45246578625417994,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,0.36558976769447327
+616103,2,1.593284361810044,1.450753247304193,1.8081335312765157,,,,,,,,,,,,,0.36558976769447327
+616104,0,0.07800989058673549,0.8402605546324132,0.7697741886502898,-0.9689657939725767,-0.10725920948294862,0.7418646801456215,-1.6136752526077616,0.2161851991690361,-1.7094390147775689,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-2.5822157519969178,-1.388853942113607,-1.3566877907945707,-0.027706654742360115
+616104,1,0.52869840359617,0.7067324708851749,1.371591507462599,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,0.7418388724327087
+616104,2,0.11739768571107917,0.5165447305088826,0.18808796969072364,,,,,,,,,,,,,0.7418388724327087
+616303,0,0.07800989058673549,0.7252024287150527,0.6463181773704137,-0.08409336463203088,0.7727681057484966,1.026323861956036,-0.61013519081313,-0.8685636623081825,-0.7217892120049145,0.9581833684000187,0.6182048363947807,-1.3918785079011935,0.49778314283978853,1.9044904197771946,0.20460009219036931,2.747105360031128
+616303,1,0.6248191578070585,-0.18414412988023388,1.2694664273283303,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.9204952716827393
+616303,2,1.4948919167367798,0.1272911818441699,0.368093032089145,,,,,,,,,,,,,1.9204952716827393
+616402,0,-0.2608380242528609,0.6101443027976923,-0.09441789030884316,0.06338537359139342,-0.35869558526336154,0.457405498335207,-0.518904276104527,-1.5314657443220383,-0.06335601015647824,0.36043714080320877,0.22503104425430823,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-1.133646664653865,1.7856541872024536
+616402,1,0.048094632541727786,0.17220651042592966,-0.16028469455143282,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.4419600012801827,2.26259708404541
+616402,2,-0.27617209458197817,0.20514189157711243,-1.791967716691911,,,,,,,,,,,,,2.26259708404541
+616801,0,0.529807110372864,0.8402605546324132,0.2759501435307853,-0.23157210285545515,-0.9872865247143939,-0.9648904107168657,0.8495594445245161,0.3367128504442826,-0.5571809115428055,-0.23730908679360116,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,1.9044904197771946,-0.4645232862317478,0.49949711561203003
+616801,1,0.52869840359617,0.08311885034938876,-0.26240977468570165,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,0.7651342749595642
+616801,2,0.8061448012239295,2.151409634900676,-2.5119879662855964,,,,,,,,,,,,,0.7651342749595642
+618101,0,-0.2608380242528609,-0.770553208210634,0.6463181773704137,-0.674008317525728,-1.1130047126046003,-0.3959720470960366,-1.24875159377335,-1.712257221234908,-1.2156141133912417,-0.23730908679360116,0.6182048363947807,0.28831555240026907,-1.0422163045785646,0.806708965813594,3.104134732019544,0.0770183652639389
+618101,1,0.14421538675261625,-1.2531960507987243,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,0.29251447319984436
+618101,2,-0.27617209458197817,-1.429723012814681,-0.981944935899015,,,,,,,,,,,,,0.29251447319984436
+619501,0,-0.14788871930632877,0.4950861768803317,0.6463181773704137,-0.23157210285545515,-0.10725920948294862,-0.9648904107168657,-0.33644244668732126,-0.024870103381456905,-0.8863975124670236,0.9581833684000187,1.4045524206757267,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.1110920906066895
+619501,1,0.7209399120179469,0.4394694906555523,0.35034070611991114,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.1107271909713745
+619501,2,-0.07938720443544948,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,1.1107271909713745
+621001,0,-0.03493941435979663,0.03485367321088963,-0.09441789030884316,-0.8214870557491524,-1.867313839945839,-1.8182679561481092,1.0320212739417218,-0.5069807084824429,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-1.133646664653865,0.4804854989051819
+621001,1,0.52869840359617,0.8849077910382567,0.8609661067912552,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,0.6160309314727783
+621001,2,-0.5713494298017712,1.295051827838308,-0.35192721750454037,,,,,,,,,,,,,0.6160309314727783
+621002,0,0.529807110372864,1.3004930583018552,0.7697741886502898,-0.8214870557491524,-1.867313839945839,-1.8182679561481092,1.0320212739417218,-0.5069807084824429,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-1.3566877907945707,0.002994222566485405
+621002,1,0.2403361409635047,3.023011632875238,0.04396546571710477,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.3139013144854623,0.7253972887992859
+621002,2,-0.37456453965524245,0.20514189157711243,-0.35192721750454037,,,,,,,,,,,,,0.7253972887992859
+621501,0,-0.2608380242528609,-0.3103207045411919,-0.2178739015887193,-0.37905084107887943,0.1441771662974643,0.457405498335207,1.1232521886503248,1.9035723170224874,0.10125229030563083,0.9581833684000187,0.22503104425430823,-1.3918785079011935,0.49778314283978853,1.9044904197771946,-0.9106055385131593,2.0724709033966064
+621501,1,0.4325776493852816,-0.09505646980369299,-0.26240977468570165,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.184756278991699
+621501,2,-0.4729569847285068,-0.10626094735465771,-0.8919424046998043,,,,,,,,,,,,,2.184756278991699
+621701,0,-1.164432463825118,-0.42537883045855246,-0.2178739015887193,-1.2639232704194252,-1.1130047126046003,-2.3871863197689382,0.028481212147090252,-0.3261892315695732,-0.8863975124670236,-1.432801541987221,-1.740837916448057,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,0.8737234706124865,-0.6931471824645996
+621701,1,1.2976644372832777,-0.2732317899567748,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,3.7028453019878094,-0.2773612141609192
+621701,2,0.11739768571107917,0.282992601310055,0.09808543849151298,,,,,,,,,,,,,-0.2773612141609192
+623503,0,0.529807110372864,-0.42537883045855246,-0.2178739015887193,0.5058215882616662,0.6470499178582901,-0.1115128652856221,1.4881758474847362,0.3367128504442826,-0.22796431061858732,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-2.5822157519969178,-0.2910724881500066,-1.3566877907945707,2.2989680767059326
+623503,1,0.2403361409635047,-0.09505646980369299,0.35034070611991114,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-1.3139013144854623,2.2646894454956055
+623503,2,0.019005240637814846,1.6843053765030207,-0.7119373423013831,,,,,,,,,,,,,2.2646894454956055
+624302,0,0.6427564153193962,-0.42537883045855246,-0.09441789030884316,-0.5265295793023037,-0.7358501489339809,-1.2493495925272802,-0.518904276104527,0.6380319786323989,-0.7217892120049145,1.5559295959968287,0.6182048363947807,-0.5517814777504622,0.49778314283978853,1.9044904197771946,-0.4645232862317478,-0.6931471824645996
+624302,1,-0.7208714011453798,-1.2531960507987243,-0.7730351753570456,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,0.15324164927005768
+624302,2,-0.6697418748750354,-0.8069173349511406,-0.981944935899015,,,,,,,,,,,,,0.15324164927005768
+624401,0,-0.48673663414592516,0.14991179912825014,0.2759501435307853,0.8007790647085149,-0.2329773973731551,-0.1115128652856221,0.3934048709815018,0.15592137353141286,0.9242937926161762,1.5559295959968287,1.0113786285352542,0.7083640674756347,-0.27221658086938805,0.806708965813594,1.9889291013160153,0.9525032043457031
+624401,1,0.2403361409635047,-0.2732317899567748,0.24821562598564237,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,0.7845523953437805
+624401,2,0.31418257585760784,0.36084331104299755,-1.251952529496647,,,,,,,,,,,,,0.7845523953437805
+625502,0,0.3039085004797998,0.3800280509629712,-0.09441789030884316,-0.08409336463203088,0.2698953541876708,0.17294631652479245,0.3021739562728989,-0.6275083597576895,0.10125229030563083,1.5559295959968287,1.0113786285352542,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-0.6875644123724536,1.153459906578064
+625502,1,0.048094632541727786,0.17220651042592966,-1.1815354958941209,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,1.340333342552185
+625502,2,-0.5713494298017712,-0.10626094735465771,-0.7119373423013831,,,,,,,,,,,,,1.340333342552185
+627701,0,-0.48673663414592516,0.03485367321088963,0.5228621660905376,-1.5588807468662738,0.6470499178582901,0.17294631652479245,-0.7013661055217327,-0.26592540593194997,-0.8863975124670236,0.9581833684000187,1.4045524206757267,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.069667100906372
+627701,1,0.2403361409635047,0.7067324708851749,0.8609661067912552,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.19112267045651915,2.2015633583068848
+627701,2,-0.1777796495087138,0.1272911818441699,-0.8919424046998043,,,,,,,,,,,,,2.2015633583068848
+627702,0,-1.164432463825118,-0.42537883045855246,-0.4647859241484716,-1.5588807468662738,0.6470499178582901,0.17294631652479245,-0.7013661055217327,-0.26592540593194997,-0.8863975124670236,0.9581833684000187,1.4045524206757267,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.363544464111328
+627702,1,-0.33638838430182605,-0.7186700903394792,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,2.400158405303955
+627702,2,-0.7681343199482997,-0.729066625218198,-0.5319322799029617,,,,,,,,,,,,,2.400158405303955
+627801,0,0.07800989058673549,0.6101443027976923,0.7697741886502898,0.5058215882616662,0.6470499178582901,1.026323861956036,0.6670976151073104,0.2161851991690361,1.2535103935403944,0.9581833684000187,1.7977262128162,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,1.5408765077590942
+627801,1,-0.04802612166916067,-0.18414412988023388,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.6456503868103027
+627801,2,-0.4729569847285068,0.04944047211122737,0.638100625686777,,,,,,,,,,,,,1.6456503868103027
+628202,0,0.3039085004797998,-1.1157275859627156,-0.9586099692679761,-1.2639232704194252,-0.7358501489339809,-0.1115128652856221,-1.4312134231905558,-0.9288274879458058,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.018441033950336395,0.7081189155578613
+628202,1,-2.3549242227304834,-1.3422837108752652,-1.9985361369682713,,,,,,,,,,0.2373400917434395,2.88275169843941,0.9436346629275099,0.7893117666244507
+628202,2,-0.9649192100948284,-1.3518723030817383,-1.1619499982974364,,,,,,,,,,,,,0.7893117666244507
+629001,0,-1.164432463825118,-0.8856113341279945,-0.7116979467082238,-0.9689657939725767,-1.1130047126046003,-1.2493495925272802,-0.8838279349389385,-0.5672445341200663,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,0.3993598520755768
+629001,1,-0.9131129095671567,-1.431371370951806,-1.3857856561626585,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,0.8571066856384277
+629001,2,-0.7681343199482997,-1.1183201738829107,-1.0719474670982256,,,,,,,,,,,,,0.8571066856384277
+629304,0,-0.8255845489855216,-0.8856113341279945,-0.5882419354283478,-1.8538382233131223,-0.8615683368241874,-1.8182679561481092,-2.1610607408593787,-2.616214605799257,-1.3802224138533508,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,0.4781186580657959
+629304,1,-0.9131129095671567,-1.609546691104888,-1.2836605760283897,,,,,,,,,,0.2373400917434395,1.8141914255436393,1.1944719937511734,0.9142692685127258
+629304,2,-1.4568814354611501,-1.741125851746451,-0.7119373423013831,,,,,,,,,,,,,0.9142692685127258
+629703,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.5265295793023037,-1.4901592762752198,-1.8182679561481092,-2.6172153144023933,-2.2546316519735177,-1.0510058129291326,-0.23730908679360116,-1.3476641243075844,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.30569419264793396
+629703,1,-1.4898374348324874,-2.054984991487592,-1.8964110568340025,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,0.4649827182292938
+629703,2,-1.2600965453146213,-2.286080819877049,-2.5119879662855964,,,,,,,,,,,,,0.4649827182292938
+629901,0,1.4334015499451211,1.9908418138060184,2.745070369128308,-0.674008317525728,1.0242044815289095,0.17294631652479245,0.028481212147090252,0.15592137353141286,-0.06335601015647824,1.5559295959968287,1.0113786285352542,1.1284125825510003,0.49778314283978853,1.9044904197771946,0.8737234706124865,1.8984321355819702
+629901,1,1.5860266999159431,1.330346091420961,1.371591507462599,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,2.1498022079467773
+629901,2,1.7900692519565728,1.606454666770078,1.3581208752804623,,,,,,,,,,,,,2.1498022079467773
+629902,0,0.6427564153193962,1.0703768064671344,2.3747023352886796,-0.674008317525728,1.0242044815289095,0.17294631652479245,0.028481212147090252,0.15592137353141286,-0.06335601015647824,1.5559295959968287,1.0113786285352542,1.1284125825510003,1.267782866548965,1.9044904197771946,-0.6875644123724536,2.1498022079467773
+629902,1,0.8170606662288354,1.5976090716505837,1.1673413471940615,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.310551991190808,1.9784197807312012
+629902,2,0.8061448012239295,1.450753247304193,2.528153780870201,,,,,,,,,,,,,1.9784197807312012
+631101,0,-1.27738176877165,-0.6554950822932735,-0.7116979467082238,1.833130232272485,0.39561354207787724,0.7418646801456215,0.3021739562728989,0.09565754789378961,1.5827269944646125,0.9581833684000187,0.6182048363947807,1.1284125825510003,-1.0422163045785646,0.806708965813594,-0.24148216009104212,0.9568647742271423
+631101,1,-0.24026763009093757,-1.431371370951806,-1.3857856561626585,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,0.8141009211540222
+631101,2,-0.6697418748750354,-1.5075737225476233,-1.521960123094279,,,,,,,,,,,,,0.8141009211540222
+631201,0,-0.03493941435979663,0.3800280509629712,0.2759501435307853,-0.674008317525728,-1.3644410883850133,-1.2493495925272802,-0.518904276104527,0.6982958042700221,-1.5448307143154598,0.36043714080320877,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.6875644123724536,-0.20245274901390076
+631201,1,0.4325776493852816,0.3503818305790114,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,-1.0630639836617988,0.20032857358455658
+631201,2,-0.1777796495087138,0.43869402077594005,0.45809556328835566,,,,,,,,,,,,,0.20032857358455658
+631203,0,-0.2608380242528609,0.14991179912825014,0.15249413225090913,-0.674008317525728,-1.3644410883850133,-1.2493495925272802,-0.518904276104527,0.6982958042700221,-1.5448307143154598,0.36043714080320877,-0.9544903321671111,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.8465985655784607
+631203,1,0.52869840359617,0.7067324708851749,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.1644368171691895
+631203,2,-0.07938720443544948,0.282992601310055,0.18808796969072364,,,,,,,,,,,,,1.1644368171691895
+632206,0,-0.9385338539320537,-0.5404369563759129,-0.5882419354283478,-0.8214870557491524,0.2698953541876708,0.17294631652479245,0.4846357856901046,0.3367128504442826,0.2658605907677399,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.20460009219036931,1.7113808393478394
+632206,1,-1.2975959264107106,-0.9859330705691017,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.4756414890289307
+632206,2,-0.7681343199482997,-0.729066625218198,0.18808796969072364,,,,,,,,,,,,,1.4756414890289307
+632704,0,-0.5996859390924573,-0.1952625786238314,0.15249413225090913,-1.5588807468662738,-1.3644410883850133,-0.9648904107168657,-1.1575206790647472,-0.38645305720719647,-1.0510058129291326,-1.432801541987221,-0.16814274788616518,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,0.20460009219036931,0.5291650295257568
+632704,1,-0.528629892723603,-0.18414412988023388,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,0.47886303067207336
+632704,2,-0.7681343199482997,-0.4955144960193704,-1.3419550606958577,,,,,,,,,,,,,0.47886303067207336
+633401,0,-1.5032803786647144,-0.5404369563759129,-0.8351539579881,0.06338537359139342,-0.8615683368241874,0.457405498335207,0.210943041564296,-0.20566158029432668,0.595077191691958,-0.23730908679360116,-0.5613165400266386,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,2.11169171333313
+633401,1,-1.585958189043376,-1.3422837108752652,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.058462619781494
+633401,2,-1.3584889903878858,-1.741125851746451,-1.791967716691911,,,,,,,,,,,,,2.058462619781494
+633602,0,-0.03493941435979663,-0.1952625786238314,0.15249413225090913,-0.9689657939725767,-1.7415956520556326,-1.2493495925272802,-1.339982508481953,-0.5672445341200663,-1.3802224138533508,0.36043714080320877,1.0113786285352542,-0.13173296267509654,-2.5822157519969178,-1.388853942113607,0.20460009219036931,0.9947413206100464
+633602,1,0.8170606662288354,-0.00596880972715211,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,-0.3206198513507843
+633602,2,-0.8665267650215641,0.36084331104299755,-0.08191962390690835,,,,,,,,,,,,,-0.3206198513507843
+633902,0,-0.5996859390924573,-0.6554950822932735,-0.5882419354283478,-0.9689657939725767,-1.2387229004948068,-0.9648904107168657,-0.8838279349389385,-0.8082998366705593,-0.22796431061858732,1.5559295959968287,1.7977262128162,0.28831555240026907,0.49778314283978853,0.806708965813594,0.8737234706124865,2.2875821590423584
+633902,1,-0.8169921553562683,-1.520459031028347,-0.16028469455143282,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.341325283050537
+633902,2,-0.4729569847285068,-1.1183201738829107,-1.251952529496647,,,,,,,,,,,,,2.341325283050537
+633903,0,0.7557057202659283,0.2649699250456107,0.029038120971032973,-0.9689657939725767,-1.2387229004948068,-0.9648904107168657,-0.8838279349389385,-0.8082998366705593,-0.22796431061858732,1.5559295959968287,1.7977262128162,0.28831555240026907,-0.27221658086938805,0.806708965813594,-1.133646664653865,2.4724788665771484
+633903,1,1.0093021746506123,-0.18414412988023388,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,2.4788014888763428
+633903,2,0.2157901307843435,-0.573365205752313,-0.441929748703751,,,,,,,,,,,,,2.4788014888763428
+634204,0,-1.164432463825118,-0.1952625786238314,-0.5882419354283478,-0.9689657939725767,-0.8615683368241874,-0.3959720470960366,-1.4312134231905558,-1.2904104417715454,-1.5448307143154598,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-0.4645232862317478,1.8845422267913818
+634204,1,-1.201475172199822,-0.5404947701863974,-1.079410415759852,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,1.918394923210144
+634204,2,-0.5713494298017712,-1.040469464149968,-0.6219348111021723,,,,,,,,,,,,,1.918394923210144
+635302,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,0.2108641118148177,-1.3644410883850133,-1.8182679561481092,0.210943041564296,0.5175043273571525,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.7083640674756347,1.267782866548965,0.806708965813594,-0.9106055385131593,2.161705493927002
+635302,1,-2.0665619600978182,-1.2531960507987243,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,2.3496084213256836
+635302,2,0.31418257585760784,-1.040469464149968,-1.251952529496647,,,,,,,,,,,,,2.3496084213256836
+635303,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,0.2108641118148177,-1.3644410883850133,-1.8182679561481092,0.210943041564296,0.5175043273571525,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.7083640674756347,1.267782866548965,0.806708965813594,0.20460009219036931,2.161705493927002
+635303,1,-1.9704412058869298,-1.3422837108752652,-1.3857856561626585,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.3496084213256836
+635303,2,-0.5713494298017712,-1.1183201738829107,-1.6119626542934897,,,,,,,,,,,,,2.3496084213256836
+635701,0,1.8851987697312496,0.03485367321088963,-0.3413299128685955,-0.37905084107887943,-1.3644410883850133,0.7418646801456215,0.5758667003987075,-0.5069807084824429,-0.06335601015647824,0.36043714080320877,0.22503104425430823,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.4645232862317478,0.3993663191795349
+635701,1,-0.4325091385127145,0.17220651042592966,1.1673413471940615,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,-0.45491474866867065
+635701,2,-0.4729569847285068,0.20514189157711243,-0.8019398735005937,,,,,,,,,,,,,-0.45491474866867065
+635802,0,-1.7291789885577786,-1.230785711880076,-1.0820659805478523,-0.8214870557491524,-1.4901592762752198,-1.5338087743376947,-2.069829826150776,-0.26592540593194997,-1.0510058129291326,-0.23730908679360116,1.0113786285352542,0.28831555240026907,-1.0422163045785646,1.9044904197771946,-0.6875644123724536,0.592125415802002
+635802,1,-1.6820789432542644,-1.7877220112579697,-1.4879107362969273,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,0.9003428816795349
+635802,2,-2.047236105900736,-1.741125851746451,-1.8819702478911218,,,,,,,,,,,,,0.9003428816795349
+635803,0,-0.37378732919939306,-0.770553208210634,-0.5882419354283478,-0.8214870557491524,-1.4901592762752198,-1.5338087743376947,-2.069829826150776,-0.26592540593194997,-1.0510058129291326,-0.23730908679360116,1.0113786285352542,0.28831555240026907,1.267782866548965,0.806708965813594,-0.24148216009104212,0.9003428816795349
+635803,1,-1.1053544179889336,-1.520459031028347,-1.3857856561626585,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,1.313968539237976
+635803,2,-1.2600965453146213,-1.3518723030817383,-0.26192468630532967,,,,,,,,,,,,,1.313968539237976
+636303,0,-1.5032803786647144,-0.770553208210634,-0.8351539579881,-0.674008317525728,-0.9872865247143939,-0.9648904107168657,-0.518904276104527,-1.4109380930467919,-0.8863975124670236,0.36043714080320877,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.018441033950336395,0.45105665922164917
+636303,1,-1.6820789432542644,-1.520459031028347,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-1.0630639836617988,0.4600786566734314
+636303,2,-1.4568814354611501,-0.729066625218198,-0.441929748703751,,,,,,,,,,,,,0.4600786566734314
+637104,0,-0.8255845489855216,-0.5404369563759129,0.3994061548106614,-1.8538382233131223,-1.867313839945839,-2.3871863197689382,-2.3435225702765847,-2.616214605799257,-1.3802224138533508,-0.835055314390411,-0.9544903321671111,0.7083640674756347,0.49778314283978853,1.9044904197771946,-0.24148216009104212,1.1159309148788452
+637104,1,0.2403361409635047,-0.00596880972715211,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.3139013144854623,0.7343482375144958
+637104,2,-0.4729569847285068,-0.4955144960193704,-0.441929748703751,,,,,,,,,,,,,0.7343482375144958
+637108,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-1.8538382233131223,-1.867313839945839,-2.3871863197689382,-2.3435225702765847,-2.616214605799257,-1.3802224138533508,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,0.5968322157859802
+637108,1,-0.33638838430182605,-2.054984991487592,-1.7942859766997337,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.0324801206588745
+637108,2,-1.5552738805344144,-2.3639315296099914,-1.791967716691911,,,,,,,,,,,,,1.0324801206588745
+637109,0,-0.5996859390924573,-1.1157275859627156,-0.9586099692679761,-1.8538382233131223,-1.867313839945839,-2.3871863197689382,-2.3435225702765847,-2.616214605799257,-1.3802224138533508,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-2.5822157519969178,-1.388853942113607,-1.133646664653865,1.0324801206588745
+637109,1,-0.528629892723603,-1.7877220112579697,-1.7942859766997337,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.0527193546295166
+637109,2,-0.6697418748750354,-1.1183201738829107,-1.8819702478911218,,,,,,,,,,,,,1.0527193546295166
+638202,0,-1.9550775984508428,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.6101319610437744,-0.9648904107168657,-0.518904276104527,0.15592137353141286,-0.5571809115428055,-0.835055314390411,-2.920359292869476,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-0.9106055385131593,0.08500266075134277
+638202,1,-1.9704412058869298,-1.609546691104888,-1.590035816431196,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,0.08461300283670425
+638202,2,-3.1295530017066437,-1.8189765614793936,-1.9719727790903323,,,,,,,,,,,,,0.08461300283670425
+639601,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.3644410883850133,-0.6804312289064511,-1.5224443378991586,-0.748036011032936,-1.2156141133912417,-1.432801541987221,-0.5613165400266386,-0.13173296267509654,-2.5822157519969178,-1.388853942113607,-0.6875644123724536,1.1583552360534668
+639601,1,-0.8169921553562683,0.5285571507320932,0.35034070611991114,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.6927973321038463,1.7749511003494263
+639601,2,-0.7681343199482997,-0.33981307655348536,-0.17192215510611902,,,,,,,,,,,,,1.7749511003494263
+641603,0,-0.03493941435979663,-0.5404369563759129,-0.3413299128685955,-1.1164445321960008,-1.4901592762752198,-2.671645501579353,-0.7925970202303356,-1.5314657443220383,-1.2156141133912417,-1.432801541987221,-2.920359292869476,-1.3918785079011935,0.49778314283978853,-1.388853942113607,0.8737234706124865,0.8862864971160889
+641603,1,-0.6247506469344914,0.08311885034938876,0.5545908663884488,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.4419600012801827,0.2957175374031067
+641603,2,-1.0633116551680928,-0.10626094735465771,0.638100625686777,,,,,,,,,,,,,0.2957175374031067
+644202,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-0.37905084107887943,-1.1130047126046003,-1.2493495925272802,-1.1575206790647472,-1.4712019186844152,-0.8863975124670236,0.9581833684000187,1.0113786285352542,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.5894548892974854
+644202,1,-1.2975959264107106,-1.431371370951806,-1.7942859766997337,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,1.8060486316680908
+644202,2,-1.2600965453146213,-1.6632751420135086,-1.521960123094279,,,,,,,,,,,,,1.8060486316680908
+644203,0,-1.6162296836112464,0.03485367321088963,-0.4647859241484716,-0.37905084107887943,-1.1130047126046003,-1.2493495925272802,-1.1575206790647472,-1.4712019186844152,-0.8863975124670236,0.9581833684000187,1.0113786285352542,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.8060486316680908
+644203,1,-0.528629892723603,0.08311885034938876,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.7931030988693237
+644203,2,0.2157901307843435,-0.2619623668205428,-0.26192468630532967,,,,,,,,,,,,,1.7931030988693237
+644503,0,-0.37378732919939306,-0.42537883045855246,0.7697741886502898,-1.5588807468662738,-1.1130047126046003,-0.9648904107168657,-1.0662897643561442,-1.5917295699596616,-1.0510058129291326,-0.835055314390411,-2.13401170858853,-1.3918785079011935,-1.812216028287741,-0.2910724881500066,-0.24148216009104212,0.5962517857551575
+644503,1,0.52869840359617,-0.6295824302629383,-0.7730351753570456,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,0.6382931470870972
+644503,2,-0.7681343199482997,-0.9626187544170256,-0.35192721750454037,,,,,,,,,,,,,0.6382931470870972
+644504,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-1.5588807468662738,-1.1130047126046003,-0.9648904107168657,-1.0662897643561442,-1.5917295699596616,-1.0510058129291326,-0.835055314390411,-2.13401170858853,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,0.8737234706124865,0.6382931470870972
+644504,1,-0.4325091385127145,-1.1641083907221836,-1.4879107362969273,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.310551991190808,0.41023147106170654
+644504,2,-0.9649192100948284,-1.040469464149968,-0.8019398735005937,,,,,,,,,,,,,0.41023147106170654
+644505,0,-1.27738176877165,0.14991179912825014,-0.2178739015887193,-1.5588807468662738,-1.1130047126046003,-0.9648904107168657,-1.0662897643561442,-1.5917295699596616,-1.0510058129291326,-0.835055314390411,-2.13401170858853,-1.3918785079011935,1.267782866548965,-1.388853942113607,-0.4645232862317478,0.3093876242637634
+644505,1,-2.0665619600978182,-0.09505646980369299,-1.2836605760283897,,,,,,,,,,1.663413533782179,0.7456311526478686,0.4419600012801827,-0.1311200112104416
+644505,2,-0.4729569847285068,-0.4955144960193704,-1.7019651854927003,,,,,,,,,,,,,-0.1311200112104416
+645002,0,-0.48673663414592516,-0.42537883045855246,-0.7116979467082238,-0.674008317525728,-0.9872865247143939,-0.1115128652856221,0.4846357856901046,-1.4712019186844152,-0.5571809115428055,0.36043714080320877,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.3613131642341614
+645002,1,-0.4325091385127145,0.08311885034938876,-0.568785015088508,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.19112267045651915,-0.6931471824645996
+645002,2,-0.5713494298017712,-0.6512159154852555,-0.5319322799029617,,,,,,,,,,,,,-0.6931471824645996
+645503,0,-0.48673663414592516,-0.1952625786238314,-0.3413299128685955,-1.1164445321960008,-0.6101319610437744,0.7418646801456215,0.940790359233119,0.5175043273571525,-0.5571809115428055,-0.23730908679360116,0.22503104425430823,0.28831555240026907,-1.812216028287741,-0.2910724881500066,-1.3566877907945707,1.5064141750335693
+645503,1,1.4899059457050545,-0.00596880972715211,-0.46665993495423924,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.8122266528381351,1.5211694240570068
+645503,2,0.019005240637814846,0.20514189157711243,-1.1619499982974364,,,,,,,,,,,,,1.5211694240570068
+646101,0,-1.6162296836112464,-1.5759600896321577,-1.4524340143874808,-0.8214870557491524,-1.615877464165426,-0.3959720470960366,-0.61013519081313,-0.5069807084824429,-1.0510058129291326,0.36043714080320877,-0.16814274788616518,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.9106055385131593,0.04113364592194557
+646101,1,-1.393716680621599,-0.896845410492561,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,0.48787549138069153
+646101,2,-0.8665267650215641,-0.729066625218198,-0.26192468630532967,,,,,,,,,,,,,0.48787549138069153
+646102,0,-0.03493941435979663,-0.5404369563759129,-0.4647859241484716,-0.8214870557491524,-1.615877464165426,-0.3959720470960366,-0.61013519081313,-0.5069807084824429,-1.0510058129291326,0.36043714080320877,-0.16814274788616518,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.0250657796859741
+646102,1,-1.201475172199822,-1.0750207306456427,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,-0.28944888710975647
+646102,2,-0.9649192100948284,-1.2740215933487957,-1.7019651854927003,,,,,,,,,,,,,-0.28944888710975647
+648901,0,-0.7126352440389895,-0.8856113341279945,-0.8351539579881,-0.9689657939725767,-1.1130047126046003,-2.102727137958524,-0.7013661055217327,-0.4467168828448197,-0.3925726110806964,0.36043714080320877,-0.5613165400266386,-1.3918785079011935,-1.0422163045785646,1.9044904197771946,-0.018441033950336395,1.5368752479553223
+648901,1,-0.24026763009093757,-0.3623194500333156,-0.9772853356255832,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.6927973321038463,1.4185444116592407
+648901,2,0.019005240637814846,-0.41766378628642786,-0.26192468630532967,,,,,,,,,,,,,1.4185444116592407
+651502,0,-0.14788871930632877,2.105899939723379,1.5105102563295467,0.2108641118148177,-0.6101319610437744,0.7418646801456215,-0.61013519081313,-0.26592540593194997,0.7596854921540671,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.8845422267913818
+651502,1,1.1054229288615007,1.7757843918036655,1.1673413471940615,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.026191473007202
+651502,2,1.1997145815169867,2.151409634900676,0.008082907292302316,,,,,,,,,,,,,2.026191473007202
+651602,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.1130047126046003,-2.102727137958524,-1.24875159377335,-1.712257221234908,-1.0510058129291326,0.36043714080320877,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-1.133646664653865,-0.6931471824645996
+651602,1,-1.9704412058869298,0.4394694906555523,-1.3857856561626585,,,,,,,,,,0.2373400917434395,1.8141914255436393,-1.3139013144854623,-0.27459201216697693
+651602,2,-1.3584889903878858,-0.10626094735465771,0.638100625686777,,,,,,,,,,,,,-0.27459201216697693
+664303,0,-0.48673663414592516,-0.1952625786238314,-0.2178739015887193,0.5058215882616662,0.7727681057484966,0.7418646801456215,0.3934048709815018,0.3367128504442826,-0.3925726110806964,1.5559295959968287,1.7977262128162,0.28831555240026907,0.49778314283978853,0.806708965813594,0.20460009219036931,0.9701385498046875
+664303,1,0.048094632541727786,-0.00596880972715211,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,0.777299165725708
+664303,2,-0.5713494298017712,-0.10626094735465771,0.2780905008899343,,,,,,,,,,,,,0.777299165725708
+665102,0,-1.7291789885577786,-1.000669460045355,-0.8351539579881,-0.674008317525728,-1.7415956520556326,-1.2493495925272802,-1.24875159377335,-1.712257221234908,-1.3802224138533508,-0.835055314390411,-0.16814274788616518,0.7083640674756347,1.267782866548965,1.9044904197771946,3.104134732019544,0.7495623230934143
+665102,1,-2.1626827143087066,-1.9658973314110515,-1.8964110568340025,,,,,,,,,,1.663413533782179,-0.3229291202479022,-1.0630639836617988,0.27320346236228943
+665102,2,-2.735983221413586,-2.130379400411164,-2.151977841488754,,,,,,,,,,,,,0.27320346236228943
+667602,0,-1.27738176877165,-1.9211344673842392,-1.8228020482271092,-0.08409336463203088,0.6470499178582901,0.17294631652479245,-0.7925970202303356,-0.3261892315695732,-0.22796431061858732,0.36043714080320877,-0.5613165400266386,-1.8119270229765592,-1.812216028287741,-1.388853942113607,-0.24148216009104212,1.082613229751587
+667602,1,-1.7781996974651528,-1.520459031028347,-2.10066121710254,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.059714660367144415,0.687514066696167
+667602,2,-1.9488436608274717,-1.429723012814681,-0.8019398735005937,,,,,,,,,,,,,0.687514066696167
+669301,0,0.19095919553326762,0.3800280509629712,0.2759501435307853,1.2432152793787876,0.018458978407257843,0.7418646801456215,0.210943041564296,0.5175043273571525,1.5827269944646125,-0.23730908679360116,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.995732307434082
+669301,1,0.7209399120179469,0.5285571507320932,0.04396546571710477,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.756405830383301
+669301,2,0.31418257585760784,0.43869402077594005,0.9981107504836196,,,,,,,,,,,,,2.756405830383301
+670901,0,-0.37378732919939306,-0.8856113341279945,-0.7116979467082238,-1.4114020086428494,-0.9872865247143939,-0.6804312289064511,-0.2452115319787184,0.2161851991690361,-0.8863975124670236,0.36043714080320877,-2.5271855007290034,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,0.20460009219036931,1.3454829454421997
+670901,1,0.4325776493852816,-0.7186700903394792,-0.05815961441716403,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.0215626955032349
+670901,2,-0.5713494298017712,-0.8847680446840831,-0.441929748703751,,,,,,,,,,,,,1.0215626955032349
+670903,0,-0.9385338539320537,-0.770553208210634,-0.2178739015887193,-1.4114020086428494,-0.9872865247143939,-0.6804312289064511,-0.2452115319787184,0.2161851991690361,-0.8863975124670236,0.36043714080320877,-2.5271855007290034,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,1.384527564048767
+670903,1,0.2403361409635047,0.08311885034938876,0.24821562598564237,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,1.5555419921875
+670903,2,0.019005240637814846,-0.18411165708760024,-0.441929748703751,,,,,,,,,,,,,1.5555419921875
+674202,0,-1.5032803786647144,-1.230785711880076,-1.0820659805478523,-0.8214870557491524,-0.35869558526336154,0.457405498335207,0.4846357856901046,1.1804064093710083,-0.5571809115428055,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,0.8318341970443726
+674202,1,-2.7394072395740374,-1.7877220112579697,-1.9985361369682713,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,0.1124754473567009
+674202,2,-1.9488436608274717,-1.8968272712123362,-1.791967716691911,,,,,,,,,,,,,0.1124754473567009
+675202,0,-0.8255845489855216,-0.08020445270647089,1.2635982337697944,-0.674008317525728,0.7727681057484966,-0.1115128652856221,-3.0733698879454074,-2.435423128886387,-0.3925726110806964,-0.835055314390411,0.22503104425430823,-0.13173296267509654,1.267782866548965,-0.2910724881500066,3.104134732019544,1.0724180936813354
+675202,1,-0.04802612166916067,-0.09505646980369299,-0.9772853356255832,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.059714660367144415,1.404684066772461
+675202,2,-0.27617209458197817,-0.573365205752313,-0.981944935899015,,,,,,,,,,,,,1.404684066772461
+675205,0,-0.37378732919939306,-0.08020445270647089,-0.4647859241484716,-0.674008317525728,0.7727681057484966,-0.1115128652856221,-3.0733698879454074,-2.435423128886387,-0.3925726110806964,-0.835055314390411,0.22503104425430823,-0.13173296267509654,-1.812216028287741,-1.388853942113607,0.20460009219036931,1.2826331853866577
+675205,1,0.52869840359617,2.132135032109829,0.45246578625417994,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,0.6603667140007019
+675205,2,0.019005240637814846,0.36084331104299755,-0.26192468630532967,,,,,,,,,,,,,0.6603667140007019
+677302,0,-1.5032803786647144,-0.8856113341279945,-0.8351539579881,-1.4114020086428494,-1.9930320278360456,-1.2493495925272802,-2.799677143819599,-2.4956869545240106,-0.8863975124670236,-2.030547769584031,-0.16814274788616518,-0.5517814777504622,1.267782866548965,1.9044904197771946,-1.3566877907945707,0.24670489132404327
+677302,1,-1.4898374348324874,-1.7877220112579697,-1.8964110568340025,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.3139013144854623,-0.4602424204349518
+677302,2,-2.735983221413586,-2.130379400411164,-1.9719727790903323,,,,,,,,,,,,,-0.4602424204349518
+680702,0,0.6427564153193962,0.03485367321088963,0.15249413225090913,0.6533003264850905,0.8984862936387031,0.7418646801456215,0.4846357856901046,0.3367128504442826,0.2658605907677399,1.5559295959968287,1.7977262128162,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,1.6853389739990234
+680702,1,0.8170606662288354,0.08311885034938876,0.04396546571710477,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,1.743966817855835
+680702,2,1.3964994716635155,-0.573365205752313,0.45809556328835566,,,,,,,,,,,,,1.743966817855835
+682601,0,3.5794383439292314,5.097411213574753,2.621614357848432,1.5381727558256364,1.149922669419116,0.7418646801456215,-0.33644244668732126,-0.3261892315695732,1.5827269944646125,0.9581833684000187,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.995732307434082
+682601,1,3.0278380130792697,3.3793622731814015,1.1673413471940615,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.5613893220144716,2.995732307434082
+682601,2,2.085246587176366,2.462812473832446,2.978166436866254,,,,,,,,,,,,,2.995732307434082
+684502,0,1.207502940052057,0.3800280509629712,0.5228621660905376,-1.4114020086428494,-0.2329773973731551,-0.1115128652856221,-0.2452115319787184,-0.3261892315695732,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,1.9332695007324219
+684502,1,0.2403361409635047,0.7958201309617158,0.5545908663884488,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.3579683303833008
+684502,2,-0.27617209458197817,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,1.3579683303833008
+684503,0,1.4334015499451211,0.03485367321088963,0.3994061548106614,-1.4114020086428494,-0.2329773973731551,-0.1115128652856221,-0.2452115319787184,-0.3261892315695732,-0.5571809115428055,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.3579683303833008
+684503,1,-0.24026763009093757,-0.09505646980369299,0.24821562598564237,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,1.6807031631469727
+684503,2,-0.1777796495087138,1.0614996986394805,0.18808796969072364,,,,,,,,,,,,,1.6807031631469727
+685201,0,2.1110973796243138,1.875783687888658,1.8808782901691752,0.9482578029319392,1.149922669419116,0.7418646801456215,0.6670976151073104,0.6982958042700221,0.9242937926161762,-0.835055314390411,1.0113786285352542,0.7083640674756347,1.267782866548965,-0.2910724881500066,-0.9106055385131593,2.4955623149871826
+685201,1,1.4899059457050545,2.577573332492533,1.6779667478654055,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,2.4643607139587402
+685201,2,1.593284361810044,1.1393504083724229,-0.26192468630532967,,,,,,,,,,,,,2.4643607139587402
+686202,0,-0.5996859390924573,-0.08020445270647089,0.15249413225090913,-0.674008317525728,0.6470499178582901,0.457405498335207,-1.4312134231905558,-0.748036011032936,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.170846700668335
+686202,1,1.1054229288615007,0.5285571507320932,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.6261838674545288
+686202,2,-0.8665267650215641,-0.18411165708760024,0.18808796969072364,,,,,,,,,,,,,1.6261838674545288
+687602,0,1.7722494647847176,-0.42537883045855246,-0.5882419354283478,0.06338537359139342,1.0242044815289095,0.7418646801456215,1.3969449327761334,-0.38645305720719647,0.9242937926161762,0.36043714080320877,0.6182048363947807,-0.9718299928258278,0.49778314283978853,3.002271873740795,0.8737234706124865,1.68544602394104
+687602,1,0.4325776493852816,-0.00596880972715211,-0.8751602554913144,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,1.8464181423187256
+687602,2,-0.07938720443544948,-0.6512159154852555,-0.441929748703751,,,,,,,,,,,,,1.8464181423187256
+688103,0,1.207502940052057,1.4155511842192159,2.3747023352886796,-0.08409336463203088,-0.6101319610437744,-0.1115128652856221,-0.8838279349389385,-1.1698827904962987,-1.3802224138533508,0.36043714080320877,0.22503104425430823,1.1284125825510003,-1.812216028287741,-0.2910724881500066,0.8737234706124865,1.6086946725845337
+688103,1,1.3937851914941661,1.0630831111913384,0.35034070611991114,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.3139013144854623,2.301387310028076
+688103,2,0.9045372462971938,0.7500968597077102,0.5480980944875663,,,,,,,,,,,,,2.301387310028076
+688501,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.3644410883850133,-1.2493495925272802,0.028481212147090252,-0.8685636623081825,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.20460009219036931,0.8586603403091431
+688501,1,-1.4898374348324874,-1.7877220112579697,-1.4879107362969273,,,,,,,,,,1.663413533782179,1.8141914255436393,-0.5613893220144716,0.17535093426704407
+688501,2,-1.6536663256076787,-1.9746779809452786,-1.6119626542934897,,,,,,,,,,,,,0.17535093426704407
+691303,0,-0.9385338539320537,-0.6554950822932735,-0.5882419354283478,0.06338537359139342,0.7727681057484966,-0.3959720470960366,-0.8838279349389385,-0.6877721853953127,-0.22796431061858732,0.9581833684000187,0.22503104425430823,0.7083640674756347,0.49778314283978853,0.806708965813594,0.20460009219036931,1.1913950443267822
+691303,1,-1.0092336637780452,-1.6986343511814288,-1.6921608965654649,,,,,,,,,,1.663413533782179,-1.3914893931436731,0.4419600012801827,1.617070198059082
+691303,2,0.019005240637814846,-1.429723012814681,-1.6119626542934897,,,,,,,,,,,,,1.617070198059082
+695202,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,-0.5265295793023037,-1.1130047126046003,-0.9648904107168657,-0.8838279349389385,-0.4467168828448197,-1.2156141133912417,0.36043714080320877,-0.5613165400266386,0.28831555240026907,-1.0422163045785646,0.806708965813594,-0.24148216009104212,0.8586603403091431
+695202,1,-1.585958189043376,-1.6986343511814288,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,0.611970067024231
+695202,2,-1.2600965453146213,-0.573365205752313,-1.3419550606958577,,,,,,,,,,,,,0.611970067024231
+695302,0,0.8686550252124604,1.5306093101365763,1.2635982337697944,-0.37905084107887943,0.1441771662974643,0.7418646801456215,-1.0662897643561442,-0.4467168828448197,0.2658605907677399,-0.23730908679360116,1.0113786285352542,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.557302474975586
+695302,1,-0.04802612166916067,1.2412584313444202,1.2694664273283303,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.6848872900009155
+695302,2,0.2157901307843435,0.7500968597077102,0.18808796969072364,,,,,,,,,,,,,1.6848872900009155
+695702,0,-0.5996859390924573,-0.770553208210634,-0.7116979467082238,-1.1164445321960008,0.018458978407257843,0.457405498335207,-0.7013661055217327,-0.8082998366705593,-0.5571809115428055,1.5559295959968287,0.6182048363947807,0.28831555240026907,0.49778314283978853,0.806708965813594,1.9889291013160153,1.2500165700912476
+695702,1,-1.1053544179889336,-0.18414412988023388,0.5545908663884488,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.310551991190808,1.6071908473968506
+695702,2,0.019005240637814846,0.20514189157711243,0.18808796969072364,,,,,,,,,,,,,1.6071908473968506
+696603,0,-0.14788871930632877,-0.770553208210634,-0.09441789030884316,-0.23157210285545515,-0.2329773973731551,-0.9648904107168657,-1.24875159377335,-0.5069807084824429,-0.7217892120049145,0.9581833684000187,1.0113786285352542,1.548461097626366,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,0.5205920338630676
+696603,1,-1.2975959264107106,-1.3422837108752652,-1.590035816431196,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.5613893220144716,-0.6931471824645996
+696603,2,-1.0633116551680928,-1.1183201738829107,-1.4319575918950684,,,,,,,,,,,,,-0.6931471824645996
+696704,0,-1.0514831588785858,-0.5404369563759129,-0.8351539579881,-1.4114020086428494,-1.9930320278360456,-1.2493495925272802,-2.1610607408593787,-2.6764784314368804,-0.8863975124670236,0.36043714080320877,-0.9544903321671111,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,1.5428468490346037,0.0069354516454041
+696704,1,-0.7208714011453798,-0.7186700903394792,-0.05815961441716403,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,0.4744674563407898
+696704,2,-0.8665267650215641,-0.729066625218198,-1.791967716691911,,,,,,,,,,,,,0.4744674563407898
+697101,0,0.19095919553326762,-0.08020445270647089,-0.4647859241484716,1.0957365411553635,0.018458978407257843,0.17294631652479245,0.6670976151073104,-0.6275083597576895,-0.22796431061858732,0.36043714080320877,1.4045524206757267,0.7083640674756347,0.49778314283978853,0.806708965813594,3.104134732019544,1.036523461341858
+697101,1,0.52869840359617,0.3503818305790114,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,1.2641807794570923
+697101,2,-0.1777796495087138,0.36084331104299755,-0.08191962390690835,,,,,,,,,,,,,1.2641807794570923
+697102,0,1.320452244998589,0.3800280509629712,0.3994061548106614,1.0957365411553635,0.018458978407257843,0.17294631652479245,0.6670976151073104,-0.6275083597576895,-0.22796431061858732,0.36043714080320877,1.4045524206757267,0.7083640674756347,-1.0422163045785646,0.806708965813594,0.8737234706124865,1.0127716064453125
+697102,1,0.33645689517439314,0.08311885034938876,0.14609054585137357,,,,,,,,,,0.9503768127628092,-1.3914893931436731,1.1944719937511734,0.8152689933776855
+697102,2,0.6093599110774008,1.0614996986394805,1.5381259376788836,,,,,,,,,,,,,0.8152689933776855
+697103,0,0.19095919553326762,1.7607255619712974,0.6463181773704137,1.0957365411553635,0.018458978407257843,0.17294631652479245,0.6670976151073104,-0.6275083597576895,-0.22796431061858732,0.36043714080320877,1.4045524206757267,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.24148216009104212,0.9402173161506653
+697103,1,0.7209399120179469,3.2011869530283197,1.0652162670597927,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,0.3549081087112427
+697103,2,-0.37456453965524245,1.5286039570371357,1.0881132816828303,,,,,,,,,,,,,0.3549081087112427
+698902,0,0.3039085004797998,-0.3103207045411919,-0.2178739015887193,-0.9689657939725767,0.6470499178582901,0.457405498335207,-0.9750588496475414,-0.5672445341200663,-0.22796431061858732,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.470105767250061
+698902,1,-1.201475172199822,0.08311885034938876,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,0.5334247946739197
+698902,2,1.6916768068833083,0.9836489889065378,1.178115812882041,,,,,,,,,,,,,0.5334247946739197
+704601,0,-0.7126352440389895,1.5306093101365763,0.6463181773704137,-0.37905084107887943,-0.35869558526336154,0.457405498335207,0.3021739562728989,0.2764490248066594,-0.7217892120049145,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,-0.4645232862317478,1.353195071220398
+704601,1,0.2403361409635047,0.4394694906555523,1.5758416677311367,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,1.5886214971542358
+704601,2,0.7077523561506651,1.1393504083724229,1.6281284688780944,,,,,,,,,,,,,1.5886214971542358
+704902,0,-0.03493941435979663,-0.08020445270647089,-0.4647859241484716,-0.23157210285545515,0.8984862936387031,1.026323861956036,-1.0662897643561442,-0.8082998366705593,0.7596854921540671,0.36043714080320877,0.6182048363947807,0.7083640674756347,-1.812216028287741,-1.388853942113607,-1.133646664653865,1.7459635734558105
+704902,1,0.14421538675261625,0.17220651042592966,0.24821562598564237,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,2.220890760421753
+704902,2,1.0029296913704582,0.8279475694406527,-0.441929748703751,,,,,,,,,,,,,2.220890760421753
+704903,0,-0.9385338539320537,-0.5404369563759129,-0.4647859241484716,-0.23157210285545515,0.8984862936387031,1.026323861956036,-1.0662897643561442,-0.8082998366705593,0.7596854921540671,0.36043714080320877,0.6182048363947807,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.9106055385131593,1.3556981086730957
+704903,1,-0.4325091385127145,-0.09505646980369299,0.6567159465227176,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.095194697380066
+704903,2,-0.27617209458197817,0.36084331104299755,0.008082907292302316,,,,,,,,,,,,,1.095194697380066
+706401,0,0.4168578054263319,-0.6554950822932735,0.029038120971032973,-0.08409336463203088,-0.7358501489339809,-2.102727137958524,-1.4312134231905558,-1.3506742674091685,-1.3802224138533508,0.9581833684000187,0.22503104425430823,-0.9718299928258278,0.49778314283978853,0.806708965813594,0.20460009219036931,0.16714361310005188
+706401,1,-0.528629892723603,-0.18414412988023388,0.8609661067912552,,,,,,,,,,1.663413533782179,2.88275169843941,-0.059714660367144415,0.08839824050664902
+706401,2,-0.4729569847285068,-0.41766378628642786,-0.17192215510611902,,,,,,,,,,,,,0.08839824050664902
+707703,0,1.4334015499451211,0.03485367321088963,1.016686211210042,-0.5265295793023037,-0.10725920948294862,0.17294631652479245,0.3934048709815018,0.8188234555452687,-1.2156141133912417,0.36043714080320877,0.6182048363947807,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,1.094746470451355
+707703,1,-0.04802612166916067,-0.18414412988023388,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,1.5337891578674316
+707703,2,0.11739768571107917,0.5943954402418251,-1.3419550606958577,,,,,,,,,,,,,1.5337891578674316
+708401,0,1.8851987697312496,2.105899939723379,2.745070369128308,0.6533003264850905,0.6470499178582901,-0.1115128652856221,0.8495594445245161,1.1804064093710083,0.595077191691958,1.5559295959968287,1.0113786285352542,0.28831555240026907,-1.0422163045785646,0.806708965813594,-0.24148216009104212,2.482635021209717
+708401,1,2.0666304709703853,2.0430473720332882,1.1673413471940615,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,2.4234797954559326
+708401,2,1.7900692519565728,1.6843053765030207,2.8881639056670436,,,,,,,,,,,,,2.4234797954559326
+708402,0,1.5463508548916531,0.7252024287150527,0.5228621660905376,0.6533003264850905,0.6470499178582901,-0.1115128652856221,0.8495594445245161,1.1804064093710083,0.595077191691958,1.5559295959968287,1.0113786285352542,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,2.4234797954559326
+708402,1,0.52869840359617,1.2412584313444202,0.8609661067912552,,,,,,,,,,-1.1887333502953,-0.3229291202479022,1.1944719937511734,2.6081390380859375
+708402,2,0.8061448012239295,0.8279475694406527,0.8181056880851983,,,,,,,,,,,,,2.6081390380859375
+708403,0,0.6427564153193962,0.6101443027976923,0.7697741886502898,0.6533003264850905,0.6470499178582901,-0.1115128652856221,0.8495594445245161,1.1804064093710083,0.595077191691958,1.5559295959968287,1.0113786285352542,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,2.6081390380859375
+708403,1,0.2403361409635047,0.7958201309617158,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,2.7568225860595703
+708403,2,0.31418257585760784,0.6722461499747677,1.3581208752804623,,,,,,,,,,,,,2.7568225860595703
+710501,0,0.19095919553326762,0.7252024287150527,-0.09441789030884316,-0.674008317525728,0.2698953541876708,0.457405498335207,0.4846357856901046,0.5777681529947757,-0.22796431061858732,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.4645232862317478,1.5365381240844727
+710501,1,0.14421538675261625,-0.2732317899567748,-0.7730351753570456,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.545040488243103
+710501,2,-0.37456453965524245,-0.2619623668205428,-1.0719474670982256,,,,,,,,,,,,,1.545040488243103
+711502,0,1.320452244998589,1.5306093101365763,0.5228621660905376,-0.37905084107887943,0.7727681057484966,0.7418646801456215,-0.518904276104527,-0.08513392901908017,0.2658605907677399,0.36043714080320877,1.7977262128162,1.1284125825510003,-1.0422163045785646,1.9044904197771946,0.8737234706124865,0.19534938037395477
+711502,1,0.9131814204397238,1.1521707712678793,1.4737165875968679,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,0.29579710960388184
+711502,2,1.0029296913704582,2.0735589251677333,0.09808543849151298,,,,,,,,,,,,,0.29579710960388184
+712303,0,0.4168578054263319,0.3800280509629712,-0.09441789030884316,-1.1164445321960008,-0.2329773973731551,-0.9648904107168657,-0.61013519081313,-0.6877721853953127,-0.7217892120049145,0.36043714080320877,0.6182048363947807,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.4645232862317478,1.0705281496047974
+712303,1,0.6248191578070585,0.2612941705024705,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.2847071886062622
+712303,2,-0.5713494298017712,0.6722461499747677,-0.08191962390690835,,,,,,,,,,,,,1.2847071886062622
+712402,0,-1.5032803786647144,-0.42537883045855246,0.3994061548106614,-1.7063594850896981,-0.9872865247143939,-0.6804312289064511,-0.42767336139592416,-1.4712019186844152,-1.0510058129291326,1.5559295959968287,0.22503104425430823,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,2.380452871322632
+712402,1,-2.4510449769413722,0.08311885034938876,0.5545908663884488,,,,,,,,,,1.663413533782179,-1.3914893931436731,-1.0630639836617988,2.5043182373046875
+712402,2,-1.9488436608274717,-0.573365205752313,0.09808543849151298,,,,,,,,,,,,,2.5043182373046875
+712802,0,2.336995989517378,1.7607255619712974,2.004334301449051,-0.5265295793023037,-0.7358501489339809,-0.3959720470960366,-0.33644244668732126,0.15592137353141286,-0.3925726110806964,1.5559295959968287,-0.16814274788616518,1.1284125825510003,-1.812216028287741,0.806708965813594,-0.9106055385131593,0.5090728998184204
+712802,1,-0.4325091385127145,-0.3623194500333156,-1.2836605760283897,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,0.8125841021537781
+712802,2,-0.6697418748750354,0.1272911818441699,0.18808796969072364,,,,,,,,,,,,,0.8125841021537781
+713902,0,-0.8255845489855216,-0.5404369563759129,-0.8351539579881,-0.8214870557491524,-1.9930320278360456,-1.8182679561481092,-2.3435225702765847,-2.314895477611141,-0.7217892120049145,-0.835055314390411,-2.13401170858853,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-1.133646664653865,-0.6931471824645996
+713902,1,-0.33638838430182605,-1.0750207306456427,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,-0.6931471824645996
+713902,2,-0.8665267650215641,-0.9626187544170256,-0.8919424046998043,,,,,,,,,,,,,-0.6931471824645996
+713903,0,-1.7291789885577786,-2.3813669710536813,-2.316626093346614,-0.8214870557491524,-1.9930320278360456,-1.8182679561481092,-2.3435225702765847,-2.314895477611141,-0.7217892120049145,-0.835055314390411,-2.13401170858853,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-1.3566877907945707,-0.6931471824645996
+713903,1,-2.5471657311522606,-2.500423291870297,-2.5091615376396152,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,-0.6931471824645996
+713903,2,-3.6215152270729654,-2.7531850782747043,-2.691993028684018,,,,,,,,,,,,,-0.6931471824645996
+714402,0,-1.3903310737181822,-1.3458438377974367,-1.2055219918277285,1.0957365411553635,0.1441771662974643,0.17294631652479245,-1.1575206790647472,0.2161851991690361,0.9242937926161762,-0.23730908679360116,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,1.0508196353912354
+714402,1,-1.201475172199822,-1.8768096713345106,-1.7942859766997337,,,,,,,,,,0.9503768127628092,2.88275169843941,0.6927973321038463,0.7744470238685608
+714402,2,-1.2600965453146213,-2.208230110144106,-2.331982903887175,,,,,,,,,,,,,0.7744470238685608
+715201,0,-1.0514831588785858,-0.5404369563759129,-0.4647859241484716,-0.674008317525728,-0.8615683368241874,0.17294631652479245,-1.24875159377335,-0.4467168828448197,-0.7217892120049145,0.36043714080320877,-1.740837916448057,-2.2319755380519246,0.49778314283978853,0.806708965813594,1.319805722893898,2.143651247024536
+715201,1,0.4325776493852816,-1.520459031028347,-0.568785015088508,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.2054340839385986
+715201,2,-0.8665267650215641,-1.6632751420135086,-1.791967716691911,,,,,,,,,,,,,2.2054340839385986
+715601,0,-1.27738176877165,-0.770553208210634,-0.8351539579881,-0.674008317525728,-0.35869558526336154,0.457405498335207,0.210943041564296,-0.024870103381456905,0.430468891229849,0.36043714080320877,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,0.45304128527641296
+715601,1,-0.6247506469344914,-0.18414412988023388,0.04396546571710477,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,0.6636877059936523
+715601,2,-0.4729569847285068,-0.18411165708760024,0.09808543849151298,,,,,,,,,,,,,0.6636877059936523
+715602,0,-1.0514831588785858,-0.42537883045855246,-0.4647859241484716,-0.674008317525728,-0.35869558526336154,0.457405498335207,0.210943041564296,-0.024870103381456905,0.430468891229849,0.36043714080320877,0.6182048363947807,1.1284125825510003,-1.812216028287741,-1.388853942113607,-0.4645232862317478,0.6636877059936523
+715602,1,-0.6247506469344914,-1.0750207306456427,-1.1815354958941209,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.5613893220144716,0.817485511302948
+715602,2,-0.5713494298017712,-1.1183201738829107,-0.5319322799029617,,,,,,,,,,,,,0.817485511302948
+715804,0,0.4168578054263319,0.03485367321088963,-0.2178739015887193,-0.674008317525728,-1.7415956520556326,-2.102727137958524,-1.8873679967335701,-0.5672445341200663,-1.7094390147775689,-0.835055314390411,-0.9544903321671111,0.28831555240026907,1.267782866548965,-0.2910724881500066,0.8737234706124865,-0.14483897387981415
+715804,1,-0.33638838430182605,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,0.1670992225408554
+715804,2,-0.7681343199482997,-0.10626094735465771,-0.441929748703751,,,,,,,,,,,,,0.1670992225408554
+715805,0,-0.03493941435979663,0.7252024287150527,0.5228621660905376,-0.674008317525728,-1.7415956520556326,-2.102727137958524,-1.8873679967335701,-0.5672445341200663,-1.7094390147775689,-0.835055314390411,-0.9544903321671111,0.28831555240026907,1.267782866548965,-0.2910724881500066,-0.4645232862317478,-0.3943285644054413
+715805,1,0.7209399120179469,0.2612941705024705,-0.6709100952227768,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,-0.00778490724042058
+715805,2,0.5109674660041365,-0.41766378628642786,0.638100625686777,,,,,,,,,,,,,-0.00778490724042058
+717501,0,-0.9385338539320537,-0.6554950822932735,-0.5882419354283478,-1.1164445321960008,0.1441771662974643,0.457405498335207,-0.06274970256151263,-0.9288274879458058,-0.8863975124670236,1.5559295959968287,-0.16814274788616518,0.28831555240026907,0.49778314283978853,0.806708965813594,0.8737234706124865,1.6569554805755615
+717501,1,-0.528629892723603,-0.7186700903394792,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,1.766926884651184
+717501,2,0.31418257585760784,-0.8069173349511406,-0.441929748703751,,,,,,,,,,,,,1.766926884651184
+722802,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-0.9872865247143939,-0.1115128652856221,-0.06274970256151263,-0.6275083597576895,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,0.49778314283978853,0.806708965813594,-0.4645232862317478,0.5757072567939758
+722802,1,-1.1053544179889336,-1.1641083907221836,-1.1815354958941209,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.8122266528381351,2.0254647731781006
+722802,2,-0.7681343199482997,-0.8847680446840831,0.18808796969072364,,,,,,,,,,,,,2.0254647731781006
+722803,0,-0.5996859390924573,-0.3103207045411919,1.2635982337697944,-0.8214870557491524,-0.9872865247143939,-0.1115128652856221,-0.06274970256151263,-0.6275083597576895,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,-1.3918785079011935,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,1.927304744720459
+722803,1,0.33645689517439314,-0.5404947701863974,-1.8964110568340025,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.197821317045828,1.9618428945541382
+722803,2,0.7077523561506651,-1.2740215933487957,-0.7119373423013831,,,,,,,,,,,,,1.9618428945541382
+723503,0,-1.3903310737181822,-1.1157275859627156,-0.9586099692679761,-0.23157210285545515,-1.4901592762752198,-2.671645501579353,-0.7013661055217327,-0.748036011032936,-1.3802224138533508,-1.432801541987221,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,1.4152991771697998
+723503,1,-0.04802612166916067,-0.00596880972715211,0.14609054585137357,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.8122266528381351,0.9502330422401428
+723503,2,-0.37456453965524245,-0.2619623668205428,-1.7019651854927003,,,,,,,,,,,,,0.9502330422401428
+723602,0,-1.27738176877165,-0.5404369563759129,-0.7116979467082238,-0.23157210285545515,-0.2329773973731551,-0.1115128652856221,1.2144831033589276,0.6982958042700221,-0.7217892120049145,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,2.1158957481384277
+723602,1,-0.9131129095671567,0.17220651042592966,0.6567159465227176,,,,,,,,,,0.9503768127628092,2.88275169843941,-0.8122266528381351,2.077674627304077
+723602,2,-0.6697418748750354,-0.41766378628642786,0.638100625686777,,,,,,,,,,,,,2.077674627304077
+724402,0,-0.37378732919939306,0.3800280509629712,-0.2178739015887193,-1.4114020086428494,-1.3644410883850133,-0.3959720470960366,-0.06274970256151263,-0.024870103381456905,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,0.20460009219036931,0.4316272437572479
+724402,1,-0.14414687588004912,0.08311885034938876,1.0652162670597927,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,0.4419600012801827,0.5832832455635071
+724402,2,-0.07938720443544948,0.7500968597077102,0.8181056880851983,,,,,,,,,,,,,0.5832832455635071
+724403,0,0.3039085004797998,0.9553186805497738,0.6463181773704137,-1.4114020086428494,-1.3644410883850133,-0.3959720470960366,-0.06274970256151263,-0.024870103381456905,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,0.20460009219036931,0.5832832455635071
+724403,1,-0.33638838430182605,0.7067324708851749,0.963091186925524,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,0.4146827459335327
+724403,2,-0.1777796495087138,1.9178575057018483,0.18808796969072364,,,,,,,,,,,,,0.4146827459335327
+728503,0,-0.48673663414592516,0.4950861768803317,-0.7116979467082238,0.358342850038242,0.6470499178582901,1.3107830437664505,1.4881758474847362,0.2161851991690361,0.9242937926161762,-1.432801541987221,-0.5613165400266386,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,1.6323636770248413
+728503,1,0.2403361409635047,-0.00596880972715211,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.4419600012801827,1.8294824361801147
+728503,2,0.2157901307843435,0.5943954402418251,0.5480980944875663,,,,,,,,,,,,,1.8294824361801147
+728601,0,-0.2608380242528609,-0.42537883045855246,-0.7116979467082238,0.9482578029319392,1.0242044815289095,1.026323861956036,-0.06274970256151263,0.09565754789378961,1.9119435953888306,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.20460009219036931,2.760448932647705
+728601,1,0.2403361409635047,-0.9859330705691017,-0.46665993495423924,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,2.914477825164795
+728601,2,-0.1777796495087138,-0.8069173349511406,-0.5319322799029617,,,,,,,,,,,,,2.914477825164795
+731702,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.674008317525728,-0.35869558526336154,-0.1115128652856221,-0.1539806172701155,-1.5314657443220383,-0.5571809115428055,1.5559295959968287,0.22503104425430823,0.7083640674756347,-0.27221658086938805,-1.388853942113607,0.42764121833107505,1.8684189319610596
+731702,1,-1.201475172199822,-0.4514071101098565,-0.8751602554913144,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.6927973321038463,1.9674564599990845
+731702,2,-0.7681343199482997,-0.729066625218198,0.45809556328835566,,,,,,,,,,,,,1.9674564599990845
+732403,0,-1.0514831588785858,-0.3103207045411919,0.15249413225090913,-0.8214870557491524,-1.3644410883850133,-0.9648904107168657,-0.9750588496475414,-1.712257221234908,-1.5448307143154598,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,0.042797770351171494
+732403,1,0.14421538675261625,0.7958201309617158,-0.9772853356255832,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.059714660367144415,0.4141573905944824
+732403,2,-0.27617209458197817,-0.2619623668205428,-0.981944935899015,,,,,,,,,,,,,0.4141573905944824
+737702,0,-0.37378732919939306,-0.1952625786238314,-0.4647859241484716,-1.2639232704194252,-2.4959047793968714,-0.6804312289064511,-1.1575206790647472,-1.7725210468725314,-1.0510058129291326,0.9581833684000187,1.0113786285352542,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,0.8404447436332703
+737702,1,-0.9131129095671567,-1.1641083907221836,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,1.1139354705810547
+737702,2,-0.1777796495087138,-1.1961708836158533,-1.1619499982974364,,,,,,,,,,,,,1.1139354705810547
+737801,0,0.19095919553326762,1.4155511842192159,0.6463181773704137,0.6533003264850905,-0.7358501489339809,0.7418646801456215,0.7583285298159133,-0.20566158029432668,0.2658605907677399,0.9581833684000187,0.6182048363947807,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.8687939643859863
+737801,1,0.4325776493852816,2.755748652645615,0.8609661067912552,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.8571891784667969
+737801,2,0.019005240637814846,1.5286039570371357,0.638100625686777,,,,,,,,,,,,,1.8571891784667969
+738201,0,0.07800989058673549,-0.08020445270647089,0.5228621660905376,-0.08409336463203088,-0.35869558526336154,0.457405498335207,0.4846357856901046,0.2161851991690361,-1.0510058129291326,-0.23730908679360116,-0.16814274788616518,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.10997474193573
+738201,1,-0.04802612166916067,0.7958201309617158,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,-0.5867891311645508
+738201,2,0.41257502093087217,0.282992601310055,0.18808796969072364,,,,,,,,,,,,,-0.5867891311645508
+738802,0,-0.03493941435979663,-0.3103207045411919,-0.2178739015887193,0.5058215882616662,1.2756408573093225,0.457405498335207,0.11971212685569313,0.035393722256166354,0.9242937926161762,0.36043714080320877,0.6182048363947807,-0.13173296267509654,-1.812216028287741,0.806708965813594,0.8737234706124865,1.7749511003494263
+738802,1,-0.9131129095671567,-0.3623194500333156,0.45246578625417994,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.7447443008422852
+738802,2,0.8061448012239295,-0.028410237621715174,0.908108219284409,,,,,,,,,,,,,1.7447443008422852
+739602,0,-0.2608380242528609,0.3800280509629712,0.029038120971032973,-0.674008317525728,-0.10725920948294862,0.457405498335207,1.1232521886503248,0.4572405017195292,-0.22796431061858732,0.36043714080320877,0.22503104425430823,0.7083640674756347,1.267782866548965,0.806708965813594,-0.018441033950336395,2.3018417358398438
+739602,1,0.048094632541727786,0.17220651042592966,-1.079410415759852,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.2991676330566406
+739602,2,-0.27617209458197817,-0.41766378628642786,0.45809556328835566,,,,,,,,,,,,,2.2991676330566406
+742301,0,0.3039085004797998,0.4950861768803317,0.6463181773704137,0.6533003264850905,0.8984862936387031,0.7418646801456215,-0.1539806172701155,0.09565754789378961,1.7473352949267216,1.5559295959968287,-0.16814274788616518,0.7083640674756347,1.267782866548965,0.806708965813594,0.20460009219036931,1.4201829433441162
+742301,1,0.048094632541727786,-0.09505646980369299,0.14609054585137357,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,1.8486546277999878
+742301,2,0.11739768571107917,-0.18411165708760024,0.638100625686777,,,,,,,,,,,,,1.8486546277999878
+743701,0,0.3039085004797998,0.9553186805497738,0.15249413225090913,0.2108641118148177,-0.8615683368241874,-0.9648904107168657,0.5758667003987075,-0.6275083597576895,-0.22796431061858732,1.5559295959968287,1.7977262128162,-0.9718299928258278,1.267782866548965,1.9044904197771946,0.8737234706124865,1.5084161758422852
+743701,1,-0.528629892723603,-0.09505646980369299,0.6567159465227176,,,,,,,,,,1.663413533782179,0.7456311526478686,0.6927973321038463,1.616479516029358
+743701,2,-0.6697418748750354,-0.028410237621715174,-0.35192721750454037,,,,,,,,,,,,,1.616479516029358
+744601,0,-1.3903310737181822,-3.0717157265578443,-3.0573621610258708,-1.2639232704194252,-2.2444684036164584,-1.8182679561481092,-2.708446229110996,-2.5559507801616337,-1.0510058129291326,-4.42153267997127,-0.9544903321671111,-0.9718299928258278,1.267782866548965,-1.388853942113607,-0.018441033950336395,-0.6931471824645996
+744601,1,-2.7394072395740374,-1.1641083907221836,-1.2836605760283897,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.059714660367144415,-0.5048196315765381
+744601,2,-0.1777796495087138,-1.585424432280566,-2.2419803726879644,,,,,,,,,,,,,-0.5048196315765381
+744602,0,-0.37378732919939306,-0.08020445270647089,-0.5882419354283478,-1.2639232704194252,-2.2444684036164584,-1.8182679561481092,-2.708446229110996,-2.5559507801616337,-1.0510058129291326,-4.42153267997127,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-0.24148216009104212,-0.5048196315765381
+744602,1,-2.1626827143087066,0.8849077910382567,-0.46665993495423924,,,,,,,,,,1.663413533782179,-1.3914893931436731,-0.5613893220144716,-0.23798243701457977
+744602,2,-0.9649192100948284,-0.729066625218198,-0.08191962390690835,,,,,,,,,,,,,-0.23798243701457977
+744804,0,-0.2608380242528609,-0.5404369563759129,-0.2178739015887193,-1.4114020086428494,-1.615877464165426,-2.3871863197689382,-2.3435225702765847,-2.134104000698271,-0.8863975124670236,-0.23730908679360116,-0.5613165400266386,-2.2319755380519246,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,0.25154638290405273
+744804,1,-1.585958189043376,-0.00596880972715211,0.04396546571710477,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.310551991190808,0.8474550843238831
+744804,2,-0.7681343199482997,-0.729066625218198,-1.251952529496647,,,,,,,,,,,,,0.8474550843238831
+744805,0,-0.5996859390924573,-0.6554950822932735,-0.5882419354283478,-1.4114020086428494,-1.615877464165426,-2.3871863197689382,-2.3435225702765847,-2.134104000698271,-0.8863975124670236,-0.23730908679360116,-0.5613165400266386,-2.2319755380519246,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,0.25154638290405273
+744805,1,-1.585958189043376,-0.09505646980369299,0.6567159465227176,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.6927973321038463,0.8474550843238831
+744805,2,-0.4729569847285068,0.5165447305088826,1.0881132816828303,,,,,,,,,,,,,0.8474550843238831
+745101,0,-0.14788871930632877,-0.1952625786238314,0.15249413225090913,-0.8214870557491524,1.2756408573093225,0.457405498335207,-0.518904276104527,-1.8327848725101548,-0.06335601015647824,1.5559295959968287,1.7977262128162,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,2.060159683227539
+745101,1,0.33645689517439314,-0.09505646980369299,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,1.5717346668243408
+745101,2,1.8884616970298371,0.5165447305088826,1.5381259376788836,,,,,,,,,,,,,1.5717346668243408
+745102,0,0.7557057202659283,1.4155511842192159,1.1401422224899183,-0.8214870557491524,1.2756408573093225,0.457405498335207,-0.518904276104527,-1.8327848725101548,-0.06335601015647824,1.5559295959968287,1.7977262128162,0.7083640674756347,-1.0422163045785646,0.806708965813594,-0.4645232862317478,1.5717346668243408
+745102,1,-0.04802612166916067,1.5085214115740428,2.494967388939556,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.607377529144287
+745102,2,1.0029296913704582,0.9836489889065378,0.008082907292302316,,,,,,,,,,,,,1.607377529144287
+746404,0,-1.164432463825118,-0.6554950822932735,-0.4647859241484716,-0.8214870557491524,-1.1130047126046003,-0.9648904107168657,-0.518904276104527,-0.5069807084824429,-0.5571809115428055,1.5559295959968287,0.6182048363947807,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.4185444116592407
+746404,1,-0.33638838430182605,-0.00596880972715211,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.5729546546936035
+746404,2,-0.5713494298017712,-0.10626094735465771,-0.26192468630532967,,,,,,,,,,,,,1.5729546546936035
+747902,0,0.19095919553326762,-0.42537883045855246,0.15249413225090913,-1.2639232704194252,-0.8615683368241874,0.457405498335207,0.4846357856901046,-0.024870103381456905,-1.2156141133912417,1.5559295959968287,1.0113786285352542,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.8684189319610596
+747902,1,-0.14414687588004912,-0.00596880972715211,-0.05815961441716403,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,2.0360493659973145
+747902,2,-0.5713494298017712,0.5943954402418251,0.18808796969072364,,,,,,,,,,,,,2.0360493659973145
+748003,0,0.07800989058673549,-0.08020445270647089,-0.3413299128685955,-0.674008317525728,-1.4901592762752198,0.457405498335207,-0.42767336139592416,-0.6877721853953127,-0.7217892120049145,0.9581833684000187,1.4045524206757267,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,2.369898557662964
+748003,1,0.14421538675261625,-0.2732317899567748,1.371591507462599,,,,,,,,,,0.2373400917434395,-1.3914893931436731,3.7028453019878094,2.332099676132202
+748003,2,-0.37456453965524245,0.1272911818441699,0.5480980944875663,,,,,,,,,,,,,2.332099676132202
+749701,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-1.867313839945839,-0.3959720470960366,-0.8838279349389385,-1.0493551392210523,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,0.806708965813594,-0.9106055385131593,1.9662433862686157
+749701,1,-0.6247506469344914,-0.3623194500333156,-0.8751602554913144,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,0.7462761998176575
+749701,2,-0.1777796495087138,-0.10626094735465771,0.45809556328835566,,,,,,,,,,,,,0.7462761998176575
+749802,0,1.320452244998589,0.4950861768803317,0.6463181773704137,0.9482578029319392,1.149922669419116,1.3107830437664505,1.3969449327761334,0.6380319786323989,1.2535103935403944,1.5559295959968287,-0.16814274788616518,-1.8119270229765592,-1.0422163045785646,-1.388853942113607,0.8737234706124865,2.0841472148895264
+749802,1,0.7209399120179469,0.4394694906555523,1.0652162670597927,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,3.7028453019878094,2.1526081562042236
+749802,2,1.7900692519565728,0.7500968597077102,0.7281031568859877,,,,,,,,,,,,,2.1526081562042236
+750103,0,-0.5996859390924573,-0.8856113341279945,-0.5882419354283478,-0.23157210285545515,-1.2387229004948068,-0.3959720470960366,-0.7013661055217327,-0.20566158029432668,-0.06335601015647824,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-1.812216028287741,-1.388853942113607,0.20460009219036931,0.051239874213933945
+750103,1,-1.6820789432542644,-1.431371370951806,-1.1815354958941209,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,2.4011685848236084
+750103,2,-1.4568814354611501,-1.2740215933487957,-2.061975310289543,,,,,,,,,,,,,2.4011685848236084
+750104,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-0.23157210285545515,-1.2387229004948068,-0.3959720470960366,-0.7013661055217327,-0.20566158029432668,-0.06335601015647824,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,-1.388853942113607,1.319805722893898,-0.6931471824645996
+750104,1,-1.8743204516760412,-0.18414412988023388,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.5613893220144716,2.254472017288208
+750104,2,-1.6536663256076787,-0.4955144960193704,-1.3419550606958577,,,,,,,,,,,,,2.254472017288208
+750105,0,-0.03493941435979663,0.03485367321088963,-0.3413299128685955,-0.23157210285545515,-1.2387229004948068,-0.3959720470960366,-0.7013661055217327,-0.20566158029432668,-0.06335601015647824,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,0.806708965813594,-0.018441033950336395,2.254472017288208
+750105,1,0.14421538675261625,-0.09505646980369299,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.6728168725967407
+750105,2,-0.37456453965524245,0.282992601310055,0.008082907292302316,,,,,,,,,,,,,1.6728168725967407
+750301,0,-0.5996859390924573,-0.6554950822932735,-0.8351539579881,-1.2639232704194252,-1.615877464165426,-1.2493495925272802,-0.8838279349389385,-1.8327848725101548,-0.3925726110806964,0.9581833684000187,0.6182048363947807,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.5790977478027344
+750301,1,-0.528629892723603,-1.431371370951806,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.9436346629275099,1.5715423822402954
+750301,2,-1.4568814354611501,-1.6632751420135086,-1.3419550606958577,,,,,,,,,,,,,1.5715423822402954
+750404,0,-0.7126352440389895,-0.42537883045855246,-0.5882419354283478,-1.1164445321960008,-1.3644410883850133,-0.9648904107168657,-0.42767336139592416,-0.3261892315695732,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,-1.0422163045785646,-1.388853942113607,0.8737234706124865,1.4227486848831177
+750404,1,0.7209399120179469,-1.1641083907221836,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.0968455076217651
+750404,2,0.11739768571107917,-1.040469464149968,0.368093032089145,,,,,,,,,,,,,1.0968455076217651
+750405,0,-0.9385338539320537,0.14991179912825014,-0.09441789030884316,-1.1164445321960008,-1.3644410883850133,-0.9648904107168657,-0.42767336139592416,-0.3261892315695732,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,0.8737234706124865,1.4227486848831177
+750405,1,-0.6247506469344914,0.08311885034938876,0.6567159465227176,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.0968455076217651
+750405,2,-0.8665267650215641,-0.41766378628642786,-0.6219348111021723,,,,,,,,,,,,,1.0968455076217651
+751402,0,0.19095919553326762,0.9553186805497738,2.004334301449051,0.06338537359139342,1.149922669419116,0.7418646801456215,-0.1539806172701155,-0.9288274879458058,0.595077191691958,1.5559295959968287,1.7977262128162,1.548461097626366,-1.812216028287741,-0.2910724881500066,0.8737234706124865,1.0286067724227905
+751402,1,0.048094632541727786,0.9739954511147976,0.8609661067912552,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.310551991190808,1.3031600713729858
+751402,2,0.019005240637814846,0.6722461499747677,0.908108219284409,,,,,,,,,,,,,1.3031600713729858
+752501,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,0.2108641118148177,0.39561354207787724,0.17294631652479245,1.3969449327761334,0.3367128504442826,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,3.002271873740795,0.8737234706124865,0.9975906014442444
+752501,1,-0.528629892723603,-1.3422837108752652,-1.1815354958941209,,,,,,,,,,1.663413533782179,1.8141914255436393,1.1944719937511734,1.666351318359375
+752501,2,-0.6697418748750354,-1.429723012814681,-0.26192468630532967,,,,,,,,,,,,,1.666351318359375
+752701,0,1.5463508548916531,0.9553186805497738,0.3994061548106614,1.833130232272485,0.7727681057484966,0.457405498335207,1.3057140180675306,1.602253188834371,1.9119435953888306,1.5559295959968287,1.0113786285352542,1.1284125825510003,1.267782866548965,0.806708965813594,0.20460009219036931,2.900031805038452
+752701,1,-0.14414687588004912,0.3503818305790114,0.04396546571710477,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.5977070331573486
+752701,2,-0.4729569847285068,1.3729025375712505,-0.35192721750454037,,,,,,,,,,,,,2.5977070331573486
+756001,0,-1.27738176877165,-0.5404369563759129,-0.5882419354283478,-0.5265295793023037,0.1441771662974643,0.457405498335207,0.7583285298159133,0.7585596299076455,0.430468891229849,-0.23730908679360116,0.22503104425430823,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.6875644123724536,0.8771734237670898
+756001,1,-0.14414687588004912,-0.18414412988023388,-1.4879107362969273,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,0.5719466209411621
+756001,2,-0.37456453965524245,-0.41766378628642786,-1.251952529496647,,,,,,,,,,,,,0.5719466209411621
+757502,0,-0.2608380242528609,-0.08020445270647089,-0.5882419354283478,-0.23157210285545515,1.0242044815289095,0.7418646801456215,0.5758667003987075,-0.6877721853953127,-0.3925726110806964,1.5559295959968287,1.7977262128162,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,2.3008182048797607
+757502,1,-0.04802612166916067,-0.6295824302629383,1.7800918279996742,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.275500535964966
+757502,2,-0.4729569847285068,-0.573365205752313,0.2780905008899343,,,,,,,,,,,,,2.275500535964966
+760602,0,-0.2608380242528609,-0.6554950822932735,-0.7116979467082238,-0.37905084107887943,1.0242044815289095,0.457405498335207,-0.7013661055217327,-1.1096189648586756,-1.0510058129291326,-0.835055314390411,1.4045524206757267,1.9685096127017316,1.267782866548965,-1.388853942113607,-0.24148216009104212,2.0023252964019775
+760602,1,0.4325776493852816,-0.896845410492561,-1.2836605760283897,,,,,,,,,,1.663413533782179,-1.3914893931436731,0.4419600012801827,2.1837191581726074
+760602,2,-0.5713494298017712,-0.573365205752313,-1.0719474670982256,,,,,,,,,,,,,2.1837191581726074
+761601,0,-1.3903310737181822,-0.8856113341279945,-0.8351539579881,-0.674008317525728,-1.615877464165426,-2.102727137958524,-0.7925970202303356,-0.26592540593194997,-0.5571809115428055,0.36043714080320877,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,0.806708965813594,0.20460009219036931,0.281955748796463
+761601,1,-1.393716680621599,-1.520459031028347,-1.1815354958941209,,,,,,,,,,1.663413533782179,0.7456311526478686,-1.0630639836617988,-0.2370988428592682
+761601,2,-0.6697418748750354,-1.741125851746451,-1.251952529496647,,,,,,,,,,,,,-0.2370988428592682
+761802,0,-0.8255845489855216,-0.6554950822932735,-0.5882419354283478,-1.1164445321960008,-1.615877464165426,-1.5338087743376947,-0.61013519081313,-0.024870103381456905,-1.2156141133912417,-2.628293997180841,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,1.7658879751753094,0.9014517664909363
+761802,1,0.048094632541727786,-0.80775775041602,-0.16028469455143282,,,,,,,,,,1.663413533782179,2.88275169843941,0.4419600012801827,0.6268419027328491
+761802,2,-0.6697418748750354,-0.8069173349511406,-0.17192215510611902,,,,,,,,,,,,,0.6268419027328491
+764502,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-0.9689657939725767,-1.7415956520556326,-1.8182679561481092,-0.7013661055217327,-2.5559507801616337,-0.8863975124670236,-0.23730908679360116,0.6182048363947807,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-1.3566877907945707,0.1766740381717682
+764502,1,0.048094632541727786,-0.4514071101098565,-0.46665993495423924,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,0.24496731162071228
+764502,2,-0.8665267650215641,-0.2619623668205428,-0.26192468630532967,,,,,,,,,,,,,0.24496731162071228
+767002,0,0.6427564153193962,-0.1952625786238314,0.2759501435307853,-1.2639232704194252,0.1441771662974643,-1.2493495925272802,-1.339982508481953,-0.38645305720719647,-1.5448307143154598,1.5559295959968287,1.7977262128162,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-0.4645232862317478,1.6853389739990234
+767002,1,-0.528629892723603,-0.2732317899567748,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.059714660367144415,1.1561801433563232
+767002,2,-0.7681343199482997,-0.729066625218198,1.3581208752804623,,,,,,,,,,,,,1.1561801433563232
+768401,0,1.207502940052057,0.2649699250456107,0.15249413225090913,0.2108641118148177,-0.35869558526336154,0.457405498335207,-0.61013519081313,0.15592137353141286,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.9648857116699219
+768401,1,1.8743889625486083,0.17220651042592966,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.8869439363479614
+768401,2,0.7077523561506651,-0.10626094735465771,0.368093032089145,,,,,,,,,,,,,1.8869439363479614
+768802,0,-1.6162296836112464,-1.5759600896321577,-1.4524340143874808,-0.8214870557491524,-0.2329773973731551,-0.3959720470960366,0.3021739562728989,0.8790872811828919,-0.5571809115428055,0.36043714080320877,1.0113786285352542,1.548461097626366,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,0.6174983382225037
+768802,1,-1.1053544179889336,-1.0750207306456427,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,1.6572585105895996
+768802,2,0.7077523561506651,-0.41766378628642786,-0.35192721750454037,,,,,,,,,,,,,1.6572585105895996
+769101,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-0.48441377315356804,-0.1115128652856221,0.3934048709815018,-0.26592540593194997,-0.7217892120049145,-0.835055314390411,1.7977262128162,-0.13173296267509654,1.267782866548965,0.806708965813594,0.8737234706124865,1.8467730283737183
+769101,1,0.14421538675261625,0.8849077910382567,0.6567159465227176,,,,,,,,,,-1.9017700713146695,1.8141914255436393,-0.8122266528381351,2.445986270904541
+769101,2,0.2157901307843435,0.5165447305088826,1.2681183440812516,,,,,,,,,,,,,2.445986270904541
+769403,0,-0.5996859390924573,-0.08020445270647089,0.2759501435307853,-0.8214870557491524,-1.867313839945839,-1.8182679561481092,-0.7925970202303356,-0.14539775465670343,-1.0510058129291326,-1.432801541987221,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.8737234706124865,0.9882259368896484
+769403,1,0.52869840359617,0.17220651042592966,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.059714660367144415,1.3424479961395264
+769403,2,0.8061448012239295,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,1.3424479961395264
+769501,0,-0.14788871930632877,-0.8856113341279945,0.029038120971032973,-0.9689657939725767,-0.9872865247143939,-0.3959720470960366,-1.24875159377335,-0.6877721853953127,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-0.9106055385131593,1.6239888668060303
+769501,1,-0.24026763009093757,-0.09505646980369299,-0.05815961441716403,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,1.8519121408462524
+769501,2,-0.7681343199482997,0.20514189157711243,-0.26192468630532967,,,,,,,,,,,,,1.8519121408462524
+769504,0,0.07800989058673549,0.4950861768803317,0.5228621660905376,-0.9689657939725767,-0.9872865247143939,-0.3959720470960366,-1.24875159377335,-0.6877721853953127,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.9106055385131593,1.3828768730163574
+769504,1,0.2403361409635047,0.08311885034938876,0.45246578625417994,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-1.0630639836617988,2.1283438205718994
+769504,2,0.31418257585760784,0.6722461499747677,-0.17192215510611902,,,,,,,,,,,,,2.1283438205718994
+775401,0,0.529807110372864,3.1414230729796238,3.1154384029679365,0.06338537359139342,0.6470499178582901,0.17294631652479245,0.940790359233119,-0.26592540593194997,0.10125229030563083,0.9581833684000187,-0.5613165400266386,1.9685096127017316,-0.27221658086938805,0.806708965813594,-0.6875644123724536,1.5523203611373901
+775401,1,-0.14414687588004912,0.9739954511147976,1.2694664273283303,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,2.3468987941741943
+775401,2,-0.07938720443544948,2.0735589251677333,0.368093032089145,,,,,,,,,,,,,2.3468987941741943
+778903,0,-0.48673663414592516,-1.000669460045355,-0.8351539579881,-0.9689657939725767,-0.10725920948294862,-1.8182679561481092,-2.2522916555679817,-1.1698827904962987,-1.7094390147775689,-0.835055314390411,-0.5613165400266386,1.1284125825510003,-2.5822157519969178,-0.2910724881500066,-0.4645232862317478,2.3154640197753906
+778903,1,0.33645689517439314,-0.3623194500333156,-0.26240977468570165,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.6927973321038463,1.97854483127594
+778903,2,-0.4729569847285068,-0.18411165708760024,-0.5319322799029617,,,,,,,,,,,,,1.97854483127594
+778904,0,-0.5996859390924573,-0.3103207045411919,-0.3413299128685955,-0.9689657939725767,-0.10725920948294862,-1.8182679561481092,-2.2522916555679817,-1.1698827904962987,-1.7094390147775689,-0.835055314390411,-0.5613165400266386,1.1284125825510003,-1.812216028287741,-0.2910724881500066,-0.4645232862317478,1.2272639274597168
+778904,1,0.6248191578070585,1.0630831111913384,0.35034070611991114,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.3009729385375977
+778904,2,-0.7681343199482997,1.9178575057018483,-1.7019651854927003,,,,,,,,,,,,,1.3009729385375977
+779702,0,-1.27738176877165,-0.6554950822932735,-0.4647859241484716,-0.9689657939725767,-0.8615683368241874,-1.2493495925272802,0.028481212147090252,-0.6275083597576895,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,-0.05908258259296417
+779702,1,-0.9131129095671567,-0.5404947701863974,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,-0.14796800911426544
+779702,2,0.11739768571107917,-0.41766378628642786,0.09808543849151298,,,,,,,,,,,,,-0.14796800911426544
+781001,0,-0.48673663414592516,-0.6554950822932735,-0.8351539579881,-0.9689657939725767,-0.7358501489339809,-0.9648904107168657,-0.2452115319787184,-0.14539775465670343,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-2.5822157519969178,-1.388853942113607,-1.133646664653865,0.8606327176094055
+781001,1,0.14421538675261625,-0.4514071101098565,-0.05815961441716403,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,-0.16049788892269135
+781001,2,0.019005240637814846,-0.4955144960193704,-0.8019398735005937,,,,,,,,,,,,,-0.16049788892269135
+781403,0,0.07800989058673549,0.7252024287150527,-0.5882419354283478,0.2108641118148177,-0.7358501489339809,-1.5338087743376947,-0.42767336139592416,-0.08513392901908017,-0.3925726110806964,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,1.9044904197771946,0.8737234706124865,2.0930798053741455
+781403,1,0.14421538675261625,0.5285571507320932,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.19112267045651915,1.9305620193481445
+781403,2,-0.27617209458197817,-0.4955144960193704,-0.08191962390690835,,,,,,,,,,,,,1.9305620193481445
+785602,0,-0.8255845489855216,-0.5404369563759129,-0.4647859241484716,-0.9689657939725767,-0.48441377315356804,-0.6804312289064511,0.11971212685569313,-0.5672445341200663,-0.8863975124670236,-0.23730908679360116,-0.9544903321671111,1.1284125825510003,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.36678001284599304
+785602,1,-0.4325091385127145,-0.00596880972715211,-1.1815354958941209,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,0.5030383467674255
+785602,2,-0.6697418748750354,1.9178575057018483,-0.17192215510611902,,,,,,,,,,,,,0.5030383467674255
+786404,0,-0.37378732919939306,1.4155511842192159,2.2512463240088034,0.5058215882616662,-0.10725920948294862,-0.1115128652856221,-0.7925970202303356,-0.5672445341200663,-0.8863975124670236,-0.835055314390411,0.6182048363947807,1.1284125825510003,-1.812216028287741,-0.2910724881500066,-0.4645232862317478,0.9527450203895569
+786404,1,-1.1053544179889336,1.419433751497502,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.5351004600524902
+786404,2,-0.8665267650215641,1.450753247304193,0.008082907292302316,,,,,,,,,,,,,1.5351004600524902
+786901,0,-1.5032803786647144,-1.9211344673842392,-1.8228020482271092,-0.5265295793023037,-1.4901592762752198,-1.2493495925272802,-0.33644244668732126,0.3367128504442826,-0.7217892120049145,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.518728256225586
+786901,1,0.4325776493852816,-2.054984991487592,-1.8964110568340025,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,0.6841567754745483
+786901,2,-1.0633116551680928,-1.2740215933487957,-1.8819702478911218,,,,,,,,,,,,,0.6841567754745483
+786904,0,-1.8421282935043108,-1.9211344673842392,-1.8228020482271092,-0.5265295793023037,-1.4901592762752198,-1.2493495925272802,-0.33644244668732126,0.3367128504442826,-0.7217892120049145,-0.835055314390411,-1.3476641243075844,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.3929792642593384
+786904,1,-2.3549242227304834,-1.6986343511814288,-2.10066121710254,,,,,,,,,,0.9503768127628092,1.8141914255436393,-1.3139013144854623,1.6429179906845093
+786904,2,-0.6697418748750354,-2.130379400411164,-1.9719727790903323,,,,,,,,,,,,,1.6429179906845093
+788203,0,-0.9385338539320537,-1.1157275859627156,-0.9586099692679761,0.2108641118148177,0.2698953541876708,0.17294631652479245,-0.2452115319787184,0.4572405017195292,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,2.017352819442749
+788203,1,-1.0092336637780452,-0.80775775041602,-0.8751602554913144,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.2761619091033936
+788203,2,-0.6697418748750354,-0.028410237621715174,-0.6219348111021723,,,,,,,,,,,,,2.2761619091033936
+788302,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,0.06338537359139342,1.2756408573093225,0.457405498335207,-0.9750588496475414,0.2764490248066594,-0.5571809115428055,0.9581833684000187,1.7977262128162,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.9243402481079102
+788302,1,-1.4898374348324874,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,2.145266056060791
+788302,2,-1.9488436608274717,-1.040469464149968,-2.421985435086386,,,,,,,,,,,,,2.145266056060791
+788303,0,-1.164432463825118,-0.8856113341279945,-0.7116979467082238,0.06338537359139342,1.2756408573093225,0.457405498335207,-0.9750588496475414,0.2764490248066594,-0.5571809115428055,0.9581833684000187,1.7977262128162,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.145266056060791
+788303,1,-1.2975959264107106,-1.3422837108752652,-1.9985361369682713,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,2.1911191940307617
+788303,2,-1.161704100241357,-2.130379400411164,-1.4319575918950684,,,,,,,,,,,,,2.1911191940307617
+790001,0,-0.2608380242528609,-0.42537883045855246,-0.4647859241484716,-0.5265295793023037,0.5213317299680837,1.026323861956036,0.4846357856901046,-0.14539775465670343,-0.8863975124670236,0.36043714080320877,-0.5613165400266386,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.8737234706124865,1.9634854793548584
+790001,1,0.8170606662288354,0.4394694906555523,0.6567159465227176,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.265265941619873
+790001,2,-0.27617209458197817,1.1393504083724229,0.368093032089145,,,,,,,,,,,,,2.265265941619873
+792704,0,0.4168578054263319,-0.770553208210634,-0.7116979467082238,0.358342850038242,0.018458978407257843,-0.6804312289064511,0.3021739562728989,0.4572405017195292,0.9242937926161762,0.36043714080320877,1.4045524206757267,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,1.98080313205719
+792704,1,-0.6247506469344914,-0.5404947701863974,-0.16028469455143282,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.32845139503479
+792704,2,0.019005240637814846,-0.573365205752313,-0.8919424046998043,,,,,,,,,,,,,1.32845139503479
+793102,0,0.529807110372864,0.3800280509629712,0.029038120971032973,-0.9689657939725767,-2.2444684036164584,-1.5338087743376947,-1.4312134231905558,-1.7725210468725314,-1.5448307143154598,-1.432801541987221,-0.5613165400266386,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,-1.133646664653865,1.6107815504074097
+793102,1,1.1054229288615007,0.9739954511147976,-0.568785015088508,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,1.4838675260543823
+793102,2,1.0029296913704582,0.36084331104299755,0.09808543849151298,,,,,,,,,,,,,1.4838675260543823
+793804,0,-1.164432463825118,-0.8856113341279945,-0.8351539579881,-1.4114020086428494,-1.7415956520556326,-1.5338087743376947,-1.4312134231905558,-1.9533125237854012,-0.7217892120049145,-0.835055314390411,0.22503104425430823,0.28831555240026907,-2.5822157519969178,-1.388853942113607,0.20460009219036931,0.8606327176094055
+793804,1,-0.9131129095671567,-1.3422837108752652,-1.8964110568340025,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.3139013144854623,0.8166834712028503
+793804,2,-1.5552738805344144,-1.2740215933487957,-1.0719474670982256,,,,,,,,,,,,,0.8166834712028503
+794502,0,-1.27738176877165,0.2649699250456107,0.15249413225090913,-1.5588807468662738,-0.48441377315356804,0.17294631652479245,-1.1575206790647472,-0.20566158029432668,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-2.5822157519969178,-0.2910724881500066,-0.24148216009104212,1.2004246711730957
+794502,1,-1.9704412058869298,2.3103103522629107,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,0.7210030555725098
+794502,2,-1.8504512157542075,0.5165447305088826,-0.26192468630532967,,,,,,,,,,,,,0.7210030555725098
+796703,0,0.19095919553326762,-0.770553208210634,-0.5882419354283478,-1.2639232704194252,-0.10725920948294862,-0.1115128652856221,-0.518904276104527,-0.08513392901908017,-0.8863975124670236,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,1.401166558265686
+796703,1,-0.14414687588004912,-1.1641083907221836,-1.590035816431196,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,1.7245936393737793
+796703,2,-0.6697418748750354,-1.2740215933487957,-0.7119373423013831,,,,,,,,,,,,,1.7245936393737793
+797103,0,-1.5032803786647144,-1.460901963714797,-1.3289780031076046,-0.9689657939725767,-1.867313839945839,-1.8182679561481092,-2.6172153144023933,-2.194367826335894,-1.2156141133912417,-0.835055314390411,-0.9544903321671111,1.548461097626366,0.49778314283978853,0.806708965813594,0.42764121833107505,0.9032858610153198
+797103,1,-1.2975959264107106,-1.609546691104888,-1.6921608965654649,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,0.9590807557106018
+797103,2,-2.637590776340322,-2.0525286906782214,-1.791967716691911,,,,,,,,,,,,,0.9590807557106018
+797401,0,-0.2608380242528609,-0.6554950822932735,-0.8351539579881,-0.9689657939725767,-0.7358501489339809,-0.9648904107168657,-0.06274970256151263,-1.2904104417715454,-0.5571809115428055,-0.23730908679360116,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.3331875801086426
+797401,1,0.33645689517439314,0.3503818305790114,1.0652162670597927,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,1.689704418182373
+797401,2,-0.5713494298017712,-0.33981307655348536,0.008082907292302316,,,,,,,,,,,,,1.689704418182373
+798302,0,0.9816043301589925,-0.8856113341279945,-0.3413299128685955,0.5058215882616662,-0.10725920948294862,-0.6804312289064511,-0.33644244668732126,0.6982958042700221,-0.22796431061858732,0.36043714080320877,-0.5613165400266386,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.7373297214508057
+798302,1,0.048094632541727786,-1.3422837108752652,-1.7942859766997337,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.7739202976226807
+798302,2,-0.1777796495087138,-1.3518723030817383,-0.35192721750454037,,,,,,,,,,,,,1.7739202976226807
+799703,0,0.4168578054263319,2.3360161915581,2.004334301449051,0.9482578029319392,1.149922669419116,0.457405498335207,0.6670976151073104,1.5419893631967478,1.7473352949267216,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.3532345294952393
+799703,1,2.5472342420248277,0.9739954511147976,1.0652162670597927,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.7192394733428955
+799703,2,1.1013221364437225,1.606454666770078,1.6281284688780944,,,,,,,,,,,,,2.7192394733428955
+800001,0,1.207502940052057,2.105899939723379,4.226542504486822,0.9482578029319392,1.2756408573093225,1.026323861956036,1.4881758474847362,0.8790872811828919,0.7596854921540671,1.5559295959968287,1.0113786285352542,0.7083640674756347,-1.812216028287741,-1.388853942113607,0.8737234706124865,2.995732307434082
+800001,1,0.4325776493852816,1.330346091420961,0.8609661067912552,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,2.995732307434082
+800001,2,2.085246587176366,1.6843053765030207,0.7281031568859877,,,,,,,,,,,,,2.995732307434082
+800002,0,1.320452244998589,0.4950861768803317,0.15249413225090913,0.9482578029319392,1.2756408573093225,1.026323861956036,1.4881758474847362,0.8790872811828919,0.7596854921540671,1.5559295959968287,1.0113786285352542,0.7083640674756347,-0.27221658086938805,0.806708965813594,-0.24148216009104212,2.995732307434082
+800002,1,0.52869840359617,2.755748652645615,0.45246578625417994,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,2.995732307434082
+800002,2,1.9868541421031014,1.0614996986394805,1.718131000077305,,,,,,,,,,,,,2.995732307434082
+800601,0,-0.2608380242528609,-0.5404369563759129,-0.3413299128685955,0.2108641118148177,-0.48441377315356804,-0.1115128652856221,-0.2452115319787184,0.5175043273571525,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.9106055385131593,1.8914724588394165
+800601,1,0.2403361409635047,1.330346091420961,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,1.8279719352722168
+800601,2,-0.7681343199482997,0.7500968597077102,-0.17192215510611902,,,,,,,,,,,,,1.8279719352722168
+800603,0,0.9816043301589925,0.14991179912825014,-0.7116979467082238,0.2108641118148177,-0.48441377315356804,-0.1115128652856221,-0.2452115319787184,0.5175043273571525,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.9106055385131593,2.546053647994995
+800603,1,0.7209399120179469,0.3503818305790114,-1.079410415759852,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.835005760192871
+800603,2,0.019005240637814846,-0.2619623668205428,-1.4319575918950684,,,,,,,,,,,,,1.835005760192871
+803001,0,-0.03493941435979663,-0.3103207045411919,-0.7116979467082238,-0.37905084107887943,-0.7358501489339809,-0.3959720470960366,0.028481212147090252,0.6380319786323989,-1.3802224138533508,-0.23730908679360116,-1.3476641243075844,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.4929080307483673
+803001,1,-0.24026763009093757,-0.7186700903394792,-1.079410415759852,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.5613893220144716,0.6929920315742493
+803001,2,-0.5713494298017712,-0.729066625218198,0.2780905008899343,,,,,,,,,,,,,0.6929920315742493
+803101,0,-0.2608380242528609,-0.6554950822932735,-0.8351539579881,-0.8214870557491524,-1.9930320278360456,-0.3959720470960366,-1.7961370820249674,-0.6275083597576895,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,0.6381300687789917
+803101,1,-0.8169921553562683,-0.18414412988023388,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,0.9759406447410583
+803101,2,-0.9649192100948284,-0.028410237621715174,0.2780905008899343,,,,,,,,,,,,,0.9759406447410583
+803103,0,0.07800989058673549,-0.1952625786238314,0.3994061548106614,-0.8214870557491524,-1.9930320278360456,-0.3959720470960366,-1.7961370820249674,-0.6275083597576895,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.0422163045785646,0.806708965813594,-0.6875644123724536,0.46625256538391113
+803103,1,-0.4325091385127145,-0.6295824302629383,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,1.426360011100769
+803103,2,0.2157901307843435,-0.6512159154852555,-0.7119373423013831,,,,,,,,,,,,,1.426360011100769
+804401,0,0.529807110372864,-0.5404369563759129,-0.4647859241484716,-0.08409336463203088,-0.6101319610437744,-0.1115128652856221,-0.33644244668732126,-0.08513392901908017,0.2658605907677399,-0.23730908679360116,-1.740837916448057,1.1284125825510003,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.3585395812988281
+804401,1,0.4325776493852816,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.9503768127628092,2.88275169843941,-0.5613893220144716,1.6221328973770142
+804401,2,1.0029296913704582,0.04944047211122737,0.09808543849151298,,,,,,,,,,,,,1.6221328973770142
+804402,0,0.529807110372864,0.4950861768803317,-0.09441789030884316,-0.08409336463203088,-0.6101319610437744,-0.1115128652856221,-0.33644244668732126,-0.08513392901908017,0.2658605907677399,-0.23730908679360116,-1.740837916448057,1.1284125825510003,0.49778314283978853,3.002271873740795,-0.6875644123724536,1.6221328973770142
+804402,1,0.9131814204397238,0.3503818305790114,0.35034070611991114,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.4197745323181152
+804402,2,0.6093599110774008,0.36084331104299755,1.5381259376788836,,,,,,,,,,,,,1.4197745323181152
+804901,0,0.6427564153193962,1.5306093101365763,1.5105102563295467,-1.1164445321960008,0.5213317299680837,0.17294631652479245,1.3969449327761334,1.1804064093710083,1.0889020930782853,-0.835055314390411,0.22503104425430823,-0.9718299928258278,-1.0422163045785646,0.806708965813594,-0.4645232862317478,0.8391745686531067
+804901,1,1.0093021746506123,2.22122269218637,2.086467068402481,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,1.1373738050460815
+804901,2,0.7077523561506651,-1.1183201738829107,0.908108219284409,,,,,,,,,,,,,1.1373738050460815
+804902,0,0.19095919553326762,-0.770553208210634,-0.2178739015887193,-1.1164445321960008,0.5213317299680837,0.17294631652479245,1.3969449327761334,1.1804064093710083,1.0889020930782853,-0.835055314390411,0.22503104425430823,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.667398691177368
+804902,1,1.1054229288615007,-0.00596880972715211,0.45246578625417994,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,2.888021469116211
+804902,2,0.5109674660041365,0.9057982791735953,0.9981107504836196,,,,,,,,,,,,,2.888021469116211
+811302,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,1.0957365411553635,0.8984862936387031,0.7418646801456215,1.2144831033589276,-0.08513392901908017,1.4181186940025035,-0.23730908679360116,1.7977262128162,1.1284125825510003,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,2.5370912551879883
+811302,1,-1.585958189043376,-1.6986343511814288,-1.590035816431196,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,2.0105955600738525
+811302,2,-0.7681343199482997,-0.573365205752313,0.638100625686777,,,,,,,,,,,,,2.0105955600738525
+815202,0,0.4168578054263319,1.875783687888658,0.3994061548106614,-0.5265295793023037,0.7727681057484966,0.457405498335207,0.940790359233119,1.5419893631967478,-0.06335601015647824,1.5559295959968287,1.7977262128162,0.7083640674756347,0.49778314283978853,0.806708965813594,0.8737234706124865,2.995732307434082
+815202,1,-0.24026763009093757,3.2902746131048604,0.7588410266569864,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,2.9948654174804688
+815202,2,0.31418257585760784,1.606454666770078,0.09808543849151298,,,,,,,,,,,,,2.9948654174804688
+816101,0,-0.14788871930632877,0.4950861768803317,0.7697741886502898,-2.148795699759971,-1.7415956520556326,-2.671645501579353,-2.982138973236805,-2.6764784314368804,-1.3802224138533508,-2.030547769584031,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,-1.388853942113607,-1.133646664653865,0.24349652230739594
+816101,1,0.4325776493852816,0.7067324708851749,0.6567159465227176,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.8122266528381351,-0.6931471824645996
+816101,2,-0.07938720443544948,0.8279475694406527,0.368093032089145,,,,,,,,,,,,,-0.6931471824645996
+817403,0,0.4168578054263319,-0.1952625786238314,-0.8351539579881,-1.2639232704194252,-1.7415956520556326,-1.8182679561481092,-1.5224443378991586,-1.5917295699596616,-0.8863975124670236,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-1.3566877907945707,1.4489400386810303
+817403,1,-0.14414687588004912,-1.1641083907221836,-0.46665993495423924,,,,,,,,,,0.2373400917434395,1.8141914255436393,-1.3139013144854623,1.3976569175720215
+817403,2,-0.07938720443544948,-1.429723012814681,-0.8019398735005937,,,,,,,,,,,,,1.3976569175720215
+817801,0,-0.7126352440389895,-0.8856113341279945,-0.8351539579881,-0.9689657939725767,-1.3644410883850133,-2.3871863197689382,-1.7049061673163644,-1.4712019186844152,-0.8863975124670236,0.36043714080320877,-0.5613165400266386,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,1.5103520154953003
+817801,1,-0.33638838430182605,-0.7186700903394792,-0.8751602554913144,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.3139013144854623,0.9975906014442444
+817801,2,-0.07938720443544948,-1.2740215933487957,-0.35192721750454037,,,,,,,,,,,,,0.9975906014442444
+819302,0,-1.27738176877165,-0.3103207045411919,-0.09441789030884316,1.390694017602212,0.1441771662974643,0.7418646801456215,0.940790359233119,1.361197886283878,-0.3925726110806964,0.9581833684000187,0.22503104425430823,1.548461097626366,1.267782866548965,0.806708965813594,1.7658879751753094,2.3130669593811035
+819302,1,-1.585958189043376,-0.5404947701863974,-1.079410415759852,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,2.3207790851593018
+819302,2,-0.6697418748750354,-0.729066625218198,-1.791967716691911,,,,,,,,,,,,,2.3207790851593018
+819502,0,-0.2608380242528609,-0.3103207045411919,0.893230199930166,-0.5265295793023037,-1.3644410883850133,-0.6804312289064511,-0.42767336139592416,0.3969766760819059,-1.2156141133912417,-0.835055314390411,-2.13401170858853,-2.2319755380519246,1.267782866548965,-1.388853942113607,-0.4645232862317478,1.451264500617981
+819502,1,0.6248191578070585,0.3503818305790114,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.7045929431915283
+819502,2,0.9045372462971938,0.36084331104299755,1.2681183440812516,,,,,,,,,,,,,1.7045929431915283
+821202,0,0.8686550252124604,0.7252024287150527,0.029038120971032973,0.9482578029319392,0.7727681057484966,0.7418646801456215,1.3057140180675306,0.5175043273571525,2.07655189585094,-0.23730908679360116,0.6182048363947807,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,-0.9106055385131593,1.9620232582092285
+821202,1,0.4325776493852816,0.4394694906555523,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,2.010808229446411
+821202,2,1.6916768068833083,-0.10626094735465771,0.5480980944875663,,,,,,,,,,,,,2.010808229446411
+822601,0,1.7722494647847176,3.0263649470622633,2.745070369128308,1.2432152793787876,1.401359045199529,1.026323861956036,1.4881758474847362,0.7585596299076455,2.07655189585094,0.9581833684000187,1.0113786285352542,1.548461097626366,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.995732307434082
+822601,1,2.0666304709703853,1.2412584313444202,2.8013426293423622,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,2.995732307434082
+822601,2,1.1997145815169867,1.1393504083724229,2.258146187272569,,,,,,,,,,,,,2.995732307434082
+822602,0,1.6593001598381854,1.7607255619712974,1.016686211210042,1.2432152793787876,1.401359045199529,1.026323861956036,1.4881758474847362,0.7585596299076455,2.07655189585094,0.9581833684000187,1.0113786285352542,1.548461097626366,0.49778314283978853,1.9044904197771946,-0.24148216009104212,2.995732307434082
+822602,1,0.33645689517439314,0.7958201309617158,0.6567159465227176,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.5613893220144716,2.995732307434082
+822602,2,1.1013221364437225,0.43869402077594005,1.718131000077305,,,,,,,,,,,,,2.995732307434082
+822701,0,1.6593001598381854,1.5306093101365763,2.621614357848432,0.5058215882616662,1.0242044815289095,1.026323861956036,0.8495594445245161,0.3367128504442826,1.5827269944646125,0.9581833684000187,0.6182048363947807,-0.5517814777504622,-2.5822157519969178,0.806708965813594,0.20460009219036931,2.995732307434082
+822701,1,1.2015436830723893,0.5285571507320932,1.1673413471940615,,,,,,,,,,-1.9017700713146695,1.8141914255436393,0.4419600012801827,2.995732307434082
+822701,2,2.9707785928357446,1.0614996986394805,1.8981360624757264,,,,,,,,,,,,,2.995732307434082
+825702,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-0.10725920948294862,0.17294631652479245,-0.06274970256151263,0.5175043273571525,-0.7217892120049145,1.5559295959968287,1.7977262128162,1.9685096127017316,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,2.407790422439575
+825702,1,-1.585958189043376,-1.3422837108752652,-1.3857856561626585,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,2.3139476776123047
+825702,2,-1.8504512157542075,-1.1183201738829107,-0.8019398735005937,,,,,,,,,,,,,2.3139476776123047
+826105,0,-1.0514831588785858,-0.5404369563759129,-0.4647859241484716,-1.1164445321960008,-1.7415956520556326,-0.3959720470960366,-2.069829826150776,-2.073840175060648,-0.7217892120049145,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.5618313550949097
+826105,1,-0.4325091385127145,2.9339239727986968,0.24821562598564237,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,-0.06553414463996887
+826105,2,0.11739768571107917,1.0614996986394805,0.008082907292302316,,,,,,,,,,,,,-0.06553414463996887
+826202,0,0.3039085004797998,0.7252024287150527,-0.2178739015887193,-0.674008317525728,-0.35869558526336154,-1.2493495925272802,-0.8838279349389385,1.4214617119215014,-1.0510058129291326,1.5559295959968287,0.22503104425430823,-0.5517814777504622,1.267782866548965,-0.2910724881500066,-0.4645232862317478,2.995732307434082
+826202,1,0.14421538675261625,-0.09505646980369299,-0.46665993495423924,,,,,,,,,,-1.1887333502953,-1.3914893931436731,1.6961466553985005,2.995732307434082
+826202,2,0.6093599110774008,1.995708215434791,0.09808543849151298,,,,,,,,,,,,,2.995732307434082
+826203,0,0.19095919553326762,0.8402605546324132,0.5228621660905376,-0.674008317525728,-0.35869558526336154,-1.2493495925272802,-0.8838279349389385,1.4214617119215014,-1.0510058129291326,1.5559295959968287,0.22503104425430823,-0.5517814777504622,1.267782866548965,-1.388853942113607,1.319805722893898,2.995732307434082
+826203,1,0.4325776493852816,0.3503818305790114,0.04396546571710477,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,2.995732307434082
+826203,2,-0.4729569847285068,0.36084331104299755,-0.6219348111021723,,,,,,,,,,,,,2.995732307434082
+827303,0,0.07800989058673549,0.6101443027976923,1.5105102563295467,0.5058215882616662,1.149922669419116,0.7418646801456215,0.4846357856901046,1.361197886283878,0.595077191691958,1.5559295959968287,1.7977262128162,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.24148216009104212,2.3221967220306396
+827303,1,0.9131814204397238,1.0630831111913384,0.5545908663884488,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,2.752803325653076
+827303,2,-0.1777796495087138,1.3729025375712505,0.008082907292302316,,,,,,,,,,,,,2.752803325653076
+827901,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-0.8615683368241874,-0.3959720470960366,-0.06274970256151263,-1.1698827904962987,-0.06335601015647824,0.9581833684000187,1.4045524206757267,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,0.48023536801338196
+827901,1,-0.8169921553562683,0.6176448108086341,0.45246578625417994,,,,,,,,,,-1.1887333502953,-0.3229291202479022,2.4486586478694914,1.6807416677474976
+827901,2,-1.3584889903878858,0.6722461499747677,0.008082907292302316,,,,,,,,,,,,,1.6807416677474976
+828604,0,-0.5996859390924573,-0.3103207045411919,1.016686211210042,-0.674008317525728,-0.48441377315356804,0.17294631652479245,-1.24875159377335,-0.024870103381456905,-1.0510058129291326,-0.23730908679360116,-0.5613165400266386,0.28831555240026907,1.267782866548965,0.806708965813594,-0.6875644123724536,0.8576897382736206
+828604,1,0.14421538675261625,-0.2732317899567748,0.35034070611991114,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.19112267045651915,1.616479516029358
+828604,2,-0.6697418748750354,-0.33981307655348536,-0.26192468630532967,,,,,,,,,,,,,1.616479516029358
+828703,0,-0.14788871930632877,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,-1.7415956520556326,-1.2493495925272802,-0.2452115319787184,0.5777681529947757,-1.0510058129291326,-0.23730908679360116,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,0.6727573275566101
+828703,1,-0.33638838430182605,0.17220651042592966,0.5545908663884488,,,,,,,,,,0.9503768127628092,-0.3229291202479022,2.4486586478694914,0.7665178179740906
+828703,2,-0.4729569847285068,0.1272911818441699,-0.5319322799029617,,,,,,,,,,,,,0.7665178179740906
+828902,0,-1.9550775984508428,-1.000669460045355,-0.8351539579881,-0.37905084107887943,-1.9930320278360456,-2.102727137958524,-1.1575206790647472,-0.6275083597576895,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,-2.2319755380519246,1.267782866548965,-1.388853942113607,-1.3566877907945707,0.7422600388526917
+828902,1,-1.1053544179889336,-1.8768096713345106,-1.079410415759852,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,1.0138639211654663
+828902,2,-0.4729569847285068,-1.585424432280566,-1.0719474670982256,,,,,,,,,,,,,1.0138639211654663
+828904,0,-1.5032803786647144,-1.1157275859627156,-0.9586099692679761,-0.37905084107887943,-1.9930320278360456,-2.102727137958524,-1.1575206790647472,-0.6275083597576895,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,-2.2319755380519246,-1.812216028287741,-1.388853942113607,-1.3566877907945707,1.0138639211654663
+828904,1,-1.6820789432542644,-1.609546691104888,-1.3857856561626585,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.3139013144854623,0.8473845720291138
+828904,2,-2.4408058861937936,-2.286080819877049,-2.421985435086386,,,,,,,,,,,,,0.8473845720291138
+828905,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.37905084107887943,-1.9930320278360456,-2.102727137958524,-1.1575206790647472,-0.6275083597576895,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,-2.2319755380519246,-2.5822157519969178,-1.388853942113607,0.42764121833107505,0.8473845720291138
+828905,1,-2.1626827143087066,-1.6986343511814288,-1.1815354958941209,,,,,,,,,,-1.1887333502953,0.7456311526478686,-1.3139013144854623,0.9859139323234558
+828905,2,-0.8665267650215641,-1.3518723030817383,-1.9719727790903323,,,,,,,,,,,,,0.9859139323234558
+829401,0,-0.7126352440389895,-0.770553208210634,-0.8351539579881,-1.1164445321960008,-0.9872865247143939,-1.5338087743376947,-0.8838279349389385,0.3969766760819059,-0.7217892120049145,-0.23730908679360116,1.7977262128162,1.9685096127017316,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.2641254663467407
+829401,1,-0.7208714011453798,-0.3623194500333156,-1.590035816431196,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.492652416229248
+829401,2,-1.2600965453146213,-0.10626094735465771,-0.08191962390690835,,,,,,,,,,,,,1.492652416229248
+830503,0,-1.0514831588785858,-1.9211344673842392,-1.8228020482271092,-0.674008317525728,-2.621622967287078,-1.8182679561481092,-1.4312134231905558,-1.9533125237854012,-1.2156141133912417,-0.23730908679360116,-1.3476641243075844,-0.9718299928258278,-2.5822157519969178,-1.388853942113607,-0.4645232862317478,-0.6931471824645996
+830503,1,-1.4898374348324874,-1.8768096713345106,-1.8964110568340025,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.20381760597229
+830503,2,-0.1777796495087138,-1.429723012814681,-1.251952529496647,,,,,,,,,,,,,1.20381760597229
+830504,0,-1.27738176877165,-1.3458438377974367,-1.2055219918277285,-0.674008317525728,-2.621622967287078,-1.8182679561481092,-1.4312134231905558,-1.9533125237854012,-1.2156141133912417,-0.23730908679360116,-1.3476641243075844,-0.9718299928258278,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,1.20381760597229
+830504,1,-2.258803468519595,-1.7877220112579697,-1.079410415759852,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-1.0630639836617988,0.8111194372177124
+830504,2,-0.7681343199482997,-1.3518723030817383,-1.4319575918950684,,,,,,,,,,,,,0.8111194372177124
+830906,0,-0.48673663414592516,0.4950861768803317,-0.09441789030884316,-0.23157210285545515,-1.867313839945839,-2.102727137958524,-1.339982508481953,-1.4712019186844152,-1.3802224138533508,-0.835055314390411,-0.5613165400266386,-1.8119270229765592,0.49778314283978853,-1.388853942113607,-0.9106055385131593,2.0119855403900146
+830906,1,0.33645689517439314,-0.6295824302629383,-0.05815961441716403,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,2.1076858043670654
+830906,2,1.298107026590251,-0.729066625218198,-1.521960123094279,,,,,,,,,,,,,2.1076858043670654
+832901,0,-0.7126352440389895,-0.6554950822932735,-0.7116979467082238,-0.37905084107887943,-1.2387229004948068,-1.5338087743376947,-0.8838279349389385,0.3969766760819059,-1.2156141133912417,-1.432801541987221,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,-0.4645232862317478,0.4068944454193115
+832901,1,-0.14414687588004912,1.5976090716505837,0.24821562598564237,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.4419600012801827,0.8529248237609863
+832901,2,-0.7681343199482997,-0.33981307655348536,-0.5319322799029617,,,,,,,,,,,,,0.8529248237609863
+832902,0,-0.9385338539320537,-0.8856113341279945,-0.7116979467082238,-0.37905084107887943,-1.2387229004948068,-1.5338087743376947,-0.8838279349389385,0.3969766760819059,-1.2156141133912417,-1.432801541987221,-0.5613165400266386,-0.9718299928258278,-2.5822157519969178,-1.388853942113607,0.8737234706124865,0.8529248237609863
+832902,1,-1.201475172199822,-0.00596880972715211,0.5545908663884488,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,0.8743267059326172
+832902,2,0.2157901307843435,-0.41766378628642786,0.09808543849151298,,,,,,,,,,,,,0.8743267059326172
+832903,0,-0.5996859390924573,-0.42537883045855246,-0.5882419354283478,-0.37905084107887943,-1.2387229004948068,-1.5338087743376947,-0.8838279349389385,0.3969766760819059,-1.2156141133912417,-1.432801541987221,-0.5613165400266386,-0.9718299928258278,1.267782866548965,-1.388853942113607,-0.24148216009104212,0.8743267059326172
+832903,1,-0.14414687588004912,0.4394694906555523,1.0652162670597927,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,0.8036295175552368
+832903,2,0.019005240637814846,0.20514189157711243,0.09808543849151298,,,,,,,,,,,,,0.8036295175552368
+833401,0,-1.3903310737181822,-0.8856113341279945,-0.2178739015887193,-0.37905084107887943,-0.9872865247143939,-1.5338087743376947,0.8495594445245161,0.3367128504442826,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.3510891199111938
+833401,1,-1.6820789432542644,-1.520459031028347,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.0140403509140015
+833401,2,-1.0633116551680928,-3.9987964340017847,-4.132033527871388,,,,,,,,,,,,,1.0140403509140015
+833402,0,-1.0514831588785858,-0.8856113341279945,-0.7116979467082238,-0.37905084107887943,-0.9872865247143939,-1.5338087743376947,0.8495594445245161,0.3367128504442826,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-1.133646664653865,1.731703758239746
+833402,1,-2.835527993784926,-0.5404947701863974,-1.590035816431196,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.19112267045651915,1.807160496711731
+833402,2,-0.9649192100948284,-1.040469464149968,-1.521960123094279,,,,,,,,,,,,,1.807160496711731
+833601,0,0.7557057202659283,0.4950861768803317,0.5228621660905376,-0.08409336463203088,0.7727681057484966,0.457405498335207,1.1232521886503248,1.1804064093710083,-0.8863975124670236,1.5559295959968287,1.7977262128162,1.548461097626366,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.6535903215408325
+833601,1,0.048094632541727786,0.17220651042592966,0.14609054585137357,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.7243309020996094
+833601,2,-0.37456453965524245,-0.2619623668205428,0.18808796969072364,,,,,,,,,,,,,1.7243309020996094
+834501,0,0.07800989058673549,0.7252024287150527,0.3994061548106614,-1.1164445321960008,-0.9872865247143939,-1.5338087743376947,-0.61013519081313,-1.2904104417715454,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,3.104134732019544,-0.5234033465385437
+834501,1,-0.04802612166916067,0.3503818305790114,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.9218922853469849
+834501,2,-0.07938720443544948,-0.2619623668205428,0.8181056880851983,,,,,,,,,,,,,1.9218922853469849
+835202,0,0.9816043301589925,0.03485367321088963,0.6463181773704137,-0.9689657939725767,-0.2329773973731551,-0.1115128652856221,0.7583285298159133,-1.0493551392210523,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,1.267782866548965,-0.2910724881500066,0.20460009219036931,1.8506172895431519
+835202,1,0.4325776493852816,-0.18414412988023388,0.8609661067912552,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,2.0023252964019775
+835202,2,-0.5713494298017712,1.295051827838308,0.45809556328835566,,,,,,,,,,,,,2.0023252964019775
+835203,0,-0.03493941435979663,-0.42537883045855246,-0.4647859241484716,-0.9689657939725767,-0.2329773973731551,-0.1115128652856221,0.7583285298159133,-1.0493551392210523,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,-1.8119270229765592,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.0023252964019775
+835203,1,-0.6247506469344914,-0.18414412988023388,0.45246578625417994,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.059714660367144415,1.9737452268600464
+835203,2,-0.7681343199482997,1.6843053765030207,0.5480980944875663,,,,,,,,,,,,,1.9737452268600464
+835702,0,0.529807110372864,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.7415956520556326,-1.5338087743376947,-0.42767336139592416,-0.748036011032936,-0.22796431061858732,-0.835055314390411,-0.5613165400266386,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.5856728553771973
+835702,1,-0.8169921553562683,-0.9859330705691017,-1.1815354958941209,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.522819995880127
+835702,2,0.2157901307843435,-0.41766378628642786,-0.441929748703751,,,,,,,,,,,,,1.522819995880127
+837401,0,-1.3903310737181822,-0.770553208210634,-0.4647859241484716,-0.23157210285545515,-0.48441377315356804,0.7418646801456215,0.11971212685569313,0.2161851991690361,0.2658605907677399,0.36043714080320877,-0.9544903321671111,-0.13173296267509654,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,1.3704848289489746
+837401,1,-1.2975959264107106,-0.896845410492561,-0.6709100952227768,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,1.3922568559646606
+837401,2,-0.5713494298017712,-0.8847680446840831,-0.26192468630532967,,,,,,,,,,,,,1.3922568559646606
+837501,0,-1.3903310737181822,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,-0.35869558526336154,0.17294631652479245,-0.9750588496475414,-0.14539775465670343,0.10125229030563083,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-1.812216028287741,-1.388853942113607,-0.24148216009104212,-0.3416321575641632
+837501,1,-1.393716680621599,-1.0750207306456427,-1.1815354958941209,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.4419600012801827,0.23271861672401428
+837501,2,-2.047236105900736,-0.8069173349511406,-0.8019398735005937,,,,,,,,,,,,,0.23271861672401428
+837502,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-0.35869558526336154,0.17294631652479245,-0.9750588496475414,-0.14539775465670343,0.10125229030563083,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.3648323118686676
+837502,1,-0.7208714011453798,-1.3422837108752652,-1.590035816431196,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,0.752189040184021
+837502,2,-0.7681343199482997,0.04944047211122737,-0.6219348111021723,,,,,,,,,,,,,0.752189040184021
+837503,0,-1.3903310737181822,-0.3103207045411919,-0.3413299128685955,-1.4114020086428494,-0.35869558526336154,0.17294631652479245,-0.9750588496475414,-0.14539775465670343,0.10125229030563083,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.24148216009104212,0.8735378980636597
+837503,1,-1.2975959264107106,-0.3623194500333156,-0.9772853356255832,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,0.42754459381103516
+837503,2,-0.27617209458197817,0.04944047211122737,-1.0719474670982256,,,,,,,,,,,,,0.42754459381103516
+837504,0,-1.3903310737181822,-1.230785711880076,-1.0820659805478523,-1.4114020086428494,-0.35869558526336154,0.17294631652479245,-0.9750588496475414,-0.14539775465670343,0.10125229030563083,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-1.812216028287741,0.806708965813594,-0.4645232862317478,0.42754459381103516
+837504,1,-0.6247506469344914,-1.6986343511814288,-1.8964110568340025,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.4419600012801827,0.5518285036087036
+837504,2,-2.2440209960472646,-1.1961708836158533,-1.521960123094279,,,,,,,,,,,,,0.5518285036087036
+837702,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.674008317525728,-1.4901592762752198,-1.8182679561481092,-1.9785989114421731,-2.2546316519735177,-1.3802224138533508,-2.030547769584031,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.021496057510376
+837702,1,-1.2975959264107106,-0.6295824302629383,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.5613893220144716,-0.1895303875207901
+837702,2,-1.8504512157542075,0.1272911818441699,-0.5319322799029617,,,,,,,,,,,,,-0.1895303875207901
+838701,0,0.529807110372864,-1.1157275859627156,-0.9586099692679761,-0.9689657939725767,-0.7358501489339809,-0.3959720470960366,-0.61013519081313,-1.3506742674091685,-1.0510058129291326,0.36043714080320877,1.4045524206757267,-0.9718299928258278,0.49778314283978853,0.806708965813594,0.8737234706124865,0.38975751399993896
+838701,1,-0.8169921553562683,-0.2732317899567748,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,0.6877025961875916
+838701,2,-0.9649192100948284,0.5165447305088826,0.18808796969072364,,,,,,,,,,,,,0.6877025961875916
+838902,0,-1.27738176877165,0.03485367321088963,-0.3413299128685955,-0.37905084107887943,-0.48441377315356804,-1.5338087743376947,0.6670976151073104,0.4572405017195292,-1.2156141133912417,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-1.812216028287741,-0.2910724881500066,-1.133646664653865,1.7672069072723389
+838902,1,0.6248191578070585,-0.6295824302629383,-0.36453485481997044,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.3139013144854623,1.6882779598236084
+838902,2,0.2157901307843435,-1.1961708836158533,0.45809556328835566,,,,,,,,,,,,,1.6882779598236084
+839103,0,-2.068026903397375,-0.770553208210634,-0.8351539579881,0.358342850038242,0.39561354207787724,-0.3959720470960366,0.8495594445245161,1.120142583733385,-0.7217892120049145,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-0.9106055385131593,1.402454137802124
+839103,1,-1.9704412058869298,-1.7877220112579697,-1.7942859766997337,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.3139013144854623,1.7210513353347778
+839103,2,-0.6697418748750354,-1.741125851746451,-1.251952529496647,,,,,,,,,,,,,1.7210513353347778
+839304,0,0.6427564153193962,0.3800280509629712,-0.09441789030884316,-1.1164445321960008,-0.7358501489339809,-1.2493495925272802,0.3021739562728989,0.15592137353141286,-1.0510058129291326,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,-2.5822157519969178,-1.388853942113607,-1.133646664653865,1.4967767000198364
+839304,1,0.6248191578070585,-0.18414412988023388,0.14609054585137357,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.059714660367144415,1.480457067489624
+839304,2,0.9045372462971938,0.5165447305088826,-0.441929748703751,,,,,,,,,,,,,1.480457067489624
+839501,0,1.207502940052057,-0.3103207045411919,1.1401422224899183,1.0957365411553635,0.5213317299680837,0.17294631652479245,0.5758667003987075,-0.8685636623081825,1.5827269944646125,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,1.267782866548965,0.806708965813594,-0.9106055385131593,2.225468873977661
+839501,1,0.33645689517439314,0.08311885034938876,0.7588410266569864,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,2.3939902782440186
+839501,2,0.2157901307843435,0.7500968597077102,0.9981107504836196,,,,,,,,,,,,,2.3939902782440186
+839502,0,0.4168578054263319,-0.1952625786238314,0.029038120971032973,1.0957365411553635,0.5213317299680837,0.17294631652479245,0.5758667003987075,-0.8685636623081825,1.5827269944646125,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,2.3939902782440186
+839502,1,0.6248191578070585,-0.896845410492561,0.45246578625417994,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-1.3139013144854623,2.4089431762695312
+839502,2,1.0029296913704582,0.6722461499747677,0.45809556328835566,,,,,,,,,,,,,2.4089431762695312
+839801,0,-0.9385338539320537,-0.42537883045855246,-0.5882419354283478,-1.1164445321960008,0.018458978407257843,-0.6804312289064511,-0.8838279349389385,-0.20566158029432668,-0.5571809115428055,-0.835055314390411,-1.3476641243075844,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.6875644123724536,1.4451113939285278
+839801,1,0.9131814204397238,0.6176448108086341,1.7800918279996742,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.7448049783706665
+839801,2,-0.7681343199482997,0.1272911818441699,0.008082907292302316,,,,,,,,,,,,,1.7448049783706665
+840501,0,0.6427564153193962,-0.3103207045411919,-0.5882419354283478,-1.2639232704194252,-1.9930320278360456,-1.5338087743376947,-1.24875159377335,-2.314895477611141,-1.2156141133912417,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,-0.6929159164428711
+840501,1,0.4325776493852816,0.08311885034938876,-0.7730351753570456,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,0.1780426800251007
+840501,2,-0.5713494298017712,-0.573365205752313,-0.441929748703751,,,,,,,,,,,,,0.1780426800251007
+841601,0,-0.14788871930632877,0.8402605546324132,0.3994061548106614,0.2108641118148177,-0.2329773973731551,-0.1115128652856221,-0.2452115319787184,0.2764490248066594,0.10125229030563083,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,-0.2910724881500066,-0.018441033950336395,2.3393518924713135
+841601,1,0.048094632541727786,-0.00596880972715211,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.6696367263793945
+841601,2,-0.5713494298017712,0.36084331104299755,0.5480980944875663,,,,,,,,,,,,,2.6696367263793945
+842201,0,-0.2608380242528609,-1.000669460045355,-0.8351539579881,0.6533003264850905,-0.2329773973731551,0.7418646801456215,-0.06274970256151263,-0.5069807084824429,0.430468891229849,-0.23730908679360116,-1.3476641243075844,-1.8119270229765592,-1.812216028287741,-1.388853942113607,-1.133646664653865,1.565287709236145
+842201,1,-1.1053544179889336,0.2612941705024705,-0.568785015088508,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,1.492652416229248
+842201,2,-0.4729569847285068,-0.2619623668205428,-0.17192215510611902,,,,,,,,,,,,,1.492652416229248
+847302,0,-0.9385338539320537,-0.5404369563759129,-0.8351539579881,-0.23157210285545515,0.2698953541876708,-0.6804312289064511,-0.1539806172701155,-1.8327848725101548,-0.3925726110806964,-0.835055314390411,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,2.3900279998779297
+847302,1,0.6248191578070585,-1.6986343511814288,-1.1815354958941209,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,1.1466591358184814
+847302,2,0.31418257585760784,-1.5075737225476233,-0.7119373423013831,,,,,,,,,,,,,1.1466591358184814
+847702,0,-0.7126352440389895,0.9553186805497738,-0.09441789030884316,-1.2639232704194252,-1.3644410883850133,-0.9648904107168657,-0.42767336139592416,0.2161851991690361,-1.2156141133912417,-0.23730908679360116,1.4045524206757267,-0.5517814777504622,-1.812216028287741,1.9044904197771946,-0.24148216009104212,2.868598222732544
+847702,1,-0.528629892723603,-0.09505646980369299,1.1673413471940615,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,1.945996880531311
+847702,2,-0.37456453965524245,0.1272911818441699,-0.08191962390690835,,,,,,,,,,,,,1.945996880531311
+848002,0,-1.164432463825118,-0.3103207045411919,-3.0573621610258708,-0.8214870557491524,-1.7415956520556326,-0.9648904107168657,-1.24875159377335,-0.38645305720719647,-0.5571809115428055,-0.23730908679360116,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-1.3566877907945707,1.0868301391601562
+848002,1,-0.33638838430182605,-0.09505646980369299,1.0652162670597927,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.4419600012801827,1.0918900966644287
+848002,2,0.2157901307843435,0.36084331104299755,-0.08191962390690835,,,,,,,,,,,,,1.0918900966644287
+848202,0,-0.48673663414592516,-0.08020445270647089,0.2759501435307853,-0.8214870557491524,-0.7358501489339809,-0.9648904107168657,-0.1539806172701155,0.15592137353141286,-1.0510058129291326,-0.23730908679360116,-0.9544903321671111,-0.9718299928258278,0.49778314283978853,0.806708965813594,-0.4645232862317478,1.4882373809814453
+848202,1,0.52869840359617,-0.00596880972715211,1.4737165875968679,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,1.5029147863388062
+848202,2,1.593284361810044,-0.6512159154852555,0.368093032089145,,,,,,,,,,,,,1.5029147863388062
+848401,0,-0.48673663414592516,-0.8856113341279945,-0.7116979467082238,0.358342850038242,0.1441771662974643,-0.1115128652856221,-0.8838279349389385,-0.8685636623081825,1.2535103935403944,-0.835055314390411,0.6182048363947807,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.326094627380371
+848401,1,-0.24026763009093757,-0.2732317899567748,-0.26240977468570165,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.769005537033081
+848401,2,-0.7681343199482997,-0.028410237621715174,0.7281031568859877,,,,,,,,,,,,,1.769005537033081
+848402,0,-1.7291789885577786,-1.000669460045355,-0.8351539579881,0.358342850038242,0.1441771662974643,-0.1115128652856221,-0.8838279349389385,-0.8685636623081825,1.2535103935403944,-0.835055314390411,0.6182048363947807,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.1296610832214355
+848402,1,-0.33638838430182605,-0.6295824302629383,-1.2836605760283897,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,2.3137216567993164
+848402,2,-0.27617209458197817,-0.729066625218198,-0.441929748703751,,,,,,,,,,,,,2.3137216567993164
+849403,0,-0.2608380242528609,-0.3103207045411919,-0.3413299128685955,-0.9689657939725767,-0.6101319610437744,-0.9648904107168657,-0.61013519081313,-0.024870103381456905,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,1.267782866548965,-1.388853942113607,0.20460009219036931,0.5960701704025269
+849403,1,0.2403361409635047,-0.4514071101098565,0.14609054585137357,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,0.022437866777181625
+849403,2,-0.1777796495087138,-0.4955144960193704,0.18808796969072364,,,,,,,,,,,,,0.022437866777181625
+850302,0,0.19095919553326762,-1.230785711880076,-1.0820659805478523,-0.9689657939725767,-1.4901592762752198,-2.102727137958524,-1.4312134231905558,-2.134104000698271,-0.22796431061858732,-0.835055314390411,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,-0.395932674407959
+850302,1,-2.0665619600978182,-0.9859330705691017,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,0.16403116285800934
+850302,2,-0.6697418748750354,-0.41766378628642786,-1.251952529496647,,,,,,,,,,,,,0.16403116285800934
+853202,0,-0.9385338539320537,-1.1157275859627156,-0.9586099692679761,-0.674008317525728,-1.4901592762752198,-0.6804312289064511,-1.4312134231905558,0.2161851991690361,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,1.8348360061645508
+853202,1,-0.33638838430182605,-1.1641083907221836,-0.8751602554913144,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.3139013144854623,1.9098578691482544
+853202,2,-0.4729569847285068,-0.41766378628642786,0.008082907292302316,,,,,,,,,,,,,1.9098578691482544
+853203,0,0.529807110372864,0.03485367321088963,0.029038120971032973,-0.674008317525728,-1.4901592762752198,-0.6804312289064511,-1.4312134231905558,0.2161851991690361,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,0.28831555240026907,1.267782866548965,-1.388853942113607,-1.3566877907945707,1.601650595664978
+853203,1,0.7209399120179469,0.2612941705024705,0.45246578625417994,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,2.1712863445281982
+853203,2,-0.07938720443544948,0.282992601310055,0.008082907292302316,,,,,,,,,,,,,2.1712863445281982
+854003,0,0.529807110372864,0.4950861768803317,-0.3413299128685955,-0.08409336463203088,-0.6101319610437744,-0.6804312289064511,0.4846357856901046,0.035393722256166354,-0.06335601015647824,0.36043714080320877,1.4045524206757267,0.7083640674756347,1.267782866548965,-0.2910724881500066,1.9889291013160153,1.148128628730774
+854003,1,0.2403361409635047,0.17220651042592966,0.8609661067912552,,,,,,,,,,-0.47569662927593015,0.7456311526478686,0.4419600012801827,1.310645580291748
+854003,2,0.019005240637814846,-0.33981307655348536,0.09808543849151298,,,,,,,,,,,,,1.310645580291748
+854902,0,1.4334015499451211,2.2209580656407395,2.3747023352886796,-0.5265295793023037,1.2756408573093225,1.3107830437664505,0.6670976151073104,-0.4467168828448197,0.430468891229849,1.5559295959968287,-0.16814274788616518,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.24148216009104212,2.022714614868164
+854902,1,0.2403361409635047,1.6866967317271246,1.6779667478654055,,,,,,,,,,-1.1887333502953,0.7456311526478686,1.1944719937511734,2.044905662536621
+854902,2,0.8061448012239295,1.2172011181053655,0.908108219284409,,,,,,,,,,,,,2.044905662536621
+856101,0,-0.03493941435979663,0.4950861768803317,0.5228621660905376,-1.2639232704194252,-0.7358501489339809,-0.3959720470960366,-0.33644244668732126,-0.26592540593194997,-0.8863975124670236,0.9581833684000187,1.0113786285352542,-0.5517814777504622,-2.5822157519969178,-1.388853942113607,-0.24148216009104212,0.8063206672668457
+856101,1,-0.33638838430182605,1.330346091420961,-0.05815961441716403,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.113524079322815
+856101,2,-0.7681343199482997,1.2172011181053655,-1.0719474670982256,,,,,,,,,,,,,1.113524079322815
+857001,0,0.9816043301589925,-0.08020445270647089,-0.5882419354283478,-0.8214870557491524,-1.9930320278360456,-2.102727137958524,-1.7961370820249674,-1.712257221234908,-0.5571809115428055,-1.432801541987221,-0.5613165400266386,0.7083640674756347,-0.27221658086938805,-1.388853942113607,0.6506823444717807,1.6527677774429321
+857001,1,-0.6247506469344914,-0.18414412988023388,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.3139013144854623,1.2153352499008179
+857001,2,0.019005240637814846,-0.33981307655348536,0.18808796969072364,,,,,,,,,,,,,1.2153352499008179
+857003,0,-0.48673663414592516,-0.5404369563759129,-0.4647859241484716,-0.8214870557491524,-1.9930320278360456,-2.102727137958524,-1.7961370820249674,-1.712257221234908,-0.5571809115428055,-1.432801541987221,-0.5613165400266386,0.7083640674756347,-1.812216028287741,-1.388853942113607,-0.24148216009104212,1.2153352499008179
+857003,1,-1.4898374348324874,-0.896845410492561,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.0943048000335693
+857003,2,-0.9649192100948284,-1.040469464149968,-1.521960123094279,,,,,,,,,,,,,1.0943048000335693
+857903,0,0.8686550252124604,0.4950861768803317,0.029038120971032973,-1.1164445321960008,-1.4901592762752198,-2.102727137958524,-2.3435225702765847,-1.8327848725101548,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-1.3566877907945707,1.1419421434402466
+857903,1,0.52869840359617,-0.7186700903394792,-0.16028469455143282,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.3139013144854623,0.8615133762359619
+857903,2,-0.07938720443544948,-0.18411165708760024,-0.26192468630532967,,,,,,,,,,,,,0.8615133762359619
+857904,0,-1.0514831588785858,1.4155511842192159,1.3870542450496706,-1.1164445321960008,-1.4901592762752198,-2.102727137958524,-2.3435225702765847,-1.8327848725101548,-0.8863975124670236,-0.835055314390411,-1.3476641243075844,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,-1.133646664653865,-0.10603423416614532
+857904,1,0.33645689517439314,1.419433751497502,1.2694664273283303,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,-0.6931471824645996
+857904,2,0.6093599110774008,0.43869402077594005,1.988138593674937,,,,,,,,,,,,,-0.6931471824645996
+862202,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-0.9872865247143939,-1.2493495925272802,1.3969449327761334,-1.3506742674091685,-0.7217892120049145,1.5559295959968287,0.22503104425430823,-0.9718299928258278,1.267782866548965,-0.2910724881500066,-0.9106055385131593,0.5672407746315002
+862202,1,0.7209399120179469,-0.00596880972715211,0.8609661067912552,,,,,,,,,,0.9503768127628092,-0.3229291202479022,0.4419600012801827,0.2842644155025482
+862202,2,0.41257502093087217,0.8279475694406527,-0.441929748703751,,,,,,,,,,,,,0.2842644155025482
+863102,0,-0.8255845489855216,-0.8856113341279945,-0.5882419354283478,-1.4114020086428494,-2.2444684036164584,-2.3871863197689382,-2.1610607408593787,-1.8327848725101548,-1.2156141133912417,-0.23730908679360116,-0.5613165400266386,-1.8119270229765592,0.49778314283978853,0.806708965813594,-1.133646664653865,0.8933416604995728
+863102,1,-1.201475172199822,-1.7877220112579697,-1.8964110568340025,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-1.0630639836617988,1.7954797744750977
+863102,2,-1.161704100241357,-2.0525286906782214,-1.8819702478911218,,,,,,,,,,,,,1.7954797744750977
+863403,0,-1.3903310737181822,-0.8856113341279945,-0.5882419354283478,-1.1164445321960008,-0.8615683368241874,0.7418646801456215,1.1232521886503248,1.3009340606462547,-0.7217892120049145,0.9581833684000187,-0.16814274788616518,0.28831555240026907,0.49778314283978853,0.806708965813594,-1.133646664653865,0.5119994282722473
+863403,1,-0.9131129095671567,0.08311885034938876,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,0.4533287584781647
+863403,2,-0.6697418748750354,-0.10626094735465771,-1.6119626542934897,,,,,,,,,,,,,0.4533287584781647
+863405,0,-0.7126352440389895,-0.770553208210634,-0.7116979467082238,-1.1164445321960008,-0.8615683368241874,0.7418646801456215,1.1232521886503248,1.3009340606462547,-0.7217892120049145,0.9581833684000187,-0.16814274788616518,0.28831555240026907,-1.0422163045785646,-0.2910724881500066,-1.3566877907945707,1.018851399421692
+863405,1,0.7209399120179469,-0.7186700903394792,-0.6709100952227768,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-1.0630639836617988,1.1350666284561157
+863405,2,0.7077523561506651,-1.1961708836158533,-0.8019398735005937,,,,,,,,,,,,,1.1350666284561157
+864202,0,0.07800989058673549,-0.3103207045411919,-0.7116979467082238,-0.674008317525728,-1.4901592762752198,-2.3871863197689382,-0.1539806172701155,0.2161851991690361,0.10125229030563083,-1.432801541987221,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-1.133646664653865,0.7603731751441956
+864202,1,-0.4325091385127145,-0.5404947701863974,-1.079410415759852,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,0.6913803815841675
+864202,2,0.11739768571107917,-1.5075737225476233,-1.4319575918950684,,,,,,,,,,,,,0.6913803815841675
+864802,0,0.19095919553326762,-0.42537883045855246,-0.3413299128685955,-0.08409336463203088,-1.7415956520556326,-0.3959720470960366,0.11971212685569313,0.09565754789378961,-0.06335601015647824,-0.23730908679360116,-0.5613165400266386,-1.8119270229765592,1.267782866548965,0.806708965813594,-1.3566877907945707,1.9990390539169312
+864802,1,0.52869840359617,-1.2531960507987243,-1.2836605760283897,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.286637306213379
+864802,2,0.8061448012239295,-0.6512159154852555,-0.26192468630532967,,,,,,,,,,,,,2.286637306213379
+865801,0,-0.2608380242528609,-0.08020445270647089,-0.2178739015887193,-0.37905084107887943,-0.35869558526336154,-0.6804312289064511,1.3969449327761334,0.2161851991690361,-0.3925726110806964,-0.835055314390411,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,0.806708965813594,-0.4645232862317478,2.14208722114563
+865801,1,-2.3549242227304834,0.5285571507320932,-0.36453485481997044,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.157371759414673
+865801,2,-0.6697418748750354,-0.028410237621715174,-0.7119373423013831,,,,,,,,,,,,,2.157371759414673
+866206,0,-1.7291789885577786,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.867313839945839,-1.8182679561481092,0.6670976151073104,0.15592137353141286,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,0.49778314283978853,-1.388853942113607,-0.24148216009104212,-0.12683576345443726
+866206,1,-1.9704412058869298,-0.4514071101098565,-0.9772853356255832,,,,,,,,,,1.663413533782179,-0.3229291202479022,-1.0630639836617988,0.3354036211967468
+866206,2,-2.047236105900736,-0.8069173349511406,-2.151977841488754,,,,,,,,,,,,,0.3354036211967468
+869602,0,-0.5996859390924573,-0.3103207045411919,0.029038120971032973,-0.674008317525728,-0.7358501489339809,-0.6804312289064511,-0.518904276104527,-1.8327848725101548,-0.5571809115428055,0.9581833684000187,1.7977262128162,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,3.104134732019544,0.7335761785507202
+869602,1,-0.528629892723603,-0.4514071101098565,0.35034070611991114,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,1.12765634059906
+869602,2,-0.8665267650215641,-0.4955144960193704,-0.981944935899015,,,,,,,,,,,,,1.12765634059906
+869701,0,-1.27738176877165,-0.42537883045855246,0.029038120971032973,-0.9689657939725767,-0.2329773973731551,-0.9648904107168657,-0.1539806172701155,-2.0135763494230243,-0.5571809115428055,-0.835055314390411,1.7977262128162,-0.5517814777504622,0.49778314283978853,0.806708965813594,0.8737234706124865,1.3458973169326782
+869701,1,-0.9131129095671567,-1.6986343511814288,-1.1815354958941209,,,,,,,,,,1.663413533782179,0.7456311526478686,-1.0630639836617988,1.848672866821289
+869701,2,-1.2600965453146213,-1.585424432280566,-1.521960123094279,,,,,,,,,,,,,1.848672866821289
+870503,0,0.19095919553326762,-1.1157275859627156,-0.9586099692679761,-0.5265295793023037,-0.6101319610437744,-1.2493495925272802,1.0320212739417218,-0.38645305720719647,-1.3802224138533508,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-2.5822157519969178,-1.388853942113607,-1.133646664653865,0.13007454574108124
+870503,1,-1.2975959264107106,-0.18414412988023388,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,-0.6931471824645996
+870503,2,-1.0633116551680928,-0.573365205752313,-0.35192721750454037,,,,,,,,,,,,,-0.6931471824645996
+870803,0,1.0945536351055247,0.9553186805497738,0.5228621660905376,-1.1164445321960008,-1.4901592762752198,-0.9648904107168657,-0.518904276104527,-1.1096189648586756,-1.3802224138533508,-1.432801541987221,-1.740837916448057,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.6754510402679443
+870803,1,1.6821474541268315,0.8849077910382567,0.04396546571710477,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.1084463596343994
+870803,2,1.6916768068833083,0.43869402077594005,0.2780905008899343,,,,,,,,,,,,,2.1084463596343994
+885301,0,-0.2608380242528609,0.8402605546324132,0.6463181773704137,0.06338537359139342,-0.48441377315356804,-0.9648904107168657,-0.1539806172701155,-0.024870103381456905,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,-1.0422163045785646,-1.388853942113607,-1.133646664653865,1.3729783296585083
+885301,1,0.048094632541727786,0.3503818305790114,-0.16028469455143282,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,1.3363447189331055
+885301,2,0.2157901307843435,2.384961764099504,-2.5119879662855964,,,,,,,,,,,,,1.3363447189331055
+886701,0,-0.5996859390924573,0.7252024287150527,-0.2178739015887193,-0.5265295793023037,-1.615877464165426,-0.9648904107168657,-0.9750588496475414,-0.4467168828448197,-0.8863975124670236,-2.030547769584031,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-1.133646664653865,0.4474456310272217
+886701,1,0.14421538675261625,-0.4514071101098565,-0.36453485481997044,,,,,,,,,,0.2373400917434395,2.88275169843941,-1.3139013144854623,0.7396634817123413
+886701,2,-0.8665267650215641,-1.040469464149968,-0.08191962390690835,,,,,,,,,,,,,0.7396634817123413
+886702,0,-1.3903310737181822,-0.5404369563759129,-0.7116979467082238,-0.5265295793023037,-1.615877464165426,-0.9648904107168657,-0.9750588496475414,-0.4467168828448197,-0.8863975124670236,-2.030547769584031,-0.9544903321671111,-1.8119270229765592,-0.27221658086938805,-0.2910724881500066,-1.3566877907945707,0.7396634817123413
+886702,1,-0.7208714011453798,-0.3623194500333156,0.35034070611991114,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.310551991190808,0.6211280226707458
+886702,2,-0.37456453965524245,-0.8069173349511406,-0.441929748703751,,,,,,,,,,,,,0.6211280226707458
+887801,0,1.0945536351055247,0.6101443027976923,0.3994061548106614,-0.37905084107887943,-1.615877464165426,-0.3959720470960366,-0.61013519081313,-0.3261892315695732,0.10125229030563083,0.36043714080320877,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.2362797260284424
+887801,1,0.52869840359617,0.7958201309617158,0.8609661067912552,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,2.04902720451355
+887801,2,0.5109674660041365,0.9836489889065378,1.448123406479673,,,,,,,,,,,,,2.04902720451355
+888902,0,0.19095919553326762,1.0703768064671344,-0.2178739015887193,-0.5265295793023037,0.5213317299680837,-0.1115128652856221,0.3021739562728989,0.09565754789378961,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,1.8396975994110107
+888902,1,-0.14414687588004912,-0.3623194500333156,-1.3857856561626585,,,,,,,,,,-1.1887333502953,-0.3229291202479022,0.6927973321038463,1.6456503868103027
+888902,2,-0.27617209458197817,1.2172011181053655,1.2681183440812516,,,,,,,,,,,,,1.6456503868103027
+890401,0,0.529807110372864,0.2649699250456107,-0.3413299128685955,0.6533003264850905,-0.48441377315356804,0.457405498335207,-1.6136752526077616,0.5777681529947757,0.430468891229849,-0.835055314390411,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.9095518589019775
+890401,1,0.33645689517439314,-0.4514071101098565,0.04396546571710477,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.310551991190808,2.0273759365081787
+890401,2,0.2157901307843435,-0.6512159154852555,0.368093032089145,,,,,,,,,,,,,2.0273759365081787
+890901,0,-0.14788871930632877,-0.5404369563759129,-0.4647859241484716,-0.37905084107887943,-0.8615683368241874,-0.9648904107168657,0.210943041564296,0.09565754789378961,-0.3925726110806964,0.36043714080320877,0.22503104425430823,1.1284125825510003,-1.0422163045785646,0.806708965813594,0.8737234706124865,0.04198045656085014
+890901,1,1.0093021746506123,0.08311885034938876,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,2.197821317045828,0.07061395049095154
+890901,2,1.1013221364437225,-0.028410237621715174,0.638100625686777,,,,,,,,,,,,,0.07061395049095154
+890902,0,1.9981480746777818,0.14991179912825014,1.5105102563295467,-0.37905084107887943,-0.8615683368241874,-0.9648904107168657,0.210943041564296,0.09565754789378961,-0.3925726110806964,0.36043714080320877,0.22503104425430823,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,1.7658879751753094,0.07061395049095154
+890902,1,-0.04802612166916067,0.3503818305790114,0.6567159465227176,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,1.5868988037109375
+890902,2,-0.27617209458197817,-0.4955144960193704,0.09808543849151298,,,,,,,,,,,,,1.5868988037109375
+892602,0,-0.8255845489855216,-0.770553208210634,-0.8351539579881,-1.1164445321960008,0.2698953541876708,0.457405498335207,-0.8838279349389385,-0.20566158029432668,-0.8863975124670236,0.36043714080320877,0.22503104425430823,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.9227645397186279
+892602,1,-1.2975959264107106,-1.609546691104888,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,1.0860345363616943
+892602,2,-1.3584889903878858,-1.6632751420135086,-1.791967716691911,,,,,,,,,,,,,1.0860345363616943
+893201,0,0.3039085004797998,0.9553186805497738,-0.5882419354283478,-1.1164445321960008,-0.48441377315356804,-0.3959720470960366,0.6670976151073104,-1.5917295699596616,-1.2156141133912417,-0.835055314390411,0.6182048363947807,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,1.58408522605896
+893201,1,0.4325776493852816,0.17220651042592966,0.8609661067912552,,,,,,,,,,-0.47569662927593015,1.8141914255436393,0.19112267045651915,1.5905905961990356
+893201,2,-0.1777796495087138,-0.2619623668205428,-0.17192215510611902,,,,,,,,,,,,,1.5905905961990356
+893801,0,-0.7126352440389895,-1.1157275859627156,-0.9586099692679761,-0.674008317525728,-1.2387229004948068,-0.9648904107168657,-0.61013519081313,-1.4109380930467919,-1.0510058129291326,0.36043714080320877,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,3.104134732019544,1.897551417350769
+893801,1,-1.1053544179889336,-1.431371370951806,-1.2836605760283897,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.19112267045651915,1.9718661308288574
+893801,2,0.2157901307843435,-1.040469464149968,-1.1619499982974364,,,,,,,,,,,,,1.9718661308288574
+894201,0,-0.2608380242528609,0.14991179912825014,-0.09441789030884316,-0.08409336463203088,0.1441771662974643,0.457405498335207,1.1232521886503248,-0.9288274879458058,0.2658605907677399,1.5559295959968287,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.8737234706124865,1.6261838674545288
+894201,1,-0.8169921553562683,-0.2732317899567748,-0.16028469455143282,,,,,,,,,,0.9503768127628092,2.88275169843941,-0.310551991190808,1.5347334146499634
+894201,2,-0.5713494298017712,0.43869402077594005,0.18808796969072364,,,,,,,,,,,,,1.5347334146499634
+894202,0,-0.37378732919939306,-1.230785711880076,-1.0820659805478523,-0.08409336463203088,0.1441771662974643,0.457405498335207,1.1232521886503248,-0.9288274879458058,0.2658605907677399,1.5559295959968287,-0.16814274788616518,0.28831555240026907,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.7443128824234009
+894202,1,1.1054229288615007,-0.3623194500333156,0.04396546571710477,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,1.7414125204086304
+894202,2,1.1997145815169867,0.1272911818441699,0.2780905008899343,,,,,,,,,,,,,1.7414125204086304
+894403,0,-0.2608380242528609,0.7252024287150527,-0.4647859241484716,-0.9689657939725767,0.1441771662974643,-1.2493495925272802,-0.7013661055217327,0.09565754789378961,-0.06335601015647824,1.5559295959968287,-0.9544903321671111,-1.3918785079011935,-0.27221658086938805,0.806708965813594,-1.3566877907945707,2.0619263648986816
+894403,1,-0.04802612166916067,0.5285571507320932,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,1.8665237426757812
+894403,2,0.31418257585760784,-0.18411165708760024,0.09808543849151298,,,,,,,,,,,,,1.8665237426757812
+894601,0,-0.7126352440389895,0.4950861768803317,0.2759501435307853,1.2432152793787876,-0.48441377315356804,0.457405498335207,0.6670976151073104,0.5777681529947757,0.7596854921540671,-0.23730908679360116,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,0.7819690704345703
+894601,1,-0.7208714011453798,-0.00596880972715211,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,0.7152848243713379
+894601,2,-0.37456453965524245,0.6722461499747677,-0.441929748703751,,,,,,,,,,,,,0.7152848243713379
+894803,0,-1.0514831588785858,-1.1157275859627156,-0.9586099692679761,-0.8214870557491524,-2.118750215726252,-0.9648904107168657,-1.24875159377335,-1.1698827904962987,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-1.3566877907945707,0.5336511135101318
+894803,1,-0.4325091385127145,-1.2531960507987243,-1.3857856561626585,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.3139013144854623,0.5030383467674255
+894803,2,-0.9649192100948284,-0.729066625218198,-0.6219348111021723,,,,,,,,,,,,,0.5030383467674255
+895301,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-0.9872865247143939,-1.2493495925272802,-2.1610607408593787,-1.9533125237854012,-0.06335601015647824,0.9581833684000187,0.22503104425430823,-1.3918785079011935,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.8857914209365845
+895301,1,-0.24026763009093757,-0.6295824302629383,0.45246578625417994,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.310551991190808,2.0037927627563477
+895301,2,-1.0633116551680928,0.43869402077594005,0.008082907292302316,,,,,,,,,,,,,2.0037927627563477
+896202,0,-0.37378732919939306,-0.6554950822932735,-0.3413299128685955,-0.08409336463203088,-0.48441377315356804,0.457405498335207,0.6670976151073104,0.2161851991690361,-0.5571809115428055,0.9581833684000187,1.0113786285352542,0.7083640674756347,0.49778314283978853,1.9044904197771946,-0.4645232862317478,2.0590553283691406
+896202,1,0.33645689517439314,-0.7186700903394792,-0.568785015088508,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.7919895648956299
+896202,2,-0.27617209458197817,-0.729066625218198,-0.5319322799029617,,,,,,,,,,,,,1.7919895648956299
+896203,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-0.08409336463203088,-0.48441377315356804,0.457405498335207,0.6670976151073104,0.2161851991690361,-0.5571809115428055,0.9581833684000187,1.0113786285352542,0.7083640674756347,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.8890836238861084
+896203,1,0.048094632541727786,-0.2732317899567748,-1.079410415759852,,,,,,,,,,0.9503768127628092,-1.3914893931436731,0.4419600012801827,2.0335779190063477
+896203,2,1.1997145815169867,-0.2619623668205428,0.18808796969072364,,,,,,,,,,,,,2.0335779190063477
+899602,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-0.7358501489339809,0.17294631652479245,-1.339982508481953,-1.5917295699596616,-0.5571809115428055,0.9581833684000187,-0.5613165400266386,-1.3918785079011935,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,2.394554376602173
+899602,1,-0.04802612166916067,-0.18414412988023388,-0.7730351753570456,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.5016679763793945
+899602,2,-0.27617209458197817,0.36084331104299755,-0.8919424046998043,,,,,,,,,,,,,2.5016679763793945
+901901,0,0.4168578054263319,-0.42537883045855246,0.3994061548106614,0.2108641118148177,0.6470499178582901,0.7418646801456215,-1.7049061673163644,-0.6877721853953127,0.7596854921540671,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,1.267782866548965,3.002271873740795,0.8737234706124865,0.5839208960533142
+901901,1,0.14421538675261625,-0.3623194500333156,0.24821562598564237,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.310551991190808,0.6490850448608398
+901901,2,-0.4729569847285068,-0.10626094735465771,0.18808796969072364,,,,,,,,,,,,,0.6490850448608398
+901902,0,0.529807110372864,-0.3103207045411919,-0.2178739015887193,0.2108641118148177,0.6470499178582901,0.7418646801456215,-1.7049061673163644,-0.6877721853953127,0.7596854921540671,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,0.49778314283978853,1.9044904197771946,-0.24148216009104212,0.6490850448608398
+901902,1,0.2403361409635047,-0.896845410492561,-1.2836605760283897,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,0.6019249558448792
+901902,2,0.019005240637814846,-0.8847680446840831,-0.17192215510611902,,,,,,,,,,,,,0.6019249558448792
+903302,0,-0.7126352440389895,-1.3458438377974367,-1.2055219918277285,-1.1164445321960008,-1.615877464165426,-1.2493495925272802,-0.7925970202303356,-2.435423128886387,-1.2156141133912417,-2.030547769584031,1.7977262128162,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,0.42764121833107505,2.383884906768799
+903302,1,-0.6247506469344914,-1.6986343511814288,-0.9772853356255832,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.9055811166763306
+903302,2,-1.0633116551680928,-1.585424432280566,-1.7019651854927003,,,,,,,,,,,,,1.9055811166763306
+903703,0,-1.7291789885577786,-1.000669460045355,-0.8351539579881,-0.8214870557491524,-1.2387229004948068,-1.2493495925272802,-0.33644244668732126,-0.38645305720719647,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,0.41180187463760376
+903703,1,-1.7781996974651528,-1.3422837108752652,-0.8751602554913144,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,0.39685460925102234
+903703,2,-0.9649192100948284,-0.6512159154852555,0.2780905008899343,,,,,,,,,,,,,0.39685460925102234
+904002,0,0.529807110372864,-0.42537883045855246,-0.09441789030884316,-0.9689657939725767,-2.4959047793968714,-1.2493495925272802,-1.6136752526077616,-0.3261892315695732,-1.2156141133912417,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,1.9044904197771946,-1.133646664653865,1.4621953964233398
+904002,1,0.048094632541727786,1.2412584313444202,0.45246578625417994,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,1.4181597232818604
+904002,2,-0.1777796495087138,0.7500968597077102,0.368093032089145,,,,,,,,,,,,,1.4181597232818604
+904502,0,0.7557057202659283,0.14991179912825014,0.5228621660905376,-0.23157210285545515,-0.6101319610437744,0.17294631652479245,1.3969449327761334,0.9996149324581385,0.7596854921540671,-0.23730908679360116,-0.5613165400266386,-0.13173296267509654,-0.27221658086938805,0.806708965813594,-0.4645232862317478,0.8563500642776489
+904502,1,0.2403361409635047,0.7067324708851749,1.371591507462599,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.5613893220144716,0.25935599207878113
+904502,2,0.11739768571107917,1.450753247304193,0.908108219284409,,,,,,,,,,,,,0.25935599207878113
+908101,0,0.19095919553326762,0.7252024287150527,1.016686211210042,-0.674008317525728,-1.867313839945839,-1.5338087743376947,-1.8873679967335701,-1.0493551392210523,-1.2156141133912417,-2.030547769584031,-2.5271855007290034,-0.9718299928258278,0.49778314283978853,-1.388853942113607,0.20460009219036931,1.3541992902755737
+908101,1,0.8170606662288354,-0.6295824302629383,0.7588410266569864,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,-0.17095910012722015
+908101,2,0.41257502093087217,-0.33981307655348536,0.2780905008899343,,,,,,,,,,,,,-0.17095910012722015
+909201,0,0.7557057202659283,0.9553186805497738,0.7697741886502898,-0.37905084107887943,0.1441771662974643,0.457405498335207,0.6670976151073104,0.09565754789378961,-0.5571809115428055,-0.23730908679360116,-1.3476641243075844,-2.2319755380519246,0.49778314283978853,0.806708965813594,-0.018441033950336395,0.6834262609481812
+909201,1,0.6248191578070585,1.419433751497502,0.7588410266569864,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.8457883596420288
+909201,2,-0.07938720443544948,1.6843053765030207,1.8081335312765157,,,,,,,,,,,,,1.8457883596420288
+910001,0,-0.14788871930632877,-0.08020445270647089,-0.5882419354283478,-0.8214870557491524,-0.48441377315356804,-0.1115128652856221,-0.7013661055217327,-1.712257221234908,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.6535903215408325
+910001,1,-0.33638838430182605,0.08311885034938876,-0.26240977468570165,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.456284761428833
+910001,2,0.019005240637814846,0.6722461499747677,-0.17192215510611902,,,,,,,,,,,,,1.456284761428833
+910003,0,-0.8255845489855216,-0.6554950822932735,-0.7116979467082238,-0.8214870557491524,-0.48441377315356804,-0.1115128652856221,-0.7013661055217327,-1.712257221234908,-0.06335601015647824,-0.835055314390411,0.22503104425430823,0.28831555240026907,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.4489346742630005
+910003,1,-0.4325091385127145,0.5285571507320932,-0.36453485481997044,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,0.8208858370780945
+910003,2,-4.40865478765908,-2.8310357880076467,-2.7819955598832284,,,,,,,,,,,,,0.8208858370780945
+910102,0,-1.164432463825118,-0.6554950822932735,-0.8351539579881,-1.1164445321960008,-2.118750215726252,-2.3871863197689382,-2.982138973236805,-2.616214605799257,-1.5448307143154598,-0.835055314390411,-0.9544903321671111,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-0.9106055385131593,0.16645944118499756
+910102,1,-1.4898374348324874,-1.520459031028347,-0.6709100952227768,,,,,,,,,,0.2373400917434395,2.88275169843941,0.6927973321038463,0.45304128527641296
+910102,2,-1.2600965453146213,-1.8968272712123362,-0.441929748703751,,,,,,,,,,,,,0.45304128527641296
+910103,0,0.07800989058673549,-0.3103207045411919,-0.3413299128685955,-1.1164445321960008,-2.118750215726252,-2.3871863197689382,-2.982138973236805,-2.616214605799257,-1.5448307143154598,-0.835055314390411,-0.9544903321671111,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.9106055385131593,0.45526236295700073
+910103,1,-1.6820789432542644,-0.6295824302629383,-0.26240977468570165,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-1.0630639836617988,-0.12737418711185455
+910103,2,-1.5552738805344144,-1.1961708836158533,-1.9719727790903323,,,,,,,,,,,,,-0.12737418711185455
+911701,0,0.7557057202659283,1.5306093101365763,1.6339662676094229,0.5058215882616662,0.8984862936387031,0.7418646801456215,0.210943041564296,0.2764490248066594,0.430468891229849,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.6875644123724536,2.1120355129241943
+911701,1,0.52869840359617,1.0630831111913384,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,2.237985372543335
+911701,2,0.41257502093087217,0.6722461499747677,0.638100625686777,,,,,,,,,,,,,2.237985372543335
+914401,0,-0.7126352440389895,0.8402605546324132,0.15249413225090913,0.8007790647085149,0.39561354207787724,1.3107830437664505,-0.42767336139592416,0.3367128504442826,0.595077191691958,-2.030547769584031,-2.5271855007290034,-0.13173296267509654,1.267782866548965,0.806708965813594,-0.24148216009104212,1.2514903545379639
+914401,1,-0.14414687588004912,1.2412584313444202,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.768213152885437
+914401,2,-0.37456453965524245,1.6843053765030207,0.2780905008899343,,,,,,,,,,,,,1.768213152885437
+914402,0,1.320452244998589,1.0703768064671344,1.1401422224899183,0.8007790647085149,0.39561354207787724,1.3107830437664505,-0.42767336139592416,0.3367128504442826,0.595077191691958,-2.030547769584031,-2.5271855007290034,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,0.8737234706124865,1.768213152885437
+914402,1,0.7209399120179469,1.330346091420961,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,1.9472538232803345
+914402,2,0.11739768571107917,0.43869402077594005,0.638100625686777,,,,,,,,,,,,,1.9472538232803345
+914403,0,-0.2608380242528609,-0.1952625786238314,-0.2178739015887193,0.8007790647085149,0.39561354207787724,1.3107830437664505,-0.42767336139592416,0.3367128504442826,0.595077191691958,-2.030547769584031,-2.5271855007290034,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.24148216009104212,1.9472538232803345
+914403,1,-1.4898374348324874,-1.431371370951806,-1.2836605760283897,,,,,,,,,,0.9503768127628092,0.7456311526478686,2.4486586478694914,2.0562407970428467
+914403,2,-0.5713494298017712,0.1272911818441699,0.8181056880851983,,,,,,,,,,,,,2.0562407970428467
+919301,0,-0.7126352440389895,0.14991179912825014,-0.4647859241484716,-0.674008317525728,-0.7358501489339809,-1.2493495925272802,-0.33644244668732126,-0.8685636623081825,-0.7217892120049145,1.5559295959968287,0.6182048363947807,-0.5517814777504622,1.267782866548965,0.806708965813594,0.42764121833107505,1.6479153633117676
+919301,1,-1.1053544179889336,-0.00596880972715211,-1.079410415759852,,,,,,,,,,1.663413533782179,1.8141914255436393,0.4419600012801827,1.2461656332015991
+919301,2,-0.6697418748750354,-0.8069173349511406,-0.35192721750454037,,,,,,,,,,,,,1.2461656332015991
+920501,0,-1.0514831588785858,-1.230785711880076,-1.0820659805478523,-1.1164445321960008,-1.2387229004948068,-2.671645501579353,-2.069829826150776,-0.8082998366705593,-0.8863975124670236,-3.226040224777651,-0.5613165400266386,0.7083640674756347,-1.812216028287741,-1.388853942113607,-0.9106055385131593,0.44122472405433655
+920501,1,-1.0092336637780452,-1.2531960507987243,-1.3857856561626585,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.8122266528381351,0.47123631834983826
+920501,2,-0.1777796495087138,-0.6512159154852555,-0.26192468630532967,,,,,,,,,,,,,0.47123631834983826
+920601,0,-1.27738176877165,-1.230785711880076,-1.0820659805478523,-1.4114020086428494,-1.3644410883850133,-1.2493495925272802,-0.7925970202303356,-0.4467168828448197,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,1.267782866548965,0.806708965813594,0.8737234706124865,1.0719356536865234
+920601,1,-2.1626827143087066,-1.8768096713345106,-2.10066121710254,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.310551991190808,0.7210389971733093
+920601,2,-0.5713494298017712,-2.286080819877049,-2.151977841488754,,,,,,,,,,,,,0.7210389971733093
+920602,0,1.5463508548916531,-1.000669460045355,-0.8351539579881,-1.4114020086428494,-1.3644410883850133,-1.2493495925272802,-0.7925970202303356,-0.4467168828448197,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,0.7210389971733093
+920602,1,0.9131814204397238,-1.431371370951806,-1.3857856561626585,,,,,,,,,,1.663413533782179,-0.3229291202479022,3.7028453019878094,0.8684980869293213
+920602,2,1.1013221364437225,-1.429723012814681,-0.35192721750454037,,,,,,,,,,,,,0.8684980869293213
+921402,0,-0.8255845489855216,0.8402605546324132,-0.09441789030884316,-1.5588807468662738,-0.35869558526336154,-1.2493495925272802,-1.7961370820249674,-1.1096189648586756,-0.7217892120049145,1.5559295959968287,1.7977262128162,-0.9718299928258278,-1.0422163045785646,0.806708965813594,0.20460009219036931,0.7417820692062378
+921402,1,-0.7208714011453798,1.2412584313444202,-0.26240977468570165,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,0.6688825488090515
+921402,2,-0.6697418748750354,1.295051827838308,-4.222036059070599,,,,,,,,,,,,,0.6688825488090515
+921403,0,-0.8255845489855216,-0.08020445270647089,-0.3413299128685955,-1.5588807468662738,-0.35869558526336154,-1.2493495925272802,-1.7961370820249674,-1.1096189648586756,-0.7217892120049145,1.5559295959968287,1.7977262128162,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,0.6688825488090515
+921403,1,-0.24026763009093757,-0.3623194500333156,-0.7730351753570456,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.0630639836617988,1.2572916746139526
+921403,2,-0.7681343199482997,-0.33981307655348536,-0.6219348111021723,,,,,,,,,,,,,1.2572916746139526
+922901,0,0.3039085004797998,-0.6554950822932735,-0.5882419354283478,0.5058215882616662,-0.35869558526336154,0.17294631652479245,1.4881758474847362,0.8188234555452687,0.2658605907677399,1.5559295959968287,1.0113786285352542,-0.5517814777504622,-0.27221658086938805,0.806708965813594,0.20460009219036931,2.273139715194702
+922901,1,0.8170606662288354,0.08311885034938876,1.2694664273283303,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,2.2974038124084473
+922901,2,-0.07938720443544948,-0.028410237621715174,0.18808796969072364,,,,,,,,,,,,,2.2974038124084473
+922902,0,-0.9385338539320537,0.6101443027976923,-0.09441789030884316,0.5058215882616662,-0.35869558526336154,0.17294631652479245,1.4881758474847362,0.8188234555452687,0.2658605907677399,1.5559295959968287,1.0113786285352542,-0.5517814777504622,1.267782866548965,-0.2910724881500066,0.20460009219036931,2.522961378097534
+922902,1,0.6248191578070585,0.5285571507320932,-0.8751602554913144,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.059714660367144415,2.54594087600708
+922902,2,1.1013221364437225,0.5165447305088826,-1.1619499982974364,,,,,,,,,,,,,2.54594087600708
+925602,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.9689657939725767,-1.1130047126046003,-0.1115128652856221,0.4846357856901046,1.3009340606462547,-0.8863975124670236,1.5559295959968287,1.4045524206757267,-0.13173296267509654,1.267782866548965,-1.388853942113607,-0.9106055385131593,1.7142808437347412
+925602,1,0.33645689517439314,-1.0750207306456427,-1.2836605760283897,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.5613893220144716,1.902241826057434
+925602,2,-0.27617209458197817,-1.1183201738829107,-1.3419550606958577,,,,,,,,,,,,,1.902241826057434
+928101,0,-0.5996859390924573,-0.1952625786238314,-0.09441789030884316,-0.674008317525728,-0.10725920948294862,-1.5338087743376947,-0.7925970202303356,-0.14539775465670343,-0.3925726110806964,-0.23730908679360116,-0.9544903321671111,0.28831555240026907,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.7989391684532166
+928101,1,-0.04802612166916067,0.17220651042592966,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,1.6456503868103027
+928101,2,-0.4729569847285068,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,1.6456503868103027
+928701,0,0.3039085004797998,0.03485367321088963,-0.09441789030884316,-1.2639232704194252,-0.2329773973731551,0.7418646801456215,-1.339982508481953,0.4572405017195292,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,0.7083640674756347,0.49778314283978853,-0.2910724881500066,0.42764121833107505,1.3370261192321777
+928701,1,-1.1053544179889336,-0.00596880972715211,-0.9772853356255832,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,1.2578848600387573
+928701,2,-0.6697418748750354,-0.18411165708760024,0.638100625686777,,,,,,,,,,,,,1.2578848600387573
+929805,0,-0.5996859390924573,-0.08020445270647089,-0.09441789030884316,1.833130232272485,1.149922669419116,1.026323861956036,1.4881758474847362,1.0598787580957618,1.0889020930782853,-0.23730908679360116,0.22503104425430823,1.1284125825510003,-0.27221658086938805,0.806708965813594,0.20460009219036931,0.7595062255859375
+929805,1,0.048094632541727786,-0.5404947701863974,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.8122266528381351,1.0288760662078857
+929805,2,0.11739768571107917,-0.9626187544170256,-0.08191962390690835,,,,,,,,,,,,,1.0288760662078857
+931201,0,0.07800989058673549,1.645667436053937,0.2759501435307853,-0.674008317525728,-1.1130047126046003,-0.6804312289064511,-0.2452115319787184,-0.6275083597576895,0.10125229030563083,-0.835055314390411,-1.3476641243075844,1.1284125825510003,-2.5822157519969178,-0.2910724881500066,-0.9106055385131593,0.13021844625473022
+931201,1,-0.6247506469344914,-1.0750207306456427,-0.46665993495423924,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-1.3139013144854623,0.2557781934738159
+931201,2,-0.4729569847285068,-0.729066625218198,-0.6219348111021723,,,,,,,,,,,,,0.2557781934738159
+934101,0,-1.164432463825118,-0.08020445270647089,0.5228621660905376,-0.674008317525728,-1.1130047126046003,1.026323861956036,-0.61013519081313,-0.6877721853953127,0.430468891229849,0.36043714080320877,-0.16814274788616518,-1.3918785079011935,-1.812216028287741,-0.2910724881500066,0.8737234706124865,1.456284761428833
+934101,1,-1.8743204516760412,0.8849077910382567,-1.7942859766997337,,,,,,,,,,-1.1887333502953,2.88275169843941,-0.059714660367144415,-0.6880087852478027
+934101,2,-0.5713494298017712,0.5943954402418251,-0.441929748703751,,,,,,,,,,,,,-0.6880087852478027
+934102,0,0.19095919553326762,0.7252024287150527,-0.5882419354283478,-0.674008317525728,-1.1130047126046003,1.026323861956036,-0.61013519081313,-0.6877721853953127,0.430468891229849,0.36043714080320877,-0.16814274788616518,-1.3918785079011935,-1.812216028287741,-0.2910724881500066,-0.6875644123724536,-0.6880087852478027
+934102,1,0.8170606662288354,-0.00596880972715211,0.14609054585137357,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.638952374458313
+934102,2,0.41257502093087217,-0.10626094735465771,0.008082907292302316,,,,,,,,,,,,,1.638952374458313
+936001,0,0.529807110372864,1.645667436053937,2.1277903127289273,0.2108641118148177,1.2756408573093225,1.026323861956036,0.028481212147090252,-0.20566158029432668,1.4181186940025035,-0.23730908679360116,-0.5613165400266386,-0.5517814777504622,0.49778314283978853,0.806708965813594,3.104134732019544,2.8746187686920166
+936001,1,1.4899059457050545,1.2412584313444202,0.6567159465227176,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.19112267045651915,2.7267251014709473
+936001,2,0.9045372462971938,0.9836489889065378,0.8181056880851983,,,,,,,,,,,,,2.7267251014709473
+938102,0,-0.14788871930632877,-0.08020445270647089,-0.3413299128685955,0.358342850038242,0.5213317299680837,-0.1115128652856221,0.6670976151073104,-0.8082998366705593,-0.3925726110806964,0.36043714080320877,1.4045524206757267,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,2.4735782146453857
+938102,1,0.4325776493852816,0.4394694906555523,-0.36453485481997044,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.8122266528381351,2.604126453399658
+938102,2,0.2157901307843435,0.43869402077594005,0.09808543849151298,,,,,,,,,,,,,2.604126453399658
+938103,0,0.3039085004797998,0.6101443027976923,0.6463181773704137,0.358342850038242,0.5213317299680837,-0.1115128652856221,0.6670976151073104,-0.8082998366705593,-0.3925726110806964,0.36043714080320877,1.4045524206757267,1.1284125825510003,-0.27221658086938805,0.806708965813594,-0.4645232862317478,2.604126453399658
+938103,1,0.2403361409635047,0.8849077910382567,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,2.4343323707580566
+938103,2,1.1997145815169867,1.7621560862359633,0.8181056880851983,,,,,,,,,,,,,2.4343323707580566
+940102,0,-0.37378732919939306,-0.6554950822932735,-0.7116979467082238,-1.1164445321960008,1.2756408573093225,0.17294631652479245,-1.0662897643561442,-0.14539775465670343,-0.5571809115428055,-0.835055314390411,1.4045524206757267,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-0.24148216009104212,1.204970359802246
+940102,1,-2.0665619600978182,-1.3422837108752652,-1.1815354958941209,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.1517411470413208
+940102,2,0.6093599110774008,-1.040469464149968,-0.08191962390690835,,,,,,,,,,,,,1.1517411470413208
+942101,0,-0.5996859390924573,-1.5759600896321577,-1.4524340143874808,0.9482578029319392,1.0242044815289095,-0.1115128652856221,-0.7013661055217327,0.09565754789378961,0.595077191691958,-0.835055314390411,0.22503104425430823,-0.13173296267509654,1.267782866548965,0.806708965813594,-0.6875644123724536,2.5971994400024414
+942101,1,-0.14414687588004912,-0.2732317899567748,-0.05815961441716403,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,2.6048038005828857
+942101,2,-0.07938720443544948,-0.10626094735465771,0.008082907292302316,,,,,,,,,,,,,2.6048038005828857
+942302,0,-1.8421282935043108,-3.0717157265578443,-3.0573621610258708,-0.5265295793023037,-0.8615683368241874,0.17294631652479245,-0.9750588496475414,0.4572405017195292,-0.5571809115428055,-1.432801541987221,-0.9544903321671111,-0.13173296267509654,1.267782866548965,0.806708965813594,0.20460009219036931,1.9196336269378662
+942302,1,-2.835527993784926,-1.6986343511814288,-1.7942859766997337,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.0481386184692383
+942302,2,-3.6215152270729654,-1.9746779809452786,-2.061975310289543,,,,,,,,,,,,,2.0481386184692383
+942303,0,-0.9385338539320537,0.3800280509629712,-0.09441789030884316,-0.5265295793023037,-0.8615683368241874,0.17294631652479245,-0.9750588496475414,0.4572405017195292,-0.5571809115428055,-1.432801541987221,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.0481386184692383
+942303,1,0.048094632541727786,0.17220651042592966,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,1.6961466553985005,1.7909538745880127
+942303,2,0.31418257585760784,0.5165447305088826,-0.5319322799029617,,,,,,,,,,,,,1.7909538745880127
+944602,0,-1.164432463825118,0.7252024287150527,0.6463181773704137,0.06338537359139342,0.7727681057484966,-0.1115128652856221,1.3969449327761334,2.265155270848227,-0.7217892120049145,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,-1.0422163045785646,0.806708965813594,-0.6875644123724536,2.410393476486206
+944602,1,-0.9131129095671567,0.7067324708851749,-1.079410415759852,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.8122266528381351,2.4378082752227783
+944602,2,-0.27617209458197817,0.5943954402418251,0.2780905008899343,,,,,,,,,,,,,2.4378082752227783
+948702,0,-0.37378732919939306,-1.000669460045355,-0.8351539579881,0.06338537359139342,-0.8615683368241874,0.457405498335207,-1.1575206790647472,1.3009340606462547,-1.0510058129291326,-0.835055314390411,-0.16814274788616518,1.9685096127017316,0.49778314283978853,0.806708965813594,-0.24148216009104212,1.7980340719223022
+948702,1,-0.6247506469344914,-0.9859330705691017,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,2.0390443801879883
+948702,2,-0.27617209458197817,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,2.0390443801879883
+952304,0,-1.164432463825118,-0.5404369563759129,-0.3413299128685955,0.8007790647085149,-1.2387229004948068,0.17294631652479245,1.0320212739417218,0.4572405017195292,1.2535103935403944,0.9581833684000187,1.7977262128162,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.160570502281189
+952304,1,0.9131814204397238,-0.3623194500333156,-0.46665993495423924,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.5613893220144716,1.0059444904327393
+952304,2,0.41257502093087217,-0.573365205752313,0.638100625686777,,,,,,,,,,,,,1.0059444904327393
+953601,0,0.07800989058673549,-0.6554950822932735,-0.5882419354283478,-0.9689657939725767,-0.6101319610437744,-0.3959720470960366,-0.2452115319787184,-0.08513392901908017,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.4645232862317478,1.4776995182037354
+953601,1,-1.1053544179889336,-0.896845410492561,-1.590035816431196,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,1.7157959938049316
+953601,2,0.5109674660041365,-1.1183201738829107,-0.8019398735005937,,,,,,,,,,,,,1.7157959938049316
+953602,0,0.19095919553326762,-0.8856113341279945,-0.8351539579881,-0.9689657939725767,-0.6101319610437744,-0.3959720470960366,-0.2452115319787184,-0.08513392901908017,-1.0510058129291326,-0.835055314390411,-0.5613165400266386,0.28831555240026907,0.49778314283978853,0.806708965813594,-0.4645232862317478,1.4776995182037354
+953602,1,-1.2975959264107106,-1.431371370951806,-1.4879107362969273,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.7157959938049316
+953602,2,-0.27617209458197817,-1.2740215933487957,-1.521960123094279,,,,,,,,,,,,,1.7157959938049316
+955702,0,-0.2608380242528609,0.03485367321088963,-0.2178739015887193,-0.5265295793023037,-0.8615683368241874,-0.6804312289064511,-0.06274970256151263,-0.38645305720719647,-1.0510058129291326,-0.23730908679360116,-0.5613165400266386,-1.3918785079011935,-1.0422163045785646,0.806708965813594,-1.133646664653865,1.1982612609863281
+955702,1,-0.528629892723603,-0.7186700903394792,-1.7942859766997337,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.146475911140442
+955702,2,-0.1777796495087138,-0.6512159154852555,-0.17192215510611902,,,,,,,,,,,,,1.146475911140442
+956803,0,0.529807110372864,1.645667436053937,0.893230199930166,-0.674008317525728,0.6470499178582901,-0.9648904107168657,-0.7925970202303356,-0.8685636623081825,-0.22796431061858732,1.5559295959968287,1.4045524206757267,0.7083640674756347,-1.812216028287741,-0.2910724881500066,1.7658879751753094,1.88933265209198
+956803,1,1.4899059457050545,0.7958201309617158,1.2694664273283303,,,,,,,,,,-0.47569662927593015,0.7456311526478686,1.1944719937511734,1.763675332069397
+956803,2,1.0029296913704582,0.43869402077594005,0.7281031568859877,,,,,,,,,,,,,1.763675332069397
+957601,0,-0.48673663414592516,-0.08020445270647089,-0.7116979467082238,0.5058215882616662,0.7727681057484966,1.3107830437664505,0.3934048709815018,0.7585596299076455,1.4181186940025035,-0.23730908679360116,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,0.806708965813594,3.104134732019544,2.2524044513702393
+957601,1,-1.2975959264107106,-1.431371370951806,-1.4879107362969273,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.4419600012801827,2.490797519683838
+957601,2,-1.6536663256076787,-1.2740215933487957,-0.981944935899015,,,,,,,,,,,,,2.490797519683838
+957806,0,-0.03493941435979663,0.8402605546324132,2.2512463240088034,-0.23157210285545515,0.7727681057484966,0.7418646801456215,0.028481212147090252,-0.024870103381456905,-0.5571809115428055,1.5559295959968287,-0.16814274788616518,-2.6520240531272905,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.2399094104766846
+957806,1,0.048094632541727786,0.9739954511147976,0.7588410266569864,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.5819287300109863
+957806,2,0.8061448012239295,0.5943954402418251,0.45809556328835566,,,,,,,,,,,,,2.5819287300109863
+961901,0,1.4334015499451211,1.1854349323844948,1.8808782901691752,-0.37905084107887943,0.7727681057484966,1.026323861956036,-0.2452115319787184,0.9996149324581385,-0.3925726110806964,0.9581833684000187,1.7977262128162,0.28831555240026907,-0.27221658086938805,1.9044904197771946,3.104134732019544,1.7614192962646484
+961901,1,0.8170606662288354,0.7958201309617158,1.1673413471940615,,,,,,,,,,-1.9017700713146695,0.7456311526478686,1.1944719937511734,1.8038743734359741
+961901,2,0.31418257585760784,0.7500968597077102,0.368093032089145,,,,,,,,,,,,,1.8038743734359741
+962703,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-0.674008317525728,0.7727681057484966,0.7418646801456215,0.6670976151073104,0.15592137353141286,0.2658605907677399,-1.432801541987221,-0.5613165400266386,1.548461097626366,1.267782866548965,0.806708965813594,3.104134732019544,1.02993643283844
+962703,1,-1.1053544179889336,-1.609546691104888,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,0.8526932597160339
+962703,2,-0.7681343199482997,-1.5075737225476233,-1.4319575918950684,,,,,,,,,,,,,0.8526932597160339
+963501,0,-0.7126352440389895,0.9553186805497738,0.893230199930166,0.2108641118148177,1.149922669419116,0.457405498335207,-0.1539806172701155,0.15592137353141286,0.7596854921540671,-0.835055314390411,0.6182048363947807,-1.8119270229765592,0.49778314283978853,0.806708965813594,1.9889291013160153,1.0819897651672363
+963501,1,0.7209399120179469,0.7067324708851749,0.963091186925524,,,,,,,,,,0.9503768127628092,0.7456311526478686,0.19112267045651915,1.9273991584777832
+963501,2,1.7900692519565728,0.9836489889065378,0.5480980944875663,,,,,,,,,,,,,1.9273991584777832
+968003,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-1.2639232704194252,-1.4901592762752198,-1.8182679561481092,-0.8838279349389385,-0.5069807084824429,-1.2156141133912417,-0.835055314390411,-1.740837916448057,-0.5517814777504622,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,1.5245847702026367
+968003,1,-1.7781996974651528,-0.4514071101098565,0.14609054585137357,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,1.1118844747543335
+968003,2,-0.4729569847285068,0.282992601310055,0.45809556328835566,,,,,,,,,,,,,1.1118844747543335
+971101,0,0.7557057202659283,0.14991179912825014,0.029038120971032973,-0.08409336463203088,-1.3644410883850133,-1.2493495925272802,-0.8838279349389385,-0.4467168828448197,-0.7217892120049145,1.5559295959968287,1.7977262128162,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.20460009219036931,0.9732363224029541
+971101,1,1.3937851914941661,-0.00596880972715211,-1.4879107362969273,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,1.4617455005645752
+971101,2,1.3964994716635155,0.6722461499747677,0.09808543849151298,,,,,,,,,,,,,1.4617455005645752
+975702,0,-1.164432463825118,-0.770553208210634,-0.5882419354283478,-1.4114020086428494,-1.1130047126046003,-1.2493495925272802,-0.06274970256151263,0.6380319786323989,-0.8863975124670236,0.36043714080320877,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,0.06647571176290512
+975702,1,-0.04802612166916067,-0.4514071101098565,0.7588410266569864,,,,,,,,,,1.663413533782179,0.7456311526478686,-0.059714660367144415,1.9535350799560547
+975702,2,0.8061448012239295,-0.729066625218198,-0.08191962390690835,,,,,,,,,,,,,1.9535350799560547
+982001,0,-0.48673663414592516,-0.5404369563759129,-0.5882419354283478,0.358342850038242,1.2756408573093225,0.457405498335207,0.028481212147090252,-0.14539775465670343,0.9242937926161762,0.36043714080320877,1.4045524206757267,0.7083640674756347,0.49778314283978853,0.806708965813594,1.9889291013160153,1.5636433362960815
+982001,1,-0.4325091385127145,-1.2531960507987243,-0.05815961441716403,,,,,,,,,,-1.1887333502953,0.7456311526478686,-0.059714660367144415,1.5050772428512573
+982001,2,-1.0633116551680928,-1.040469464149968,-1.0719474670982256,,,,,,,,,,,,,1.5050772428512573
+982601,0,-0.03493941435979663,-0.770553208210634,-0.8351539579881,-0.674008317525728,-0.7358501489339809,-1.5338087743376947,-2.069829826150776,-1.4712019186844152,-0.7217892120049145,-0.835055314390411,-0.9544903321671111,1.548461097626366,-1.0422163045785646,-1.388853942113607,-0.9106055385131593,0.3336679935455322
+982601,1,-0.04802612166916067,-1.7877220112579697,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,0.926652729511261
+982601,2,-0.37456453965524245,-1.9746779809452786,-1.3419550606958577,,,,,,,,,,,,,0.926652729511261
+983901,0,-0.37378732919939306,-0.42537883045855246,-0.09441789030884316,-1.2639232704194252,0.018458978407257843,0.457405498335207,-0.33644244668732126,0.6380319786323989,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.9718299928258278,0.49778314283978853,-0.2910724881500066,0.20460009219036931,1.790067434310913
+983901,1,-0.528629892723603,-0.80775775041602,-1.079410415759852,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.4419600012801827,2.0023252964019775
+983901,2,-1.3584889903878858,-1.1961708836158533,-0.8919424046998043,,,,,,,,,,,,,2.0023252964019775
+984001,0,-0.7126352440389895,-1.000669460045355,-0.8351539579881,-0.23157210285545515,-0.35869558526336154,-0.1115128652856221,-0.2452115319787184,-0.08513392901908017,-0.3925726110806964,-0.23730908679360116,1.0113786285352542,-2.6520240531272905,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,0.9283568859100342
+984001,1,-1.585958189043376,-0.80775775041602,-0.9772853356255832,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,0.7758997082710266
+984001,2,-2.2440209960472646,-1.1961708836158533,-0.35192721750454037,,,,,,,,,,,,,0.7758997082710266
+984401,0,1.0945536351055247,1.1854349323844948,-0.8351539579881,-0.23157210285545515,-0.8615683368241874,-0.1115128652856221,-0.9750588496475414,-2.616214605799257,-1.3802224138533508,-0.835055314390411,0.22503104425430823,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,1.3953558206558228
+984401,1,0.4325776493852816,-0.7186700903394792,-0.8751602554913144,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.9436346629275099,0.884745717048645
+984401,2,-0.27617209458197817,-0.41766378628642786,-1.521960123094279,,,,,,,,,,,,,0.884745717048645
+986201,0,0.19095919553326762,-0.3103207045411919,0.6463181773704137,-0.8214870557491524,-1.867313839945839,-0.6804312289064511,-0.7013661055217327,-0.024870103381456905,-1.0510058129291326,-1.432801541987221,-0.9544903321671111,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.24148216009104212,1.5425888299942017
+986201,1,-0.04802612166916067,0.2612941705024705,-0.26240977468570165,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,0.6470571160316467
+986201,2,-0.37456453965524245,-0.028410237621715174,-0.08191962390690835,,,,,,,,,,,,,0.6470571160316467
+986203,0,-1.27738176877165,-1.230785711880076,-1.0820659805478523,-0.8214870557491524,-1.867313839945839,-0.6804312289064511,-0.7013661055217327,-0.024870103381456905,-1.0510058129291326,-1.432801541987221,-0.9544903321671111,1.548461097626366,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,1.8329122066497803
+986203,1,-0.14414687588004912,-1.609546691104888,-1.7942859766997337,,,,,,,,,,1.663413533782179,1.8141914255436393,-0.059714660367144415,2.0028235912323
+986203,2,-0.6697418748750354,0.1272911818441699,-0.6219348111021723,,,,,,,,,,,,,2.0028235912323
+987102,0,1.320452244998589,1.645667436053937,0.893230199930166,0.2108641118148177,0.6470499178582901,0.457405498335207,0.3021739562728989,0.4572405017195292,-0.22796431061858732,-1.432801541987221,-0.5613165400266386,-0.5517814777504622,-2.5822157519969178,-0.2910724881500066,-1.133646664653865,1.7550491094589233
+987102,1,-0.528629892723603,0.7958201309617158,0.45246578625417994,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-1.3139013144854623,1.0046143531799316
+987102,2,1.298107026590251,0.8279475694406527,1.2681183440812516,,,,,,,,,,,,,1.0046143531799316
+987701,0,0.529807110372864,-0.6554950822932735,-0.8351539579881,-1.4114020086428494,-1.1130047126046003,-0.6804312289064511,-1.0662897643561442,0.3969766760819059,-0.5571809115428055,0.9581833684000187,1.0113786285352542,0.28831555240026907,-0.27221658086938805,1.9044904197771946,-0.24148216009104212,2.0037927627563477
+987701,1,-0.6247506469344914,-0.4514071101098565,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.059714660367144415,2.031648874282837
+987701,2,-0.5713494298017712,-0.729066625218198,-0.7119373423013831,,,,,,,,,,,,,2.031648874282837
+989701,0,-0.2608380242528609,1.5306093101365763,0.893230199930166,0.6533003264850905,1.0242044815289095,1.026323861956036,0.3934048709815018,0.035393722256166354,1.7473352949267216,0.36043714080320877,0.6182048363947807,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,2.995732307434082
+989701,1,0.33645689517439314,0.7958201309617158,2.086467068402481,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.059714660367144415,2.995732307434082
+989701,2,-0.07938720443544948,1.0614996986394805,1.448123406479673,,,,,,,,,,,,,2.995732307434082
+989702,0,0.529807110372864,1.7607255619712974,0.3994061548106614,0.6533003264850905,1.0242044815289095,1.026323861956036,0.3934048709815018,0.035393722256166354,1.7473352949267216,0.36043714080320877,0.6182048363947807,0.7083640674756347,1.267782866548965,-0.2910724881500066,0.8737234706124865,2.995732307434082
+989702,1,0.2403361409635047,2.6666609925690743,1.2694664273283303,,,,,,,,,,0.9503768127628092,-0.3229291202479022,1.1944719937511734,2.995732307434082
+989702,2,0.6093599110774008,1.9178575057018483,2.7081588432686226,,,,,,,,,,,,,2.995732307434082
+992502,0,-0.37378732919939306,0.3800280509629712,-0.2178739015887193,-1.2639232704194252,-0.7358501489339809,0.17294631652479245,0.3934048709815018,-2.0135763494230243,-1.7094390147775689,-0.835055314390411,0.22503104425430823,0.28831555240026907,-1.0422163045785646,-1.388853942113607,0.8737234706124865,1.5644813776016235
+992502,1,0.7209399120179469,-0.00596880972715211,1.4737165875968679,,,,,,,,,,-1.1887333502953,-0.3229291202479022,3.7028453019878094,1.7981853485107422
+992502,2,-0.6697418748750354,0.1272911818441699,0.008082907292302316,,,,,,,,,,,,,1.7981853485107422
+993002,0,0.6427564153193962,-0.6554950822932735,-0.7116979467082238,-0.23157210285545515,-0.8615683368241874,-1.2493495925272802,-1.24875159377335,-1.712257221234908,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,1.9044904197771946,-1.133646664653865,2.2646894454956055
+993002,1,-0.33638838430182605,-1.431371370951806,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-0.3229291202479022,-0.8122266528381351,0.9342978000640869
+993002,2,0.11739768571107917,-0.8069173349511406,0.18808796969072364,,,,,,,,,,,,,0.9342978000640869
+993003,0,-1.6162296836112464,-0.42537883045855246,-0.4647859241484716,-0.23157210285545515,-0.8615683368241874,-1.2493495925272802,-1.24875159377335,-1.712257221234908,-1.0510058129291326,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-0.9106055385131593,0.9342978000640869
+993003,1,-1.2975959264107106,-0.896845410492561,-1.079410415759852,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.3035826683044434
+993003,2,-1.5552738805344144,-1.1961708836158533,-2.5119879662855964,,,,,,,,,,,,,2.3035826683044434
+993501,0,-0.7126352440389895,-0.770553208210634,-0.7116979467082238,1.9806089704959091,0.7727681057484966,1.026323861956036,0.7583285298159133,1.2406702350086316,0.9242937926161762,-0.835055314390411,0.22503104425430823,0.7083640674756347,-0.27221658086938805,0.806708965813594,3.104134732019544,1.7439056634902954
+993501,1,0.6248191578070585,0.6176448108086341,1.4737165875968679,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,1.1944719937511734,1.779181718826294
+993501,2,0.31418257585760784,1.450753247304193,0.908108219284409,,,,,,,,,,,,,1.779181718826294
+993502,0,0.8686550252124604,1.1854349323844948,0.6463181773704137,1.9806089704959091,0.7727681057484966,1.026323861956036,0.7583285298159133,1.2406702350086316,0.9242937926161762,-0.835055314390411,0.22503104425430823,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,0.42764121833107505,1.779181718826294
+993502,1,0.2403361409635047,0.5285571507320932,0.7588410266569864,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,1.986369013786316
+993502,2,-0.4729569847285068,0.8279475694406527,-0.08191962390690835,,,,,,,,,,,,,1.986369013786316
+993804,0,-0.2608380242528609,-0.770553208210634,-0.8351539579881,-0.674008317525728,0.2698953541876708,-0.3959720470960366,-0.1539806172701155,-0.08513392901908017,-1.0510058129291326,-0.23730908679360116,-0.16814274788616518,1.548461097626366,-1.812216028287741,-1.388853942113607,-1.3566877907945707,2.6926963329315186
+993804,1,-2.5471657311522606,-1.6986343511814288,-1.9985361369682713,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,0.7701282501220703
+993804,2,-3.3263378918531723,-1.8968272712123362,-2.151977841488754,,,,,,,,,,,,,0.7701282501220703
+994002,0,-0.8255845489855216,-0.770553208210634,-0.2178739015887193,-0.9689657939725767,-2.118750215726252,-1.2493495925272802,-1.7961370820249674,-2.7367422570745035,-0.06335601015647824,-0.835055314390411,-0.16814274788616518,0.7083640674756347,-1.0422163045785646,-0.2910724881500066,-1.3566877907945707,1.4455662965774536
+994002,1,-1.585958189043376,-1.609546691104888,-1.4879107362969273,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-1.3139013144854623,2.2646894454956055
+994002,2,-1.8504512157542075,-1.8189765614793936,-1.4319575918950684,,,,,,,,,,,,,2.2646894454956055
+997403,0,1.5463508548916531,-0.42537883045855246,0.029038120971032973,-0.8214870557491524,-1.867313839945839,-2.102727137958524,-2.1610607408593787,-2.0135763494230243,-1.3802224138533508,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,-1.0422163045785646,0.806708965813594,-0.9106055385131593,1.260453701019287
+997403,1,0.4325776493852816,0.4394694906555523,0.14609054585137357,,,,,,,,,,-0.47569662927593015,1.8141914255436393,-0.5613893220144716,-0.6931471824645996
+997403,2,0.31418257585760784,0.8279475694406527,0.09808543849151298,,,,,,,,,,,,,-0.6931471824645996
+998004,0,-0.37378732919939306,-0.8856113341279945,-0.4647859241484716,-0.9689657939725767,-0.6101319610437744,-1.5338087743376947,-0.8838279349389385,-1.7725210468725314,-1.5448307143154598,0.9581833684000187,-2.5271855007290034,0.7083640674756347,1.267782866548965,0.806708965813594,-0.9106055385131593,0.9404321312904358
+998004,1,-1.201475172199822,-1.7877220112579697,-1.7942859766997337,,,,,,,,,,0.9503768127628092,1.8141914255436393,-1.0630639836617988,1.351270318031311
+998004,2,-0.7681343199482997,-1.6632751420135086,-0.5319322799029617,,,,,,,,,,,,,1.351270318031311
+998005,0,-1.164432463825118,-0.42537883045855246,-0.3413299128685955,-0.9689657939725767,-0.6101319610437744,-1.5338087743376947,-0.8838279349389385,-1.7725210468725314,-1.5448307143154598,0.9581833684000187,-2.5271855007290034,0.7083640674756347,0.49778314283978853,1.9044904197771946,-0.9106055385131593,1.351270318031311
+998005,1,0.2403361409635047,0.17220651042592966,-0.6709100952227768,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,2.161266326904297
+998005,2,0.019005240637814846,-0.729066625218198,-1.7019651854927003,,,,,,,,,,,,,2.161266326904297
+999204,0,-0.8255845489855216,-0.42537883045855246,-0.5882419354283478,-0.37905084107887943,-0.10725920948294862,-1.5338087743376947,-0.06274970256151263,-0.4467168828448197,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,1.9685096127017316,0.49778314283978853,1.9044904197771946,-1.3566877907945707,2.2948670387268066
+999204,1,1.2976644372832777,0.08311885034938876,0.5545908663884488,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.298217535018921
+999204,2,-0.27617209458197817,-0.4955144960193704,0.09808543849151298,,,,,,,,,,,,,2.298217535018921
+999205,0,-0.5996859390924573,-0.42537883045855246,-0.3413299128685955,-0.37905084107887943,-0.10725920948294862,-1.5338087743376947,-0.06274970256151263,-0.4467168828448197,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,1.9685096127017316,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,2.298217535018921
+999205,1,-1.585958189043376,-0.6295824302629383,-1.2836605760283897,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-1.0630639836617988,-0.47177043557167053
+999205,2,-1.161704100241357,-1.1183201738829107,-0.17192215510611902,,,,,,,,,,,,,-0.47177043557167053
+999502,0,-1.5032803786647144,-1.000669460045355,-0.8351539579881,-0.5265295793023037,0.5213317299680837,0.457405498335207,-0.33644244668732126,-1.0493551392210523,0.10125229030563083,-0.23730908679360116,1.7977262128162,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.6682648658752441
+999502,1,0.14421538675261625,-1.431371370951806,-1.079410415759852,,,,,,,,,,0.2373400917434395,1.8141914255436393,0.6927973321038463,1.5305007696151733
+999502,2,-0.9649192100948284,-1.040469464149968,-0.8919424046998043,,,,,,,,,,,,,1.5305007696151733
+999702,0,-2.068026903397375,-2.0361925933015996,-1.9462580595069854,-1.1164445321960008,-1.3644410883850133,-2.102727137958524,-1.5224443378991586,-0.8082998366705593,-0.7217892120049145,1.5559295959968287,1.0113786285352542,1.548461097626366,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,1.314550518989563
+999702,1,-2.0665619600978182,-1.9658973314110515,0.7588410266569864,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.5613893220144716,0.592125415802002
+999702,2,-0.6697418748750354,-2.286080819877049,-0.35192721750454037,,,,,,,,,,,,,0.592125415802002
+1001101,0,-0.2608380242528609,-0.08020445270647089,-0.3413299128685955,-0.674008317525728,1.2756408573093225,0.7418646801456215,-0.9750588496475414,-0.3261892315695732,-1.0510058129291326,0.36043714080320877,1.7977262128162,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.8291246891021729
+1001101,1,-0.24026763009093757,-0.6295824302629383,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.031777262687683
+1001101,2,-0.5713494298017712,-0.4955144960193704,0.368093032089145,,,,,,,,,,,,,1.031777262687683
+1002401,0,-1.0514831588785858,-0.8856113341279945,-0.8351539579881,-0.674008317525728,0.018458978407257843,0.17294631652479245,-0.8838279349389385,-2.314895477611141,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,-0.5517814777504622,-1.812216028287741,-0.2910724881500066,0.6506823444717807,1.042883038520813
+1002401,1,-0.24026763009093757,-0.896845410492561,-0.16028469455143282,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,1.2104620933532715
+1002401,2,0.41257502093087217,-0.10626094735465771,-0.17192215510611902,,,,,,,,,,,,,1.2104620933532715
+1003201,0,0.4168578054263319,0.4950861768803317,0.893230199930166,-0.8214870557491524,-1.615877464165426,-1.2493495925272802,-0.8838279349389385,-0.8685636623081825,-1.2156141133912417,-0.835055314390411,0.22503104425430823,-0.5517814777504622,0.49778314283978853,0.806708965813594,-1.133646664653865,1.0401012897491455
+1003201,1,-1.6820789432542644,-0.9859330705691017,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.19112267045651915,1.406803846359253
+1003201,2,-1.6536663256076787,-1.1183201738829107,-1.8819702478911218,,,,,,,,,,,,,1.406803846359253
+1003202,0,-1.164432463825118,-0.770553208210634,-0.8351539579881,-0.8214870557491524,-1.615877464165426,-1.2493495925272802,-0.8838279349389385,-0.8685636623081825,-1.2156141133912417,-0.835055314390411,0.22503104425430823,-0.5517814777504622,-0.27221658086938805,0.806708965813594,0.20460009219036931,1.406803846359253
+1003202,1,-1.201475172199822,-0.4514071101098565,-0.16028469455143282,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.059714660367144415,1.1101969480514526
+1003202,2,-0.4729569847285068,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,1.1101969480514526
+1003602,0,0.8686550252124604,-0.08020445270647089,-0.8351539579881,-0.8214870557491524,-0.9872865247143939,-2.3871863197689382,-1.0662897643561442,-2.073840175060648,-1.5448307143154598,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-1.3566877907945707,0.7600094079971313
+1003602,1,0.6248191578070585,0.7067324708851749,0.5545908663884488,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-1.0630639836617988,1.047293782234192
+1003602,2,-0.27617209458197817,-0.8069173349511406,-0.441929748703751,,,,,,,,,,,,,1.047293782234192
+1007304,0,1.207502940052057,-0.08020445270647089,0.15249413225090913,-1.1164445321960008,-1.867313839945839,-1.8182679561481092,-1.4312134231905558,-1.8930486981477779,-1.3802224138533508,-2.030547769584031,-1.740837916448057,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-1.3566877907945707,0.9004513025283813
+1007304,1,0.33645689517439314,-0.00596880972715211,-1.1815354958941209,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,1.0038161277770996
+1007304,2,0.31418257585760784,1.450753247304193,-0.17192215510611902,,,,,,,,,,,,,1.0038161277770996
+1007701,0,0.19095919553326762,0.4950861768803317,-0.7116979467082238,0.06338537359139342,-0.9872865247143939,-0.3959720470960366,0.940790359233119,0.3367128504442826,0.7596854921540671,0.36043714080320877,0.6182048363947807,1.9685096127017316,0.49778314283978853,-1.388853942113607,-1.133646664653865,1.5715423822402954
+1007701,1,0.8170606662288354,0.08311885034938876,0.35034070611991114,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.8122266528381351,0.9921917915344238
+1007701,2,0.2157901307843435,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,0.9921917915344238
+1007702,0,1.0945536351055247,-0.5404369563759129,-0.4647859241484716,0.06338537359139342,-0.9872865247143939,-0.3959720470960366,0.940790359233119,0.3367128504442826,0.7596854921540671,0.36043714080320877,0.6182048363947807,1.9685096127017316,-0.27221658086938805,-0.2910724881500066,-1.133646664653865,1.1411173343658447
+1007702,1,0.14421538675261625,-1.3422837108752652,-1.079410415759852,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.3139013144854623,0.8152689933776855
+1007702,2,0.31418257585760784,-1.2740215933487957,-0.8919424046998043,,,,,,,,,,,,,0.8152689933776855
+1007704,0,1.320452244998589,0.8402605546324132,0.2759501435307853,0.06338537359139342,-0.9872865247143939,-0.3959720470960366,0.940790359233119,0.3367128504442826,0.7596854921540671,0.36043714080320877,0.6182048363947807,1.9685096127017316,-1.0422163045785646,-1.388853942113607,0.20460009219036931,1.6086946725845337
+1007704,1,0.6248191578070585,0.17220651042592966,-0.8751602554913144,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.4957093000411987
+1007704,2,0.5109674660041365,-0.028410237621715174,0.008082907292302316,,,,,,,,,,,,,1.4957093000411987
+1012502,0,0.19095919553326762,0.2649699250456107,-0.4647859241484716,-1.1164445321960008,-1.3644410883850133,-0.6804312289064511,0.4846357856901046,-0.3261892315695732,-1.3802224138533508,-1.432801541987221,-0.9544903321671111,0.7083640674756347,1.267782866548965,-1.388853942113607,-0.6875644123724536,-0.6931471824645996
+1012502,1,0.8170606662288354,-0.00596880972715211,-0.46665993495423924,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.310551991190808,1.0705281496047974
+1012502,2,-0.27617209458197817,-0.573365205752313,-0.7119373423013831,,,,,,,,,,,,,1.0705281496047974
+1016201,0,-0.9385338539320537,-0.770553208210634,-0.8351539579881,-0.674008317525728,-1.2387229004948068,-0.1115128652856221,-1.339982508481953,-1.1698827904962987,-0.7217892120049145,-0.23730908679360116,-0.16814274788616518,0.28831555240026907,0.49778314283978853,3.002271873740795,-0.24148216009104212,2.031648874282837
+1016201,1,-1.0092336637780452,-0.80775775041602,-1.3857856561626585,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.8122266528381351,0.8798075318336487
+1016201,2,-0.6697418748750354,-0.6512159154852555,-0.35192721750454037,,,,,,,,,,,,,0.8798075318336487
+1016603,0,0.07800989058673549,-0.1952625786238314,-0.3413299128685955,-0.08409336463203088,0.7727681057484966,1.3107830437664505,0.11971212685569313,0.3969766760819059,0.430468891229849,-0.835055314390411,-0.9544903321671111,0.7083640674756347,-1.0422163045785646,0.806708965813594,-0.24148216009104212,2.408377170562744
+1016603,1,0.33645689517439314,1.2412584313444202,1.5758416677311367,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,2.2987194061279297
+1016603,2,1.1997145815169867,0.6722461499747677,0.908108219284409,,,,,,,,,,,,,2.2987194061279297
+1019104,0,-1.27738176877165,-0.770553208210634,-0.4647859241484716,-1.2639232704194252,-1.2387229004948068,-1.5338087743376947,-2.2522916555679817,-1.2904104417715454,-1.5448307143154598,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.24148216009104212,0.2048673778772354
+1019104,1,-1.393716680621599,-0.7186700903394792,-1.079410415759852,,,,,,,,,,0.9503768127628092,0.7456311526478686,-1.3139013144854623,-0.4795703589916229
+1019104,2,-0.37456453965524245,-0.8069173349511406,-1.6119626542934897,,,,,,,,,,,,,-0.4795703589916229
+1019105,0,-0.8255845489855216,-0.5404369563759129,-0.7116979467082238,-1.2639232704194252,-1.2387229004948068,-1.5338087743376947,-2.2522916555679817,-1.2904104417715454,-1.5448307143154598,-0.23730908679360116,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.24148216009104212,0.2048673778772354
+1019105,1,-1.0092336637780452,-0.3623194500333156,-0.568785015088508,,,,,,,,,,0.9503768127628092,0.7456311526478686,-1.3139013144854623,-0.4795703589916229
+1019105,2,-2.047236105900736,-0.33981307655348536,-1.1619499982974364,,,,,,,,,,,,,-0.4795703589916229
+1023802,0,-0.2608380242528609,0.8402605546324132,0.15249413225090913,-1.7063594850896981,-0.8615683368241874,-0.6804312289064511,-0.9750588496475414,-1.4712019186844152,-1.0510058129291326,0.9581833684000187,-0.16814274788616518,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.6875644123724536,2.29714035987854
+1023802,1,-0.6247506469344914,-0.5404947701863974,-0.7730351753570456,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.2414400577545166
+1023802,2,-2.047236105900736,-0.573365205752313,-0.441929748703751,,,,,,,,,,,,,1.2414400577545166
+1030302,0,-0.8255845489855216,-0.6554950822932735,-0.7116979467082238,-1.2639232704194252,-1.9930320278360456,-2.102727137958524,-1.8873679967335701,-1.712257221234908,-0.7217892120049145,-0.23730908679360116,-1.3476641243075844,-1.8119270229765592,-0.27221658086938805,0.806708965813594,-0.018441033950336395,1.3111305236816406
+1030302,1,0.4325776493852816,-1.0750207306456427,-1.1815354958941209,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,0.19112267045651915,1.231344223022461
+1030302,2,-0.37456453965524245,-1.1183201738829107,-1.4319575918950684,,,,,,,,,,,,,1.231344223022461
+1031001,0,0.7557057202659283,1.4155511842192159,2.1277903127289273,-0.5265295793023037,-0.7358501489339809,0.7418646801456215,1.3969449327761334,0.8790872811828919,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,1.9044904197771946,0.8737234706124865,1.7634333372116089
+1031001,1,1.2976644372832777,1.419433751497502,0.963091186925524,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.9084824323654175
+1031001,2,1.593284361810044,1.5286039570371357,2.1681436560733585,,,,,,,,,,,,,1.9084824323654175
+1031002,0,-0.14788871930632877,0.8402605546324132,2.2512463240088034,-0.5265295793023037,-0.7358501489339809,0.7418646801456215,1.3969449327761334,0.8790872811828919,0.2658605907677399,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,1.9084824323654175
+1031002,1,0.2403361409635047,0.3503818305790114,1.5758416677311367,,,,,,,,,,0.2373400917434395,0.7456311526478686,1.1944719937511734,2.165961265563965
+1031002,2,0.41257502093087217,1.606454666770078,2.6181563120694116,,,,,,,,,,,,,2.165961265563965
+1032902,0,1.0945536351055247,1.3004930583018552,1.6339662676094229,-0.37905084107887943,-0.2329773973731551,-0.9648904107168657,-0.7925970202303356,-0.6275083597576895,0.10125229030563083,0.36043714080320877,1.4045524206757267,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,2.43746018409729
+1032902,1,0.048094632541727786,1.5085214115740428,1.5758416677311367,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,2.7076427936553955
+1032902,2,0.7077523561506651,2.151409634900676,-0.17192215510611902,,,,,,,,,,,,,2.7076427936553955
+1032903,0,0.07800989058673549,1.0703768064671344,-0.4647859241484716,-0.37905084107887943,-0.2329773973731551,-0.9648904107168657,-0.7925970202303356,-0.6275083597576895,0.10125229030563083,0.36043714080320877,1.4045524206757267,-0.9718299928258278,0.49778314283978853,-1.388853942113607,-0.9106055385131593,2.6526176929473877
+1032903,1,0.14421538675261625,-0.3623194500333156,0.45246578625417994,,,,,,,,,,0.2373400917434395,-1.3914893931436731,-0.8122266528381351,2.6009228229522705
+1032903,2,0.5109674660041365,-0.9626187544170256,0.008082907292302316,,,,,,,,,,,,,2.6009228229522705
+1033202,0,-0.8255845489855216,-0.6554950822932735,-0.2178739015887193,-0.5265295793023037,-1.615877464165426,-1.5338087743376947,-2.6172153144023933,-1.8327848725101548,-0.7217892120049145,-1.432801541987221,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-1.388853942113607,-1.3566877907945707,0.8045450448989868
+1033202,1,-2.4510449769413722,-0.6295824302629383,-0.9772853356255832,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,-0.22519858181476593
+1033202,2,-1.2600965453146213,-0.9626187544170256,-0.8919424046998043,,,,,,,,,,,,,-0.22519858181476593
+1033204,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,-0.5265295793023037,-1.615877464165426,-1.5338087743376947,-2.6172153144023933,-1.8327848725101548,-0.7217892120049145,-1.432801541987221,-0.5613165400266386,0.28831555240026907,0.49778314283978853,-1.388853942113607,-0.4645232862317478,1.1985125541687012
+1033204,1,-2.0665619600978182,-1.609546691104888,-1.8964110568340025,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.8122266528381351,0.9084188342094421
+1033204,2,-1.6536663256076787,-1.3518723030817383,-0.17192215510611902,,,,,,,,,,,,,0.9084188342094421
+1034002,0,0.8686550252124604,0.03485367321088963,0.3994061548106614,-0.674008317525728,-1.2387229004948068,-1.5338087743376947,-0.33644244668732126,0.035393722256166354,-1.0510058129291326,-0.23730908679360116,-0.9544903321671111,-0.9718299928258278,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,0.7036289572715759
+1034002,1,-0.7208714011453798,-0.2732317899567748,0.35034070611991114,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,1.1944719937511734,1.6092827320098877
+1034002,2,-0.27617209458197817,-1.040469464149968,0.2780905008899343,,,,,,,,,,,,,1.6092827320098877
+1037102,0,-1.27738176877165,-1.9211344673842392,-1.8228020482271092,-1.1164445321960008,-2.118750215726252,-1.2493495925272802,-0.518904276104527,-1.2904104417715454,-0.5571809115428055,-0.835055314390411,-0.5613165400266386,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,-0.32271260023117065
+1037102,1,-1.201475172199822,-2.1440726515641333,-2.10066121710254,,,,,,,,,,0.2373400917434395,0.7456311526478686,-1.0630639836617988,0.6576125025749207
+1037102,2,-0.7681343199482997,-2.208230110144106,-1.7019651854927003,,,,,,,,,,,,,0.6576125025749207
+1040101,0,0.9816043301589925,0.14991179912825014,-0.4647859241484716,0.5058215882616662,0.1441771662974643,0.7418646801456215,0.210943041564296,-0.26592540593194997,0.430468891229849,-0.835055314390411,-0.16814274788616518,1.548461097626366,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.2251687049865723
+1040101,1,-0.04802612166916067,-0.18414412988023388,-0.05815961441716403,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,1.2743092775344849
+1040101,2,1.1997145815169867,-0.6512159154852555,-0.17192215510611902,,,,,,,,,,,,,1.2743092775344849
+1040102,0,0.9816043301589925,0.03485367321088963,2.3747023352886796,0.5058215882616662,0.1441771662974643,0.7418646801456215,0.210943041564296,-0.26592540593194997,0.430468891229849,-0.835055314390411,-0.16814274788616518,1.548461097626366,0.49778314283978853,1.9044904197771946,-0.4645232862317478,1.2251687049865723
+1040102,1,0.2403361409635047,0.9739954511147976,0.963091186925524,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,1.2743092775344849
+1040102,2,0.7077523561506651,0.9057982791735953,1.718131000077305,,,,,,,,,,,,,1.2743092775344849
+1042701,0,-0.9385338539320537,-1.000669460045355,-0.8351539579881,0.06338537359139342,-0.2329773973731551,0.17294631652479245,0.3934048709815018,-1.4712019186844152,-0.8863975124670236,-0.23730908679360116,0.6182048363947807,-0.13173296267509654,-1.812216028287741,-0.2910724881500066,0.8737234706124865,0.9925477504730225
+1042701,1,-1.0092336637780452,-0.80775775041602,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,2.050936460494995
+1042701,2,-0.9649192100948284,-0.573365205752313,-0.08191962390690835,,,,,,,,,,,,,2.050936460494995
+1044301,0,-0.5996859390924573,-0.6554950822932735,-0.3413299128685955,-0.8214870557491524,-1.3644410883850133,0.457405498335207,-1.0662897643561442,-0.38645305720719647,-0.8863975124670236,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-0.27221658086938805,-0.2910724881500066,-0.4645232862317478,0.29904457926750183
+1044301,1,-0.04802612166916067,-0.18414412988023388,0.35034070611991114,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.1048868894577026
+1044301,2,-0.37456453965524245,-0.729066625218198,-0.26192468630532967,,,,,,,,,,,,,1.1048868894577026
+1044401,0,0.529807110372864,0.3800280509629712,0.029038120971032973,-0.08409336463203088,0.018458978407257843,-0.1115128652856221,-0.8838279349389385,-0.26592540593194997,-0.5571809115428055,-0.23730908679360116,-0.16814274788616518,1.1284125825510003,1.267782866548965,0.806708965813594,0.20460009219036931,1.1157387495040894
+1044401,1,0.52869840359617,0.8849077910382567,1.2694664273283303,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,1.5715423822402954
+1044401,2,1.1013221364437225,0.282992601310055,0.638100625686777,,,,,,,,,,,,,1.5715423822402954
+1044802,0,-1.27738176877165,-0.770553208210634,-0.7116979467082238,0.9482578029319392,0.2698953541876708,-0.1115128652856221,-0.1539806172701155,-0.08513392901908017,1.2535103935403944,0.36043714080320877,-0.5613165400266386,1.1284125825510003,1.267782866548965,-1.388853942113607,0.20460009219036931,0.5672407746315002
+1044802,1,0.6248191578070585,-0.9859330705691017,-0.6709100952227768,,,,,,,,,,1.663413533782179,-0.3229291202479022,1.1944719937511734,0.824648916721344
+1044802,2,-0.07938720443544948,-0.4955144960193704,-0.17192215510611902,,,,,,,,,,,,,0.824648916721344
+1050002,0,-0.37378732919939306,0.4950861768803317,-0.2178739015887193,-0.5265295793023037,-0.48441377315356804,-0.6804312289064511,0.028481212147090252,-0.5672445341200663,-1.0510058129291326,-0.835055314390411,0.6182048363947807,1.1284125825510003,1.267782866548965,-0.2910724881500066,-0.4645232862317478,2.3137216567993164
+1050002,1,0.33645689517439314,0.17220651042592966,-0.05815961441716403,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,1.55637788772583
+1050002,2,-0.9649192100948284,0.9057982791735953,-0.8919424046998043,,,,,,,,,,,,,1.55637788772583
+1052802,0,0.3039085004797998,0.8402605546324132,0.3994061548106614,-0.08409336463203088,-0.2329773973731551,1.026323861956036,0.5758667003987075,0.5777681529947757,-0.22796431061858732,1.5559295959968287,1.7977262128162,1.1284125825510003,0.49778314283978853,-1.388853942113607,0.20460009219036931,0.20158211886882782
+1052802,1,1.8743889625486083,0.5285571507320932,0.963091186925524,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,-0.6931471824645996
+1052802,2,1.0029296913704582,1.1393504083724229,0.09808543849151298,,,,,,,,,,,,,-0.6931471824645996
+1053802,0,-1.164432463825118,-1.1157275859627156,-0.9586099692679761,-1.4114020086428494,-0.6101319610437744,-2.102727137958524,-1.0662897643561442,-0.024870103381456905,-1.5448307143154598,-0.835055314390411,-0.9544903321671111,-1.8119270229765592,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.8052595257759094
+1053802,1,-1.7781996974651528,-1.1641083907221836,-1.079410415759852,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,0.7158130407333374
+1053802,2,-0.37456453965524245,0.04944047211122737,0.908108219284409,,,,,,,,,,,,,0.7158130407333374
+1054202,0,-0.5996859390924573,-0.3103207045411919,-0.7116979467082238,0.06338537359139342,-1.1130047126046003,-0.3959720470960366,-0.7013661055217327,-0.38645305720719647,-1.5448307143154598,-0.835055314390411,-1.740837916448057,-0.9718299928258278,-0.27221658086938805,0.806708965813594,-0.9106055385131593,1.4833734035491943
+1054202,1,0.33645689517439314,-0.4514071101098565,-0.36453485481997044,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,1.6659400463104248
+1054202,2,0.41257502093087217,0.1272911818441699,-0.5319322799029617,,,,,,,,,,,,,1.6659400463104248
+1054203,0,-1.6162296836112464,-1.000669460045355,-0.8351539579881,0.06338537359139342,-1.1130047126046003,-0.3959720470960366,-0.7013661055217327,-0.38645305720719647,-1.5448307143154598,-0.835055314390411,-1.740837916448057,-0.9718299928258278,-1.0422163045785646,-1.388853942113607,-0.6875644123724536,1.6659400463104248
+1054203,1,-1.201475172199822,-1.3422837108752652,-1.3857856561626585,,,,,,,,,,-0.47569662927593015,2.88275169843941,-0.059714660367144415,1.9535350799560547
+1054203,2,-1.161704100241357,-1.9746779809452786,-1.7019651854927003,,,,,,,,,,,,,1.9535350799560547
+1056503,0,-0.14788871930632877,0.14991179912825014,0.2759501435307853,-0.5265295793023037,-0.48441377315356804,-0.1115128652856221,-0.2452115319787184,0.2161851991690361,-0.8863975124670236,-1.432801541987221,-0.5613165400266386,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,1.5277436971664429
+1056503,1,0.52869840359617,1.2412584313444202,0.5545908663884488,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,1.662566900253296
+1056503,2,1.1997145815169867,-0.18411165708760024,0.368093032089145,,,,,,,,,,,,,1.662566900253296
+1057201,0,-0.7126352440389895,-1.1157275859627156,-0.9586099692679761,-0.23157210285545515,-1.2387229004948068,-1.2493495925272802,-0.518904276104527,-0.6275083597576895,-0.3925726110806964,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.4645232862317478,1.6171895265579224
+1057201,1,-1.1053544179889336,-1.0750207306456427,-1.1815354958941209,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.8122266528381351,1.0238142013549805
+1057201,2,-0.07938720443544948,-1.3518723030817383,-0.8019398735005937,,,,,,,,,,,,,1.0238142013549805
+1057902,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-1.2639232704194252,-0.48441377315356804,-0.9648904107168657,-1.1575206790647472,0.09565754789378961,-1.0510058129291326,1.5559295959968287,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-1.388853942113607,-0.24148216009104212,0.7008250951766968
+1057902,1,-2.5471657311522606,-1.609546691104888,-1.6921608965654649,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.8122266528381351,0.9689387083053589
+1057902,2,-2.5391983312670576,-1.9746779809452786,-2.5119879662855964,,,,,,,,,,,,,0.9689387083053589
+1081103,0,-0.5996859390924573,-1.000669460045355,-0.8351539579881,1.390694017602212,1.149922669419116,0.7418646801456215,0.3021739562728989,0.8790872811828919,0.430468891229849,-0.835055314390411,-0.9544903321671111,1.1284125825510003,0.49778314283978853,-1.388853942113607,-0.24148216009104212,1.832129955291748
+1081103,1,-0.8169921553562683,-0.5404947701863974,0.6567159465227176,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,2.170846700668335
+1081103,2,-0.4729569847285068,0.04944047211122737,0.5480980944875663,,,,,,,,,,,,,2.170846700668335
+1130902,0,1.7722494647847176,-0.42537883045855246,-0.4647859241484716,0.2108641118148177,0.8984862936387031,-0.1115128652856221,-1.0662897643561442,-1.3506742674091685,-0.22796431061858732,0.36043714080320877,1.7977262128162,1.548461097626366,-1.812216028287741,0.806708965813594,0.8737234706124865,2.45827054977417
+1130902,1,0.9131814204397238,-0.5404947701863974,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,0.4419600012801827,2.5092456340789795
+1130902,2,1.1997145815169867,-0.028410237621715174,0.45809556328835566,,,,,,,,,,,,,2.5092456340789795
+1137102,0,0.4168578054263319,-0.1952625786238314,0.5228621660905376,1.2432152793787876,1.2756408573093225,1.3107830437664505,1.4881758474847362,2.024099968297734,0.9242937926161762,1.5559295959968287,0.22503104425430823,1.1284125825510003,0.49778314283978853,0.806708965813594,1.9889291013160153,2.5097808837890625
+1137102,1,1.2015436830723893,-0.09505646980369299,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.310551991190808,2.7039597034454346
+1137102,2,1.593284361810044,-0.4955144960193704,0.5480980944875663,,,,,,,,,,,,,2.7039597034454346
+1176403,0,-1.0514831588785858,0.14991179912825014,-0.4647859241484716,-0.8214870557491524,-2.2444684036164584,-2.3871863197689382,-1.7961370820249674,-1.5314657443220383,-0.7217892120049145,-0.835055314390411,-0.5613165400266386,-0.5517814777504622,1.267782866548965,-1.388853942113607,-0.018441033950336395,0.09308870881795883
+1176403,1,-0.24026763009093757,-0.00596880972715211,-0.8751602554913144,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-0.310551991190808,-0.6931471824645996
+1176403,2,-0.9649192100948284,-0.9626187544170256,-1.3419550606958577,,,,,,,,,,,,,-0.6931471824645996
+1176901,0,0.07800989058673549,0.03485367321088963,0.3994061548106614,0.06338537359139342,0.8984862936387031,1.026323861956036,0.028481212147090252,0.035393722256166354,-0.06335601015647824,1.5559295959968287,0.6182048363947807,-1.3918785079011935,1.267782866548965,0.806708965813594,3.104134732019544,2.477936029434204
+1176901,1,0.048094632541727786,0.7067324708851749,-0.05815961441716403,,,,,,,,,,-0.47569662927593015,1.8141914255436393,1.1944719937511734,2.4267048835754395
+1176901,2,0.6093599110774008,0.20514189157711243,0.09808543849151298,,,,,,,,,,,,,2.4267048835754395
+1177304,0,-1.0514831588785858,0.9553186805497738,0.15249413225090913,-0.9689657939725767,-0.8615683368241874,-2.3871863197689382,-1.7049061673163644,-2.194367826335894,-0.5571809115428055,-2.030547769584031,0.6182048363947807,1.1284125825510003,-0.27221658086938805,-1.388853942113607,-0.9106055385131593,0.3956103026866913
+1177304,1,-0.33638838430182605,-0.09505646980369299,0.5545908663884488,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.4419600012801827,0.4424646496772766
+1177304,2,-0.7681343199482997,0.1272911818441699,-0.26192468630532967,,,,,,,,,,,,,0.4424646496772766
+1177401,0,1.5463508548916531,0.8402605546324132,-0.7116979467082238,-0.08409336463203088,1.0242044815289095,0.17294631652479245,1.4881758474847362,-1.651993395597285,-0.06335601015647824,-0.23730908679360116,-0.5613165400266386,-1.8119270229765592,0.49778314283978853,0.806708965813594,-0.9106055385131593,2.2228243350982666
+1177401,1,1.0093021746506123,0.8849077910382567,0.04396546571710477,,,,,,,,,,-1.9017700713146695,-0.3229291202479022,-0.5613893220144716,2.326460599899292
+1177401,2,0.6093599110774008,0.20514189157711243,-1.8819702478911218,,,,,,,,,,,,,2.326460599899292
+1177701,0,0.19095919553326762,0.14991179912825014,1.2635982337697944,1.390694017602212,1.401359045199529,1.026323861956036,0.7583285298159133,0.9996149324581385,1.5827269944646125,1.5559295959968287,1.0113786285352542,0.7083640674756347,0.49778314283978853,1.9044904197771946,1.7658879751753094,2.4911186695098877
+1177701,1,0.9131814204397238,0.4394694906555523,0.5545908663884488,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.5613893220144716,2.721698760986328
+1177701,2,0.31418257585760784,1.1393504083724229,0.7281031568859877,,,,,,,,,,,,,2.721698760986328
+1177903,0,0.4168578054263319,0.2649699250456107,0.3994061548106614,0.8007790647085149,1.149922669419116,1.3107830437664505,0.7583285298159133,0.7585596299076455,1.4181186940025035,-0.835055314390411,-0.16814274788616518,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.995732307434082
+1177903,1,0.33645689517439314,0.08311885034938876,0.04396546571710477,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.5613893220144716,2.9876959323883057
+1177903,2,-0.37456453965524245,0.43869402077594005,0.45809556328835566,,,,,,,,,,,,,2.9876959323883057
+1178702,0,1.0945536351055247,0.6101443027976923,-0.09441789030884316,-0.5265295793023037,-0.35869558526336154,-0.9648904107168657,-0.7013661055217327,0.8188234555452687,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-0.13173296267509654,-0.27221658086938805,-0.2910724881500066,-0.6875644123724536,1.9216480255126953
+1178702,1,0.14421538675261625,0.08311885034938876,0.6567159465227176,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,2.169384479522705
+1178702,2,0.5109674660041365,-0.4955144960193704,1.448123406479673,,,,,,,,,,,,,2.169384479522705
+1178703,0,-0.9385338539320537,0.6101443027976923,-0.4647859241484716,-0.5265295793023037,-0.35869558526336154,-0.9648904107168657,-0.7013661055217327,0.8188234555452687,-0.7217892120049145,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,-0.6875644123724536,2.149778127670288
+1178703,1,-0.24026763009093757,0.3503818305790114,-0.46665993495423924,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.173884868621826
+1178703,2,-0.27617209458197817,0.36084331104299755,0.368093032089145,,,,,,,,,,,,,2.173884868621826
+1179801,0,-0.14788871930632877,-1.000669460045355,-0.8351539579881,-1.4114020086428494,0.8984862936387031,0.7418646801456215,-0.2452115319787184,-0.5069807084824429,-0.22796431061858732,1.5559295959968287,1.0113786285352542,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,0.03478278964757919
+1179801,1,-0.4325091385127145,0.08311885034938876,0.04396546571710477,,,,,,,,,,-1.9017700713146695,0.7456311526478686,-0.8122266528381351,0.38979893922805786
+1179801,2,-0.7681343199482997,-0.10626094735465771,0.5480980944875663,,,,,,,,,,,,,0.38979893922805786
+1180702,0,0.3039085004797998,0.14991179912825014,-0.09441789030884316,-0.674008317525728,0.1441771662974643,-1.5338087743376947,-0.33644244668732126,0.035393722256166354,0.430468891229849,-0.835055314390411,-0.5613165400266386,0.7083640674756347,1.267782866548965,0.806708965813594,0.20460009219036931,2.818532705307007
+1180702,1,-0.4325091385127145,0.3503818305790114,0.14609054585137357,,,,,,,,,,0.2373400917434395,0.7456311526478686,0.4419600012801827,2.8492138385772705
+1180702,2,-0.9649192100948284,-0.2619623668205428,0.18808796969072364,,,,,,,,,,,,,2.8492138385772705
+1181201,0,-1.5032803786647144,-1.460901963714797,-1.3289780031076046,-1.1164445321960008,-1.7415956520556326,-1.5338087743376947,-1.9785989114421731,-1.230146616133922,-1.3802224138533508,-2.628293997180841,-3.31353308500995,-0.5517814777504622,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,-0.2243199348449707
+1181201,1,-1.4898374348324874,-2.1440726515641333,-2.10066121710254,,,,,,,,,,-1.1887333502953,-1.3914893931436731,0.6927973321038463,0.27897539734840393
+1181201,2,-2.342413441120529,-2.3639315296099914,-2.2419803726879644,,,,,,,,,,,,,0.27897539734840393
+1181202,0,-1.3903310737181822,-1.000669460045355,-0.8351539579881,-1.1164445321960008,-1.7415956520556326,-1.5338087743376947,-1.9785989114421731,-1.230146616133922,-1.3802224138533508,-2.628293997180841,-3.31353308500995,-0.5517814777504622,-1.812216028287741,-1.388853942113607,-0.4645232862317478,0.37406787276268005
+1181202,1,-1.585958189043376,-0.9859330705691017,-0.568785015088508,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.5613893220144716,1.0263673067092896
+1181202,2,0.11739768571107917,-0.573365205752313,-0.6219348111021723,,,,,,,,,,,,,1.0263673067092896
+1181902,0,0.07800989058673549,0.3800280509629712,-0.4647859241484716,-0.5265295793023037,0.39561354207787724,0.7418646801456215,0.5758667003987075,0.5777681529947757,-0.06335601015647824,0.9581833684000187,1.4045524206757267,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.24148216009104212,0.8798075318336487
+1181902,1,-0.528629892723603,-1.1641083907221836,-0.16028469455143282,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,1.0807244777679443
+1181902,2,-0.4729569847285068,-0.8847680446840831,-0.441929748703751,,,,,,,,,,,,,1.0807244777679443
+1183502,0,-0.48673663414592516,1.5306093101365763,2.004334301449051,-0.5265295793023037,1.2756408573093225,0.7418646801456215,0.7583285298159133,0.5175043273571525,-0.22796431061858732,0.36043714080320877,-0.9544903321671111,1.548461097626366,1.267782866548965,1.9044904197771946,0.20460009219036931,2.3039286136627197
+1183502,1,0.33645689517439314,3.2902746131048604,1.1673413471940615,,,,,,,,,,0.9503768127628092,1.8141914255436393,0.4419600012801827,2.4724788665771484
+1183502,2,-0.4729569847285068,1.8400067959689057,2.1681436560733585,,,,,,,,,,,,,2.4724788665771484
+1184701,0,0.19095919553326762,0.8402605546324132,0.5228621660905376,1.390694017602212,0.018458978407257843,0.17294631652479245,-0.06274970256151263,-0.26592540593194997,0.7596854921540671,-0.835055314390411,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,0.8737234706124865,2.407790422439575
+1184701,1,0.52869840359617,0.08311885034938876,0.5545908663884488,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.8122266528381351,2.31561279296875
+1184701,2,1.1997145815169867,-0.573365205752313,0.09808543849151298,,,,,,,,,,,,,2.31561279296875
+1185501,0,-1.0514831588785858,-0.08020445270647089,-0.7116979467082238,-0.8214870557491524,-0.7358501489339809,0.457405498335207,-0.8838279349389385,-0.5069807084824429,-1.3802224138533508,-0.23730908679360116,0.22503104425430823,0.7083640674756347,-0.27221658086938805,0.806708965813594,0.6506823444717807,1.747433066368103
+1185501,1,-1.201475172199822,1.2412584313444202,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.8122266528381351,1.8959037065505981
+1185501,2,-0.4729569847285068,1.1393504083724229,0.9981107504836196,,,,,,,,,,,,,1.8959037065505981
+1185502,0,-0.7126352440389895,0.4950861768803317,0.2759501435307853,-0.8214870557491524,-0.7358501489339809,0.457405498335207,-0.8838279349389385,-0.5069807084824429,-1.3802224138533508,-0.23730908679360116,0.22503104425430823,0.7083640674756347,1.267782866548965,1.9044904197771946,-0.6875644123724536,1.8304996490478516
+1185502,1,-0.14414687588004912,0.5285571507320932,0.8609661067912552,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.059714660367144415,2.332099676132202
+1185502,2,-0.8665267650215641,0.36084331104299755,0.008082907292302316,,,,,,,,,,,,,2.332099676132202
+1185802,0,1.0945536351055247,0.9553186805497738,2.1277903127289273,-0.37905084107887943,0.7727681057484966,0.457405498335207,1.1232521886503248,2.1446276195729803,-0.7217892120049145,0.9581833684000187,-1.3476641243075844,0.7083640674756347,-0.27221658086938805,1.9044904197771946,0.20460009219036931,2.029665470123291
+1185802,1,1.2976644372832777,1.5085214115740428,1.371591507462599,,,,,,,,,,0.9503768127628092,-0.3229291202479022,3.7028453019878094,1.730391502380371
+1185802,2,0.31418257585760784,1.6843053765030207,2.3481487184717795,,,,,,,,,,,,,1.730391502380371
+1186802,0,1.5463508548916531,0.03485367321088963,-0.3413299128685955,0.2108641118148177,-0.2329773973731551,0.457405498335207,1.1232521886503248,0.5777681529947757,0.9242937926161762,-2.030547769584031,-1.3476641243075844,0.28831555240026907,0.49778314283978853,0.806708965813594,1.7658879751753094,2.9821481704711914
+1186802,1,0.52869840359617,-0.4514071101098565,-1.4879107362969273,,,,,,,,,,0.2373400917434395,-0.3229291202479022,0.4419600012801827,2.995732307434082
+1186802,2,0.7077523561506651,-1.1961708836158533,-1.6119626542934897,,,,,,,,,,,,,2.995732307434082
+1187901,0,0.4168578054263319,0.6101443027976923,0.5228621660905376,0.06338537359139342,1.2756408573093225,0.7418646801456215,-0.06274970256151263,-0.024870103381456905,-0.3925726110806964,0.9581833684000187,-0.16814274788616518,0.28831555240026907,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.125063419342041
+1187901,1,0.14421538675261625,0.4394694906555523,-0.05815961441716403,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.9436346629275099,2.451024293899536
+1187901,2,-0.27617209458197817,0.5943954402418251,0.368093032089145,,,,,,,,,,,,,2.451024293899536
+1188602,0,-1.27738176877165,-1.000669460045355,-0.8351539579881,0.6533003264850905,1.401359045199529,1.3107830437664505,0.5758667003987075,0.5777681529947757,0.9242937926161762,0.9581833684000187,-0.16814274788616518,-0.9718299928258278,-0.27221658086938805,-1.388853942113607,0.20460009219036931,1.8032644987106323
+1188602,1,-1.201475172199822,-1.2531960507987243,-1.079410415759852,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.5613893220144716,1.7444919347763062
+1188602,2,-0.1777796495087138,-1.2740215933487957,-0.8019398735005937,,,,,,,,,,,,,1.7444919347763062
+1189402,0,0.3039085004797998,0.4950861768803317,0.15249413225090913,1.2432152793787876,0.5213317299680837,0.457405498335207,0.3021739562728989,0.2764490248066594,0.2658605907677399,-0.23730908679360116,-1.3476641243075844,-0.13173296267509654,0.49778314283978853,0.806708965813594,-0.6875644123724536,1.3371928930282593
+1189402,1,0.9131814204397238,0.4394694906555523,0.14609054585137357,,,,,,,,,,1.663413533782179,-0.3229291202479022,0.4419600012801827,1.3306896686553955
+1189402,2,1.3964994716635155,0.20514189157711243,0.368093032089145,,,,,,,,,,,,,1.3306896686553955
+1189801,0,0.8686550252124604,1.9908418138060184,1.8808782901691752,1.5381727558256364,1.149922669419116,0.7418646801456215,1.4881758474847362,0.7585596299076455,1.4181186940025035,0.9581833684000187,1.0113786285352542,1.548461097626366,-0.27221658086938805,1.9044904197771946,0.8737234706124865,2.098484754562378
+1189801,1,0.7209399120179469,1.5976090716505837,0.45246578625417994,,,,,,,,,,-0.47569662927593015,1.8141914255436393,0.4419600012801827,2.517941474914551
+1189801,2,0.6093599110774008,1.450753247304193,0.8181056880851983,,,,,,,,,,,,,2.517941474914551
+1191603,0,-0.37378732919939306,0.2649699250456107,-0.7116979467082238,-0.9689657939725767,0.2698953541876708,0.17294631652479245,0.3934048709815018,0.15592137353141286,-0.22796431061858732,-0.835055314390411,-0.5613165400266386,-2.2319755380519246,-1.812216028287741,0.806708965813594,-0.24148216009104212,1.7689392566680908
+1191603,1,-1.201475172199822,-0.00596880972715211,0.24821562598564237,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.059714660367144415,1.9468461275100708
+1191603,2,-0.7681343199482997,0.282992601310055,-0.08191962390690835,,,,,,,,,,,,,1.9468461275100708
+1191803,0,1.8851987697312496,0.4950861768803317,1.1401422224899183,1.833130232272485,1.149922669419116,0.7418646801456215,1.3969449327761334,1.120142583733385,1.7473352949267216,0.36043714080320877,1.4045524206757267,1.1284125825510003,1.267782866548965,0.806708965813594,-0.6875644123724536,2.8986551761627197
+1191803,1,2.258871979392162,0.7958201309617158,0.963091186925524,,,,,,,,,,0.9503768127628092,0.7456311526478686,-1.3139013144854623,2.9557442665100098
+1191803,2,2.3804239223961585,1.6843053765030207,1.5381259376788836,,,,,,,,,,,,,2.9557442665100098
+1191902,0,1.207502940052057,1.5306093101365763,1.757422278889299,1.5381727558256364,1.2756408573093225,1.026323861956036,0.210943041564296,0.4572405017195292,1.4181186940025035,-0.835055314390411,-0.16814274788616518,-1.3918785079011935,-0.27221658086938805,-0.2910724881500066,0.20460009219036931,2.4328701496124268
+1191902,1,1.3937851914941661,0.5285571507320932,1.0652162670597927,,,,,,,,,,0.9503768127628092,0.7456311526478686,3.7028453019878094,2.3102173805236816
+1191902,2,1.298107026590251,1.1393504083724229,0.7281031568859877,,,,,,,,,,,,,2.3102173805236816
+1192301,0,0.07800989058673549,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.6470499178582901,0.457405498335207,-0.1539806172701155,0.2161851991690361,0.2658605907677399,-0.23730908679360116,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-1.388853942113607,-0.24148216009104212,1.0154227018356323
+1192301,1,-0.8169921553562683,-0.2732317899567748,0.45246578625417994,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.059714660367144415,1.1081873178482056
+1192301,2,0.019005240637814846,-0.6512159154852555,-0.35192721750454037,,,,,,,,,,,,,1.1081873178482056
+1192302,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-0.8214870557491524,0.6470499178582901,0.457405498335207,-0.1539806172701155,0.2161851991690361,0.2658605907677399,-0.23730908679360116,-0.9544903321671111,0.7083640674756347,0.49778314283978853,-0.2910724881500066,-0.4645232862317478,1.1081873178482056
+1192302,1,-0.33638838430182605,-0.00596880972715211,-0.26240977468570165,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.5613893220144716,1.0109165906906128
+1192302,2,-0.8665267650215641,0.9057982791735953,0.18808796969072364,,,,,,,,,,,,,1.0109165906906128
+1192303,0,-0.9385338539320537,-1.1157275859627156,-0.9586099692679761,-0.8214870557491524,0.6470499178582901,0.457405498335207,-0.1539806172701155,0.2161851991690361,0.2658605907677399,-0.23730908679360116,-0.9544903321671111,0.7083640674756347,-0.27221658086938805,-0.2910724881500066,-0.9106055385131593,1.9303545951843262
+1192303,1,-1.4898374348324874,-0.2732317899567748,-0.568785015088508,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-1.0630639836617988,1.2966893911361694
+1192303,2,-2.2440209960472646,-0.573365205752313,-0.26192468630532967,,,,,,,,,,,,,1.2966893911361694
+1193501,0,0.529807110372864,-0.08020445270647089,-0.09441789030884316,-0.5265295793023037,-0.9872865247143939,-0.9648904107168657,-1.4312134231905558,-1.4109380930467919,-1.8740473152396782,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,-1.3566877907945707,1.8493273258209229
+1193501,1,0.4325776493852816,-0.00596880972715211,0.5545908663884488,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,1.9846503734588623
+1193501,2,-0.37456453965524245,-0.4955144960193704,0.008082907292302316,,,,,,,,,,,,,1.9846503734588623
+1193502,0,0.07800989058673549,0.14991179912825014,-0.09441789030884316,-0.5265295793023037,-0.9872865247143939,-0.9648904107168657,-1.4312134231905558,-1.4109380930467919,-1.8740473152396782,0.36043714080320877,-0.16814274788616518,-0.5517814777504622,1.267782866548965,0.806708965813594,0.8737234706124865,1.9846503734588623
+1193502,1,0.4325776493852816,0.17220651042592966,-0.6709100952227768,,,,,,,,,,1.663413533782179,-0.3229291202479022,-0.059714660367144415,2.5552432537078857
+1193502,2,0.31418257585760784,-0.33981307655348536,0.908108219284409,,,,,,,,,,,,,2.5552432537078857
+1195001,0,-0.5996859390924573,-0.42537883045855246,-0.4647859241484716,-1.5588807468662738,-0.2329773973731551,-1.2493495925272802,-1.339982508481953,-0.14539775465670343,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.812216028287741,-1.388853942113607,-0.6875644123724536,0.04469000920653343
+1195001,1,-0.528629892723603,-0.4514071101098565,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,1.1944719937511734,0.054613590240478516
+1195001,2,-0.1777796495087138,-0.10626094735465771,0.2780905008899343,,,,,,,,,,,,,0.054613590240478516
+1195002,0,-0.14788871930632877,-0.5404369563759129,-0.2178739015887193,-1.5588807468662738,-0.2329773973731551,-1.2493495925272802,-1.339982508481953,-0.14539775465670343,-1.2156141133912417,-0.835055314390411,-0.16814274788616518,-0.13173296267509654,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,0.054613590240478516
+1195002,1,-0.528629892723603,-1.2531960507987243,-1.590035816431196,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,-0.5613893220144716,0.2264738529920578
+1195002,2,0.019005240637814846,-1.585424432280566,-1.6119626542934897,,,,,,,,,,,,,0.2264738529920578
+1195101,0,-1.164432463825118,-1.000669460045355,-0.8351539579881,-0.674008317525728,-1.2387229004948068,-2.3871863197689382,-0.33644244668732126,-0.6877721853953127,-1.5448307143154598,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,0.7064250707626343
+1195101,1,-0.8169921553562683,-1.2531960507987243,-1.079410415759852,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.059714660367144415,0.8498374223709106
+1195101,2,-0.8665267650215641,-0.573365205752313,-1.251952529496647,,,,,,,,,,,,,0.8498374223709106
+1195102,0,-0.5996859390924573,0.14991179912825014,0.3994061548106614,-0.674008317525728,-1.2387229004948068,-2.3871863197689382,-0.33644244668732126,-0.6877721853953127,-1.5448307143154598,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,0.49778314283978853,-1.388853942113607,-0.24148216009104212,0.8498374223709106
+1195102,1,0.7209399120179469,-0.6295824302629383,0.14609054585137357,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-1.0630639836617988,0.14589345455169678
+1195102,2,0.31418257585760784,-0.573365205752313,0.18808796969072364,,,,,,,,,,,,,0.14589345455169678
+1195103,0,-0.8255845489855216,-0.770553208210634,-0.7116979467082238,-0.674008317525728,-1.2387229004948068,-2.3871863197689382,-0.33644244668732126,-0.6877721853953127,-1.5448307143154598,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,0.14589345455169678
+1195103,1,-1.2975959264107106,-1.7877220112579697,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,0.7456311526478686,-0.059714660367144415,0.2596920132637024
+1195103,2,-1.5552738805344144,-1.585424432280566,-0.6219348111021723,,,,,,,,,,,,,0.2596920132637024
+1200001,0,-0.14788871930632877,0.3800280509629712,0.3994061548106614,1.5381727558256364,0.5213317299680837,0.457405498335207,1.4881758474847362,1.4817255375591245,1.5827269944646125,1.5559295959968287,1.4045524206757267,1.548461097626366,0.49778314283978853,-0.2910724881500066,0.20460009219036931,2.2981979846954346
+1200001,1,0.14421538675261625,-0.18414412988023388,0.35034070611991114,,,,,,,,,,0.2373400917434395,-0.3229291202479022,-0.310551991190808,2.3970284461975098
+1200001,2,1.4948919167367798,0.5943954402418251,0.9981107504836196,,,,,,,,,,,,,2.3970284461975098
+1200302,0,1.5463508548916531,-1.1157275859627156,-0.9586099692679761,0.06338537359139342,0.5213317299680837,0.17294631652479245,0.210943041564296,0.2161851991690361,-0.5571809115428055,-0.835055314390411,0.6182048363947807,1.9685096127017316,1.267782866548965,1.9044904197771946,1.319805722893898,0.5583431720733643
+1200302,1,0.14421538675261625,-0.3623194500333156,0.04396546571710477,,,,,,,,,,1.663413533782179,1.8141914255436393,2.4486586478694914,0.36898189783096313
+1200302,2,1.1997145815169867,-0.2619623668205428,0.908108219284409,,,,,,,,,,,,,0.36898189783096313
+1200401,0,-0.03493941435979663,-0.8856113341279945,-0.7116979467082238,-0.9689657939725767,0.2698953541876708,-0.1115128652856221,0.5758667003987075,-1.8930486981477779,0.10125229030563083,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,0.49778314283978853,-0.2910724881500066,0.20460009219036931,0.29385462403297424
+1200401,1,-0.528629892723603,-0.5404947701863974,-0.7730351753570456,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.059714660367144415,0.5752089619636536
+1200401,2,-0.7681343199482997,-0.8847680446840831,-0.26192468630532967,,,,,,,,,,,,,0.5752089619636536
+1200402,0,-0.37378732919939306,-0.1952625786238314,-0.8351539579881,-0.9689657939725767,0.2698953541876708,-0.1115128652856221,0.5758667003987075,-1.8930486981477779,0.10125229030563083,-0.835055314390411,-0.9544903321671111,-0.13173296267509654,-1.0422163045785646,-0.2910724881500066,-0.6875644123724536,0.5752089619636536
+1200402,1,0.4325776493852816,0.5285571507320932,1.0652162670597927,,,,,,,,,,-1.1887333502953,0.7456311526478686,0.4419600012801827,0.541500449180603
+1200402,2,0.2157901307843435,0.04944047211122737,0.18808796969072364,,,,,,,,,,,,,0.541500449180603
+1202701,0,0.3039085004797998,-0.08020445270647089,0.5228621660905376,1.0957365411553635,1.149922669419116,1.3107830437664505,1.2144831033589276,0.5175043273571525,1.0889020930782853,-1.432801541987221,-2.13401170858853,0.7083640674756347,0.49778314283978853,0.806708965813594,-1.3566877907945707,1.8305209875106812
+1202701,1,0.6248191578070585,0.2612941705024705,0.6567159465227176,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,1.9781602621078491
+1202701,2,1.0029296913704582,0.8279475694406527,-0.08191962390690835,,,,,,,,,,,,,1.9781602621078491
+1205202,0,0.8686550252124604,0.8402605546324132,0.5228621660905376,1.0957365411553635,1.0242044815289095,0.7418646801456215,-0.8838279349389385,-0.5672445341200663,1.2535103935403944,1.5559295959968287,1.7977262128162,0.7083640674756347,0.49778314283978853,0.806708965813594,-0.24148216009104212,2.0001583099365234
+1205202,1,1.4899059457050545,0.4394694906555523,0.7588410266569864,,,,,,,,,,0.2373400917434395,0.7456311526478686,-0.310551991190808,2.2692220211029053
+1205202,2,0.5109674660041365,0.9057982791735953,2.258146187272569,,,,,,,,,,,,,2.2692220211029053
+1205701,0,1.8851987697312496,2.566132443392821,2.4981583465685557,-0.08409336463203088,0.7727681057484966,0.7418646801456215,-0.1539806172701155,0.035393722256166354,-0.3925726110806964,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,1.267782866548965,-0.2910724881500066,1.9889291013160153,1.9700478315353394
+1205701,1,-1.1053544179889336,2.9339239727986968,1.5758416677311367,,,,,,,,,,1.663413533782179,0.7456311526478686,2.4486586478694914,1.9216480255126953
+1205701,2,0.6093599110774008,2.307111054366561,1.988138593674937,,,,,,,,,,,,,1.9216480255126953
+1206201,0,0.07800989058673549,0.9553186805497738,0.6463181773704137,-1.4114020086428494,-0.7358501489339809,-2.9561046833897673,-0.2452115319787184,-0.3261892315695732,-2.038655615701787,-0.835055314390411,-0.9544903321671111,-0.5517814777504622,-0.27221658086938805,0.806708965813594,-1.3566877907945707,1.5790977478027344
+1206201,1,0.7209399120179469,1.419433751497502,1.0652162670597927,,,,,,,,,,0.2373400917434395,1.8141914255436393,-0.310551991190808,2.07464599609375
+1206201,2,0.7077523561506651,1.9178575057018483,0.2780905008899343,,,,,,,,,,,,,2.07464599609375
+1206603,0,0.4168578054263319,0.3800280509629712,-0.7116979467082238,-0.08409336463203088,0.39561354207787724,-0.3959720470960366,-1.8873679967335701,0.035393722256166354,-0.8863975124670236,-0.835055314390411,-0.9544903321671111,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.9106055385131593,1.1433346271514893
+1206603,1,-0.04802612166916067,1.0630831111913384,2.392842308805287,,,,,,,,,,0.9503768127628092,1.8141914255436393,-0.8122266528381351,1.6769641637802124
+1206603,2,0.019005240637814846,0.282992601310055,0.5480980944875663,,,,,,,,,,,,,1.6769641637802124
+1208302,0,-0.8255845489855216,-1.000669460045355,-0.8351539579881,-0.674008317525728,0.6470499178582901,0.7418646801456215,-0.518904276104527,1.1804064093710083,-0.7217892120049145,-0.835055314390411,-0.16814274788616518,0.28831555240026907,-0.27221658086938805,-1.388853942113607,-0.018441033950336395,0.7058717012405396
+1208302,1,-0.6247506469344914,-1.0750207306456427,-1.079410415759852,,,,,,,,,,-1.9017700713146695,-1.3914893931436731,0.19112267045651915,0.6976528763771057
+1208302,2,-0.6697418748750354,-1.1183201738829107,-0.26192468630532967,,,,,,,,,,,,,0.6976528763771057
+1209201,0,0.3039085004797998,0.2649699250456107,2.621614357848432,0.358342850038242,0.2698953541876708,1.3107830437664505,0.6670976151073104,0.6380319786323989,-0.7217892120049145,0.9581833684000187,0.6182048363947807,-0.5517814777504622,0.49778314283978853,-0.2910724881500066,0.8737234706124865,2.0407068729400635
+1209201,1,0.33645689517439314,1.5085214115740428,0.963091186925524,,,,,,,,,,1.663413533782179,0.7456311526478686,1.1944719937511734,2.2077863216400146
+1209201,2,-0.4729569847285068,0.9057982791735953,0.5480980944875663,,,,,,,,,,,,,2.2077863216400146
+1209202,0,-0.03493941435979663,-1.230785711880076,-1.0820659805478523,0.358342850038242,0.2698953541876708,1.3107830437664505,0.6670976151073104,0.6380319786323989,-0.7217892120049145,0.9581833684000187,0.6182048363947807,-0.5517814777504622,1.267782866548965,0.806708965813594,0.8737234706124865,2.2077863216400146
+1209202,1,-1.1053544179889336,-0.896845410492561,-0.36453485481997044,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,2.179457426071167
+1209202,2,-0.27617209458197817,0.8279475694406527,0.7281031568859877,,,,,,,,,,,,,2.179457426071167
+1212303,0,-1.164432463825118,-0.8856113341279945,-0.4647859241484716,-1.2639232704194252,-1.1130047126046003,-0.1115128652856221,-0.61013519081313,-0.024870103381456905,-1.3802224138533508,-0.835055314390411,-0.16814274788616518,1.1284125825510003,-1.812216028287741,0.806708965813594,-0.24148216009104212,1.946341633796692
+1212303,1,-0.33638838430182605,-0.4514071101098565,0.45246578625417994,,,,,,,,,,-1.1887333502953,0.7456311526478686,-1.0630639836617988,2.3939449787139893
+1212303,2,-0.5713494298017712,-0.729066625218198,-0.17192215510611902,,,,,,,,,,,,,2.3939449787139893
+1213002,0,-1.6162296836112464,-0.770553208210634,-0.5882419354283478,-0.674008317525728,-0.35869558526336154,0.457405498335207,-0.8838279349389385,-0.4467168828448197,-1.0510058129291326,-0.23730908679360116,1.7977262128162,0.7083640674756347,-1.0422163045785646,-1.388853942113607,-0.4645232862317478,2.017455816268921
+1213002,1,-1.7781996974651528,-0.18414412988023388,-0.9772853356255832,,,,,,,,,,-0.47569662927593015,-1.3914893931436731,-0.5613893220144716,2.1084463596343994
+1213002,2,-0.27617209458197817,0.20514189157711243,-0.17192215510611902,,,,,,,,,,,,,2.1084463596343994
+1213701,0,-1.164432463825118,-0.5404369563759129,-0.3413299128685955,-0.5265295793023037,0.018458978407257843,0.457405498335207,0.940790359233119,0.7585596299076455,-0.7217892120049145,-1.432801541987221,-1.740837916448057,-1.8119270229765592,0.49778314283978853,-1.388853942113607,0.20460009219036931,0.9000177979469299
+1213701,1,-1.0092336637780452,-0.4514071101098565,-0.26240977468570165,,,,,,,,,,0.2373400917434395,-1.3914893931436731,0.19112267045651915,1.2578848600387573
+1213701,2,-0.7681343199482997,-0.33981307655348536,-0.7119373423013831,,,,,,,,,,,,,1.2578848600387573
+1218802,0,-1.27738176877165,0.03485367321088963,-0.2178739015887193,-0.674008317525728,-1.1130047126046003,-0.9648904107168657,0.940790359233119,-0.08513392901908017,-1.0510058129291326,-0.23730908679360116,0.22503104425430823,0.28831555240026907,0.49778314283978853,0.806708965813594,0.42764121833107505,1.7459635734558105
+1218802,1,0.6248191578070585,1.330346091420961,0.45246578625417994,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.310551991190808,2.150357484817505
+1218802,2,0.9045372462971938,0.5165447305088826,-0.35192721750454037,,,,,,,,,,,,,2.150357484817505
+1219108,0,-0.14788871930632877,-0.42537883045855246,-0.5882419354283478,-1.2639232704194252,-1.3644410883850133,-0.9648904107168657,0.8495594445245161,-1.0493551392210523,-1.2156141133912417,0.36043714080320877,-2.13401170858853,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.6875644123724536,-0.6931471824645996
+1219108,1,0.7209399120179469,-0.3623194500333156,0.7588410266569864,,,,,,,,,,0.9503768127628092,-1.3914893931436731,-1.0630639836617988,0.4990084767341614
+1219108,2,0.019005240637814846,-0.6512159154852555,0.09808543849151298,,,,,,,,,,,,,0.4990084767341614
+1219404,0,2.336995989517378,0.8402605546324132,1.5105102563295467,-0.23157210285545515,0.018458978407257843,0.457405498335207,-0.518904276104527,0.035393722256166354,-0.3925726110806964,-0.835055314390411,1.0113786285352542,-0.9718299928258278,-1.0422163045785646,-0.2910724881500066,-0.4645232862317478,-0.5128860473632812
+1219404,1,-0.14414687588004912,0.3503818305790114,0.04396546571710477,,,,,,,,,,-1.1887333502953,-1.3914893931436731,-0.8122266528381351,0.47219088673591614
+1219404,2,-0.07938720443544948,-0.18411165708760024,-0.5319322799029617,,,,,,,,,,,,,0.47219088673591614
+1221002,0,-0.03493941435979663,-0.1952625786238314,-0.3413299128685955,-0.5265295793023037,-0.35869558526336154,-0.9648904107168657,0.3934048709815018,-0.08513392901908017,-0.06335601015647824,0.9581833684000187,-0.5613165400266386,-0.9718299928258278,-0.27221658086938805,-0.2910724881500066,3.104134732019544,1.8515022993087769
+1221002,1,-0.528629892723603,0.2612941705024705,-0.9772853356255832,,,,,,,,,,-1.1887333502953,-0.3229291202479022,-0.5613893220144716,1.5154399871826172
+1221002,2,-0.5713494298017712,-0.2619623668205428,0.09808543849151298,,,,,,,,,,,,,1.5154399871826172
+1224001,0,-1.164432463825118,-0.08020445270647089,-0.2178739015887193,-0.5265295793023037,-0.7358501489339809,-0.9648904107168657,-0.61013519081313,-0.26592540593194997,-0.22796431061858732,-0.835055314390411,-0.16814274788616518,-0.5517814777504622,-0.27221658086938805,-1.388853942113607,-0.24148216009104212,1.166993260383606
+1224001,1,0.9131814204397238,-0.18414412988023388,-0.8751602554913144,,,,,,,,,,0.2373400917434395,-0.3229291202479022,1.1944719937511734,0.6483290791511536
+1224001,2,-0.37456453965524245,-0.6512159154852555,-0.08191962390690835,,,,,,,,,,,,,0.6483290791511536
+1225402,0,-1.0514831588785858,-1.000669460045355,-0.8351539579881,-1.2639232704194252,0.5213317299680837,-0.3959720470960366,-1.1575206790647472,-0.4467168828448197,-1.0510058129291326,0.36043714080320877,-0.5613165400266386,-1.8119270229765592,-0.27221658086938805,1.9044904197771946,-0.6875644123724536,0.8086773157119751
+1225402,1,-0.7208714011453798,-1.520459031028347,-1.079410415759852,,,,,,,,,,-0.47569662927593015,-0.3229291202479022,-0.5613893220144716,1.3888816833496094
+1225402,2,-0.6697418748750354,-1.6632751420135086,-2.2419803726879644,,,,,,,,,,,,,1.3888816833496094
+1228104,0,-0.9385338539320537,-0.08020445270647089,-0.09441789030884316,-1.1164445321960008,-0.8615683368241874,-0.1115128652856221,1.2144831033589276,0.3367128504442826,-0.5571809115428055,0.9581833684000187,1.4045524206757267,0.7083640674756347,-2.5822157519969178,-0.2910724881500066,-0.6875644123724536,2.0427663326263428
+1228104,1,-0.24026763009093757,-0.4514071101098565,-0.36453485481997044,,,,,,,,,,-1.9017700713146695,0.7456311526478686,2.197821317045828,0.6349214315414429
+1228104,2,0.5109674660041365,-0.729066625218198,-0.08191962390690835,,,,,,,,,,,,,0.6349214315414429
+1228402,0,1.5463508548916531,-0.08020445270647089,-0.2178739015887193,1.0957365411553635,1.0242044815289095,0.457405498335207,0.940790359233119,0.5777681529947757,0.9242937926161762,1.5559295959968287,1.7977262128162,1.1284125825510003,-1.0422163045785646,-0.2910724881500066,-0.24148216009104212,2.747105360031128
+1228402,1,-0.14414687588004912,0.3503818305790114,0.35034070611991114,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.059714660367144415,2.6632115840911865
+1228402,2,-0.27617209458197817,0.04944047211122737,0.2780905008899343,,,,,,,,,,,,,2.6632115840911865
+1256602,0,-0.14788871930632877,0.8402605546324132,1.3870542450496706,0.358342850038242,0.7727681057484966,0.7418646801456215,0.5758667003987075,1.361197886283878,0.7596854921540671,0.9581833684000187,0.22503104425430823,-0.13173296267509654,0.49778314283978853,0.806708965813594,0.8737234706124865,2.453709602355957
+1256602,1,0.52869840359617,0.6176448108086341,0.7588410266569864,,,,,,,,,,0.9503768127628092,0.7456311526478686,1.1944719937511734,1.5944350957870483
+1256602,2,-0.5713494298017712,0.43869402077594005,0.09808543849151298,,,,,,,,,,,,,1.5944350957870483
+1266703,0,-0.03493941435979663,-0.3103207045411919,-0.09441789030884316,-0.674008317525728,-0.7358501489339809,0.17294631652479245,0.3021739562728989,-1.3506742674091685,0.2658605907677399,-0.23730908679360116,-0.5613165400266386,0.28831555240026907,0.49778314283978853,1.9044904197771946,-0.6875644123724536,1.9671103954315186
+1266703,1,-1.0092336637780452,-1.431371370951806,-1.079410415759852,,,,,,,,,,0.9503768127628092,0.7456311526478686,-0.5613893220144716,1.9573663473129272
+1266703,2,-1.6536663256076787,-1.585424432280566,-1.6119626542934897,,,,,,,,,,,,,1.9573663473129272
diff --git a/src/skillmodels/test_data/model2.py b/src/skillmodels/test_data/model2.py
index dc5a160b..00ea8c5a 100644
--- a/src/skillmodels/test_data/model2.py
+++ b/src/skillmodels/test_data/model2.py
@@ -5,9 +5,9 @@
anchoring of fac1 to outcome Q1 and a single control variable x1.
"""
-from skillmodels.model_spec import (
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.model_spec import (
AnchoringSpec,
- EstimationOptions,
FactorSpec,
ModelSpec,
Normalizations,
@@ -49,9 +49,14 @@
),
controls=("x1",),
stagemap=(0, 0, 0, 0, 0, 0, 0),
- estimation_options=EstimationOptions(
- robust_bounds=True,
- bounds_distance=0.001,
- n_mixtures=1,
- ),
+)
+
+# CHS options used alongside MODEL2 in tests. Tests using this fixture run
+# `get_maximization_inputs` for shape and value checks rather than full
+# estimation; opt into the cheap Spearman start-value path so the fixture
+# stays fast. End-user defaults (CHSEstimationOptions()) keep `"amn"`.
+MODEL2_CHS_OPTIONS = CHSEstimationOptions(
+ robust_bounds=True,
+ bounds_distance=0.001,
+ start_params_strategy="spearman",
)
diff --git a/src/skillmodels/test_data/simplest_augmented_model.py b/src/skillmodels/test_data/simplest_augmented_model.py
index fd481723..7d2f058e 100644
--- a/src/skillmodels/test_data/simplest_augmented_model.py
+++ b/src/skillmodels/test_data/simplest_augmented_model.py
@@ -5,8 +5,8 @@
periods. Used for testing endogenous factor augmentation.
"""
-from skillmodels.model_spec import (
- EstimationOptions,
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.model_spec import (
FactorSpec,
ModelSpec,
Normalizations,
@@ -33,7 +33,13 @@
),
},
observed_factors=("of",),
- estimation_options=EstimationOptions(
- bounds_distance=1e-8,
- ),
+)
+
+# CHS options used alongside SIMPLEST_AUGMENTED_MODEL in tests. Tests using
+# this fixture exercise CHS plumbing rather than full estimation; opt into
+# the cheap Spearman start-value path so collection stays fast. End-user
+# defaults remain "amn".
+SIMPLEST_AUGMENTED_MODEL_CHS_OPTIONS = CHSEstimationOptions(
+ bounds_distance=1e-8,
+ start_params_strategy="spearman",
)
diff --git a/src/skillmodels/transition_functions.py b/src/skillmodels/transition_functions.py
deleted file mode 100644
index 9e384614..00000000
--- a/src/skillmodels/transition_functions.py
+++ /dev/null
@@ -1,267 +0,0 @@
-"""Contains transition functions and corresponding helper functions.
-
-Below the signature and purpose of a transition function and its helper
-functions is explained with a transition function called example_func:
->
-
-**example_func(** *states, params**)**:
-
- The actual transition function.
-
-Args:
- * states: 1d numpy array of length n_all_factors
- * params: 1d numpy array with coefficients specific to this transition function
-
-Return:
- * float
-**names_example_func(** *factors* **)**:
-
- Generate a list of names for the params of the transition function.
-
- The names will be used to construct index tuples in the following way:
-
- ('transition', period, factor, NAME)
-
-The transition functions have to be JAX jittable and differentiable. However, they
-should not be jitted yet.
-
-"""
-
-import functools
-from itertools import combinations
-from typing import TYPE_CHECKING, Any
-
-import jax
-import jax.numpy as jnp
-import optimagic as om
-from jax import Array
-
-if TYPE_CHECKING:
- from skillmodels.constraints import FixedConstraintWithValue
-
-
-def select_by_loc(params: Any, loc: Any) -> Any: # noqa: ANN401
- """Select parameters by location."""
- return params.loc[loc]
-
-
-def linear(states: Array, params: Array) -> Array:
- """Linear production function where the constant is the last parameter."""
- constant = params[-1]
- betas = params[:-1]
- return jnp.dot(states, betas) + constant
-
-
-def params_linear(factors: tuple[str, ...]) -> list[str]:
- """Index tuples for linear transition function."""
- return [*factors, "constant"]
-
-
-def identity_constraints_linear(
- factor: str,
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[FixedConstraintWithValue]:
- """Identity constraints for linear transition function."""
- from skillmodels.constraints import FixedConstraintWithValue # noqa: PLC0415
-
- constraints: list[FixedConstraintWithValue] = []
- for regressor in params_linear(all_factors):
- val = 1.0 if factor == regressor else 0.0
- loc = ("transition", aug_period, factor, regressor)
- constraints.append(FixedConstraintWithValue(loc=loc, value=val))
- return constraints
-
-
-def translog(states: Array, params: Array) -> Array:
- """Translog transition function.
-
- The name is a convention in the skill formation literature even though the function
- is better described as a linear in parameters transition function with squares and
- interaction terms of the states.
-
- """
- nfac = len(states)
- constant = params[-1]
- lin_beta = params[:nfac]
- square_beta = params[nfac : 2 * nfac]
- inter_beta = params[2 * nfac : -1]
-
- res = jnp.dot(states, lin_beta)
- res += jnp.dot(states**2, square_beta)
- for p, (a, b) in zip(inter_beta, combinations(range(nfac), 2), strict=False):
- res += p * states[a] * states[b]
- res += constant
- return res
-
-
-def params_translog(factors: tuple[str, ...]) -> list[str]:
- """Index tuples for the translog production function."""
- return (
- list(factors)
- + [f"{factor} ** 2" for factor in factors]
- + [f"{a} * {b}" for a, b in combinations(factors, 2)]
- + ["constant"]
- )
-
-
-def identity_constraints_translog(
- factor: str,
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[FixedConstraintWithValue]:
- """Identity constraints for translog transition function."""
- from skillmodels.constraints import FixedConstraintWithValue # noqa: PLC0415
-
- constraints: list[FixedConstraintWithValue] = []
- for regressor in params_translog(all_factors):
- val = 1.0 if factor == regressor else 0.0
- loc = ("transition", aug_period, factor, regressor)
- constraints.append(FixedConstraintWithValue(loc=loc, value=val))
- return constraints
-
-
-def log_ces(states: Array, params: Array) -> Array:
- """Log CES production function (KLS version)."""
- phi = params[-1]
- gammas = params[:-1]
- scaling_factor = 1 / phi
-
- # note: once the b argument is supported in jax.scipy.special.logsumexp, we can set
- # b = gammas instead of adding the log of gammas to sigma_points * phi
-
- # the log step for gammas underflows for gamma = 0, but this is handled correctly
- # by logsumexp and does not raise a warning.
- unscaled = jax.scipy.special.logsumexp(jnp.log(gammas) + states * phi)
- return unscaled * scaling_factor
-
-
-def params_log_ces(factors: tuple[str, ...]) -> list[str]:
- """Index tuples for the log_ces production function."""
- return [*factors, "phi"]
-
-
-def constraints_log_ces(
- factor: str,
- factors: tuple[str, ...],
- aug_period: int,
-) -> om.constraints.Constraint:
- """Constraints for log_ces production function."""
- names = params_log_ces(factors)
- loc = [("transition", aug_period, factor, name) for name in names[:-1]]
- return om.ProbabilityConstraint(selector=functools.partial(select_by_loc, loc=loc))
-
-
-def identity_constraints_log_ces(
- factors: tuple[str, ...],
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[om.constraints.Constraint]:
- """Identity constraints for log_ces."""
- raise NotImplementedError
-
-
-def constant(state: Array, params: Array) -> Array: # noqa: ARG001
- """Constant production function."""
- return state
-
-
-def params_constant(factors: tuple[str, ...]) -> list[str]: # noqa: ARG001
- """Index tuples for the constant production function."""
- return []
-
-
-def robust_translog(states: Array, params: Array) -> Array:
- """Numerically robust version of the translog transition function.
-
- This function does a clipping of the state vector at +- 1e12 before calling
- the standard translog function. It has a no effect on the results if the
- states do not get close to the clipping values and prevents overflows otherwise.
-
- The name is a convention in the skill formation literature even though the function
- is better described as a linear in parameters transition function with squares and
- interaction terms of the states.
-
- """
- clipped_states = jnp.clip(states, -1e12, 1e12)
- return translog(states=clipped_states, params=params)
-
-
-def params_robust_translog(factors: tuple[str, ...]) -> list[str]:
- """Return parameter names for robust translog transition function."""
- return params_translog(factors)
-
-
-def identity_constraints_robust_translog(
- factor: str,
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[FixedConstraintWithValue]:
- """Identity constraints for robust_translog."""
- return identity_constraints_translog(
- factor=factor, aug_period=aug_period, all_factors=all_factors
- )
-
-
-def linear_and_squares(states: Array, params: Array) -> Array:
- """linear_and_squares transition function."""
- nfac = len(states)
- constant = params[-1]
- lin_beta = params[:nfac]
- square_beta = params[nfac : 2 * nfac]
-
- res = jnp.dot(states, lin_beta)
- res += jnp.dot(states**2, square_beta)
- res += constant
- return res
-
-
-def params_linear_and_squares(factors: tuple[str, ...]) -> list[str]:
- """Index tuples for the linear_and_squares production function."""
- return list(factors) + [f"{factor} ** 2" for factor in factors] + ["constant"]
-
-
-def identity_constraints_linear_and_squares(
- factor: str,
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[FixedConstraintWithValue]:
- """Identity constraints for linear_and_squares transition function."""
- from skillmodels.constraints import FixedConstraintWithValue # noqa: PLC0415
-
- constraints: list[FixedConstraintWithValue] = []
- for regressor in params_linear_and_squares(all_factors):
- val = 1.0 if factor == regressor else 0.0
- loc = ("transition", aug_period, factor, regressor)
- constraints.append(FixedConstraintWithValue(loc=loc, value=val))
- return constraints
-
-
-def log_ces_general(states: Array, params: Array) -> Array:
- """Generalized log_ces production function without known location and scale."""
- n = states.shape[-1]
- tfp = params[-1]
- gammas = params[:n]
- sigmas = params[n : 2 * n]
-
- # note: once the b argument is supported in jax.scipy.special.logsumexp, we can set
- # b = gammas instead of adding the log of gammas to sigma_points * phi
-
- # the log step for gammas underflows for gamma = 0, but this is handled correctly
- # by logsumexp and does not raise a warning.
- unscaled = jax.scipy.special.logsumexp(jnp.log(gammas) + states * sigmas)
- return unscaled * tfp
-
-
-def params_log_ces_general(factors: tuple[str, ...]) -> list[str]:
- """Index tuples for the generalized log_ces production function."""
- return list(factors) + [f"sigma_{fac}" for fac in factors] + ["tfp"]
-
-
-def identity_constraints_log_ces_general(
- factors: tuple[str, ...],
- aug_period: int,
- all_factors: tuple[str, ...],
-) -> list[om.constraints.Constraint]:
- """Identity constraints for log_ces_general."""
- raise NotImplementedError
diff --git a/tests/af/test_validate.py b/tests/af/test_validate.py
new file mode 100644
index 00000000..bdf0d1c0
--- /dev/null
+++ b/tests/af/test_validate.py
@@ -0,0 +1,41 @@
+"""Regression tests for the AF kappa-parameter scope guard.
+
+These pin the documented AF scope boundary (kappa_t = 0, exogenous
+investment): a caller cannot silently smuggle a `kappa`/`kappa_t`
+parameter, while standard parameter categories still pass.
+"""
+
+import pandas as pd
+import pytest
+
+from skillmodels.af.validate import fail_if_unsupported_kappa_params
+
+
+def test_fail_if_unsupported_kappa_params_rejects_kappa_in_start_params() -> None:
+ idx = pd.MultiIndex.from_tuples(
+ [("kappa", 0, "skill", "-")],
+ names=["category", "period", "name1", "name2"],
+ )
+ start = pd.DataFrame({"value": [0.3]}, index=idx)
+ with pytest.raises(NotImplementedError, match="kappa"):
+ fail_if_unsupported_kappa_params(start, None, None)
+
+
+def test_fail_if_unsupported_kappa_params_rejects_kappa_in_fixed_params() -> None:
+ idx = pd.MultiIndex.from_tuples(
+ [("kappa_t", 0, "skill", "-")],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed = pd.DataFrame({"value": [0.0]}, index=idx)
+ with pytest.raises(NotImplementedError):
+ fail_if_unsupported_kappa_params(None, fixed, None)
+
+
+def test_fail_if_unsupported_kappa_params_allows_standard_categories() -> None:
+ idx = pd.MultiIndex.from_tuples(
+ [("shock_sds", 0, "skill", "-"), ("investment_sds", 0, "inv", "-")],
+ names=["category", "period", "name1", "name2"],
+ )
+ start = pd.DataFrame({"value": [0.5, 0.5]}, index=idx)
+ # Must NOT raise.
+ fail_if_unsupported_kappa_params(start, None, None)
diff --git a/tests/conftest.py b/tests/conftest.py
index 89d6f081..3268d472 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,13 +1,40 @@
-"""Shared test fixtures and helpers."""
+"""Shared test fixtures and helpers.
-from dataclasses import replace
-from pathlib import Path
+Tests opt in to whole-package beartype via `beartype.claw.beartype_package`
+here so that annotation drift on *internal* helpers surfaces as a
+`BeartypeCallHintParamViolation` during the test run. The perimeter
+decorators (`skillmodels._beartype_conf`) keep raising project-specific
+exception classes for *user-facing* parameter violations; the claw-installed
+checks below are for everything in between.
-import pandas as pd
-import pytest
+`skillmodels.chs.qr` is skipped because it relies on JAX's `@custom_jvp`
+decorator, which beartype.claw wraps in a way that strips the
+`.defjvp` attribute that the second-stage `@qr_gpu.defjvp` decoration
+needs. No annotations in that module are user-facing.
+"""
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.test_data.model2 import MODEL2
+from beartype import BeartypeConf
+from beartype.claw import beartype_package
+
+# Mirror the perimeter conf's PEP-484 numeric tower so `int` satisfies
+# `float`-typed parameters. Without this every `value=1` call site
+# (e.g. `FixedConstraintWithValue(value=1)`) trips the claw checker.
+beartype_package(
+ "skillmodels",
+ conf=BeartypeConf(
+ is_pep484_tower=True,
+ claw_skip_package_names=("skillmodels.chs.qr",),
+ ),
+)
+
+from dataclasses import replace # noqa: E402
+from pathlib import Path # noqa: E402
+
+import pandas as pd # noqa: E402
+import pytest # noqa: E402
+
+from skillmodels.common.config import TEST_DATA_DIR # noqa: E402
+from skillmodels.test_data.model2 import MODEL2 # noqa: E402
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
diff --git a/tests/test_af_batching.py b/tests/test_af_batching.py
new file mode 100644
index 00000000..18681d5c
--- /dev/null
+++ b/tests/test_af_batching.py
@@ -0,0 +1,139 @@
+"""Tests for the AF memory-aware batching helpers."""
+
+import os
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pytest
+
+from skillmodels.af.batching import (
+ _DEFAULT_TARGET_BATCH_BYTES,
+ _ENV_VAR_TARGET,
+ auto_n_obs_per_batch,
+ target_batch_bytes,
+)
+from skillmodels.af.likelihood import _map_over_obs
+
+jax.config.update("jax_enable_x64", val=True)
+
+
+def _square_sum(x: jnp.ndarray) -> jnp.ndarray:
+ return jnp.sum(x**2)
+
+
+def _two_arg(x: jnp.ndarray, y: jnp.ndarray) -> jnp.ndarray:
+ return jnp.sum(x * y)
+
+
+@pytest.mark.parametrize("batch_size", [None, 1, 3, 7, 100])
+def test_map_over_obs_matches_vmap_for_every_batch_size(batch_size: int | None) -> None:
+ """The chunked ``_map_over_obs`` must match ``jax.vmap`` exactly."""
+ rng = np.random.default_rng(0)
+ xs = jnp.asarray(rng.normal(size=(20, 5)))
+
+ expected = jax.vmap(_square_sum)(xs)
+ actual = _map_over_obs(_square_sum, xs, n_obs_per_batch=batch_size)
+
+ # 1 ULP differences are allowed because `lax.map` may use a different
+ # reduction order than `vmap`.
+ np.testing.assert_allclose(
+ np.asarray(actual), np.asarray(expected), rtol=0, atol=1e-13
+ )
+
+
+@pytest.mark.parametrize("batch_size", [None, 1, 5])
+def test_map_over_obs_two_args(batch_size: int | None) -> None:
+ rng = np.random.default_rng(1)
+ xs = jnp.asarray(rng.normal(size=(15, 3)))
+ ys = jnp.asarray(rng.normal(size=(15, 3)))
+
+ expected = jax.vmap(_two_arg)(xs, ys)
+ actual = _map_over_obs(_two_arg, xs, ys, n_obs_per_batch=batch_size)
+
+ np.testing.assert_allclose(
+ np.asarray(actual), np.asarray(expected), rtol=0, atol=1e-14
+ )
+
+
+def test_map_over_obs_preserves_gradient() -> None:
+ """Reverse-mode gradient must not depend on the chunk size."""
+ rng = np.random.default_rng(2)
+ xs = jnp.asarray(rng.normal(size=(12, 4)))
+
+ def _loss(xs_flat: jnp.ndarray, batch: int | None) -> jnp.ndarray:
+ xs_r = xs_flat.reshape((12, 4))
+ return jnp.sum(_map_over_obs(_square_sum, xs_r, n_obs_per_batch=batch))
+
+ g_full = jax.grad(lambda x: _loss(x, None))(xs.reshape(-1))
+ g_chunked = jax.grad(lambda x: _loss(x, 3))(xs.reshape(-1))
+
+ np.testing.assert_allclose(
+ np.asarray(g_chunked), np.asarray(g_full), rtol=0, atol=1e-10
+ )
+
+
+def test_target_batch_bytes_default() -> None:
+ os.environ.pop(_ENV_VAR_TARGET, None)
+ assert target_batch_bytes() == _DEFAULT_TARGET_BATCH_BYTES
+
+
+def test_target_batch_bytes_env_override() -> None:
+ os.environ[_ENV_VAR_TARGET] = "1048576"
+ try:
+ assert target_batch_bytes() == 1_048_576
+ finally:
+ del os.environ[_ENV_VAR_TARGET]
+
+
+def test_target_batch_bytes_rejects_junk() -> None:
+ os.environ[_ENV_VAR_TARGET] = "not-a-number"
+ try:
+ assert target_batch_bytes() == _DEFAULT_TARGET_BATCH_BYTES
+ finally:
+ del os.environ[_ENV_VAR_TARGET]
+
+
+def test_auto_n_obs_per_batch_small_problem_uses_all() -> None:
+ """Tiny problems fit easily; the whole batch should run in one shot."""
+ batch = auto_n_obs_per_batch(
+ n_obs=100,
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ n_latent=2,
+ n_endogenous=0,
+ )
+ assert batch == 100
+
+
+def test_auto_n_obs_per_batch_large_problem_splits() -> None:
+ """Large problems need to be chunked; the result is smaller than n_obs."""
+ batch = auto_n_obs_per_batch(
+ n_obs=1403,
+ n_halton_points=20_000,
+ n_halton_points_shock=20_000,
+ n_latent=4,
+ n_endogenous=1,
+ )
+ assert 1 <= batch < 1403
+
+
+def test_auto_n_obs_per_batch_respects_target_bytes() -> None:
+ """A bigger budget should allow a larger batch (monotone in the budget)."""
+ small = auto_n_obs_per_batch(
+ n_obs=10_000,
+ n_halton_points=200,
+ n_halton_points_shock=50,
+ n_latent=2,
+ n_endogenous=1,
+ target_bytes=2**24,
+ )
+ large = auto_n_obs_per_batch(
+ n_obs=10_000,
+ n_halton_points=200,
+ n_halton_points_shock=50,
+ n_latent=2,
+ n_endogenous=1,
+ target_bytes=2**30,
+ )
+ assert small <= large
diff --git a/tests/test_af_equality_propagation.py b/tests/test_af_equality_propagation.py
new file mode 100644
index 00000000..624db627
--- /dev/null
+++ b/tests/test_af_equality_propagation.py
@@ -0,0 +1,241 @@
+"""Cross-period equality propagation in `estimate_af`.
+
+skane-struct-bw and similar applications impose equality constraints
+across aug-periods (e.g., shock_sds, transition coefficients constant
+within a stage, loadings/meas_sds constant across periods). AF's
+sequential MLE estimates each period independently and would silently
+violate those constraints; the new `constraints=` kwarg on
+`estimate_af` propagates equality groups by pinning every member of a
+group to whichever member is estimated first.
+
+These tests exercise the propagation directly via the helpers and
+end-to-end via a small synthetic T=3 fit.
+"""
+
+import functools
+
+import jax
+import numpy as np
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.af import AFEstimationOptions, estimate_af
+from skillmodels.af.estimate import (
+ _extract_equality_groups,
+ _propagate_equality_groups,
+)
+from skillmodels.af.types import AFPeriodResult
+from skillmodels.common.constraints import select_by_loc
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.process_model import process_model
+
+jax.config.update("jax_enable_x64", True)
+
+
+def _equality_constraint(loc: pd.MultiIndex) -> om.EqualityConstraint:
+ return om.EqualityConstraint(
+ selector=functools.partial(select_by_loc, loc=loc),
+ )
+
+
+def test_extract_equality_groups_returns_only_equality_constraints() -> None:
+ loc = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac1"), ("transition", 1, "fac1", "fac1")],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints: list[om.constraints.Constraint] = [
+ _equality_constraint(loc),
+ om.FixedConstraint(selector=functools.partial(select_by_loc, loc=loc)),
+ ]
+ groups = _extract_equality_groups(constraints)
+ assert len(groups) == 1
+ assert groups[0].equals(loc)
+
+
+def test_extract_equality_groups_handles_empty_input() -> None:
+ assert _extract_equality_groups(None) == []
+ assert _extract_equality_groups([]) == []
+
+
+def test_propagate_equality_groups_pins_other_periods() -> None:
+ period_0 = AFPeriodResult(
+ period=0,
+ params=pd.DataFrame(
+ {"value": [0.42]},
+ index=pd.MultiIndex.from_tuples(
+ [("shock_sds", 0, "skills", "-")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ ),
+ loglikelihood=-1.0,
+ success=True,
+ optimize_result=None,
+ )
+ group = pd.MultiIndex.from_tuples(
+ [
+ ("shock_sds", 0, "skills", "-"),
+ ("shock_sds", 1, "skills", "-"),
+ ("shock_sds", 2, "skills", "-"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_params = _propagate_equality_groups(
+ period_results=[period_0],
+ fixed_params=None,
+ equality_groups=[group],
+ )
+ assert fixed_params is not None
+ assert ("shock_sds", 1, "skills", "-") in fixed_params.index
+ assert ("shock_sds", 2, "skills", "-") in fixed_params.index
+ assert fixed_params.loc[("shock_sds", 1, "skills", "-"), "value"] == 0.42
+ assert fixed_params.loc[("shock_sds", 2, "skills", "-"), "value"] == 0.42
+
+
+def test_propagate_equality_groups_respects_existing_pins() -> None:
+ period_0 = AFPeriodResult(
+ period=0,
+ params=pd.DataFrame(
+ {"value": [0.42]},
+ index=pd.MultiIndex.from_tuples(
+ [("shock_sds", 0, "skills", "-")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ ),
+ loglikelihood=-1.0,
+ success=True,
+ optimize_result=None,
+ )
+ fixed_params_initial = pd.DataFrame(
+ {"value": [0.99]},
+ index=pd.MultiIndex.from_tuples(
+ [("shock_sds", 1, "skills", "-")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ group = pd.MultiIndex.from_tuples(
+ [("shock_sds", 0, "skills", "-"), ("shock_sds", 1, "skills", "-")],
+ names=["category", "period", "name1", "name2"],
+ )
+ out = _propagate_equality_groups(
+ period_results=[period_0],
+ fixed_params=fixed_params_initial,
+ equality_groups=[group],
+ )
+ assert out is not None
+ assert out.loc[("shock_sds", 1, "skills", "-"), "value"] == 0.99
+
+
+def _build_t3_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "state": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 3,
+ intercepts=({"y1": 0},) * 3,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _truth_params(model: ModelSpec) -> pd.DataFrame:
+ processed = process_model(model)
+ p_index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ df = pd.DataFrame({"value": np.zeros(len(p_index))}, index=p_index)
+ cat = df.index.get_level_values("category")
+ df.loc[cat == "loadings", "value"] = 1.0
+ df.loc[cat == "meas_sds", "value"] = 0.3
+ df.loc[cat == "shock_sds", "value"] = 0.4
+ df.loc[cat == "mixture_weights", "value"] = 1.0
+ for aug in range(2):
+ df.loc[("transition", aug, "state", "state"), "value"] = 0.8
+ df.loc[("transition", aug, "state", "constant"), "value"] = 0.0
+ diag_mask = pd.Series(
+ [
+ idx[0] == "initial_cholcovs"
+ and "-" in idx[3]
+ and idx[3].split("-")[0] == idx[3].split("-")[1]
+ for idx in df.index
+ ],
+ index=df.index,
+ )
+ df.loc[diag_mask, "value"] = 1.0
+ return df
+
+
+def _simulate_t3(
+ model: ModelSpec, params: pd.DataFrame, n_obs: int, seed: int
+) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ states: list[np.ndarray] = [rng.normal(0.0, 1.0, size=n_obs)]
+
+ def _val(loc: tuple) -> float:
+ return float(params.loc[loc, "value"])
+
+ for t in range(1, 3):
+ a = _val(("transition", t - 1, "state", "state"))
+ c = _val(("transition", t - 1, "state", "constant"))
+ sigma = _val(("shock_sds", t - 1, "state", "-"))
+ states.append(a * states[-1] + c + sigma * rng.normal(size=n_obs))
+ rows: list[dict] = []
+ for obs_id in range(n_obs):
+ for t in range(3):
+ row: dict[str, float | int] = {"caseid": obs_id, "period": t}
+ for k in (1, 2, 3):
+ meas = f"y{k}"
+ lam = _val(("loadings", t, meas, "state"))
+ eps = _val(("meas_sds", t, meas, "-"))
+ row[meas] = lam * states[t][obs_id] + eps * rng.normal()
+ rows.append(row)
+ return pd.DataFrame.from_records(rows).set_index(["caseid", "period"])
+
+
+@pytest.mark.end_to_end
+def test_estimate_af_enforces_equality_across_periods() -> None:
+ """Pinning shock_sds equal across periods makes the chain return one value."""
+ model = _build_t3_model()
+ params = _truth_params(model)
+ data = _simulate_t3(model, params, n_obs=300, seed=20260510)
+
+ af_options = AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ eq_loc = pd.MultiIndex.from_tuples(
+ [
+ ("shock_sds", 0, "state", "-"),
+ ("shock_sds", 1, "state", "-"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints: list[om.constraints.Constraint] = [_equality_constraint(eq_loc)]
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=af_options,
+ constraints=constraints,
+ )
+
+ def _val(period_idx: int, loc: tuple) -> float:
+ return float(result.period_results[period_idx].params.loc[loc, "value"])
+
+ period1_sd = _val(1, ("shock_sds", 0, "state", "-"))
+ period2_sd = _val(2, ("shock_sds", 1, "state", "-"))
+ assert period1_sd == pytest.approx(period2_sd, rel=1e-9)
diff --git a/tests/test_af_estimate.py b/tests/test_af_estimate.py
new file mode 100644
index 00000000..3f2be261
--- /dev/null
+++ b/tests/test_af_estimate.py
@@ -0,0 +1,2443 @@
+"""End-to-end tests for the AF estimator.
+
+Run AF estimation on MODEL2 test data and verify it produces reasonable
+results, comparing to the CHS Kalman filter estimates where applicable.
+"""
+
+from collections.abc import Callable
+from pathlib import Path
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.af import AFEstimationOptions, estimate_af
+from skillmodels.af.likelihood import (
+ _rebuild_chain_at_period,
+ af_loglike_transition,
+ af_per_obs_loglike_initial,
+)
+from skillmodels.af.transition_period import _update_conditional_distribution
+from skillmodels.af.types import ChainLink, ConditionalDistribution, MixtureComponent
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.decorators import register_params
+from skillmodels.common.individual_states import get_individual_states
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.test_data.model2 import MODEL2_CHS_OPTIONS
+
+jax.config.update("jax_enable_x64", True)
+
+REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
+
+
+@pytest.fixture
+def model2_data():
+ """Load the MODEL2 simulated dataset."""
+ data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
+ return data.set_index(["caseid", "period"])
+
+
+@pytest.fixture
+def model2_af():
+ """Create an AF-compatible 2-factor model from MODEL2.
+
+ Use fac1 (log_ces, 3 measures) and fac2 (linear, 3 measures).
+ Drop fac3 since it has measurements only in period 0.
+ Reduce to 3 periods for faster testing.
+ """
+ return ModelSpec(
+ factors={
+ "fac1": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 3,
+ intercepts=({"y1": 0},) * 3,
+ ),
+ transition_function="log_ces",
+ ),
+ "fac2": FactorSpec(
+ measurements=(("y4", "y5", "y6"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"y4": 1},) * 3,
+ intercepts=({"y4": 0},) * 3,
+ ),
+ transition_function="linear",
+ ),
+ },
+ controls=("x1",),
+ )
+
+
+@pytest.fixture
+def chs_params():
+ """Load CHS-estimated parameters from regression vault."""
+ params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
+ return params.set_index(["category", "period", "name1", "name2"])
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_runs_on_model2(model2_af, model2_data) -> None:
+ """Verify AF estimation runs to completion on MODEL2 data."""
+ af_options = AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(
+ model_spec=model2_af,
+ data=model2_data,
+ options=af_options,
+ )
+
+ # Basic checks
+ assert len(result.period_results) == 3
+ assert result.params is not None
+ assert len(result.params) > 0
+
+ # Check each period converged (or at least produced finite likelihood)
+ for pr in result.period_results:
+ assert np.isfinite(pr.loglikelihood), (
+ f"Period {pr.period}: non-finite log-likelihood {pr.loglikelihood}"
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_measurement_params_in_ballpark(
+ model2_af,
+ model2_data,
+ chs_params,
+) -> None:
+ """Verify AF measurement parameter estimates are in the same ballpark as CHS.
+
+ The two estimators use different methods, so exact agreement is not
+ expected. But measurement loadings and SDs should be roughly similar.
+ """
+ af_options = AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(
+ model_spec=model2_af,
+ data=model2_data,
+ options=af_options,
+ )
+
+ # Compare period 0 measurement SDs
+ af_meas_sds = result.params.query("category == 'meas_sds' and period == 0")
+ if len(af_meas_sds) > 0:
+ af_sd_values = af_meas_sds["value"].to_numpy()
+ # All SDs should be positive and not too extreme
+ assert (af_sd_values > 0).all(), "All measurement SDs should be positive"
+ assert (af_sd_values < 10).all(), (
+ "Measurement SDs should not be unreasonably large"
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_single_factor() -> None:
+ """Test AF estimation with a single-factor model (simplest case)."""
+ # Create minimal model: 1 factor, 3 measures, 2 periods
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * 2,
+ intercepts=({"m1": 0},) * 2,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+ # Generate simple synthetic data
+ rng = np.random.default_rng(42)
+ n_obs = 200
+ n_periods = 2
+
+ # True latent factor
+ theta = rng.normal(0, 1, n_obs)
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {
+ "caseid": i,
+ "period": t,
+ "m1": theta[i] + rng.normal(0, 0.3),
+ "m2": 0.5 + 0.8 * theta[i] + rng.normal(0, 0.4),
+ "m3": -0.2 + 1.2 * theta[i] + rng.normal(0, 0.35),
+ }
+ rows.append(row)
+
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ af_options = AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(model_spec=model, data=data, options=af_options)
+
+ assert len(result.period_results) == 2
+ assert np.isfinite(result.period_results[0].loglikelihood)
+
+ # Check that estimated loadings are roughly in the right direction
+ af_loadings = result.params.query("category == 'loadings' and period == 0")
+ if len(af_loadings) > 0:
+ # m1 loading on skill should be fixed at 1.0
+ # m2 loading should be roughly 0.8
+ # m3 loading should be roughly 1.2
+ for _, row in af_loadings.iterrows():
+ assert np.isfinite(row["value"]), "Loadings should be finite"
+
+
+@pytest.mark.end_to_end
+def test_af_vs_chs_measurement_params_agree() -> None:
+ """Verify AF and CHS produce similar measurement parameter estimates.
+
+ Simulate data from a known single-factor model and estimate with both
+ AF and CHS. Period-0 measurement loadings, intercepts, and error SDs
+ should agree within tolerance.
+ """
+ rng = np.random.default_rng(42)
+ n_obs = 500
+ n_periods = 2
+
+ # True DGP parameters
+ true_loadings = {"m1": 1.0, "m2": 0.8, "m3": 1.2}
+ true_intercepts = {"m1": 0.0, "m2": 0.5, "m3": -0.2}
+ true_meas_sds = {"m1": 0.3, "m2": 0.4, "m3": 0.35}
+
+ theta = rng.normal(0, 1, n_obs)
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "m1": true_intercepts["m1"]
+ + true_loadings["m1"] * theta[i]
+ + rng.normal(0, true_meas_sds["m1"]),
+ "m2": true_intercepts["m2"]
+ + true_loadings["m2"] * theta[i]
+ + rng.normal(0, true_meas_sds["m2"]),
+ "m3": true_intercepts["m3"]
+ + true_loadings["m3"] * theta[i]
+ + rng.normal(0, true_meas_sds["m3"]),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * n_periods,
+ intercepts=({"m1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+ # --- AF estimation ---
+ af_result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=50,
+ n_halton_points_shock=20,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+ af_p0 = af_result.period_results[0].params
+
+ # --- CHS estimation (naive start: all free params = 0.1) ---
+ chs_est = _run_chs_estimation(model, data)
+
+ # --- Compare period-0 measurement parameters ---
+ tol = 0.15 # generous tolerance for finite-sample differences
+
+ for meas in ("m2", "m3"):
+ af_load = float(
+ af_p0.loc[("loadings", 0, meas, "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_load = float(
+ chs_est.loc[("loadings", 0, meas, "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert abs(af_load - chs_load) < tol, (
+ f"loading({meas}): AF={af_load:.4f} vs CHS={chs_load:.4f}"
+ )
+
+ af_intercept = float(
+ af_p0.loc[("controls", 0, meas, "constant"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_intercept = float(
+ chs_est.loc[("controls", 0, meas, "constant"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert abs(af_intercept - chs_intercept) < tol, (
+ f"intercept({meas}): AF={af_intercept:.4f} vs CHS={chs_intercept:.4f}"
+ )
+
+ for meas in ("m1", "m2", "m3"):
+ af_sd = float(
+ af_p0.loc[("meas_sds", 0, meas, "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_sd = float(
+ chs_est.loc[("meas_sds", 0, meas, "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert abs(af_sd - chs_sd) < tol, (
+ f"meas_sd({meas}): AF={af_sd:.4f} vs CHS={chs_sd:.4f}"
+ )
+
+
+# ---------------------------------------------------------------------------
+# TDD tests for transition likelihood and parameter recovery
+# ---------------------------------------------------------------------------
+
+
+def _simulate_linear_transition_data(
+ *,
+ n_obs: int = 500,
+ n_periods: int = 3,
+ true_beta: float = 0.8,
+ true_constant: float = 0.1,
+ true_shock_sd: float = 0.3,
+ true_meas_sds: tuple[float, ...] = (0.3, 0.4, 0.35),
+ true_loadings: tuple[float, ...] = (1.0, 0.8, 1.2),
+ true_intercepts: tuple[float, ...] = (0.0, 0.5, -0.2),
+ seed: int = 42,
+) -> tuple[pd.DataFrame, dict[str, float]]:
+ """Simulate panel data from a single-factor linear transition model.
+
+ DGP: theta_{t+1} = constant + beta * theta_t + N(0, shock_sd^2).
+ Measurements: Z_{t,m} = intercept_m + loading_m * theta_t + noise.
+
+ Return tuple of (DataFrame indexed by (caseid, period), dict of true params).
+ """
+ rng = np.random.default_rng(seed)
+ theta = np.zeros((n_obs, n_periods))
+ theta[:, 0] = rng.normal(0, 1, n_obs)
+ for t in range(n_periods - 1):
+ theta[:, t + 1] = (
+ true_constant
+ + true_beta * theta[:, t]
+ + rng.normal(0, true_shock_sd, n_obs)
+ )
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {"caseid": i, "period": t}
+ for m_idx, meas_name in enumerate(("m1", "m2", "m3")):
+ row[meas_name] = (
+ true_intercepts[m_idx]
+ + true_loadings[m_idx] * theta[i, t]
+ + rng.normal(0, true_meas_sds[m_idx])
+ )
+ rows.append(row)
+
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+ true_params = {
+ "beta": true_beta,
+ "constant": true_constant,
+ "shock_sd": true_shock_sd,
+ }
+ return data, true_params
+
+
+def _make_linear_transition_model(n_periods: int = 3) -> ModelSpec:
+ """Create a single-factor linear transition model for testing."""
+ return ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * n_periods,
+ intercepts=({"m1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_transition_params_affect_likelihood() -> None:
+ """Verify that the transition likelihood depends on transition parameters.
+
+ If we run AF estimation with the transition function wired in correctly,
+ the estimated transition parameters should NOT be at their initial values.
+ The likelihood should be sensitive to transition parameter changes.
+ """
+ data, _true_params = _simulate_linear_transition_data(n_obs=300, n_periods=3)
+ model = _make_linear_transition_model(n_periods=3)
+
+ af_opts = AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(model_spec=model, data=data, options=af_opts)
+
+ # Period 1 result should have transition params
+ p1 = result.period_results[1].params
+ trans_params = p1.query("category == 'transition'")
+ assert len(trans_params) > 0, "Should have transition parameters in period 1"
+
+ # The transition params should NOT all be at their initialization value (0.1).
+ # If the transition function is actually used in the likelihood, the optimizer
+ # will move them away from 0.5 toward the true values.
+ trans_values = trans_params["value"].to_numpy()
+ init_values = np.full_like(trans_values, 0.5)
+ assert not np.allclose(trans_values, init_values, atol=0.01), (
+ f"Transition params stuck at init values: {trans_values}. "
+ "The transition function is not being used in the likelihood."
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_recovers_linear_transition_params() -> None:
+ """Verify AF recovers known linear transition parameters from synthetic data.
+
+ Simulate data with theta_{t+1} = 0.1 + 0.8 * theta_t + N(0, 0.3^2),
+ estimate with AF, and check that estimated beta and constant are close
+ to true values.
+ """
+ data, true_params = _simulate_linear_transition_data(n_obs=500, n_periods=3)
+ model = _make_linear_transition_model(n_periods=3)
+
+ af_opts = AFEstimationOptions(
+ n_halton_points=800,
+ n_halton_points_shock=20,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(model_spec=model, data=data, options=af_opts)
+
+ # Extract estimated transition params from period 1 (transition 0->1)
+ p1 = result.period_results[1].params
+
+ # For a linear transition with 1 factor "skill", params are:
+ # ("transition", 0, "skill", "skill") = beta
+ # ("transition", 0, "skill", "constant") = constant
+ est_beta = float(
+ p1.loc[("transition", 0, "skill", "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ est_constant = float(
+ p1.loc[("transition", 0, "skill", "constant"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ # Also check shock SD
+ est_shock_sd = float(
+ p1.loc[("shock_sds", 0, "skill", "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ tol = 0.25 # generous tolerance for quadrature-based estimation
+ assert abs(est_beta - true_params["beta"]) < tol, (
+ f"beta: estimated={est_beta:.4f}, true={true_params['beta']}"
+ )
+ assert abs(est_constant - true_params["constant"]) < tol, (
+ f"constant: estimated={est_constant:.4f}, true={true_params['constant']}"
+ )
+ assert abs(est_shock_sd - true_params["shock_sd"]) < tol, (
+ f"shock_sd: estimated={est_shock_sd:.4f}, true={true_params['shock_sd']}"
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_vs_chs_transition_params_agree() -> None:
+ """Verify AF and CHS transition parameter estimates are in the same ballpark.
+
+ Use the same synthetic DGP as the measurement params comparison test,
+ but now compare the transition parameters estimated by both methods.
+ """
+ data, _true_params = _simulate_linear_transition_data(n_obs=500, n_periods=3)
+ model = _make_linear_transition_model(n_periods=3)
+
+ # --- AF estimation ---
+ af_result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=40,
+ n_halton_points_shock=20,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ # --- CHS estimation (naive start: all free params = 0.1) ---
+ chs_est = _run_chs_estimation(model, data)
+
+ # --- Compare transition parameters ---
+ af_p1 = af_result.period_results[1].params
+
+ af_beta = float(
+ af_p1.loc[("transition", 0, "skill", "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ af_constant = float(
+ af_p1.loc[("transition", 0, "skill", "constant"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ af_shock = float(
+ af_p1.loc[("shock_sds", 0, "skill", "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ chs_beta = float(
+ chs_est.loc[("transition", 0, "skill", "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_constant = float(
+ chs_est.loc[("transition", 0, "skill", "constant"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_shock = float(
+ chs_est.loc[("shock_sds", 0, "skill", "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ tol = 0.3 # generous: different methods, different # periods used
+ assert abs(af_beta - chs_beta) < tol, (
+ f"beta: AF={af_beta:.4f} vs CHS={chs_beta:.4f}"
+ )
+ assert abs(af_constant - chs_constant) < tol, (
+ f"constant: AF={af_constant:.4f} vs CHS={chs_constant:.4f}"
+ )
+ assert abs(af_shock - chs_shock) < tol, (
+ f"shock_sd: AF={af_shock:.4f} vs CHS={chs_shock:.4f}"
+ )
+
+
+def _run_chs_estimation(
+ model: ModelSpec,
+ data: pd.DataFrame,
+) -> pd.DataFrame:
+ """Run CHS estimation with uninformed but feasible start values.
+
+ Use generic defaults that don't favour either estimator: loadings = 1,
+ controls = 0, SDs = 0.5, transition = 0.5, initial_states = 0.
+ Probability constraints are satisfied (equal shares).
+ """
+ max_inputs = get_maximization_inputs(model, data, chs_options=MODEL2_CHS_OPTIONS)
+ params = max_inputs["params_template"].copy()
+ free = params["lower_bound"] != params["upper_bound"]
+ cat = params.index.get_level_values("category")
+ params.loc[free, "value"] = 0.5
+ params.loc[free & (cat == "loadings"), "value"] = 1.0
+ params.loc[free & (cat == "controls"), "value"] = 0.0
+ params.loc[free & (cat == "initial_states"), "value"] = 0.0
+ # Probability constraints must be satisfied at start params
+ for constr in max_inputs["constraints"]:
+ if isinstance(constr, om.ProbabilityConstraint):
+ prob_idx = constr.selector(params[["value"]]).index
+ params.loc[prob_idx, "value"] = 1.0 / len(prob_idx)
+
+ def _neg_ll_and_grad(p: pd.DataFrame) -> tuple[float, np.ndarray]:
+ val, grad = max_inputs["loglike_and_gradient"](p)
+ return -float(val), -np.array(grad)
+
+ return om.minimize(
+ fun=lambda p: -max_inputs["loglike"](p),
+ params=params[["value"]],
+ algorithm="scipy_lbfgsb",
+ bounds=om.Bounds(lower=params["lower_bound"], upper=params["upper_bound"]),
+ constraints=max_inputs["constraints"],
+ fun_and_jac=_neg_ll_and_grad,
+ ).params
+
+
+@pytest.mark.long_running
+def test_af_vs_chs_both_estimated_on_model2(model2_af, model2_data) -> None:
+ """Run both AF and CHS optimisation on MODEL2 data and compare estimates.
+
+ This test actually optimises both estimators (not just loading stored
+ params), so it takes a while. Skipped in CI via the long_running marker.
+ """
+ chs_est = _run_chs_estimation(model2_af, model2_data)
+
+ # --- AF estimation ---
+ af_result = estimate_af(
+ model_spec=model2_af,
+ data=model2_data,
+ options=AFEstimationOptions(
+ n_halton_points=60,
+ n_halton_points_shock=30,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ # --- Compare period-0 measurement params ---
+ af_p0 = af_result.period_results[0].params
+ meas_tol = 0.5 # generous: different estimators, AF uses 3 periods
+
+ for meas, fac in [("y2", "fac1"), ("y3", "fac1"), ("y5", "fac2"), ("y6", "fac2")]:
+ af_val = float(
+ af_p0.loc[("loadings", 0, meas, fac), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_val = float(
+ chs_est.loc[("loadings", 0, meas, fac), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert np.isfinite(af_val), f"AF loading({meas},{fac}) not finite"
+ assert np.isfinite(chs_val), f"CHS loading({meas},{fac}) not finite"
+ assert abs(af_val - chs_val) < meas_tol, (
+ f"loading({meas},{fac}): AF={af_val:.4f} vs CHS={chs_val:.4f}"
+ )
+
+ # --- Compare transition params (period 0->1) ---
+ af_p1 = af_result.period_results[1].params
+ trans_tol = 0.5
+
+ # fac2 linear: self-productivity
+ af_fac2_self = float(
+ af_p1.loc[("transition", 0, "fac2", "fac2"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ chs_fac2_self = float(
+ chs_est.loc[("transition", 0, "fac2", "fac2"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert abs(af_fac2_self - chs_fac2_self) < trans_tol, (
+ f"fac2 self-prod: AF={af_fac2_self:.4f} vs CHS={chs_fac2_self:.4f}"
+ )
+
+ # All transition params should be finite
+ af_trans = af_p1.query("category == 'transition'")
+ assert af_trans["value"].apply(np.isfinite).all(), (
+ f"Non-finite AF transition params:\n{af_trans}"
+ )
+
+ # AF transition params should NOT be stuck at initialisation
+ trans_values = af_trans["value"].to_numpy()
+ assert not np.allclose(trans_values, 0.5, atol=0.01), (
+ "AF transition params stuck at init values"
+ )
+
+ # --- Print comparison for manual inspection ---
+ print("\n\nMODEL2: AF vs CHS (both estimated)")
+ print("=" * 70)
+ print(f"{'Parameter':40s} {'AF':>10s} {'CHS':>10s}")
+ print("-" * 70)
+ for idx, row in af_trans.iterrows():
+ ix = tuple(idx) # ty: ignore[invalid-argument-type]
+ chs_loc = ("transition", ix[1], ix[2], ix[3])
+ chs_v = (
+ float(chs_est.loc[chs_loc, "value"])
+ if chs_loc in chs_est.index
+ else float("nan")
+ )
+ print(
+ f" trans {ix[2]:6s} {ix[3]:12s} {row['value']:10.4f} {chs_v:10.4f}"
+ )
+ af_shocks = af_p1.query("category == 'shock_sds'")
+ for idx, row in af_shocks.iterrows():
+ ix = tuple(idx) # ty: ignore[invalid-argument-type]
+ chs_loc = ("shock_sds", ix[1], ix[2], ix[3])
+ chs_v = (
+ float(chs_est.loc[chs_loc, "value"])
+ if chs_loc in chs_est.index
+ else float("nan")
+ )
+ print(f" shock {ix[2]:19s} {row['value']:10.4f} {chs_v:10.4f}")
+ print("-" * 70)
+
+
+# ---------------------------------------------------------------------------
+# Investment equation tests
+# ---------------------------------------------------------------------------
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_with_endogenous_factor() -> None:
+ """Verify AF estimation works with an endogenous (investment) factor.
+
+ DGP:
+ theta_{t+1} = 0.6 * theta_t + 0.3 * I_t + 0.05 + eta
+ (log_ces-like, but linear for simplicity)
+ I_t = 0.5 * theta_t + 0.2 * Y_t + eps_I
+ Skill measures: Z^s_{t,m} = intercept + loading * theta_t + noise
+ Investment measures: Z^I_{t,m} = intercept + loading * I_t + noise
+ """
+ rng = np.random.default_rng(123)
+ n_obs, n_periods = 400, 3
+
+ # True parameters
+ true_beta_skill = 0.6 # theta on theta
+ true_beta_inv = 0.3 # investment on theta_next
+ true_trans_constant = 0.05
+ true_shock_sd = 0.3
+ true_inv_beta0 = 0.0 # investment intercept
+ true_inv_beta_theta = 0.5 # investment depends on skill
+ true_inv_beta_y = 0.2 # investment depends on income
+ true_inv_sd = 0.25
+
+ # Simulate
+ theta = np.zeros((n_obs, n_periods))
+ inv = np.zeros((n_obs, n_periods))
+ income = rng.normal(1.0, 0.5, n_obs) # exogenous, time-invariant
+ theta[:, 0] = rng.normal(0, 1, n_obs)
+ inv[:, 0] = (
+ true_inv_beta0
+ + true_inv_beta_theta * theta[:, 0]
+ + true_inv_beta_y * income
+ + rng.normal(0, true_inv_sd, n_obs)
+ )
+ for t in range(n_periods - 1):
+ theta[:, t + 1] = (
+ true_trans_constant
+ + true_beta_skill * theta[:, t]
+ + true_beta_inv * inv[:, t]
+ + rng.normal(0, true_shock_sd, n_obs)
+ )
+ if t + 1 < n_periods:
+ inv[:, t + 1] = (
+ true_inv_beta0
+ + true_inv_beta_theta * theta[:, t + 1]
+ + true_inv_beta_y * income
+ + rng.normal(0, true_inv_sd, n_obs)
+ )
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ # Skill measures
+ "s1": theta[i, t] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.8 * theta[i, t] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i, t] + rng.normal(0, 0.4),
+ # Investment measures
+ "i1": inv[i, t] + rng.normal(0, 0.3),
+ "i2": 0.2 + 0.9 * inv[i, t] + rng.normal(0, 0.35),
+ "i3": -0.1 + 1.2 * inv[i, t] + rng.normal(0, 0.4),
+ # Exogenous variable
+ "income": income[i],
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ "investment": FactorSpec(
+ measurements=(("i1", "i2", "i3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"i1": 1},) * n_periods,
+ intercepts=({"i1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ observed_factors=("income",),
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ # Basic checks: estimation ran, produced results for all periods
+ assert len(result.period_results) == n_periods
+ for pr in result.period_results:
+ assert np.isfinite(pr.loglikelihood), (
+ f"Period {pr.period}: non-finite loglik {pr.loglikelihood}"
+ )
+
+ # Period 1 should have investment equation parameters
+ p1 = result.period_results[1].params
+ inv_eq = p1.query("category == 'investment_eq'")
+ assert len(inv_eq) > 0, (
+ "No investment_eq parameters found — endogenous factor not wired"
+ )
+
+ # Investment equation params should not be stuck at init
+ inv_eq_values = inv_eq["value"].to_numpy()
+ assert not np.allclose(inv_eq_values, 0.5, atol=0.05), (
+ f"Investment eq params stuck at init: {inv_eq_values}"
+ )
+
+
+def test_prev_period_inv_meas_does_not_affect_transition_loglik_gradient() -> None:
+ """Guard inv-prev-meas invariance of the AF transition-step gradient.
+
+ Inv-type measurements at the previous period must not contribute to
+ the gradient of `af_loglike_transition` w.r.t. current-step parameters.
+ MATLAB's reference AF likelihood (`AF_Application_One_Normal_Translog.m`,
+ `create_nodes_weights_12`) evaluates inv-type measurements exactly once,
+ at the step where the inv is generated as a current-period measurement.
+ They are deliberately omitted from the chained-sample importance weight
+ at the next transition step (`prod_inv` is commented out in the MATLAB
+ source). Re-evaluating them would be wrong: the chained sample carries
+ forward only state factors, so the previous step's inv value is no
+ longer available; evaluating prev-period inv measurements against the
+ *current* step's freshly-drawn inv would be a wrong-value comparison.
+
+ The Python port restricts the prev-meas factor to state-factor
+ loadings only (using `state_factor_indices_in_latent` to slice the
+ columns). This test guards against future refactors that re-introduce
+ a parameter-dependent contribution from inv-loading rows at the
+ previous period: it perturbs only the inv-meas columns of
+ `prev_measurements` and asserts the gradient w.r.t. all current-step
+ parameters is unchanged.
+ """
+ rng = np.random.default_rng(20260507)
+ n_obs = 5
+ n_state = 1
+ n_endog = 1
+ n_obs_factors = 0
+ n_measures = 2 # 1 skill + 1 inv at current period
+ n_prev_measures = 2 # 1 skill + 1 inv at prev period
+ n_controls = 1 # constant
+ n_halton = 3
+ n_components = 1
+
+ # Loading masks: row 0 = skill meas (loads on factor 0=skills), row 1 =
+ # inv meas (loads on factor 1=investment). Both at current and prev.
+ loading_mask = jnp.array([[True, False], [False, True]])
+ prev_loading_mask = jnp.array([[True, False], [False, True]])
+
+ measurements = jnp.array(rng.normal(size=(n_obs, n_measures)))
+ controls = jnp.ones((n_obs, n_controls))
+ prev_measurements_a = jnp.array(rng.normal(size=(n_obs, n_prev_measures)))
+ # Perturb ONLY the inv-meas column (index 1) at the previous period.
+ inv_perturbation = jnp.array(rng.normal(size=n_obs))
+ prev_measurements_b = prev_measurements_a.at[:, 1].set( # noqa: PD008
+ prev_measurements_a[:, 1] + inv_perturbation
+ )
+ prev_controls = jnp.ones((n_obs, n_controls))
+
+ # Prev-period measurement-system parameters (held fixed at the
+ # transition step in production -- they were estimated previously).
+ prev_loadings_flat = jnp.array([1.0, 1.0])
+ prev_control_params = jnp.zeros((n_prev_measures, n_controls))
+ prev_meas_sds = jnp.array([0.5, 0.4])
+
+ # Period-0 Schur-conditional payload: per-obs cond_means and per-component
+ # cond_chols (for the joint-Halton chain rebuild scheme).
+ cond_means = jnp.array(rng.normal(size=(n_components, n_obs, n_state)))
+ cond_chols = jnp.array([[[0.5]], [[0.4]]])
+ cond_weights = jnp.ones((n_obs, n_components))
+ prev_distribution = {
+ "cond_weights": cond_weights,
+ "cond_means": cond_means,
+ "cond_chols": cond_chols,
+ }
+
+ # No prior chain (this is the 0->1 step). Joint Halton dim:
+ # n_state (z_state) + 0 prior steps + (n_shock + n_endog) current step.
+ chain_links: tuple = ()
+ obs_factor_values_chain = jnp.zeros((n_obs, 0, n_obs_factors))
+ joint_nodes = jnp.array(rng.normal(size=(n_halton, n_state + n_state + n_endog)))
+ joint_weights = jnp.full(n_halton, 1.0 / n_halton)
+
+ def transition_func(full_states: jax.Array, params: jax.Array) -> jax.Array:
+ # Linear: theta_t = a * theta_prev + b * inv + c. Returns shape (n_state,).
+ return jnp.array(
+ [params[0] * full_states[0] + params[1] * full_states[1] + params[2]]
+ )
+
+ total_n_transition_params = 3
+ n_inv_eq_params_per = 1 + n_state + n_obs_factors
+ total_n_inv_params = n_endog * n_inv_eq_params_per
+
+ # Param vector layout matches `_parse_transition_params`: 3 transition
+ # params, 1 shock sd, 2 inv_eq params, 1 inv sd, 2 control params, 2
+ # loadings, 2 meas sds = 13 entries total.
+ params_value = jnp.array(
+ [
+ 0.6,
+ 0.3,
+ 0.1,
+ 0.4,
+ 0.0,
+ 0.5,
+ 0.2,
+ 0.0,
+ 0.0,
+ 1.0,
+ 1.0,
+ 0.3,
+ 0.3,
+ ]
+ )
+
+ state_factor_indices_in_latent = jnp.array([0], dtype=jnp.int32)
+ shock_factor_indices = jnp.array([0], dtype=jnp.int32)
+ obs_factor_values = jnp.zeros((n_obs, n_obs_factors))
+
+ def _ll(prev_meas: jax.Array, params: jax.Array) -> jax.Array:
+ return af_loglike_transition(
+ params,
+ n_state_factors=n_state,
+ n_endogenous_factors=n_endog,
+ n_measures=n_measures,
+ n_controls=n_controls,
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ prev_measurements=prev_meas,
+ prev_controls=prev_controls,
+ prev_loading_mask=prev_loading_mask,
+ prev_control_params=prev_control_params,
+ prev_loadings_flat=prev_loadings_flat,
+ prev_meas_sds=prev_meas_sds,
+ prev_distribution=prev_distribution,
+ chain_links=chain_links,
+ obs_factor_values_chain=obs_factor_values_chain,
+ joint_nodes=joint_nodes,
+ joint_weights=joint_weights,
+ transition_func=transition_func,
+ total_n_transition_params=total_n_transition_params,
+ total_n_inv_params=total_n_inv_params,
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ observed_factor_values=obs_factor_values,
+ stability_floor=1e-300,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ n_shock_factors=1,
+ shock_factor_indices=shock_factor_indices,
+ )
+
+ def loglike_a(params: jax.Array) -> jax.Array:
+ return _ll(prev_measurements_a, params)
+
+ def loglike_b(params: jax.Array) -> jax.Array:
+ return _ll(prev_measurements_b, params)
+
+ grad_a = jax.grad(loglike_a)(params_value)
+ grad_b = jax.grad(loglike_b)(params_value)
+
+ np.testing.assert_allclose(np.asarray(grad_a), np.asarray(grad_b), atol=1e-10)
+
+ # Sanity: with a non-zero perturbation, the inv-row residuals do change,
+ # so the loglik *value* itself differs (by a per-obs constant). That
+ # difference must NOT be zero -- otherwise the test isn't actually
+ # exercising the inv-loading rows.
+ val_a = float(loglike_a(params_value))
+ val_b = float(loglike_b(params_value))
+ assert not np.isclose(val_a, val_b), (
+ "Test sanity failure: perturbing prev inv-meas changed nothing -- "
+ "the test isn't exercising the inv-loading rows."
+ )
+
+
+def test_rebuild_chain_at_period_matches_python_forward_pass() -> None:
+ """Unit test for `_rebuild_chain_at_period`.
+
+ Hand-code a 2-step linear chain (1 state factor, 1 endog factor, 1
+ observed factor) and assert the helper's output matches a Python
+ forward pass to numerical precision. Catches index/reshape bugs in
+ the chain-rebuild helper independently of the integrand.
+ """
+ rng = np.random.default_rng(20260507)
+ n_state = 1
+ n_endog = 1
+ n_obs_factors = 1
+ n_inv_eq_params_per = 1 + n_state + n_obs_factors
+
+ # Two prior chain steps (so we're computing θ_0 → θ_1 → θ_2).
+ z_state = jnp.asarray(rng.normal(size=n_state))
+ z_inv_per_step = jnp.asarray(rng.normal(size=(2, n_endog)))
+ z_shock_per_step = jnp.asarray(rng.normal(size=(2, n_state)))
+
+ initial_mean = jnp.asarray(rng.normal(size=n_state))
+ initial_chol = jnp.asarray([[0.7]])
+
+ obs_factor_values_per_step = jnp.asarray(rng.normal(size=(2, n_obs_factors)))
+
+ # Linear "transition": theta_next = a * theta + b * inv + c * obs + d.
+ # Wrap as the f(full_states, params) signature used in production.
+ def make_transition_func() -> Callable[[jax.Array, jax.Array], jax.Array]:
+ def fn(full_states: jax.Array, params: jax.Array) -> jax.Array:
+ a, b, c, d = params[0], params[1], params[2], params[3]
+ return jnp.array(
+ [a * full_states[0] + b * full_states[1] + c * full_states[2] + d]
+ )
+
+ return fn
+
+ transition_func = make_transition_func()
+
+ link_1 = ChainLink(
+ period=1,
+ transition_func=transition_func,
+ transition_params=jnp.array([0.6, 0.3, 0.05, 0.1]),
+ shock_sds=jnp.array([0.4]),
+ shock_factor_indices=jnp.array([0], dtype=jnp.int32),
+ inv_eq_params=jnp.array([0.0, 0.5, 0.2]), # intercept, beta_skills, beta_inc
+ inv_sds=jnp.array([0.25]),
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ obs_factor_values=jnp.zeros((1, n_obs_factors)), # unused by helper
+ )
+ link_2 = ChainLink(
+ period=2,
+ transition_func=transition_func,
+ transition_params=jnp.array([0.5, 0.4, 0.0, 0.2]),
+ shock_sds=jnp.array([0.3]),
+ shock_factor_indices=jnp.array([0], dtype=jnp.int32),
+ inv_eq_params=jnp.array([0.05, 0.6, 0.3]),
+ inv_sds=jnp.array([0.15]),
+ n_inv_eq_params_per=n_inv_eq_params_per,
+ obs_factor_values=jnp.zeros((1, n_obs_factors)),
+ )
+ chain_links = (link_1, link_2)
+
+ # Hand-coded forward pass.
+ theta_0 = initial_mean + initial_chol @ z_state
+ for step_idx, link in enumerate(chain_links):
+ z_inv = z_inv_per_step[step_idx]
+ z_shock = z_shock_per_step[step_idx]
+ obs_y = obs_factor_values_per_step[step_idx]
+ beta = link.inv_eq_params # (intercept, beta_skills, beta_inc)
+ inv_val = (
+ beta[0]
+ + beta[1] * theta_0[0]
+ + beta[2] * obs_y[0]
+ + (link.inv_sds[0] * z_inv[0])
+ )
+ inv = jnp.array([inv_val])
+ full = jnp.concatenate([theta_0, inv, obs_y])
+ theta_next_det = transition_func(full, link.transition_params) # ty: ignore[invalid-argument-type]
+ theta_0 = theta_next_det + jnp.array([link.shock_sds[0] * z_shock[0]])
+ expected = theta_0 # θ at the last link's target period
+
+ actual = _rebuild_chain_at_period(
+ z_state=z_state,
+ z_inv_per_step=z_inv_per_step,
+ z_shock_per_step=z_shock_per_step,
+ initial_mean=initial_mean,
+ initial_chol=initial_chol,
+ chain_links=chain_links,
+ obs_factor_values_at_obs_per_step=obs_factor_values_per_step,
+ n_state_factors=n_state,
+ n_endogenous_factors=n_endog,
+ )
+ np.testing.assert_allclose(np.asarray(actual), np.asarray(expected), atol=1e-12)
+
+
+def test_rebuild_chain_at_period_empty_chain_returns_period_0() -> None:
+ """Verify the empty-chain (0->1) path of `_rebuild_chain_at_period`.
+
+ With no chain links, the helper just returns
+ ``initial_mean + initial_chol @ z_state``.
+ """
+ rng = np.random.default_rng(7)
+ n_state = 2
+ z_state = jnp.asarray(rng.normal(size=n_state))
+ initial_mean = jnp.asarray(rng.normal(size=n_state))
+ initial_chol = jnp.asarray([[0.5, 0.0], [0.1, 0.4]])
+ expected = initial_mean + initial_chol @ z_state
+
+ actual = _rebuild_chain_at_period(
+ z_state=z_state,
+ z_inv_per_step=jnp.zeros((0, 1)),
+ z_shock_per_step=jnp.zeros((0, n_state)),
+ initial_mean=initial_mean,
+ initial_chol=initial_chol,
+ chain_links=(),
+ obs_factor_values_at_obs_per_step=jnp.zeros((0, 0)),
+ n_state_factors=n_state,
+ n_endogenous_factors=1,
+ )
+ np.testing.assert_allclose(np.asarray(actual), np.asarray(expected), atol=1e-14)
+
+
+def test_af_joint_halton_recovers_sigma_prod_argmax() -> None: # noqa: PLR0915
+ """Catch regression to split-Halton: sigma_prod recovery on synthetic translog.
+
+ With all params except sigma_prod_0 pinned at the truth, the per-obs mean
+ log-likelihood at sigma_prod=truth must beat sigma_prod ≈ truth/4 by at least
+ 1.0 nat per obs. Under the buggy split-Halton scheme the argmax sat
+ near sigma ≈ truth/4 with truth being WORSE; under the joint-Halton fix
+ the argmax aligns with truth. The empirical joint-vs-split gap on
+ the MATLAB sim was ~2.5 nats per obs (see
+ ``sim_repro/debug_joint_halton.py`` and
+ ``obsidian/Professional/skillmodels/sigma-prod-collapse-2026-05-07.md``);
+ 1.0 nat is generous headroom that still flags any return to split.
+
+ The test calls ``af_loglike_transition`` directly with hand-built
+ kwargs on a tiny synthetic translog DGP (1 state factor, 1 endog
+ factor, 1 observed factor), so it isolates the integrand from the
+ optimizer and runs in ~10s.
+ """
+ rng = np.random.default_rng(20260508)
+ n_obs = 200
+ n_halton = 500
+ n_state = 1
+ n_endog = 1
+ n_obs_factors = 1
+ n_inv_eq_params_per = 1 + n_state + n_obs_factors
+
+ # MATLAB-translog truth values (from set_parameters in
+ # AF_Simulations_Translog.m), restricted to one state factor.
+ a_true = 0.9283
+ sigma_t_true = 0.5125 # log(skills) coef in translog
+ gamma_t_true = 0.6113 # log(inv) coef
+ delta_t_true = -0.0175 # cross coef
+ sigma_p_true = 0.36
+ sigma_i_true = 0.10
+ beta_skills_true = 0.10
+ beta_inc_true = 0.90
+
+ # Mixture truth (matches MATLAB sim): two components on (skills, log_inc).
+ p_a_true = 0.62
+ mu_a = jnp.array([-4.0, -2.0]) # (skills, log_inc)
+ cov_a = jnp.array([[0.62, 0.035], [0.035, 0.056]])
+ mu_b = jnp.array([6.0, 3.0])
+ cov_b = jnp.array([[0.83, 0.17], [0.17, 1.28]])
+
+ # Period-0 measurement system (3 skill measures).
+ lam_skills_0 = jnp.array([1.0, 0.36, 0.56])
+ sd_skills_0 = jnp.array([0.68, 0.03, 0.08])
+ # Period-1 measurement system: 3 skill measures + 3 inv measures.
+ lam_skills_1 = jnp.array([1.0, 0.66, 1.18])
+ sd_skills_1 = jnp.array([0.51, 0.12, 0.19])
+ lam_inv_1 = jnp.array([1.0, 0.84, 0.79])
+ sd_inv_1 = jnp.array([0.15, 0.39, 0.47])
+
+ # Forward simulation of one panel.
+ u = rng.uniform(size=n_obs)
+ is_a = (u < p_a_true).astype(np.float64)
+
+ def _draw_2d(mu: jax.Array, cov: jax.Array, n: int) -> np.ndarray:
+ chol = np.linalg.cholesky(np.asarray(cov))
+ z = rng.normal(size=(n, 2))
+ return np.asarray(mu)[None, :] + z @ chol.T
+
+ draw_a = _draw_2d(mu_a, cov_a, n_obs)
+ draw_b = _draw_2d(mu_b, cov_b, n_obs)
+ skills_0 = is_a * draw_a[:, 0] + (1 - is_a) * draw_b[:, 0]
+ log_inc = is_a * draw_a[:, 1] + (1 - is_a) * draw_b[:, 1]
+
+ # Period-0 data: z_skills_0 = lam * skills_0 + meas_noise.
+ z_skills_0 = (
+ np.asarray(lam_skills_0)[None, :] * skills_0[:, None]
+ + rng.normal(size=(n_obs, 3)) * np.asarray(sd_skills_0)[None, :]
+ )
+
+ # Period-0->1 transition: inv_0 = beta_sk*skills_0 + beta_inc*log_inc + sd_I*z.
+ inv_0_true = (
+ beta_skills_true * skills_0
+ + beta_inc_true * log_inc
+ + rng.normal(size=n_obs) * sigma_i_true
+ )
+ skills_1 = (
+ a_true
+ + sigma_t_true * skills_0
+ + gamma_t_true * inv_0_true
+ + delta_t_true * skills_0 * inv_0_true
+ + rng.normal(size=n_obs) * sigma_p_true
+ )
+ z_skills_1 = (
+ np.asarray(lam_skills_1)[None, :] * skills_1[:, None]
+ + rng.normal(size=(n_obs, 3)) * np.asarray(sd_skills_1)[None, :]
+ )
+ z_inv_1 = (
+ np.asarray(lam_inv_1)[None, :] * inv_0_true[:, None]
+ + rng.normal(size=(n_obs, 3)) * np.asarray(sd_inv_1)[None, :]
+ )
+
+ # Period-0 cond-distribution payload (Schur conditional given log_inc).
+ def _schur(mu_2d: jax.Array, cov_2d: jax.Array) -> tuple[jax.Array, jax.Array]:
+ # skills given log_inc: cond_mean (per obs) and cond_chol (scalar).
+ sigma_skills_inc = cov_2d[0, 1]
+ var_inc = cov_2d[1, 1]
+ var_cond = cov_2d[0, 0] - sigma_skills_inc**2 / var_inc
+ cond_chol = jnp.sqrt(var_cond)
+ cond_means = mu_2d[0] + (sigma_skills_inc / var_inc) * (
+ jnp.asarray(log_inc) - mu_2d[1]
+ )
+ return cond_means.reshape(n_obs, 1), jnp.asarray([[cond_chol]])
+
+ cond_mean_a, cond_chol_a = _schur(mu_a, cov_a)
+ cond_mean_b, cond_chol_b = _schur(mu_b, cov_b)
+ cond_means = jnp.stack([cond_mean_a, cond_mean_b], axis=0)
+ cond_chols = jnp.stack([cond_chol_a, cond_chol_b], axis=0)
+
+ # Per-obs Bayes posterior weights from the marginal Y density.
+ def _log_marg_y(mu: jax.Array, cov: jax.Array) -> jax.Array:
+ var_y = cov[1, 1]
+ return (
+ -0.5 * jnp.log(2 * jnp.pi * var_y)
+ - 0.5 * (jnp.asarray(log_inc) - mu[1]) ** 2 / var_y
+ )
+
+ log_w_a = jnp.log(p_a_true) + _log_marg_y(mu_a, cov_a)
+ log_w_b = jnp.log(1.0 - p_a_true) + _log_marg_y(mu_b, cov_b)
+ log_w = jnp.stack([log_w_a, log_w_b], axis=-1)
+ cond_weights = jax.nn.softmax(log_w, axis=-1)
+
+ prev_distribution = {
+ "cond_weights": cond_weights,
+ "cond_means": cond_means,
+ "cond_chols": cond_chols,
+ }
+
+ # Period-1 measurement loadings: 6 measures in order (skill_1, skill_2,
+ # skill_3, inv_1, inv_2, inv_3) -- skill measures load on factor 0
+ # (skills), inv measures load on factor 1 (investment).
+ n_measures = 6
+ measurements = jnp.concatenate(
+ [jnp.asarray(z_skills_1), jnp.asarray(z_inv_1)], axis=1
+ )
+ loading_mask = jnp.array(
+ [
+ [True, False],
+ [True, False],
+ [True, False],
+ [False, True],
+ [False, True],
+ [False, True],
+ ]
+ )
+ loadings_flat_curr = jnp.concatenate([lam_skills_1, lam_inv_1])
+ meas_sds_curr = jnp.concatenate([sd_skills_1, sd_inv_1])
+
+ # Period-0 measurement system (prev) -- 3 skill measures.
+ n_prev_measures = 3
+ prev_measurements = jnp.asarray(z_skills_0)
+ prev_loading_mask = jnp.array([[True, False]] * 3)
+ prev_loadings_flat = lam_skills_0
+ prev_meas_sds = sd_skills_0
+
+ # No controls (zeros).
+ n_controls = 1 # constant
+ controls = jnp.ones((n_obs, 1))
+ prev_controls = jnp.ones((n_obs, 1))
+
+ obs_factor_values = jnp.asarray(log_inc).reshape(n_obs, 1)
+
+ # Transition function: log-translog (matches MATLAB sim).
+ def transition_func(full_states: jax.Array, params: jax.Array) -> jax.Array:
+ # full_states = [theta, inv, log_inc]; params = [lin_skills, lin_inv,
+ # lin_inc, sq_skills, sq_inv, sq_inc, inter_skills_inv,
+ # inter_skills_inc, inter_inv_inc, constant].
+ skills = full_states[0]
+ inv = full_states[1]
+ return jnp.array(
+ [
+ params[9]
+ + params[0] * skills
+ + params[1] * inv
+ + params[6] * skills * inv
+ ]
+ )
+
+ total_n_transition_params = 10
+ n_per_inv = n_inv_eq_params_per
+ total_n_inv_params = n_endog * n_per_inv
+
+ state_factor_indices_in_latent = jnp.array([0], dtype=jnp.int32)
+ shock_factor_indices = jnp.array([0], dtype=jnp.int32)
+
+ # Param vector layout: transition (10) + shock_sds (1) + inv_eq (3) +
+ # inv_sds (1) + control_params (n_measures*n_controls=6) + loadings (6)
+ # + meas_sds (6) = 33.
+ transition_params_truth = jnp.array(
+ [
+ sigma_t_true,
+ gamma_t_true,
+ 0.0, # lin coef on log_inc
+ 0.0,
+ 0.0,
+ 0.0, # squares
+ delta_t_true, # skills * inv
+ 0.0,
+ 0.0, # other interactions
+ a_true,
+ ]
+ )
+ inv_eq_params_truth = jnp.array([0.0, beta_skills_true, beta_inc_true])
+
+ def _build_params(sigma_p: float) -> jax.Array:
+ return jnp.concatenate(
+ [
+ transition_params_truth,
+ jnp.array([sigma_p]),
+ inv_eq_params_truth,
+ jnp.array([sigma_i_true]),
+ jnp.zeros(n_measures * n_controls), # control intercepts
+ loadings_flat_curr,
+ meas_sds_curr,
+ ]
+ )
+
+ def _ll(sigma_p: float) -> float:
+ params_value = _build_params(sigma_p)
+ neg_mean = af_loglike_transition(
+ params_value,
+ n_state_factors=n_state,
+ n_endogenous_factors=n_endog,
+ n_measures=n_measures,
+ n_controls=n_controls,
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ prev_measurements=prev_measurements,
+ prev_controls=prev_controls,
+ prev_loading_mask=prev_loading_mask,
+ prev_control_params=jnp.zeros((n_prev_measures, n_controls)),
+ prev_loadings_flat=prev_loadings_flat,
+ prev_meas_sds=prev_meas_sds,
+ prev_distribution=prev_distribution,
+ chain_links=(),
+ obs_factor_values_chain=jnp.zeros((n_obs, 0, n_obs_factors)),
+ joint_nodes=jnp.array(
+ np.random.default_rng(1).normal(
+ size=(n_halton, n_state + n_state + n_endog)
+ )
+ ),
+ joint_weights=jnp.full(n_halton, 1.0 / n_halton),
+ transition_func=transition_func,
+ total_n_transition_params=total_n_transition_params,
+ total_n_inv_params=total_n_inv_params,
+ n_inv_eq_params_per=n_per_inv,
+ observed_factor_values=obs_factor_values,
+ stability_floor=1e-300,
+ state_factor_indices_in_latent=state_factor_indices_in_latent,
+ n_shock_factors=1,
+ shock_factor_indices=shock_factor_indices,
+ )
+ # Convert from neg-mean back to per-obs mean ll.
+ return float(-neg_mean)
+
+ sigma_truth = sigma_p_true
+ sigma_wrong = 0.09 # well below truth (= truth / 4)
+ ll_truth = _ll(sigma_truth)
+ ll_wrong = _ll(sigma_wrong)
+ gap = ll_truth - ll_wrong
+ assert gap > 1.0, (
+ f"Joint-Halton sigma_prod recovery REGRESSED: ll(truth={sigma_truth})="
+ f"{ll_truth:.4f} should beat ll(wrong={sigma_wrong})={ll_wrong:.4f} by "
+ f"at least 1.0 nat per obs but gap is only {gap:.4f}. The empirical "
+ f"joint-vs-split gap on the MATLAB translog sim was ~2.5 nats; a gap "
+ f"below 1.0 here suggests the AF likelihood has reverted to the split-"
+ f"Halton scheme that biases sigma_prod toward 0."
+ )
+
+
+def test_af_joint_halton_recovers_sigma_prod_with_chain_link() -> None: # noqa: PLR0915
+ """As above, but exercise a 1→2 step where ``chain_links`` is non-empty.
+
+ For the 0→1 step the joint Halton dim is just `n_state + n_shock +
+ n_endog` and the joint-vs-split distinction is subtle (no prior
+ chain to bridge). For 1→2 steps the joint Halton couples z_state +
+ prior chain shocks + current shocks all in one sequence — that's
+ where MATLAB's working scheme actually outperforms split Halton.
+
+ This test runs `estimate_af` end-to-end on a tiny synthetic translog
+ DGP through periods 0, 1, 2, then verifies the period-2 (= 1→2)
+ estimated sigma_prod_1 is within 35% of truth. Under split Halton
+ this parameter collapses toward 0; under joint Halton it recovers
+ near truth (0.42 in the MATLAB sim). The 35% threshold (vs split-
+ Halton's ~100% collapse) clearly separates the two regimes while
+ absorbing JAX numerical-determinism differences across CI vs local
+ hardware that nudged the recovered estimate from ~28% to ~31% on
+ the same fixed seed.
+ """
+ pytest.importorskip("optimagic")
+ rng = np.random.default_rng(20260509)
+ n_obs = 300
+ n_periods = 3
+
+ # MATLAB-translog truths.
+ a_t = (0.9283, 0.9536)
+ sigma_t_arr = (0.5125, 0.7295)
+ gamma_t_arr = (0.6113, 0.2814)
+ delta_t_arr = (-0.0175, -0.0024)
+ sigma_p_arr = (0.36, 0.42)
+ sigma_i_arr = (0.10, 0.10)
+ beta_skills = (0.10, 0.10)
+ beta_inc = (0.90, 0.90)
+ lam_skills = (
+ np.array([1.0, 0.36, 0.56]),
+ np.array([1.0, 0.66, 1.18]),
+ np.array([1.0, 0.19, 0.50]),
+ )
+ sd_skills = (
+ np.array([0.68, 0.03, 0.08]),
+ np.array([0.51, 0.12, 0.19]),
+ np.array([0.14, 0.03, 0.15]),
+ )
+ lam_inv = (np.array([1.0, 0.84, 0.79]),) * 2
+ sd_inv = (np.array([0.15, 0.39, 0.47]),) * 2
+
+ # Initial mixture (matches MATLAB).
+ p_a = 0.62
+ mu_a = np.array([-4.0, -2.0])
+ cov_a = np.array([[0.62, 0.035], [0.035, 0.056]])
+ mu_b = np.array([6.0, 3.0])
+ cov_b = np.array([[0.83, 0.17], [0.17, 1.28]])
+
+ u = rng.uniform(size=n_obs)
+ is_a = (u < p_a).astype(np.float64)
+ chol_a = np.linalg.cholesky(cov_a)
+ chol_b = np.linalg.cholesky(cov_b)
+ z_init = rng.normal(size=(n_obs, 2))
+ draw_a = mu_a[None, :] + z_init @ chol_a.T
+ draw_b = mu_b[None, :] + z_init @ chol_b.T
+ skills = np.zeros((n_obs, n_periods))
+ skills[:, 0] = is_a * draw_a[:, 0] + (1 - is_a) * draw_b[:, 0]
+ log_inc = is_a * draw_a[:, 1] + (1 - is_a) * draw_b[:, 1]
+ inv = np.zeros((n_obs, n_periods - 1))
+ for t in range(n_periods - 1):
+ inv[:, t] = (
+ beta_skills[t] * skills[:, t]
+ + beta_inc[t] * log_inc
+ + rng.normal(size=n_obs) * sigma_i_arr[t]
+ )
+ skills[:, t + 1] = (
+ a_t[t]
+ + sigma_t_arr[t] * skills[:, t]
+ + gamma_t_arr[t] * inv[:, t]
+ + delta_t_arr[t] * skills[:, t] * inv[:, t]
+ + rng.normal(size=n_obs) * sigma_p_arr[t]
+ )
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {
+ "caseid": int(i),
+ "period": int(t),
+ "skill_1": lam_skills[t][0] * skills[i, t]
+ + rng.normal() * sd_skills[t][0],
+ "skill_2": lam_skills[t][1] * skills[i, t]
+ + rng.normal() * sd_skills[t][1],
+ "skill_3": lam_skills[t][2] * skills[i, t]
+ + rng.normal() * sd_skills[t][2],
+ "log_income": float(log_inc[i]),
+ }
+ if 1 <= t <= 2:
+ inv_t_idx = t - 1
+ row["inv_1"] = (
+ lam_inv[inv_t_idx][0] * inv[i, inv_t_idx]
+ + rng.normal() * sd_inv[inv_t_idx][0]
+ )
+ row["inv_2"] = (
+ lam_inv[inv_t_idx][1] * inv[i, inv_t_idx]
+ + rng.normal() * sd_inv[inv_t_idx][1]
+ )
+ row["inv_3"] = (
+ lam_inv[inv_t_idx][2] * inv[i, inv_t_idx]
+ + rng.normal() * sd_inv[inv_t_idx][2]
+ )
+ else:
+ row["inv_1"] = np.nan
+ row["inv_2"] = np.nan
+ row["inv_3"] = np.nan
+ rows.append(row)
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ skill_normalisations = Normalizations(
+ loadings=({"skill_1": 1.0},) * n_periods,
+ intercepts=({"skill_1": 0.0},) * n_periods,
+ )
+ inv_normalisations = Normalizations(
+ loadings=({}, {"inv_1": 1.0}, {"inv_1": 1.0}),
+ intercepts=({}, {"inv_1": 0.0}, {"inv_1": 0.0}),
+ )
+
+ model = ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("skill_1", "skill_2", "skill_3"),) * n_periods,
+ normalizations=skill_normalisations,
+ transition_function="translog",
+ ),
+ "investment": FactorSpec(
+ measurements=(
+ (),
+ ("inv_1", "inv_2", "inv_3"),
+ ("inv_1", "inv_2", "inv_3"),
+ ),
+ normalizations=inv_normalisations,
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ observed_factors=("log_income",),
+ n_mixtures=2,
+ )
+
+ # Pin everything except sigma_prod_0 / sigma_prod_1 at MATLAB truth.
+ truth_extras: list[tuple[tuple[str, int, str, str], float]] = [
+ (("transition", 0, "skills", "constant"), a_t[0]),
+ (("transition", 0, "skills", "skills"), sigma_t_arr[0]),
+ (("transition", 0, "skills", "investment"), gamma_t_arr[0]),
+ (("transition", 0, "skills", "skills * investment"), delta_t_arr[0]),
+ (("transition", 1, "skills", "constant"), a_t[1]),
+ (("transition", 1, "skills", "skills"), sigma_t_arr[1]),
+ (("transition", 1, "skills", "investment"), gamma_t_arr[1]),
+ (("transition", 1, "skills", "skills * investment"), delta_t_arr[1]),
+ # Pin sigma_prod_0 at truth so we can isolate sigma_prod_1.
+ (("shock_sds", 0, "skills", "-"), sigma_p_arr[0]),
+ (("investment_eq", 0, "investment", "skills"), beta_skills[0]),
+ (("investment_eq", 0, "investment", "log_income"), beta_inc[0]),
+ (("investment_eq", 0, "investment", "constant"), 0.0),
+ (("investment_eq", 1, "investment", "skills"), beta_skills[1]),
+ (("investment_eq", 1, "investment", "log_income"), beta_inc[1]),
+ (("investment_eq", 1, "investment", "constant"), 0.0),
+ (("investment_sds", 0, "investment", "-"), sigma_i_arr[0]),
+ (("investment_sds", 1, "investment", "-"), sigma_i_arr[1]),
+ ]
+ # Pin all squares + log_income terms in translog to 0.
+ for t in range(n_periods - 1):
+ for fac in ("skills", "investment", "log_income"):
+ truth_extras.append((("transition", t, "skills", f"{fac} ** 2"), 0.0))
+ truth_extras.append((("transition", t, "skills", "log_income"), 0.0))
+ for cross in ("skills * log_income", "investment * log_income"):
+ truth_extras.append((("transition", t, "skills", cross), 0.0))
+
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [r[0] for r in truth_extras],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_params = pd.DataFrame(
+ {"value": [r[1] for r in truth_extras]}, index=fixed_idx
+ )
+
+ truth_df = pd.DataFrame({"value": [v for _, v in truth_extras]}, index=fixed_idx)
+
+ af_opts = AFEstimationOptions(
+ n_halton_points=200,
+ n_halton_points_shock=200,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=af_opts,
+ fixed_params=fixed_params,
+ start_params=truth_df,
+ )
+ p2 = result.period_results[2].params
+ sigma_prod_1_est = float(
+ p2.loc[("shock_sds", 1, "skills", "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ rel_err = abs(sigma_prod_1_est - sigma_p_arr[1]) / sigma_p_arr[1]
+ assert rel_err < 0.35, (
+ f"sigma_prod_1 estimate {sigma_prod_1_est:.4f} is more than 35% off truth "
+ f"{sigma_p_arr[1]:.4f} (rel error {rel_err:.2%}). Suggests joint-Halton "
+ f"chain rebuild has regressed and sigma_prod is collapsing toward 0."
+ )
+
+
+# ---------------------------------------------------------------------------
+# Posterior states tests
+# ---------------------------------------------------------------------------
+
+
+@pytest.mark.end_to_end
+def test_af_get_individual_states() -> None:
+ """Verify get_individual_states works with AF results.
+
+ Run AF on a simple single-factor model, then call get_individual_states
+ with the AF result. Check the returned DataFrame has the right shape,
+ columns, and reasonable values.
+ """
+ data, _true_params = _simulate_linear_transition_data(n_obs=200, n_periods=3)
+ model = _make_linear_transition_model(n_periods=3)
+
+ af_result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ result = get_individual_states(data=data, result=af_result)
+
+ # Should have unanchored_states
+ assert "unanchored_states" in result
+ states_df = result["unanchored_states"]["states"]
+
+ # DataFrame should have id, period, and factor columns
+ assert "period" in states_df.columns
+ assert "skill" in states_df.columns
+
+ # One row per individual per period
+ n_obs = 200
+ n_periods = 3
+ assert len(states_df) == n_obs * n_periods
+
+ # Values should be finite
+ assert states_df["skill"].apply(np.isfinite).all()
+
+ # State estimates should have non-trivial variance (not all the same)
+ assert states_df["skill"].std() > 0.1
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_with_translog() -> None:
+ """Verify AF estimation runs with a translog transition function.
+
+ Simulate from a linear DGP but estimate with translog — translog nests
+ linear (squares and interactions zero), so estimation should still
+ converge to a finite likelihood and recover the linear coefficient
+ roughly. With one factor there are only 3 translog params: beta, beta^2,
+ constant.
+ """
+ data, _true_params = _simulate_linear_transition_data(n_obs=300, n_periods=3)
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * 3,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * 3,
+ intercepts=({"m1": 0},) * 3,
+ ),
+ transition_function="translog",
+ ),
+ },
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ assert len(result.period_results) == 3
+ for pr in result.period_results:
+ assert np.isfinite(pr.loglikelihood), (
+ f"Period {pr.period}: non-finite loglik {pr.loglikelihood}"
+ )
+
+ # Period 1 should have 3 translog transition params: skill, skill ** 2, constant
+ p1 = result.period_results[1].params
+ trans = p1.query("category == 'transition'")
+ param_names = set(trans.index.get_level_values("name2"))
+ assert {"skill", "skill ** 2", "constant"}.issubset(param_names), (
+ f"Expected translog params skill, skill ** 2, constant; got {param_names}"
+ )
+
+ # Linear coefficient should be recovered roughly (true beta = 0.8).
+ # Tolerance is wide because translog overfits with squared term.
+ est_beta = float(
+ p1.loc[("transition", 0, "skill", "skill"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert abs(est_beta - 0.8) < 0.4, (
+ f"translog skill coefficient: got {est_beta:.3f}, expected ≈ 0.8"
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_joint_initial_distribution_with_observed_factor() -> None:
+ """Verify the joint (latent, observed) initial distribution is estimated.
+
+ When observed factors are specified, the initial period estimator models
+ the joint (latent, observed) distribution and conditions Halton draws on
+ observed values per the Schur complement (Antweiler & Freyberger 2025).
+
+ This test constructs data with a latent skill strongly correlated with
+ observed income, runs AF, and verifies:
+ - The estimated initial_states includes an entry for the observed factor.
+ - The recovered mean of the observed factor is close to its sample mean.
+ - The covariance between latent and observed has the expected sign.
+ """
+ rng = np.random.default_rng(2026)
+ n_obs, n_periods = 400, 2
+ true_corr = 0.7 # strong latent-observed correlation
+
+ # Jointly simulate skill and income with specified correlation
+ z = rng.multivariate_normal(
+ mean=[0.0, 1.0],
+ cov=[[1.0, true_corr * 0.5], [true_corr * 0.5, 0.25]],
+ size=n_obs,
+ )
+ theta = z[:, 0]
+ income = z[:, 1]
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "s1": theta[i] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.9 * theta[i] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i] + rng.normal(0, 0.4),
+ "income": income[i],
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ observed_factors=("income",),
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=40,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ p0 = result.period_results[0].params
+
+ # initial_states must now include an entry for the observed factor
+ income_mean_loc = ("initial_states", 0, "mixture_0", "income")
+ assert income_mean_loc in p0.index, (
+ "initial_states should include the observed factor 'income'"
+ )
+ est_income_mean = float(p0.loc[income_mean_loc, "value"]) # ty: ignore[invalid-argument-type]
+ sample_income_mean = float(income.mean())
+ assert abs(est_income_mean - sample_income_mean) < 0.15, (
+ f"Estimated income mean {est_income_mean:.3f} far from sample "
+ f"{sample_income_mean:.3f}."
+ )
+
+ # Cross-covariance entry (skill-income) should reflect the positive
+ # correlation in the DGP; stored as lower-triangular Cholesky with
+ # factor ordering (latent, observed).
+ cross_loc = ("initial_cholcovs", 0, "mixture_0", "income-skill")
+ assert cross_loc in p0.index, (
+ "Cross Cholesky entry between skill and income should be present"
+ )
+ # For a 2x2 joint Cholesky with positive cross-cov, the (1,0) entry
+ # should be positive.
+ cross_val = float(p0.loc[cross_loc, "value"]) # ty: ignore[invalid-argument-type]
+ assert cross_val > 0.05, (
+ f"Expected positive skill-income covariance; got Cholesky[1,0]={cross_val:.3f}"
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_fixed_params_pins_time_invariant_latent() -> None:
+ """Verify fixed_params pins MC-style time-invariant latent factors.
+
+ Construct a 2-factor model where `mc` is time-invariant and `skill`
+ evolves linearly. Pin mc's transitions to identity and its shock SD
+ to a near-zero floor (same convention CHS uses for augmented periods).
+ After estimation, the pinned parameters must equal the input values
+ exactly (not optimized away).
+ """
+ rng = np.random.default_rng(7)
+ n_obs, n_periods = 300, 3
+ mc = rng.normal(0, 1, n_obs)
+ theta = np.zeros((n_obs, n_periods))
+ theta[:, 0] = rng.normal(0, 1, n_obs)
+ for t in range(n_periods - 1):
+ theta[:, t + 1] = 0.7 * theta[:, t] + 0.2 * mc + rng.normal(0, 0.3, n_obs)
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {
+ "caseid": i,
+ "period": t,
+ "s1": theta[i, t] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.9 * theta[i, t] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i, t] + rng.normal(0, 0.4),
+ }
+ if t == 0:
+ row["m1"] = mc[i] + rng.normal(0, 0.3)
+ row["m2"] = 0.2 + 0.8 * mc[i] + rng.normal(0, 0.35)
+ row["m3"] = -0.1 + 1.1 * mc[i] + rng.normal(0, 0.4)
+ rows.append(row)
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ "mc": FactorSpec(
+ measurements=(("m1", "m2", "m3"), (), ()),
+ normalizations=Normalizations(
+ loadings=({"m1": 1}, {}, {}),
+ intercepts=({"m1": 0}, {}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+ # Pin mc to identity transition + floor shock SD across both
+ # transition periods (0 and 1).
+ fixed_entries: list[tuple[tuple[str, int, str, str], float]] = []
+ for t in (0, 1):
+ for reg in ("skill", "mc", "constant"):
+ fixed_entries.append(
+ (("transition", t, "mc", reg), 1.0 if reg == "mc" else 0.0)
+ )
+ fixed_entries.append((("shock_sds", t, "mc", "-"), 0.001))
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [e[0] for e in fixed_entries],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [e[1] for e in fixed_entries]}, index=fixed_idx)
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ fixed_params=fixed_df,
+ )
+
+ for t_trans in (0, 1):
+ p_t = result.period_results[t_trans + 1].params
+ for reg in ("skill", "mc", "constant"):
+ expected = 1.0 if reg == "mc" else 0.0
+ val = float(
+ p_t.loc[("transition", t_trans, "mc", reg), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert val == expected, (
+ f"mc transition period {t_trans}, regressor {reg}: "
+ f"expected {expected}, got {val}"
+ )
+ sd = float(
+ p_t.loc[("shock_sds", t_trans, "mc", "-"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert sd == 0.001, f"mc shock_sd period {t_trans}: {sd} (expected 0.001)"
+
+
+def _make_three_factor_log_ces_model(
+ n_periods: int,
+) -> tuple[ModelSpec, pd.DataFrame]:
+ """Build a 3-factor model with log_ces on fac1 and simulated data.
+
+ fac1 is produced via CES from (fac1, fac2, fac3). In the DGP we mute
+ fac3's contribution so tests can recover the pinning without fighting a
+ strong signal from that factor.
+ """
+ rng = np.random.default_rng(17)
+ n_obs = 250
+
+ fac1 = np.zeros((n_obs, n_periods))
+ fac2 = np.zeros((n_obs, n_periods))
+ fac3 = np.zeros((n_obs, n_periods))
+ fac1[:, 0] = rng.normal(0.5, 0.2, n_obs)
+ fac2[:, 0] = rng.normal(0.5, 0.2, n_obs)
+ fac3[:, 0] = rng.normal(0.0, 0.2, n_obs)
+ for t in range(n_periods - 1):
+ fac1[:, t + 1] = 0.4 * fac1[:, t] + 0.6 * fac2[:, t] + rng.normal(0, 0.1, n_obs)
+ fac2[:, t + 1] = 0.9 * fac2[:, t] + rng.normal(0, 0.1, n_obs)
+ fac3[:, t + 1] = fac3[:, t]
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "y1": fac1[i, t] + rng.normal(0, 0.1),
+ "y2": 0.5 + 0.8 * fac1[i, t] + rng.normal(0, 0.12),
+ "y3": -0.2 + 1.1 * fac1[i, t] + rng.normal(0, 0.1),
+ "y4": fac2[i, t] + rng.normal(0, 0.1),
+ "y5": 0.2 + 0.9 * fac2[i, t] + rng.normal(0, 0.12),
+ "y6": -0.1 + 1.1 * fac2[i, t] + rng.normal(0, 0.1),
+ "y7": fac3[i, t] + rng.normal(0, 0.1),
+ "y8": 0.1 + 0.9 * fac3[i, t] + rng.normal(0, 0.12),
+ "y9": -0.1 + 1.0 * fac3[i, t] + rng.normal(0, 0.1),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "fac1": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * n_periods,
+ intercepts=({"y1": 0},) * n_periods,
+ ),
+ transition_function="log_ces",
+ ),
+ "fac2": FactorSpec(
+ measurements=(("y4", "y5", "y6"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"y4": 1},) * n_periods,
+ intercepts=({"y4": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ "fac3": FactorSpec(
+ measurements=(("y7", "y8", "y9"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"y7": 1},) * n_periods,
+ intercepts=({"y7": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+ return model, data
+
+
+@pytest.mark.end_to_end
+def test_af_log_ces_with_cross_factor_gamma_fixed_at_zero() -> None:
+ """Fix gamma_fac3 = 0 in a log_ces transition and run AF end-to-end.
+
+ Before the probability-constraint + fixed-params support was added, this
+ combination raised `InvalidConstraintError` because optimagic refused
+ any fix inside a ProbabilityConstraint selector. Now the fold helper
+ removes gamma_fac3 from the selector and the remaining two gammas are
+ optimised on the simplex summing to one.
+ """
+ model, data = _make_three_factor_log_ces_model(n_periods=2)
+
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac3")],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [0.0]}, index=fixed_idx)
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ fixed_params=fixed_df,
+ )
+
+ p_t = result.period_results[1].params
+ gamma_fac1 = float(
+ p_t.loc[("transition", 0, "fac1", "fac1"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ gamma_fac2 = float(
+ p_t.loc[("transition", 0, "fac1", "fac2"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ gamma_fac3 = float(
+ p_t.loc[("transition", 0, "fac1", "fac3"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ assert gamma_fac3 == 0.0
+ assert np.isclose(gamma_fac1 + gamma_fac2, 1.0, atol=1e-6)
+ assert gamma_fac1 > 0.0
+ assert gamma_fac2 > 0.0
+
+
+@pytest.mark.end_to_end
+def test_af_log_ces_with_cross_factor_gamma_fixed_at_nonzero() -> None:
+ """Fix gamma_fac3 = 0.2; verify remaining gammas sum to 0.8 at the optimum."""
+ model, data = _make_three_factor_log_ces_model(n_periods=2)
+
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac3")],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [0.2]}, index=fixed_idx)
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ fixed_params=fixed_df,
+ )
+
+ p_t = result.period_results[1].params
+ gamma_fac1 = float(
+ p_t.loc[("transition", 0, "fac1", "fac1"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ gamma_fac2 = float(
+ p_t.loc[("transition", 0, "fac1", "fac2"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ gamma_fac3 = float(
+ p_t.loc[("transition", 0, "fac1", "fac3"), "value"] # ty: ignore[invalid-argument-type]
+ )
+
+ assert gamma_fac3 == 0.2
+ assert np.isclose(gamma_fac1 + gamma_fac2, 0.8, atol=1e-6)
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_tolerates_nan_measurements() -> None:
+ """NaN entries in measurement columns must not poison AF gradients.
+
+ Real panels routinely have missing values; the AF likelihood masks
+ them out at the per-observation level so each observation contributes
+ only its non-missing measurements to the log-pdf sum.
+ """
+ rng = np.random.default_rng(2026)
+ n_obs, n_periods = 400, 2
+
+ z = rng.multivariate_normal(
+ mean=[0.0, 1.0],
+ cov=[[1.0, 0.35], [0.35, 0.25]],
+ size=n_obs,
+ )
+ theta = z[:, 0]
+ income = z[:, 1]
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {
+ "caseid": i,
+ "period": t,
+ "s1": theta[i] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.9 * theta[i] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i] + rng.normal(0, 0.4),
+ "income": income[i],
+ }
+ # Sprinkle ~10% NaN into s2 across both periods.
+ if rng.random() < 0.10:
+ row["s2"] = np.nan
+ rows.append(row)
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+ assert data["s2"].isna().any(), "test setup should inject NaN measurements"
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ observed_factors=("income",),
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+ for pr in result.period_results:
+ assert pr.success, f"Period {pr.period} failed with NaN measurements"
+ assert np.isfinite(pr.loglikelihood)
+
+
+@pytest.mark.end_to_end
+def test_af_estimate_with_register_params_user_transition() -> None:
+ """AF must accept `@register_params`-decorated user transition functions.
+
+ User-defined transition functions take individual factor arguments
+ plus a `params` dict; AF's per-period likelihood passes a packed
+ state vector and a flat parameter slice. Without the bridging
+ wrapper in `_get_raw_transition_functions`, callers that supply
+ custom transitions (e.g. `skane-struct-bw`) raise TypeError at the
+ first transition-step call.
+ """
+
+ @register_params(params=["constant", "skill"])
+ def f_skill(skill: jax.Array, params: dict[str, float]) -> jax.Array:
+ return params["constant"] + params["skill"] * skill
+
+ rng = np.random.default_rng(2026)
+ n_obs, n_periods = 300, 3
+ theta = rng.normal(0, 1, (n_obs, n_periods))
+ for t in range(1, n_periods):
+ theta[:, t] = 0.1 + 0.8 * theta[:, t - 1] + rng.normal(0, 0.4, n_obs)
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "s1": theta[i, t] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.9 * theta[i, t] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i, t] + rng.normal(0, 0.4),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function=f_skill,
+ ),
+ },
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+ for pr in result.period_results:
+ assert pr.success, f"Period {pr.period} failed"
+ assert np.isfinite(pr.loglikelihood)
+
+
+def test_af_result_to_numpy_materialises_and_drops_samples_per_component() -> None:
+ """`AFEstimationResult.to_numpy()` produces a numpy-only, pickle-friendly copy.
+
+ `estimate_af` itself leaves arrays on-device so the JAX/XLA
+ compilation cache can be reused across repeated calls (e.g. inside
+ a Monte Carlo sweep). Callers that need host residency -- pickling,
+ plotting, sending across processes -- must invoke `to_numpy()`,
+ which:
+
+ * drops `samples_per_component` (per-period `(n_halton, n_obs,
+ n_state)` importance buffers, multi-GB at realistic sizes), and
+ * materialises every `jax.Array` in the result
+ (`MixtureComponent.mean`, `chol_cov`,
+ `ConditionalDistribution.cond_means`, `cond_chols`,
+ `conditional_weights`, `mixture_weights`, and the arrays inside
+ every `ChainLink`) as `np.ndarray`. JAX arrays bind to GPU
+ memory; without `to_numpy()`, pickling the result triggers a
+ GPU→host materialisation inside `__reduce__` that routinely OOMs
+ on a device still holding JIT caches.
+ """
+ rng = np.random.default_rng(2026)
+ n_obs, n_periods = 200, 2
+ theta = rng.normal(0, 1, (n_obs, n_periods))
+ for t in range(1, n_periods):
+ theta[:, t] = 0.1 + 0.8 * theta[:, t - 1] + rng.normal(0, 0.4, n_obs)
+
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "s1": theta[i, t] + rng.normal(0, 0.3),
+ "s2": 0.3 + 0.9 * theta[i, t] + rng.normal(0, 0.35),
+ "s3": -0.1 + 1.1 * theta[i, t] + rng.normal(0, 0.4),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("s1", "s2", "s3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"s1": 1},) * n_periods,
+ intercepts=({"s1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ ).to_numpy()
+
+ def _assert_numpy(arr: object, label: str) -> None:
+ if arr is None:
+ return
+ assert isinstance(arr, np.ndarray), (
+ f"{label} should be a numpy ndarray, got {type(arr).__name__}"
+ )
+
+ for cd in result.conditional_distributions:
+ assert cd.samples_per_component == (), (
+ "samples_per_component should be cleared before returning"
+ )
+ _assert_numpy(cd.mixture_weights, "mixture_weights")
+ _assert_numpy(cd.conditional_weights, "conditional_weights")
+ _assert_numpy(cd.cond_means, "cond_means")
+ _assert_numpy(cd.cond_chols, "cond_chols")
+ for component in cd.components:
+ _assert_numpy(component.mean, "MixtureComponent.mean")
+ _assert_numpy(component.chol_cov, "MixtureComponent.chol_cov")
+ for cl in cd.chain_links:
+ _assert_numpy(cl.transition_params, "ChainLink.transition_params")
+ _assert_numpy(cl.shock_sds, "ChainLink.shock_sds")
+ _assert_numpy(cl.shock_factor_indices, "ChainLink.shock_factor_indices")
+ _assert_numpy(cl.inv_eq_params, "ChainLink.inv_eq_params")
+ _assert_numpy(cl.inv_sds, "ChainLink.inv_sds")
+ _assert_numpy(cl.obs_factor_values, "ChainLink.obs_factor_values")
+
+
+def test_af_initial_loglike_is_joint_density_of_measurements_and_observed_factors() -> ( # noqa: PLR0915
+ None
+):
+ """Pin the joint estimand f(Z_theta,0, Y_0), not the conditional f(Z|Y).
+
+ With observed factors present, the initial-period per-obs log-likelihood
+ must equal `log p(Y_i) + log_integral` (the JOINT density). If a future
+ change subtracts `log p(Y_i)` to switch to the conditional MLE, the first
+ assertion fails. Cross-checked against a plain-numpy single-component
+ computation of the marginal-Y density and the quadrature integral.
+ """
+ n_factors = 2 # 1 latent + 1 observed
+ n_latent = 1
+ n_mixture_components = 1
+ n_measures = 2
+ n_controls = 1
+
+ # Mixture mean (mu_theta, mu_y) and lower-tri Cholesky of the 2x2 joint
+ # covariance in tril order [L00, L10, L11].
+ mu_theta, mu_y = 0.5, -0.3
+ chol_l00, chol_l10, chol_l11 = 1.2, 0.4, 0.9
+
+ control_params = [0.1, -0.2] # (n_measures, n_controls) flat
+ loadings = [1.0, 0.8] # both measures load on the single latent factor
+ meas_sds = [0.5, 0.6]
+
+ params = jnp.array(
+ [
+ 1.0, # mixture_weights
+ mu_theta, # mixture_means
+ mu_y,
+ chol_l00, # mixture_chol_covs (tril)
+ chol_l10,
+ chol_l11,
+ *control_params,
+ *loadings,
+ *meas_sds,
+ ]
+ )
+
+ # Both measurements load on the single latent factor.
+ loading_mask = jnp.array([[True], [True]])
+
+ n_obs = 3
+ rng = np.random.default_rng(404)
+ measurements = jnp.asarray(rng.normal(0, 1, (n_obs, n_measures)))
+ controls = jnp.asarray(rng.normal(0, 1, (n_obs, n_controls)))
+ observed_factor_values = jnp.asarray(rng.normal(0, 1, (n_obs, 1)))
+
+ # A handful of 1d standard-normal quadrature nodes with weights summing
+ # to 1 (the conditional latent dimension is 1).
+ raw_nodes = np.array([-1.5, -0.5, 0.5, 1.5])
+ node_w = np.exp(-0.5 * raw_nodes**2)
+ node_w = node_w / node_w.sum()
+ nodes = jnp.asarray(raw_nodes.reshape(-1, 1))
+ weights = jnp.asarray(node_w)
+
+ per_obs = np.asarray(
+ af_per_obs_loglike_initial(
+ params,
+ n_factors=n_factors,
+ n_mixture_components=n_mixture_components,
+ n_measures=n_measures,
+ n_controls=n_controls,
+ measurements=measurements,
+ controls=controls,
+ loading_mask=loading_mask,
+ nodes=nodes,
+ weights=weights,
+ stability_floor=0.0,
+ n_latent_factors=n_latent,
+ observed_factor_values=observed_factor_values,
+ )
+ )
+
+ # Independent plain-numpy reference for the single mixture component.
+ chol_full = np.array([[chol_l00, 0.0], [chol_l10, chol_l11]])
+ cov_full = chol_full @ chol_full.T
+ cov_tt = cov_full[:n_latent, :n_latent]
+ cov_ty = cov_full[:n_latent, n_latent:]
+ cov_yy = cov_full[n_latent:, n_latent:]
+
+ full_loadings = np.array(loadings).reshape(n_measures, n_latent)
+ control_arr = np.array(control_params).reshape(n_measures, n_controls)
+ meas_sd_arr = np.array(meas_sds)
+ nodes_np = np.asarray(nodes)
+ weights_np = np.asarray(weights)
+
+ def _log_norm(x: np.ndarray, mean: float, sd: np.ndarray) -> np.ndarray:
+ return -0.5 * np.log(2 * np.pi) - np.log(sd) - 0.5 * ((x - mean) / sd) ** 2
+
+ for i in range(n_obs):
+ y_i = np.asarray(observed_factor_values[i])
+ z_i = np.asarray(measurements[i])
+ ctrl_i = np.asarray(controls[i])
+ residual_base = z_i - control_arr @ ctrl_i
+
+ # Marginal density of Y_i.
+ log_marg = -0.5 * np.log(2 * np.pi * cov_yy[0, 0]) - 0.5 * (
+ (y_i[0] - mu_y) ** 2 / cov_yy[0, 0]
+ )
+
+ # Schur-complement conditional of theta | Y_i.
+ cond_mean = mu_theta + (cov_ty[0, 0] / cov_yy[0, 0]) * (y_i[0] - mu_y)
+ cond_cov = cov_tt[0, 0] - cov_ty[0, 0] ** 2 / cov_yy[0, 0]
+ cond_cov = cond_cov + 1e-10 # matches the code's jitter
+ cond_chol = np.sqrt(cond_cov)
+
+ log_nodes = []
+ for q in range(nodes_np.shape[0]):
+ theta_q = cond_mean + cond_chol * nodes_np[q, 0]
+ resid = residual_base - full_loadings[:, 0] * theta_q
+ log_nodes.append(np.sum(_log_norm(resid, 0.0, meas_sd_arr)))
+ log_nodes = np.array(log_nodes)
+ log_integral = np.log(np.sum(np.exp(log_nodes) * weights_np))
+
+ # The returned per-obs log-likelihood is the JOINT density.
+ np.testing.assert_allclose(per_obs[i], log_marg + log_integral, atol=1e-8)
+ # And it is NOT the conditional integral alone (p(Y_i) term present).
+ assert not np.allclose(per_obs[i], log_integral)
+
+
+def test_update_conditional_distribution_does_not_recondition_on_later_income() -> None:
+ """Pin that later-period income does NOT re-condition the carried state.
+
+ `_update_conditional_distribution` propagates the chained sample through
+ the just-fitted transition/investment equations, but the conditioning
+ payload (`cond_means`, `cond_chols`, `conditional_weights`,
+ `chain_links`) is carried forward UNCHANGED -- the state distribution
+ stays conditioned on period-0 income only. Income at t > 0 flows solely
+ through the transition function (so the chained `components` legitimately
+ change), never through a re-conditioning update.
+ """
+ n_state = 1
+ n_endog = 0
+ n_observed_factors = 1
+ n_components = 1
+ n_halton = 6
+ n_obs = 4
+
+ rng = np.random.default_rng(202)
+ prev_sample = jnp.asarray(rng.normal(0, 1, (n_halton, n_obs, n_state)))
+ cond_means = jnp.asarray(rng.normal(0, 1, (n_components, n_obs, n_state)))
+ cond_chols = jnp.asarray(
+ np.tile(np.eye(n_state), (n_components, 1, 1)).astype(float)
+ )
+ conditional_weights = jnp.ones((n_obs, n_components))
+
+ prev_distribution = ConditionalDistribution(
+ mixture_weights=jnp.array([1.0]),
+ components=(
+ MixtureComponent(mean=jnp.zeros(n_state), chol_cov=jnp.eye(n_state)),
+ ),
+ samples_per_component=(prev_sample,),
+ conditional_weights=conditional_weights,
+ cond_means=cond_means,
+ cond_chols=cond_chols,
+ chain_links=(),
+ )
+
+ # Linear transition over (state, income): theta_t = 0.7 * theta + 0.3 * Y.
+ def combined_transition(
+ full_prev_with_obs: jax.Array, params: jax.Array
+ ) -> jax.Array:
+ return jnp.array(
+ [params[0] * full_prev_with_obs[0] + params[1] * full_prev_with_obs[1]]
+ )
+
+ idx = pd.MultiIndex.from_tuples(
+ [
+ ("transition", 1, "skill", "skill"),
+ ("transition", 1, "skill", "income"),
+ ("shock_sds", 1, "skill", "-"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ result_params = pd.DataFrame({"value": [0.7, 0.3, 0.4]}, index=idx)
+
+ # Two different later-period income inputs.
+ income_a = jnp.asarray(rng.normal(0, 1, (n_obs, n_observed_factors)))
+ income_b = income_a + 5.0
+
+ joint_nodes = jnp.asarray(rng.normal(0, 1, (n_halton, 1))) # n_shock = 1 column
+
+ def _update(observed_factor_values: jax.Array) -> ConditionalDistribution:
+ return _update_conditional_distribution(
+ prev_distribution=prev_distribution,
+ result_params=result_params,
+ combined_transition=combined_transition,
+ joint_nodes=joint_nodes,
+ n_state=n_state,
+ n_endog=n_endog,
+ n_shock=1,
+ shock_factor_indices=jnp.array([0]),
+ observed_factor_values=observed_factor_values,
+ n_observed_factors=n_observed_factors,
+ )
+
+ out_a = _update(income_a)
+ out_b = _update(income_b)
+
+ # The conditioning payload is byte-identical to the input and across the
+ # two income values: income at t > 0 leaves it untouched.
+ for out in (out_a, out_b):
+ np.testing.assert_array_equal(
+ np.asarray(out.cond_means), np.asarray(prev_distribution.cond_means)
+ )
+ np.testing.assert_array_equal(
+ np.asarray(out.cond_chols), np.asarray(prev_distribution.cond_chols)
+ )
+ np.testing.assert_array_equal(
+ np.asarray(out.conditional_weights),
+ np.asarray(prev_distribution.conditional_weights),
+ )
+ assert out.chain_links == prev_distribution.chain_links
+
+ # The chained sample summary DOES change with income (the single allowed
+ # channel: income flows through the transition function).
+ assert not np.allclose(
+ np.asarray(out_a.components[0].mean),
+ np.asarray(out_b.components[0].mean),
+ )
diff --git a/tests/test_af_inference.py b/tests/test_af_inference.py
new file mode 100644
index 00000000..348745b9
--- /dev/null
+++ b/tests/test_af_inference.py
@@ -0,0 +1,413 @@
+"""Tests for ``skillmodels.af.inference.compute_af_standard_errors``.
+
+The AF inference path is the influence-function score bootstrap of
+Antweiler & Freyberger (2025) §4.2 (Armstrong-Bertanha-Hong 2014
+style). A single per-observation influence matrix is computed once at
+the optimum; each period block carries the earlier periods' influence
+via the cross-period blocks of the full-chain Hessian, and the bootstrap
+resamples the rows with ONE shared caseid index per replicate so that
+cross-period covariances are non-zero and correct. There is no
+analytical sandwich path: AF §4.2 explicitly notes the closed-form
+variance ignores estimation error in earlier-period nuisance parameters
+and is therefore incorrect for any t >= 1.
+"""
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.af.estimate import _extract_period_data, estimate_af
+from skillmodels.af.inference import (
+ AFInferenceResult,
+ _build_period_metas,
+ _compute_block_diagonal_sandwich,
+ _free_positions_for_period,
+ _period_t_per_obs_loglike_full,
+ compute_af_standard_errors,
+)
+from skillmodels.af.types import AFEstimationOptions
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+def _simulate_linear_data(
+ *,
+ n_obs: int,
+ n_periods: int = 2,
+ seed: int = 0,
+) -> pd.DataFrame:
+ """Simulate a simple single-factor linear-transition panel."""
+ rng = np.random.default_rng(seed)
+ theta = np.zeros((n_obs, n_periods))
+ theta[:, 0] = rng.normal(0.0, 1.0, n_obs)
+ for t in range(n_periods - 1):
+ theta[:, t + 1] = 0.1 + 0.7 * theta[:, t] + rng.normal(0.0, 0.3, n_obs)
+
+ loadings = (1.0, 0.9, 1.1)
+ intercepts = (0.0, 0.2, -0.1)
+ sds = (0.3, 0.4, 0.35)
+ rows = []
+ for i in range(n_obs):
+ for t in range(n_periods):
+ row = {"caseid": i, "period": t}
+ for m_idx, meas in enumerate(("m1", "m2", "m3")):
+ row[meas] = (
+ intercepts[m_idx]
+ + loadings[m_idx] * theta[i, t]
+ + rng.normal(0, sds[m_idx])
+ )
+ rows.append(row)
+
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def _make_linear_model(n_periods: int = 2) -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * n_periods,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * n_periods,
+ intercepts=({"m1": 0},) * n_periods,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+@pytest.fixture(scope="module")
+def fitted_result() -> tuple[AFInferenceResult, pd.DataFrame]:
+ """Fit the AF estimator once and bootstrap SEs; reused across tests."""
+ data = _simulate_linear_data(n_obs=400, n_periods=2)
+ model = _make_linear_model(n_periods=2)
+ af_opts = AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ fit = estimate_af(model_spec=model, data=data, options=af_opts)
+ inference = compute_af_standard_errors(fit, data, af_opts, n_boot=2000, seed=0)
+ return inference, fit.params
+
+
+@pytest.mark.end_to_end
+def test_af_inference_result_is_inference_dataclass(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ assert isinstance(inference, AFInferenceResult)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_replicate_params_shape(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, all_params = fitted_result
+ assert inference.n_boot == 2000
+ assert inference.n_clusters == 400
+ assert inference.replicate_params.shape == (2000, len(all_params.index))
+ assert list(inference.replicate_params.columns) == list(all_params.index)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_standard_errors_index_matches_params(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, all_params = fitted_result
+ assert inference.standard_errors.index.equals(all_params.index)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_vcov_row_index_matches_params(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, all_params = fitted_result
+ assert inference.vcov.index.equals(all_params.index)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_vcov_column_index_matches_params(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, all_params = fitted_result
+ assert inference.vcov.columns.equals(all_params.index)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_vcov_diagonal_matches_se_squared(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ """SEs and vcov are computed from the same replicate distribution."""
+ inference, _ = fitted_result
+ diag = np.diag(inference.vcov.to_numpy())
+ se_squared = inference.standard_errors.to_numpy() ** 2
+ np.testing.assert_allclose(diag, se_squared, rtol=1e-10, atol=1e-12)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_pinned_loading_has_zero_se(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ assert float(inference.standard_errors.loc[("loadings", 0, "m1", "skill")]) == (
+ pytest.approx(0.0, abs=1e-12)
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_inference_pinned_intercept_has_zero_se(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ assert float(
+ inference.standard_errors.loc[("controls", 0, "m1", "constant")]
+ ) == pytest.approx(0.0, abs=1e-12)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_free_loading_has_positive_se(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ assert inference.standard_errors.loc[("loadings", 0, "m2", "skill")] > 0.0
+
+
+@pytest.mark.end_to_end
+def test_af_inference_free_meas_sd_has_positive_se(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ assert inference.standard_errors.loc[("meas_sds", 0, "m2", "-")] > 0.0
+
+
+@pytest.mark.end_to_end
+def test_af_inference_vcov_is_symmetric(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ v = inference.vcov.to_numpy()
+ np.testing.assert_allclose(v, v.T, atol=1e-10)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_vcov_diagonal_nonnegative(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ inference, _ = fitted_result
+ diag = np.diag(inference.vcov.to_numpy())
+ assert np.all(diag >= 0.0)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_pinned_params_have_constant_replicates(
+ fitted_result: tuple[AFInferenceResult, pd.DataFrame],
+) -> None:
+ """Loadings/intercepts pinned via Normalizations are constant across replicates."""
+ inference, _ = fitted_result
+ pinned = [("loadings", t, "m1", "skill") for t in (0, 1)] + [
+ ("controls", t, "m1", "constant") for t in (0, 1)
+ ]
+ for loc in pinned:
+ if loc in inference.replicate_params.columns:
+ col = inference.replicate_params[loc].to_numpy()
+ assert col.std() == pytest.approx(0.0, abs=1e-12)
+
+
+@pytest.mark.end_to_end
+def test_af_inference_se_shrinks_with_sample_size() -> None:
+ """SE for a representative free parameter should shrink roughly as 1/sqrt(n)."""
+ model = _make_linear_model(n_periods=2)
+ af_opts = AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ data_small = _simulate_linear_data(n_obs=200, n_periods=2, seed=1)
+ data_large = _simulate_linear_data(n_obs=800, n_periods=2, seed=1)
+
+ fit_small = estimate_af(model_spec=model, data=data_small, options=af_opts)
+ fit_large = estimate_af(model_spec=model, data=data_large, options=af_opts)
+
+ inf_small = compute_af_standard_errors(
+ fit_small, data_small, af_opts, n_boot=2000, seed=1
+ )
+ inf_large = compute_af_standard_errors(
+ fit_large, data_large, af_opts, n_boot=2000, seed=1
+ )
+
+ loc = ("loadings", 0, "m2", "skill")
+ se_small = float(inf_small.standard_errors.loc[loc])
+ se_large = float(inf_large.standard_errors.loc[loc])
+
+ # Sample size quadrupled: expect SE ~ halved. Tolerate a wide band
+ # because the bootstrap is noisy on moderate samples.
+ ratio = se_large / se_small
+ assert 0.25 < ratio < 0.8, (
+ f"Expected SE ratio in (0.25, 0.8) under 4x sample-size bump; "
+ f"got {ratio:.3f} (se_small={se_small}, se_large={se_large})"
+ )
+
+
+# ---------------------------------------------------------------------------
+# AF-F1: influence-function score bootstrap that propagates earlier-period
+# estimation uncertainty into later periods.
+# ---------------------------------------------------------------------------
+
+
+def _build_metas_for_test(fit, data, af_opts):
+ """Rebuild the per-period inference metas (mirrors compute_af_standard_errors)."""
+ model_spec = fit.model_spec
+ processed_model = process_model(model_spec)
+ n_periods = processed_model.dimensions.n_periods
+ latent_factors = processed_model.labels.latent_factors
+ controls_names = processed_model.labels.controls
+ observed_factors = processed_model.labels.observed_factors
+ endog_info = processed_model.endogenous_factors_info
+ endogenous_factors = tuple(
+ f
+ for f in latent_factors
+ if f in endog_info.factor_info and endog_info.factor_info[f].is_endogenous
+ )
+ period_data = _extract_period_data(
+ data,
+ n_periods,
+ latent_factors,
+ controls_names,
+ model_spec,
+ observed_factors=observed_factors,
+ )
+ return _build_period_metas(
+ result=fit,
+ period_data=period_data,
+ model_spec=model_spec,
+ processed_model=processed_model,
+ af_options=af_opts,
+ observed_factors=observed_factors,
+ endogenous_factors=endogenous_factors,
+ )
+
+
+@pytest.fixture(scope="module")
+def fit_and_metas():
+ """Fit the 2-period linear model and build inference metas; reused across tests."""
+ data = _simulate_linear_data(n_obs=400, n_periods=2)
+ model = _make_linear_model(n_periods=2)
+ af_opts = AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=15,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ fit = estimate_af(model_spec=model, data=data, options=af_opts)
+ metas = _build_metas_for_test(fit, data, af_opts)
+ return fit, data, af_opts, metas
+
+
+@pytest.mark.end_to_end
+def test_af_inference_cross_period_covariance_is_nonzero(
+ fit_and_metas,
+) -> None:
+ """Propagation produces non-zero cross-period vcov entries.
+
+ A period-0 free parameter that period-1 depends on (a transition
+ slope and a free loading) must have non-zero covariance with a
+ period-1 free parameter. The old own-block independent-resample
+ bootstrap has E[cross-period cov] = 0; the influence-function fix
+ shares the caseid index so psi_1 carries B_{1,0} psi_0.
+ """
+ fit, data, af_opts, _metas = fit_and_metas
+ inference = compute_af_standard_errors(fit, data, af_opts, n_boot=4000, seed=0)
+ vcov = inference.vcov
+
+ p0_candidates = [
+ ("transition", 0, "skill", "skill"),
+ ("loadings", 0, "m2", "skill"),
+ ]
+ p1_candidates = [
+ ("loadings", 1, "m2", "skill"),
+ ("transition", 1, "skill", "skill"),
+ ]
+ p0 = next(c for c in p0_candidates if c in vcov.index)
+ p1 = next(c for c in p1_candidates if c in vcov.index)
+
+ cross_cov = float(np.asarray(vcov.loc[p0, p1]).item())
+ assert abs(cross_cov) > 1e-8, (
+ f"Expected non-zero cross-period covariance between {p0} and {p1}; "
+ f"got {cross_cov}."
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_inference_propagation_inflates_later_period_se(
+ fit_and_metas,
+) -> None:
+ """The propagated period-1 SE exceeds the old own-block SE.
+
+ Replicate the OLD independent-resample own-block SE inline for a
+ period-1 free parameter, then assert the NEW propagated SE is
+ strictly larger (it adds the PSD term Var(A_1^{-1} B_{1,0} psi_0)).
+ """
+ fit, data, af_opts, metas = fit_and_metas
+ inference = compute_af_standard_errors(fit, data, af_opts, n_boot=4000, seed=0)
+
+ loc = ("loadings", 1, "m2", "skill")
+ new_se = float(inference.standard_errors.loc[loc])
+
+ # OLD own-block bootstrap SE for the same period-1 parameter.
+ period_score_info = _compute_block_diagonal_sandwich(fit, metas)
+ period1 = next(p for p in period_score_info if p.period == 1)
+ score = np.asarray(period1.score_matrix)
+ info = np.asarray(period1.information_matrix)
+ a_inv = np.linalg.pinv(info)
+
+ n_clusters = int(metas[0].loglike_kwargs["measurements"].shape[0])
+ rng = np.random.default_rng(0)
+ idx = rng.integers(0, n_clusters, size=(4000, n_clusters))
+ mean_score = score[idx].mean(axis=1)
+ delta = -mean_score @ a_inv.T # (n_boot, n_free_own)
+
+ own_col = list(period1.free_param_locs).index(loc)
+ old_se = float(np.std(delta[:, own_col], ddof=1))
+
+ assert new_se > old_se * 1.001, (
+ f"Expected propagated SE ({new_se}) to exceed own-block SE "
+ f"({old_se}) by the propagation term."
+ )
+
+
+@pytest.mark.end_to_end
+def test_af_inference_period1_information_matches_fullchain_ownblock(
+ fit_and_metas,
+) -> None:
+ """The full-chain Hessian's period-1 own block matches the block-diagonal one.
+
+ Validates the full-chain Hessian wiring used by the influence matrix:
+ the period-1 own information sub-block recovered from
+ hessian(_period_t_per_obs_loglike_full) must match the existing
+ _block_diagonal_sandwich_single information matrix for period 1.
+ """
+ fit, _data, _af_opts, metas = fit_and_metas
+ flat_super = jnp.asarray(fit.params["value"].to_numpy())
+
+ period_score_info = _compute_block_diagonal_sandwich(fit, metas)
+ period1 = next(p for p in period_score_info if p.period == 1)
+ own_block_info = np.asarray(period1.information_matrix)
+
+ meta1 = metas[1]
+ pos, _locs = _free_positions_for_period(meta1.params_df)
+ own_global = jnp.array([meta1.slice_start + p for p in pos], dtype=jnp.int32)
+
+ def neg_mean(fs):
+ return -jnp.mean(_period_t_per_obs_loglike_full(fs, 1, metas))
+
+ hess_full = jax.hessian(neg_mean)(flat_super)
+ fullchain_own = np.asarray(hess_full[own_global][:, own_global])
+
+ np.testing.assert_allclose(fullchain_own, own_block_info, rtol=1e-4, atol=1e-8)
diff --git a/tests/test_af_initialization.py b/tests/test_af_initialization.py
new file mode 100644
index 00000000..50827358
--- /dev/null
+++ b/tests/test_af_initialization.py
@@ -0,0 +1,105 @@
+"""Tests for AF initialization strategies."""
+
+import numpy as np
+import pytest
+
+from skillmodels.af.types import AFEstimationOptions
+from skillmodels.amn.moments import spearman_factor_moments
+
+
+def test_default_start_params_strategy_is_amn():
+ """Default initialization runs the full AMN estimator upfront."""
+ opts = AFEstimationOptions()
+
+ assert opts.start_params_strategy == "amn"
+
+
+def test_start_params_strategy_can_be_set_to_spearman():
+ """Legacy Spearman pre-pass is available under the `"spearman"` name."""
+ opts = AFEstimationOptions(start_params_strategy="spearman")
+
+ assert opts.start_params_strategy == "spearman"
+
+
+def test_start_params_strategy_can_be_set_to_constant():
+ """Legacy constant init remains available for regression testing."""
+ opts = AFEstimationOptions(
+ start_params_strategy="constant",
+ )
+
+ assert opts.start_params_strategy == "constant"
+
+
+def test_spearman_seed_closer_to_truth_than_constant_default():
+ """Moment-based seed is closer to truth than the static 0.5 default.
+
+ Synthetic data with known sigma_meas and Var(latent) — assert that the
+ Spearman residual variance gives a starting sigma_meas closer to truth
+ than the legacy ``obs_sd * 0.5`` heuristic.
+ """
+ rng = np.random.default_rng(0)
+ n = 1000
+ truth_loadings = np.array([1.0, 1.2, 0.9])
+ truth_meas_sds = np.array([0.3, 0.4, 0.3])
+ truth_factor_sd = 1.5
+ factor = rng.normal(0.0, truth_factor_sd, size=n)
+ eps = rng.normal(0.0, 1.0, size=(n, 3)) * truth_meas_sds
+ measurements = truth_loadings * factor[:, None] + eps
+
+ spearman = spearman_factor_moments(measurements, anchor_idx=0)
+
+ # Spearman recovers sigma_meas within 30% of truth.
+ for k in range(3):
+ assert spearman.meas_sds[k] == pytest.approx(truth_meas_sds[k], rel=0.30)
+
+ # Legacy default is obs_sd * 0.5; for sigma_meas truth=0.3 with anchor
+ # variance λ²·Var(F)+sigma_meas² ≈ 1²·2.25+0.09 ≈ 2.34, obs_sd ≈ 1.53,
+ # default seed ≈ 0.76 — way off truth 0.3. Spearman should be closer.
+ obs_sds = np.nanstd(measurements, axis=0)
+ legacy_seeds = np.maximum(obs_sds * 0.5, 0.01)
+ spearman_dist = np.abs(spearman.meas_sds - truth_meas_sds).sum()
+ legacy_dist = np.abs(legacy_seeds - truth_meas_sds).sum()
+ assert spearman_dist < legacy_dist
+
+
+def test_spearman_falls_back_for_single_measurement_factor():
+ """`valid=False` → moment-init returns the same fallback values."""
+ measurements = np.random.default_rng(0).normal(size=(100, 1))
+
+ result = spearman_factor_moments(measurements, anchor_idx=0)
+
+ assert not result.valid
+ # Fallback values are constant; downstream code should keep using
+ # the static defaults instead of overriding from these.
+ assert result.loadings.shape == (1,)
+ assert result.meas_sds.shape == (1,)
+
+
+def test_start_params_strategy_other_options_unchanged():
+ """Other AFEstimationOptions fields remain at their existing defaults."""
+ opts = AFEstimationOptions()
+
+ assert opts.n_halton_points == 50
+ assert opts.n_halton_points_shock == 30
+ assert opts.optimizer_algorithm == "fides"
+ assert opts.two_stage is False
+ assert opts.coarse_fraction == 0.5
+ assert opts.stability_floor == 1e-217
+ assert opts.n_obs_per_batch is None
+
+
+def test_moment_init_handles_pinned_anchor_loading():
+ """When user pins loading to a non-1.0 value, anchor_loading respects it."""
+ rng = np.random.default_rng(0)
+ n = 800
+ loadings = np.array([2.0, 0.6, 1.2]) # anchor=2.0 (user normalization)
+ factor = rng.normal(0.0, 1.0, size=n)
+ eps = rng.normal(0.0, 0.4, size=(n, 3))
+ measurements = loadings * factor[:, None] + eps
+
+ result = spearman_factor_moments(measurements, anchor_idx=0, anchor_loading=2.0)
+
+ assert result.loadings[0] == pytest.approx(2.0, abs=1e-12)
+ # Other loadings should be on the same scale.
+ assert result.loadings[1] == pytest.approx(0.6, rel=0.30)
+ assert result.loadings[2] == pytest.approx(1.2, rel=0.30)
diff --git a/tests/test_af_posterior_states.py b/tests/test_af_posterior_states.py
new file mode 100644
index 00000000..3ac6d986
--- /dev/null
+++ b/tests/test_af_posterior_states.py
@@ -0,0 +1,145 @@
+"""Tests for AF posterior state extraction.
+
+Regression tests for the AF-F6 fix: posterior means are computed against the
+per-observation, income-conditioned chained importance sample
+(`samples_per_component`) weighted by `conditional_weights`, NOT from fresh
+Halton draws against pooled per-component Gaussian summaries.
+"""
+
+import jax
+import jax.numpy as jnp
+import numpy as np
+import pytest
+
+from skillmodels.af.posterior_states import _compute_posterior_means
+from skillmodels.af.types import (
+ ConditionalDistribution,
+ MixtureComponent,
+)
+
+jax.config.update("jax_enable_x64", True)
+
+
+def _placeholder_cond_dist(
+ *,
+ samples_per_component: tuple,
+ conditional_weights: jax.Array | None,
+ mixture_weights: jax.Array,
+ n_state: int,
+) -> ConditionalDistribution:
+ """Build a ConditionalDistribution with degenerate, unread placeholders.
+
+ The fixed `_compute_posterior_means` must NOT read `components` /
+ `cond_means` / `cond_chols`, so we fill them with placeholders.
+ """
+ n_components = len(mixture_weights)
+ return ConditionalDistribution(
+ mixture_weights=mixture_weights,
+ components=tuple(
+ MixtureComponent(mean=jnp.zeros(n_state), chol_cov=jnp.eye(n_state))
+ for _ in range(n_components)
+ ),
+ samples_per_component=samples_per_component,
+ conditional_weights=conditional_weights,
+ cond_means=None,
+ cond_chols=None,
+ chain_links=(),
+ )
+
+
+def test_compute_posterior_means_respects_per_obs_income_conditioning() -> None:
+ n_obs = 2
+ n_state = 1
+ n_summary = 8
+
+ rng = np.random.default_rng(606)
+ # Obs 0's samples centered near -2.0, obs 1's near +2.0: two different
+ # income-conditioned priors.
+ arr = np.zeros((n_summary, n_obs, n_state))
+ arr[:, 0, 0] = -2.0 + rng.normal(0, 0.05, n_summary)
+ arr[:, 1, 0] = 2.0 + rng.normal(0, 0.05, n_summary)
+ samples_per_component = (jnp.asarray(arr),)
+
+ cond_dist = _placeholder_cond_dist(
+ samples_per_component=samples_per_component,
+ conditional_weights=jnp.ones((n_obs, 1)),
+ mixture_weights=jnp.array([1.0]),
+ n_state=n_state,
+ )
+
+ # Identical measurement residual for both observations.
+ measurements = jnp.array([[0.0], [0.0]])
+ control_contrib = jnp.array([[0.0], [0.0]])
+ full_loadings = jnp.array([[1.0]])
+ meas_sds = jnp.array([0.5])
+
+ out = _compute_posterior_means(
+ cond_dist=cond_dist,
+ measurements=measurements,
+ control_contrib=control_contrib,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ )
+
+ # The two observations must get DIFFERENT posterior means, each staying
+ # on the side of its own income-conditioned prior cluster. Under the old
+ # pooled code both would coincide.
+ assert out[0, 0] < -0.5 < 0.5 < out[1, 0]
+
+
+def test_compute_posterior_means_uses_measurements() -> None:
+ n_summary = 16
+ n_state = 1
+
+ rng = np.random.default_rng(607)
+ # Single obs, symmetric samples around 0.
+ base = rng.normal(0, 1.0, n_summary)
+ arr = base.reshape(n_summary, 1, 1)
+ samples_per_component = (jnp.asarray(arr),)
+
+ cond_dist = _placeholder_cond_dist(
+ samples_per_component=samples_per_component,
+ conditional_weights=jnp.ones((1, 1)),
+ mixture_weights=jnp.array([1.0]),
+ n_state=n_state,
+ )
+
+ full_loadings = jnp.array([[1.0]])
+ meas_sds = jnp.array([0.5])
+ control_contrib = jnp.array([[0.0]])
+
+ out_low = _compute_posterior_means(
+ cond_dist=cond_dist,
+ measurements=jnp.array([[-1.5]]),
+ control_contrib=control_contrib,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ )
+ out_high = _compute_posterior_means(
+ cond_dist=cond_dist,
+ measurements=jnp.array([[1.5]]),
+ control_contrib=control_contrib,
+ full_loadings=full_loadings,
+ meas_sds=meas_sds,
+ )
+
+ # The posterior mean tracks the measurement (loading = 1).
+ assert out_low[0, 0] < 0.0 < out_high[0, 0]
+
+
+def test_compute_posterior_means_raises_after_to_numpy() -> None:
+ cond_dist = _placeholder_cond_dist(
+ samples_per_component=(), # as `to_numpy()` produces
+ conditional_weights=None,
+ mixture_weights=jnp.array([1.0]),
+ n_state=1,
+ )
+
+ with pytest.raises(ValueError, match="to_numpy"):
+ _compute_posterior_means(
+ cond_dist=cond_dist,
+ measurements=jnp.array([[0.0]]),
+ control_contrib=jnp.array([[0.0]]),
+ full_loadings=jnp.array([[1.0]]),
+ meas_sds=jnp.array([0.5]),
+ )
diff --git a/tests/test_af_t5_extension.py b/tests/test_af_t5_extension.py
new file mode 100644
index 00000000..0374a872
--- /dev/null
+++ b/tests/test_af_t5_extension.py
@@ -0,0 +1,166 @@
+"""End-to-end test that AF works for T = 5 periods.
+
+The AF paper's iterative chain (Section 3) is described for general T,
+but skillmodels' AF tests so far cover T = 3. This test runs the full
+chain on a synthetic T=5 panel and confirms `estimate_af` produces
+five per-period results with finite likelihoods and the expected
+chain-link structure (k links after estimating period k).
+
+Marked `end_to_end` so it does not run in the default test suite.
+"""
+
+import jax
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.af import AFEstimationOptions, estimate_af
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.process_model import process_model
+
+jax.config.update("jax_enable_x64", True)
+
+
+def _build_t5_model() -> ModelSpec:
+ """Two-factor T=5 model: linear `state`, linear `inv`, three measures each."""
+ return ModelSpec(
+ factors={
+ "state": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 5,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 5,
+ intercepts=({"y1": 0},) * 5,
+ ),
+ transition_function="linear",
+ ),
+ "inv": FactorSpec(
+ measurements=(("z1", "z2", "z3"),) * 5,
+ normalizations=Normalizations(
+ loadings=({"z1": 1},) * 5,
+ intercepts=({"z1": 0},) * 5,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _truth_params_t5(model: ModelSpec) -> pd.DataFrame:
+ """Build a truth params DataFrame for the T=5 model from the params index."""
+ processed = process_model(model)
+ p_index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ df = pd.DataFrame({"value": np.zeros(len(p_index))}, index=p_index)
+ cat = df.index.get_level_values("category")
+ df.loc[cat == "loadings", "value"] = 1.0
+ df.loc[cat == "meas_sds", "value"] = 0.3
+ df.loc[cat == "shock_sds", "value"] = 0.4
+ df.loc[cat == "mixture_weights", "value"] = 1.0
+ for aug_period in range(4):
+ for factor, other in (("state", "inv"), ("inv", "state")):
+ for regressor, val in (
+ (factor, 0.7),
+ (other, 0.2),
+ ("constant", 0.1),
+ ):
+ loc = ("transition", aug_period, factor, regressor)
+ if loc in df.index:
+ df.loc[loc, "value"] = val
+ cholcov_diag_mask = pd.Series(
+ [
+ idx[0] == "initial_cholcovs"
+ and "-" in idx[3]
+ and idx[3].split("-")[0] == idx[3].split("-")[1]
+ for idx in df.index
+ ],
+ index=df.index,
+ )
+ df.loc[cholcov_diag_mask, "value"] = 1.0
+ return df
+
+
+def _simulate_synthetic_t5(
+ model: ModelSpec,
+ params: pd.DataFrame,
+ n_obs: int,
+ seed: int,
+) -> pd.DataFrame:
+ """Simulate (states + measurements) directly for the T=5 model."""
+ n_periods = 5
+ rng = np.random.default_rng(seed)
+ state = rng.normal(0.0, 1.0, size=(n_obs, 2)) # (state_t, inv_t)
+ state_history = [state.copy()]
+
+ def _val(loc: tuple) -> float:
+ return float(params.loc[loc, "value"])
+
+ for t in range(1, n_periods):
+ prev = state_history[-1]
+ new_state = np.zeros_like(prev)
+ for f, idx in (("state", 0), ("inv", 1)):
+ other_idx = 1 - idx
+ other = "inv" if f == "state" else "state"
+ a = _val(("transition", t - 1, f, f))
+ b = _val(("transition", t - 1, f, other))
+ c = _val(("transition", t - 1, f, "constant"))
+ sigma = _val(("shock_sds", t - 1, f, "-"))
+ new_state[:, idx] = (
+ a * prev[:, idx]
+ + b * prev[:, other_idx]
+ + c
+ + sigma * rng.normal(size=n_obs)
+ )
+ state_history.append(new_state)
+
+ records: list[dict] = []
+ for obs_id in range(n_obs):
+ for t in range(n_periods):
+ row: dict[str, float | int] = {"caseid": obs_id, "period": t}
+ st = state_history[t][obs_id]
+ for f, idx in (("state", 0), ("inv", 1)):
+ meas_prefix = "y" if f == "state" else "z"
+ for k in (1, 2, 3):
+ meas_name = f"{meas_prefix}{k}"
+ lam = _val(("loadings", t, meas_name, f))
+ sigma_eps = _val(("meas_sds", t, meas_name, "-"))
+ row[meas_name] = float(lam * st[idx] + sigma_eps * rng.normal())
+ records.append(row)
+ return pd.DataFrame.from_records(records).set_index(["caseid", "period"])
+
+
+@pytest.mark.end_to_end
+def test_af_chain_runs_for_t5() -> None:
+ """`estimate_af` runs the full T=5 chain and produces finite per-period llik."""
+ model = _build_t5_model()
+ params = _truth_params_t5(model)
+ data = _simulate_synthetic_t5(model, params, n_obs=200, seed=20260510)
+
+ af_options = AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(model_spec=model, data=data, options=af_options)
+
+ assert len(result.period_results) == 5, (
+ f"Expected 5 per-period results for T=5; got {len(result.period_results)}"
+ )
+ for pr in result.period_results:
+ assert np.isfinite(pr.loglikelihood), (
+ f"period {pr.period}: non-finite loglikelihood {pr.loglikelihood}"
+ )
+ assert len(result.conditional_distributions) == 5
+ # Each period after 0 carries one chain link per prior transition.
+ for t, cd in enumerate(result.conditional_distributions):
+ assert len(cd.chain_links) == max(t, 0)
diff --git a/tests/test_af_validate_normalizations.py b/tests/test_af_validate_normalizations.py
new file mode 100644
index 00000000..2daec9e8
--- /dev/null
+++ b/tests/test_af_validate_normalizations.py
@@ -0,0 +1,189 @@
+"""Regression tests for the AF period-0 normalization-anchor check (audit F7b).
+
+`validate_af_model` previously rejected only `normalizations is None`. A
+`Normalizations` object whose period-0 maps are empty therefore slipped
+through, leaving the initial factor distribution's affine orbit (scale +
+location) unpinned and the trans-log model under-identified.
+
+The period-0 distribution is not produced by any transition, so its anchor
+must be supplied directly: a loading/intercept normalization, a `fixed_params`
+pin, or an equality constraint tying it to an anchored parameter. These tests
+pin that period-0 check. Periods t>0 (where the transition can legitimately
+propagate the anchor) are deliberately out of scope here -- the
+transition-aware identification check is a separate (P4) item.
+"""
+
+import functools
+import warnings
+from collections.abc import Mapping
+
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.af.validate import validate_af_model
+from skillmodels.common.constraints import select_by_loc
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+def _model(
+ *,
+ skills_loadings: tuple[Mapping[str, float], ...],
+ skills_intercepts: tuple[Mapping[str, float], ...],
+ skills_transition: str = "translog_af",
+) -> ModelSpec:
+ """Build a two-period AF model with controllable skills normalizations."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 2,
+ normalizations=Normalizations(
+ loadings=skills_loadings,
+ intercepts=skills_intercepts,
+ ),
+ transition_function=skills_transition,
+ ),
+ "investment": FactorSpec(
+ measurements=(("z1", "z2", "z3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"z1": 1},) * 2,
+ intercepts=({"z1": 0},) * 2,
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ )
+
+
+def test_validate_af_model_raises_on_empty_period0_loading() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_raises_on_empty_period0_intercept() -> None:
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({}, {"y1": 0}),
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_raises_on_all_empty_normalizations() -> None:
+ model = _model(
+ skills_loadings=({}, {}),
+ skills_intercepts=({}, {}),
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_accepts_period0_loading_via_fixed_params() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ fixed = pd.DataFrame(
+ {"value": [1.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model, fixed_params=fixed) is None
+
+
+def test_validate_af_model_accepts_period0_intercept_via_fixed_params() -> None:
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({}, {"y1": 0}),
+ )
+ fixed = pd.DataFrame(
+ {"value": [0.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("controls", 0, "y1", "constant")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model, fixed_params=fixed) is None
+
+
+def test_validate_af_model_accepts_period0_loading_via_equality_constraint() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ group = pd.MultiIndex.from_tuples(
+ [
+ ("loadings", 0, "y1", "skills"),
+ ("loadings", 1, "y1", "skills"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints: list[om.constraints.Constraint] = [
+ om.EqualityConstraint(selector=functools.partial(select_by_loc, loc=group)),
+ ]
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model, constraints=constraints) is None
+
+
+def test_validate_af_model_log_ces_requires_initial_intercept_anchor() -> None:
+ # The CES simplex replaces only the cross-period location alternative, not
+ # the absolute initial anchor mu_theta,0,1=0 (Pro F1). So plain log_ces /
+ # log_ces_af still need a period-0 intercept (location) anchor.
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({}, {}),
+ skills_transition="log_ces_af",
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_log_ces_still_requires_loading_anchor() -> None:
+ # The scale anchor (lambda_theta,0,1=1) is still required for log_ces.
+ model = _model(
+ skills_loadings=({}, {}),
+ skills_intercepts=({}, {}),
+ skills_transition="log_ces_af",
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_log_ces_with_constant_requires_intercept_anchor() -> None:
+ # log_ces_with_constant has a free additive level (no simplex location), so
+ # the measurement-intercept location anchor IS required (F8).
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({}, {}),
+ skills_transition="log_ces_with_constant",
+ )
+ with pytest.raises(ValueError, match="period 0"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_accepts_empty_normalization_at_later_period() -> None:
+ # Period 0 is anchored; period 1 maps are empty. The transition can carry
+ # the anchor forward, so this must NOT raise (transition-aware check is P4).
+ model = _model(
+ skills_loadings=({"y1": 1}, {}),
+ skills_intercepts=({"y1": 0}, {}),
+ )
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model) is None
diff --git a/tests/test_af_validate_production_leakage.py b/tests/test_af_validate_production_leakage.py
new file mode 100644
index 00000000..dc9aec5c
--- /dev/null
+++ b/tests/test_af_validate_production_leakage.py
@@ -0,0 +1,112 @@
+"""Regression tests for the AF observed-factor production-leakage guard.
+
+These pin two AF-F3 fixes:
+
+* the production factor using a built-in transition function that enumerates
+ parameters over `all_factors` (latent + observed) while observed factors
+ (e.g. income) are present triggers a loud `UserWarning`, because the
+ observed factors would otherwise enter the production function with free
+ coefficients (a silent wrong-estimand). The warning is non-breaking by
+ design (see deviation note in the implementation); and
+* the paper-matching `translog_af` / `log_ces_af` variants (which only
+ enumerate production factors) are accepted without a warning.
+"""
+
+import warnings
+
+import pytest
+
+from skillmodels.af.validate import validate_af_model
+from skillmodels.common.model_spec import (
+ CorrectionSpec,
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+def _build_model(
+ *,
+ skills_transition: str,
+ observed_factors: tuple[str, ...],
+) -> ModelSpec:
+ """Build a minimal AF model: one production factor + one investment factor."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"y1": 1},) * 2,
+ intercepts=({"y1": 0},) * 2,
+ ),
+ transition_function=skills_transition,
+ ),
+ "investment": FactorSpec(
+ measurements=(("z1", "z2", "z3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"z1": 1},) * 2,
+ intercepts=({"z1": 0},) * 2,
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ observed_factors=observed_factors,
+ )
+
+
+def test_validate_af_model_warns_on_observed_factor_in_builtin_production() -> None:
+ model = _build_model(
+ skills_transition="translog",
+ observed_factors=("income",),
+ )
+ with pytest.warns(UserWarning, match="only through the investment equation"):
+ validate_af_model(model)
+
+
+def test_validate_af_model_no_warning_when_no_observed_factors() -> None:
+ model = _build_model(
+ skills_transition="translog",
+ observed_factors=(),
+ )
+ # No observed factors means no leakage is possible: no leakage warning.
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model) is None
+
+
+def test_validate_af_model_no_warning_with_translog_af() -> None:
+ model = _build_model(
+ skills_transition="translog_af",
+ observed_factors=("income",),
+ )
+ # `translog_af` enumerates production factors only -> not leaky, no warning.
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", UserWarning)
+ assert validate_af_model(model) is None
+
+
+def test_validate_af_model_raises_on_correction_spec() -> None:
+ # AF implements only the kappa=0 (exogenous-investment) special case, so a
+ # CorrectionSpec must raise loudly rather than silently estimate a different
+ # estimand than CHS on the identical spec.
+ model = _build_model(
+ skills_transition="translog_af",
+ observed_factors=("income",),
+ )
+ investment = FactorSpec(
+ measurements=(("z1", "z2", "z3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"z1": 1},) * 2,
+ intercepts=({"z1": 0},) * 2,
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ correction=CorrectionSpec(instruments=("income",)),
+ )
+ model = ModelSpec(
+ factors={"skills": model.factors["skills"], "investment": investment},
+ observed_factors=("income",),
+ )
+ with pytest.raises(NotImplementedError, match="control-function correction"):
+ validate_af_model(model)
diff --git a/tests/test_amn_estimate.py b/tests/test_amn_estimate.py
new file mode 100644
index 00000000..e218df7a
--- /dev/null
+++ b/tests/test_amn_estimate.py
@@ -0,0 +1,455 @@
+"""Tests for `skillmodels.amn.estimate.estimate_amn` (end-to-end orchestration)."""
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.amn import estimate_amn
+from skillmodels.amn.estimate import _fail_if_standalone_unsupported
+from skillmodels.amn.mixture_em import InsufficientCompleteCasesError
+from skillmodels.amn.types import AMNEstimationOptions
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+def _tiny_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+ )
+
+
+def _tiny_ces_model() -> ModelSpec:
+ """A model whose skill transition is restricted CES (`log_ces`).
+
+ AMN cannot consistently estimate this standalone (no primitive-scale
+ recovery), so estimate_amn must refuse it unless it is seeding estimate_chs.
+ """
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="log_ces",
+ ),
+ },
+ n_mixtures=2,
+ )
+
+
+def _tiny_data(n: int = 1500, seed: int = 0) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ f0 = rng.normal()
+ f1 = 0.6 * f0 + rng.normal(0, 0.5)
+ for period, f in [(0, f0), (1, f1)]:
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y3": 1.1 * f + rng.normal(0, 0.5),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_estimate_amn_produces_combined_params_dataframe():
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=5000, seed=0)
+
+ result = estimate_amn(model, data, options)
+
+ assert result.params.index.names == [
+ "category",
+ "aug_period",
+ "name1",
+ "name2",
+ ]
+ cats = set(result.params.index.get_level_values("category"))
+ assert {"loadings", "meas_sds", "transition", "shock_sds"} <= cats
+ # 6 measurement loadings, 6 meas_sds, 1 transition (slope on skills) +
+ # constant for period 0, 1 shock_sds for period 0.
+ assert "controls" in cats # measurement intercepts collapse to controls
+
+
+def _subsample_model() -> ModelSpec:
+ """Model whose `skills` factor has one rotating-subsample measurement.
+
+ Measured by full-sample y1 (normalization) and y2, plus y_sub, which is
+ missing for almost every individual.
+ """
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y_sub"), ("y1", "y2", "y_sub")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+ )
+
+
+def _subsample_data(n: int = 1500, seed: int = 0) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ f0 = rng.normal()
+ f1 = 0.6 * f0 + rng.normal(0, 0.5)
+ for period, f in [(0, f0), (1, f1)]:
+ # y_sub observed only for the very first individual: the full
+ # complete-case count (1) is below the 2 mixture components, exactly
+ # the rotating-subsample regime that makes complete-case EM infeasible.
+ y_sub = f + rng.normal(0, 0.3) if caseid == 0 else np.nan
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y_sub": y_sub,
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_estimate_amn_complete_case_raises_on_subsample_measurement():
+ """Default complete-case Stage 1 raises an informative error on subsamples.
+
+ With a rotating-subsample measurement the full augmented vector has too few
+ complete cases (1 < 2 components) to fit the mixture. The default
+ complete-case method must raise `InsufficientCompleteCasesError` pointing at
+ the missing-data method, rather than silently dropping the measurement or
+ switching methods.
+ """
+ model = _subsample_model()
+ data = _subsample_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=5000, seed=0)
+
+ with pytest.raises(InsufficientCompleteCasesError, match="missing_data"):
+ estimate_amn(model, data, options)
+
+
+def test_estimate_amn_missing_data_includes_subsample_measurement():
+ """The missing-data method seeds on the full set, keeping the subsample.
+
+ Marginalising over missing entries needs no complete cases, so the subsample
+ measurement `y_sub` is retained in the recovered loadings rather than
+ dropped. Same interface as the default -- only `mixture_em_method` differs.
+ """
+ model = _subsample_model()
+ data = _subsample_data(n=1500)
+ options = AMNEstimationOptions(
+ n_simulation_draws=5000, seed=0, mixture_em_method="missing_data"
+ )
+
+ result = estimate_amn(model, data, options)
+
+ meas = result.params.xs("loadings", level="category").index.get_level_values(
+ "name1"
+ )
+ assert "y_sub" in set(meas) # subsample measurement retained, not dropped
+ assert "y2" in set(meas)
+
+
+def _split_panel_data(n: int = 1000, seed: int = 0) -> pd.DataFrame:
+ """Unbalanced panel: each individual is observed in exactly one period.
+
+ No individual spans both periods, so the augmented vector has zero
+ complete-case rows -- the regime that forces the missing-data EM.
+ """
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ f = rng.normal()
+ period = caseid % 2
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y3": 1.1 * f + rng.normal(0, 0.5),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_estimate_amn_complete_case_raises_on_unbalanced_panel():
+ """With zero complete-case rows the default method raises, no silent switch."""
+ model = _tiny_model()
+ data = _split_panel_data(n=1000)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ with pytest.raises(InsufficientCompleteCasesError, match="missing_data"):
+ estimate_amn(model, data, options)
+
+
+def test_estimate_amn_missing_data_fits_unbalanced_panel():
+ """The missing-data method fits the mixture even with no complete rows.
+
+ Each individual is observed in exactly one period, so columns from the two
+ periods are never co-observed: the EM still fits (and recovers the means)
+ but warns that the cross-period covariances are unidentified.
+ """
+ model = _tiny_model()
+ data = _split_panel_data(n=1000)
+ options = AMNEstimationOptions(
+ n_simulation_draws=2000, seed=0, mixture_em_method="missing_data"
+ )
+
+ with pytest.warns(RuntimeWarning, match="co-observation"):
+ result = estimate_amn(model, data, options)
+
+ assert isinstance(result.success, bool)
+ assert result.stages.mixture.means.shape[0] == 2
+
+
+@pytest.mark.parametrize("override", ["start_params", "fixed_params"])
+def test_estimate_amn_rejects_param_overrides(override):
+ """estimate_amn refuses start_params wholesale and fixed_params it cannot honour.
+
+ `start_params` has no single free optimisation to warm-start, so any pin is
+ refused. `fixed_params` is honoured for the categories owned by the stage
+ that fits them (transition, loadings, controls, meas_sds); a pin on a
+ category AMN cannot hold in-stage (here a derived `shock_sds` residual SD)
+ still raises rather than silently overwriting the estimate.
+ """
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [0.42]},
+ index=pd.MultiIndex.from_tuples(
+ [("shock_sds", 0, "skills", "-")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ callers = {
+ "start_params": lambda: estimate_amn(model, data, options, start_params=pin),
+ "fixed_params": lambda: estimate_amn(model, data, options, fixed_params=pin),
+ }
+
+ with pytest.raises(NotImplementedError):
+ callers[override]()
+
+
+def test_estimate_amn_honours_fixed_loading():
+ """A pinned measurement loading is held in the Stage-2 minimum distance.
+
+ The free fit would estimate the y2 loading from the moments; pinning it must
+ hold it exactly while the other structural parameters adjust around it.
+ """
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [0.8]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y2", "skills")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=pin)
+
+ got = result.params.loc[("loadings", 0, "y2", "skills"), "value"]
+ assert got == pytest.approx(0.8)
+
+
+def test_estimate_amn_honours_fixed_meas_sd():
+ """A pinned measurement SD is held in the Stage-2 minimum distance."""
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [0.5]},
+ index=pd.MultiIndex.from_tuples(
+ [("meas_sds", 0, "y2", "-")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=pin)
+
+ got = result.params.loc[("meas_sds", 0, "y2", "-"), "value"]
+ assert got == pytest.approx(0.5)
+
+
+def test_estimate_amn_rejects_pinning_normalized_loading():
+ """Pinning a loading the model already normalizes is a clear error.
+
+ `y1` is the loading-normalized measure (lambda = 1), so it is not a free
+ Stage-2 parameter; trying to pin it must raise rather than silently no-op.
+ """
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [2.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ with pytest.raises(ValueError, match="normaliz"):
+ estimate_amn(model, data, options, fixed_params=pin)
+
+
+def test_estimate_amn_rejects_constraints():
+ """A non-empty constraints list is refused; the AMN stages cannot honour it."""
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ constraint = om.EqualityConstraint(
+ selector=lambda params: params.loc[[("loadings", 1, "y2", "skills")]]
+ )
+
+ with pytest.raises(NotImplementedError):
+ estimate_amn(model, data, options, constraints=[constraint])
+
+
+def test_estimate_amn_standalone_rejects_restricted_ces():
+ """Standalone AMN refuses a restricted-CES model it cannot consistently estimate.
+
+ The restricted-CES (`log_ces`) Stage-3 regression omits Freyberger's
+ primitive-scale recovery, so a standalone fit would return inconsistent CES
+ parameters. estimate_amn must raise instead, pointing to log_ces_general or
+ seeding estimate_chs.
+ """
+ model = _tiny_ces_model()
+ data = _tiny_data(n=500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=0)
+
+ with pytest.raises(NotImplementedError, match="restricted-CES"):
+ estimate_amn(model, data, options)
+
+
+def test_amn_seeding_bypasses_restricted_ces_guard():
+ """The standalone guard does not fire when AMN is seeding estimate_chs.
+
+ `linearize_control_function=True` marks the CHS-seeding context (CHS re-fits
+ every parameter), so a rough restricted-CES seed is acceptable; the guard
+ must let it through. A non-CES model never trips the guard either.
+ """
+ ces = process_model(_tiny_ces_model())
+ # Seeding context: no raise even though the transition is restricted CES.
+ _fail_if_standalone_unsupported(ces, for_start_values=True)
+ # Standalone non-CES model: no raise.
+ _fail_if_standalone_unsupported(
+ process_model(_tiny_model()), for_start_values=False
+ )
+ # Standalone CES: raises (mirrors the integration test above).
+ with pytest.raises(NotImplementedError, match="restricted-CES"):
+ _fail_if_standalone_unsupported(ces, for_start_values=False)
+
+
+def test_estimate_amn_standalone_rejects_log_ces_af():
+ """log_ces_af is restricted CES too (Pro F6) and must trip the guard."""
+ model = ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="log_ces_af",
+ ),
+ },
+ n_mixtures=2,
+ )
+ processed = process_model(model)
+ with pytest.raises(NotImplementedError, match="restricted-CES"):
+ _fail_if_standalone_unsupported(processed, for_start_values=False)
+
+
+def test_estimate_amn_returns_success_flag():
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=2000, seed=1)
+
+ result = estimate_amn(model, data, options)
+
+ assert isinstance(result.success, bool)
+ assert result.stages.mixture.weights.shape == (2,)
+ assert result.stages.structural.factor_period_slots == (
+ (0, "skills"),
+ (1, "skills"),
+ )
+
+
+def test_estimate_amn_honours_fixed_transition_constant():
+ """A pinned transition constant is held exactly in the Stage-3 regression.
+
+ The free fit would put a nonzero intercept on the skills production
+ regression; pinning it to 0 must partial the intercept out and report
+ exactly 0, leaving the other coefficients free.
+ """
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=5000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [0.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("transition", 0, "skills", "constant")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=pin)
+
+ got = result.params.loc[("transition", 0, "skills", "constant"), "value"]
+ assert got == 0.0
+
+
+def test_estimate_amn_honours_fixed_transition_slope():
+ """A pinned transition slope is held at its value, not re-estimated."""
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(n_simulation_draws=5000, seed=0)
+
+ pin = pd.DataFrame(
+ {"value": [0.3]},
+ index=pd.MultiIndex.from_tuples(
+ [("transition", 0, "skills", "skills")],
+ names=["category", "aug_period", "name1", "name2"],
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=pin)
+
+ got = result.params.loc[("transition", 0, "skills", "skills"), "value"]
+ assert got == pytest.approx(0.3)
diff --git a/tests/test_amn_inference.py b/tests/test_amn_inference.py
new file mode 100644
index 00000000..a5ebb5bf
--- /dev/null
+++ b/tests/test_amn_inference.py
@@ -0,0 +1,146 @@
+"""Tests for `skillmodels.amn.inference.compute_amn_standard_errors`."""
+
+import dataclasses
+
+import numpy as np
+import pandas as pd
+import pytest
+
+import skillmodels.amn.inference as inf
+from skillmodels.amn import compute_amn_standard_errors, estimate_amn
+from skillmodels.amn.types import AMNEstimationOptions
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+def _tiny_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+ )
+
+
+def _tiny_data(n: int = 800, seed: int = 0) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ f0 = rng.normal()
+ f1 = 0.6 * f0 + rng.normal(0, 0.5)
+ for period, f in [(0, f0), (1, f1)]:
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y3": 1.1 * f + rng.normal(0, 0.5),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_bootstrap_returns_expected_shapes():
+ model = _tiny_model()
+ data = _tiny_data(n=500, seed=0)
+ options = AMNEstimationOptions(n_simulation_draws=1000, seed=0)
+ fit = estimate_amn(model, data, options)
+
+ inference = compute_amn_standard_errors(fit, data, options, n_boot=5, seed=11)
+
+ assert inference.n_boot == 5
+ assert inference.n_clusters == 500
+ assert inference.standard_errors.shape[0] == fit.params.shape[0]
+ assert inference.replicate_params.shape == (5, fit.params.shape[0])
+ assert inference.vcov.shape == (fit.params.shape[0], fit.params.shape[0])
+
+
+def test_bootstrap_standard_errors_non_negative_and_finite_where_replicates_finite():
+ model = _tiny_model()
+ data = _tiny_data(n=500, seed=1)
+ options = AMNEstimationOptions(n_simulation_draws=1000, seed=0)
+ fit = estimate_amn(model, data, options)
+
+ inference = compute_amn_standard_errors(fit, data, options, n_boot=8, seed=42)
+
+ # Wherever we have at least two finite replicates for a parameter,
+ # the std should be finite and non-negative.
+ for col in inference.standard_errors.index:
+ finite = inference.replicate_params[col].dropna()
+ if len(finite) >= 2:
+ se = inference.standard_errors[col]
+ assert np.isfinite(se)
+ assert se >= 0.0
+
+
+def test_bootstrap_uses_distinct_reproducible_replicate_seeds(monkeypatch):
+ model = _tiny_model()
+ data = _tiny_data(n=500, seed=0)
+ options = AMNEstimationOptions(n_simulation_draws=1000, seed=0)
+ fit = estimate_amn(model, data, options)
+
+ real = inf.estimate_amn
+
+ def make_spy(record: list[int]):
+ def spy(model_spec, boot_data, amn_options):
+ record.append(amn_options.seed)
+ return real(model_spec, boot_data, amn_options)
+
+ return spy
+
+ seen_seeds: list[int] = []
+ monkeypatch.setattr(inf, "estimate_amn", make_spy(seen_seeds))
+ compute_amn_standard_errors(fit, data, options, n_boot=4, seed=7)
+
+ # All four replicate seeds are distinct (independent random streams).
+ assert len(seen_seeds) == 4
+ assert len(set(seen_seeds)) == 4
+
+ # Same top-level seed reproduces the exact same replicate seeds.
+ seen_again: list[int] = []
+ monkeypatch.setattr(inf, "estimate_amn", make_spy(seen_again))
+ compute_amn_standard_errors(fit, data, options, n_boot=4, seed=7)
+ assert seen_again == seen_seeds
+
+
+def test_bootstrap_excludes_nonconverged_replicate(monkeypatch):
+ model = _tiny_model()
+ data = _tiny_data(n=500, seed=0)
+ options = AMNEstimationOptions(n_simulation_draws=1000, seed=0)
+ fit = estimate_amn(model, data, options)
+
+ real = inf.estimate_amn
+ sentinel = -999.0
+ call_counter = {"n": 0}
+
+ def spy(model_spec, boot_data, amn_options):
+ idx = call_counter["n"]
+ call_counter["n"] += 1
+ real_fit = real(model_spec, boot_data, amn_options)
+ if idx == 1:
+ # 2nd replicate: nonconverged with a recognizable sentinel value.
+ bad_params = real_fit.params.copy()
+ bad_params["value"] = sentinel
+ return dataclasses.replace(real_fit, params=bad_params, success=False)
+ return real_fit
+
+ monkeypatch.setattr(inf, "estimate_amn", spy)
+
+ with pytest.warns(RuntimeWarning, match="did not converge"):
+ inference = compute_amn_standard_errors(fit, data, options, n_boot=4, seed=3)
+
+ # The nonconverged replicate's row is all NaN, not stored.
+ assert inference.replicate_params.iloc[1].isna().all()
+ # The sentinel params never leak into the bootstrap distribution.
+ assert not (inference.replicate_params == sentinel).to_numpy().any()
diff --git a/tests/test_amn_log_ces_general_seed.py b/tests/test_amn_log_ces_general_seed.py
new file mode 100644
index 00000000..bbeec7ff
--- /dev/null
+++ b/tests/test_amn_log_ces_general_seed.py
@@ -0,0 +1,48 @@
+"""Tests for the log_ces_general NLS seed in AMN Stage 3 (Pro F4).
+
+`log_ces_general` names its exponents `sigma_` and its outside
+coefficient `tfp`. The generic seed previously recognized only the exact names
+`phi`/`rho`/`sigma`, so every parameter started at 0 and the transition
+evaluated `tfp * log(sum gamma_i ...) = 0 * log(0) = NaN`, which made
+scipy.least_squares raise "Residuals are not finite in the initial point". The
+seed must recognize `sigma_*` and `tfp` and start the gammas strictly positive.
+"""
+
+import math
+
+import jax.numpy as jnp
+import numpy as np
+
+from skillmodels.amn.simulate_and_regress import (
+ _fit_generic_nls,
+ _seed_generic_nls_theta0,
+)
+from skillmodels.common.transition_functions import log_ces_general
+
+
+def test_log_ces_general_seed_is_finite() -> None:
+ names = ("skills", "investment", "sigma_skills", "sigma_investment", "tfp")
+ theta0 = _seed_generic_nls_theta0(names, {}, n_unknowns=len(names))
+ # gammas strictly positive (so log(gamma) is finite).
+ assert theta0[0] > 0.0
+ assert theta0[1] > 0.0
+ # exponents and outside coefficient nonzero.
+ assert theta0[2] != 0.0
+ assert theta0[3] != 0.0
+ assert theta0[4] != 0.0
+ # the transition evaluates finite at the seed.
+ val = float(log_ces_general(jnp.asarray([1.0, 2.0]), jnp.asarray(theta0)))
+ assert math.isfinite(val)
+
+
+def test_fit_generic_nls_log_ces_general_does_not_blow_up() -> None:
+ # Synthetic data from a known transformed CES; the fitter must start finite
+ # and return a finite residual_sd (Pro F4 reproduction).
+ g1, g2, s1, s2, tfp = 0.65, 0.35, -0.25, -0.5, -2.0
+ rng = np.random.default_rng(0)
+ states = rng.normal(size=(400, 2))
+ y = tfp * np.log(g1 * np.exp(states[:, 0] * s1) + g2 * np.exp(states[:, 1] * s2))
+ names = ("skills", "investment", "sigma_skills", "sigma_investment", "tfp")
+ params, resid_sd = _fit_generic_nls(log_ces_general, names, y, states)
+ assert math.isfinite(resid_sd)
+ assert all(math.isfinite(v) for v in params.values())
diff --git a/tests/test_amn_minimum_distance.py b/tests/test_amn_minimum_distance.py
new file mode 100644
index 00000000..cee142d7
--- /dev/null
+++ b/tests/test_amn_minimum_distance.py
@@ -0,0 +1,476 @@
+"""Tests for `skillmodels.amn.minimum_distance` (AMN Stage 2)."""
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn.minimum_distance import (
+ _build_structure,
+ _initial_guess,
+ _make_objective_and_grad,
+ _objective,
+ _pack_layout,
+ solve_minimum_distance,
+)
+from skillmodels.amn.mixture_em import (
+ build_augmented_measure_layout,
+ build_augmented_measure_matrix,
+ fit_mixture_em,
+)
+from skillmodels.amn.types import (
+ AugmentedMeasureLayout,
+ MixtureFitResult,
+)
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+def _tiny_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _build_oracle_mixture(
+ *,
+ n_components: int = 2,
+ n_aug: int = 6,
+ seed: int = 0,
+ layout: AugmentedMeasureLayout | None = None,
+) -> tuple[MixtureFitResult, dict[str, np.ndarray]]:
+ """Build a synthetic MixtureFitResult with known structural moments.
+
+ Layout: 2 periods x 3 measurements on a single latent factor, anchor
+ measurement loading=1, others = (1.0, 0.8, 1.2). Mean-zero on the
+ period-0 factor.
+ """
+ del seed
+ if layout is None:
+ layout = AugmentedMeasureLayout(
+ columns=tuple(
+ f"y[{t}|skills|{m}]" for t in (0, 1) for m in ("y1", "y2", "y3")
+ ),
+ measurement_slots=tuple(range(n_aug)),
+ observed_factor_slots=(),
+ control_slots=(),
+ measurement_meta=tuple(
+ (t, "skills", m) for t in (0, 1) for m in ("y1", "y2", "y3")
+ ),
+ observed_factor_meta=(),
+ control_meta=(),
+ )
+
+ truth_lambda = np.zeros((6, 2))
+ truth_lambda[0, 0] = 1.0
+ truth_lambda[1, 0] = 0.8
+ truth_lambda[2, 0] = 1.2
+ truth_lambda[3, 1] = 1.0
+ truth_lambda[4, 1] = 0.8
+ truth_lambda[5, 1] = 1.2
+ truth_intercept = np.array([0.0, 0.1, -0.2, 0.5, 0.3, 0.4])
+ truth_sigma2 = np.array([0.3, 0.25, 0.4, 0.35, 0.2, 0.5]) ** 2
+
+ truth_mu = np.array([[-0.6, 0.4], [0.4, -0.3]]) # period-0 enforces sum-to-zero
+ # Enforce sum-to-zero on column 0 (period-0 latent slot) with
+ # weights 0.5/0.5.
+ truth_mu[1, 0] = -truth_mu[0, 0]
+ truth_omega = np.array(
+ [
+ [[1.0, 0.4], [0.4, 1.2]],
+ [[0.9, 0.2], [0.2, 1.1]],
+ ]
+ )
+
+ means = np.empty((n_components, n_aug))
+ covs = np.empty((n_components, n_aug, n_aug))
+ for m in range(n_components):
+ means[m] = truth_intercept + truth_lambda @ truth_mu[m]
+ covs[m] = truth_lambda @ truth_omega[m] @ truth_lambda.T + np.diag(truth_sigma2)
+
+ weights = np.array([0.5, 0.5])
+
+ return MixtureFitResult(
+ weights=weights,
+ means=means,
+ covariances=covs,
+ loglikelihood=-100.0,
+ n_iter=10,
+ converged=True,
+ layout=layout,
+ ), {
+ "lambda": truth_lambda,
+ "intercept": truth_intercept,
+ "sigma2": truth_sigma2,
+ "mu": truth_mu,
+ "omega": truth_omega,
+ }
+
+
+def test_build_structure_identifies_anchor_and_baseline():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+
+ struct = _build_structure(layout, processed)
+
+ # 2 latent-factor-period slots: (0, skills) and (1, skills).
+ assert len(struct.factor_period_slots) == 2
+ assert (0, "skills") in struct.factor_period_slots
+ assert (1, "skills") in struct.factor_period_slots
+ # 6 measurement slots; 2 of them (y1 at periods 0,1) have
+ # normalized loading=1, so lambda has 4 free entries.
+ assert struct.lambda_free_mask.sum() == 4
+ # y1 at period 0 has normalized intercept=0; the other 5 are free.
+ assert struct.intercept_free_mask.sum() == 5
+ # All 6 measurement slots have free sigma2 (no obs factors, no controls).
+ assert struct.sigma2_free_mask.sum() == 6
+ # Baseline mean-zero slot is (0, "skills").
+ baseline_slot = struct.factor_period_slots.index((0, "skills"))
+ assert baseline_slot in struct.baseline_mean_zero_slots
+
+
+def test_pack_layout_returns_consistent_total():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ struct = _build_structure(layout, processed)
+
+ n_total, slices = _pack_layout(struct, n_components=2)
+
+ # sigma2: 6 free; chol_0+chol_1: 2*3=6; mu: 2*2 - 1 baseline = 3;
+ # lambda: 4 free; intercept: 5 free => 6+6+3+4+5 = 24.
+ assert n_total == 24
+ assert slices["sigma2"] == slice(0, 6)
+
+
+def _numpy_fd_grad(fn, x, h: float = 1e-6) -> np.ndarray:
+ """Central finite-difference gradient of a scalar function."""
+ grad = np.zeros_like(x)
+ for i in range(x.size):
+ xp = x.copy()
+ xp[i] += h
+ xm = x.copy()
+ xm[i] -= h
+ grad[i] = (fn(xp) - fn(xm)) / (2 * h)
+ return grad
+
+
+def test_md_analytical_gradient_matches_numerical():
+ """The JAX objective + gradient match the numpy criterion and its FD gradient.
+
+ `solve_minimum_distance` passes this analytical gradient to the optimizer so
+ each L-BFGS-B step costs one backward pass instead of `n_params` finite-
+ difference objective evaluations -- the difference between seconds and hours
+ once the factor-period block (and thus the parameter vector) is large.
+ """
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+ struct = _build_structure(layout, processed)
+ n_components = mixture.weights.shape[0]
+ n_total, slices = _pack_layout(struct, n_components)
+
+ value_fn, grad_fn = _make_objective_and_grad(
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture.weights,
+ target_means=mixture.means,
+ target_covs=mixture.covariances,
+ )
+
+ rng = np.random.default_rng(1)
+ flat = _initial_guess(
+ struct,
+ slices,
+ n_components=n_components,
+ n_total=n_total,
+ target_means=mixture.means,
+ target_covs=mixture.covariances,
+ ) + 0.05 * rng.standard_normal(n_total)
+
+ def numpy_obj(x: np.ndarray) -> float:
+ return _objective(
+ x,
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture.weights,
+ target_means=mixture.means,
+ target_covs=mixture.covariances,
+ )
+
+ assert value_fn(flat) == pytest.approx(numpy_obj(flat), rel=1e-6)
+ np.testing.assert_allclose(
+ grad_fn(flat), _numpy_fd_grad(numpy_obj, flat), rtol=1e-4, atol=1e-5
+ )
+
+
+def test_solve_minimum_distance_respects_maxiter_cap():
+ """A `stopping_maxiter` cap is honoured (the seeding budget bound).
+
+ With the exact analytical gradient each L-BFGS-B step is cheap, but a seed
+ does not need full convergence; the cap bounds the Stage-2 cost on a large
+ factor-period block. A tiny cap must return a valid result, not error.
+ """
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ result = solve_minimum_distance(
+ mixture, processed, algo_options={"stopping_maxiter": 2}
+ )
+
+ assert isinstance(result.objective_value, float)
+ assert result.loadings.shape[0] == 6
+
+
+def test_solve_minimum_distance_recovers_oracle():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _truth = _build_oracle_mixture(layout=layout)
+
+ result = solve_minimum_distance(mixture, processed)
+
+ # The minimum-distance criterion should be near zero on oracle moments.
+ assert result.objective_value < 1e-3
+
+ # Loadings should match truth within tolerance.
+ loadings = result.loadings.reset_index().set_index(["period", "measurement"])
+ assert loadings.loc[(0, "y1"), "loading"] == pytest.approx(1.0, abs=1e-6)
+ assert loadings.loc[(0, "y2"), "loading"] == pytest.approx(0.8, abs=5e-2)
+ assert loadings.loc[(0, "y3"), "loading"] == pytest.approx(1.2, abs=5e-2)
+
+
+def test_solve_minimum_distance_rejects_unknown_weighting():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ with pytest.raises(ValueError, match="Unknown weighting"):
+ solve_minimum_distance(mixture, processed, weighting="bogus")
+
+
+def _observed_factor_model() -> ModelSpec:
+ """One latent factor (2 measurements, 1 period) plus an observed factor."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"),),
+ normalizations=Normalizations(
+ loadings=({"y1": 1},),
+ intercepts=({"y1": 0},),
+ ),
+ transition_function="linear",
+ ),
+ },
+ observed_factors=("inv",),
+ controls=("momed",),
+ )
+
+
+def test_build_structure_pins_observed_and_control_intercepts():
+ model = _observed_factor_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+
+ struct = _build_structure(layout, processed)
+
+ # Observed-factor and control slots must have pinned (not free) zero
+ # intercepts; this is the direct guard against the regression.
+ for idx in (*layout.observed_factor_slots, *layout.control_slots):
+ assert struct.intercept_free_mask[idx] == np.False_
+ assert struct.intercept_value[idx] == 0.0
+
+ # A latent measurement slot with a non-normalized intercept (y2) is
+ # still free, confirming we only pinned the observed/control slots.
+ y2_slot = next(
+ slot
+ for slot, meta in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ )
+ if meta[2] == "y2"
+ )
+ assert struct.intercept_free_mask[y2_slot] == np.True_
+
+
+def test_minimum_distance_recovers_observed_factor_level():
+ model = ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"),),
+ normalizations=Normalizations(
+ loadings=({"y1": 1},),
+ intercepts=({"y1": 0},),
+ ),
+ transition_function="linear",
+ ),
+ },
+ observed_factors=("inv",),
+ )
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+
+ # Augmented vector columns: y1, y2, obs_factor inv.
+ # Factor-period slots: (0, skills), (0, inv).
+ n_aug = 3
+ n_components = 2
+ truth_lambda = np.zeros((n_aug, 2))
+ truth_lambda[0, 0] = 1.0 # y1 loads on skills, normalized.
+ truth_lambda[1, 0] = 0.8 # y2 loads on skills, free.
+ truth_lambda[2, 1] = 1.0 # obs_factor inv loads on its own slot.
+ truth_intercept = np.array([0.0, 0.1, 0.0])
+ truth_sigma2 = np.array([0.3, 0.25, 0.0]) ** 2
+
+ pi = np.array([1.3, 2.1]) # true per-component reduced-form level of inv.
+ truth_mu = np.zeros((n_components, 2))
+ truth_mu[0, 0] = -0.6 # skills period-0 mean-zero (weights 0.5/0.5).
+ truth_mu[1, 0] = 0.6
+ truth_mu[:, 1] = pi
+ truth_omega = np.array(
+ [
+ [[1.0, 0.0], [0.0, 0.5]],
+ [[0.9, 0.0], [0.0, 0.4]],
+ ]
+ )
+
+ means = np.empty((n_components, n_aug))
+ covs = np.empty((n_components, n_aug, n_aug))
+ for m in range(n_components):
+ means[m] = truth_intercept + truth_lambda @ truth_mu[m]
+ covs[m] = truth_lambda @ truth_omega[m] @ truth_lambda.T + np.diag(truth_sigma2)
+
+ mixture = MixtureFitResult(
+ weights=np.array([0.5, 0.5]),
+ means=means,
+ covariances=covs,
+ loglikelihood=-1.0,
+ n_iter=1,
+ converged=True,
+ layout=layout,
+ )
+
+ result = solve_minimum_distance(mixture, processed)
+
+ inv_col = result.factor_period_slots.index((0, "inv"))
+ np.testing.assert_allclose(result.factor_mixture_means[:, inv_col], pi, atol=1e-3)
+ assert result.objective_value < 1e-3
+
+
+def test_solve_minimum_distance_runs_on_fitted_mixture():
+ """End-to-end: simulate 1-component data, fit, then recover Lambda."""
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+
+ rng = np.random.default_rng(0)
+ n = 1500
+ # period-0 factor mean-zero (sum-to-zero with itself => 0).
+ period0 = rng.normal(0.0, 1.0, size=n)
+ period1 = 0.7 * period0 + rng.normal(0.0, 0.6, size=n)
+
+ rows = []
+ for caseid in range(n):
+ for period, f in [(0, period0[caseid]), (1, period1[caseid])]:
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.8 * f + rng.normal(0, 0.4),
+ "y3": 1.2 * f + rng.normal(0, 0.35),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+ augmented = build_augmented_measure_matrix(data, processed, layout)
+
+ mixture = fit_mixture_em(augmented, n_components=2, n_init=2, seed=0, layout=layout)
+
+ result = solve_minimum_distance(mixture, processed)
+
+ # Just verifying it runs and produces a finite objective.
+ assert np.isfinite(result.objective_value)
+ assert result.loadings.shape[0] == 6
+
+
+def _ces_model(*, loadings: tuple, intercepts: tuple) -> ModelSpec:
+ """CES (`log_ces`) model with 3 measurements over 2 periods."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=loadings,
+ intercepts=intercepts,
+ ),
+ transition_function="log_ces",
+ ),
+ },
+ )
+
+
+def test_solve_minimum_distance_rejects_ces_overnormalization():
+ model = _ces_model(
+ loadings=({"y1": 1, "y2": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ )
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ with pytest.raises(ValueError, match="loading normalizations"):
+ solve_minimum_distance(mixture, processed)
+
+
+def test_solve_minimum_distance_allows_ces_overnormalization_when_opted_in():
+ model = _ces_model(
+ loadings=({"y1": 1, "y2": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ )
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ result = solve_minimum_distance(mixture, processed, allow_overnormalization=True)
+
+ assert np.isfinite(result.objective_value)
+
+
+def test_solve_minimum_distance_rejects_ces_missing_normalization():
+ model = _ces_model(
+ loadings=({"y1": 1}, {}),
+ intercepts=({"y1": 0}, {}),
+ )
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ with pytest.raises(ValueError, match="no loading normalization"):
+ solve_minimum_distance(mixture, processed)
+
+
+def test_solve_minimum_distance_rejects_documented_optimal():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ mixture, _ = _build_oracle_mixture(layout=layout)
+
+ with pytest.raises(NotImplementedError, match="not yet implemented"):
+ solve_minimum_distance(mixture, processed, weighting="optimal")
diff --git a/tests/test_amn_missing_data_em.py b/tests/test_amn_missing_data_em.py
new file mode 100644
index 00000000..2c2d2f6e
--- /dev/null
+++ b/tests/test_amn_missing_data_em.py
@@ -0,0 +1,290 @@
+"""Tests for the missing-data Gaussian-mixture EM (AMN Stage 1 fallback)."""
+
+import numpy as np
+import pytest
+from scipy.special import logsumexp
+from scipy.stats import multivariate_normal
+from sklearn.mixture import GaussianMixture
+
+from skillmodels.amn.missing_data_em import _run_em, fit_gaussian_mixture_missing
+
+
+def _mixture_loglik(
+ data: np.ndarray,
+ weights: np.ndarray,
+ means: np.ndarray,
+ covs: np.ndarray,
+) -> float:
+ """Independent complete-data Gaussian-mixture log-likelihood (an oracle)."""
+ log_comp = np.column_stack(
+ [
+ np.log(weights[k])
+ + multivariate_normal.logpdf(data, mean=means[k], cov=covs[k])
+ for k in range(weights.shape[0])
+ ]
+ )
+ return float(logsumexp(log_comp, axis=1).sum())
+
+
+def _simulate_two_component(
+ *,
+ n: int,
+ weights: tuple[float, float],
+ means: tuple[np.ndarray, np.ndarray],
+ chols: tuple[np.ndarray, np.ndarray],
+ seed: int,
+) -> np.ndarray:
+ rng = np.random.default_rng(seed)
+ labels = rng.choice([0, 1], size=n, p=list(weights))
+ out = np.empty((n, means[0].shape[0]))
+ for k in (0, 1):
+ idx = labels == k
+ if idx.any():
+ standard = rng.normal(size=(int(idx.sum()), means[k].shape[0]))
+ out[idx] = standard @ chols[k].T + means[k]
+ return out
+
+
+_WEIGHTS = (0.4, 0.6)
+_MEANS = (np.array([-2.0, 1.0]), np.array([2.0, -1.0]))
+_CHOLS = (
+ np.linalg.cholesky(np.array([[1.0, 0.3], [0.3, 1.2]])),
+ np.linalg.cholesky(np.array([[0.8, -0.2], [-0.2, 1.0]])),
+)
+
+
+def _align(fitted_means: np.ndarray) -> np.ndarray:
+ """Return the index order lining fitted components up to the truth by mean[0]."""
+ return np.argsort(fitted_means[:, 0])
+
+
+def test_missing_data_em_matches_sklearn_on_complete_data():
+ """With no missingness the EM must match sklearn's GaussianMixture."""
+ data = _simulate_two_component(
+ n=4000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=1
+ )
+
+ mine = fit_gaussian_mixture_missing(
+ data, n_components=2, max_iter=500, tol=1e-7, n_init=5, reg_covar=1e-6, seed=1
+ )
+ ref = GaussianMixture(
+ n_components=2, covariance_type="full", n_init=5, reg_covar=1e-6, random_state=1
+ ).fit(data)
+
+ mine_order = _align(mine.means)
+ ref_order = _align(ref.means_)
+ np.testing.assert_allclose(
+ mine.weights[mine_order], ref.weights_[ref_order], atol=0.02
+ )
+ np.testing.assert_allclose(mine.means[mine_order], ref.means_[ref_order], atol=0.05)
+
+
+def test_missing_data_em_covariances_match_sklearn_under_nontrivial_ridge():
+ """On complete data the EM must reproduce sklearn's covariances exactly.
+
+ The fitted covariance is the observed-data MLE: observed entries carry no
+ extra measurement noise. A non-trivial `reg_covar` is the ridge added once
+ by the M-step (exactly as sklearn does); it must not also inflate the
+ covariance used in the E-step's density and conditional moments. With a
+ large ridge any double-counting is plainly visible in the covariances.
+ """
+ data = _simulate_two_component(
+ n=6000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=11
+ )
+ reg = 0.1
+
+ mine = fit_gaussian_mixture_missing(
+ data, n_components=2, max_iter=800, tol=1e-10, n_init=5, reg_covar=reg, seed=11
+ )
+ # Match the convergence criteria so both EMs sit at the same fixed point:
+ # at convergence the complete-data update equations are identical, so any
+ # remaining covariance gap is a genuine math discrepancy, not early stopping.
+ ref = GaussianMixture(
+ n_components=2,
+ covariance_type="full",
+ n_init=5,
+ reg_covar=reg,
+ random_state=11,
+ tol=1e-10,
+ max_iter=800,
+ ).fit(data)
+
+ mine_order = _align(mine.means)
+ ref_order = _align(ref.means_)
+ np.testing.assert_allclose(
+ mine.covariances[mine_order],
+ ref.covariances_[ref_order],
+ rtol=2e-3,
+ atol=2e-3,
+ )
+
+
+def test_missing_data_em_recovers_params_under_mcar():
+ """Under ~30% MCAR missingness the EM recovers the true mixture."""
+ data = _simulate_two_component(
+ n=8000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=2
+ )
+ rng = np.random.default_rng(2)
+ data = data.copy()
+ data[rng.uniform(size=data.shape) < 0.3] = np.nan
+
+ fit = fit_gaussian_mixture_missing(
+ data, n_components=2, max_iter=500, tol=1e-7, n_init=5, reg_covar=1e-6, seed=2
+ )
+
+ order = _align(fit.means)
+ truth_order = _align(np.vstack(_MEANS))
+ np.testing.assert_allclose(
+ fit.weights[order], np.array(_WEIGHTS)[truth_order], atol=0.05
+ )
+ for fk, tk in zip(order, truth_order, strict=True):
+ np.testing.assert_allclose(fit.means[fk], _MEANS[tk], atol=0.15)
+
+
+def test_missing_data_em_fits_when_no_row_is_complete():
+ """Fits even when every row misses an entry (the unbalanced-panel case).
+
+ Column 0 is missing for even rows and column 1 for odd rows, so no row is
+ complete -- the complete-case GaussianMixture is infeasible -- yet the
+ pairwise/marginal information still identifies a single Gaussian's means.
+ No row observes both columns, so the cross-covariance is unidentified: the
+ fit must flag that (and warn) rather than report ordinary convergence alone.
+ """
+ rng = np.random.default_rng(3)
+ data = rng.normal(loc=[5.0, -3.0], scale=[1.0, 1.0], size=(2000, 2))
+ data[::2, 0] = np.nan # even rows miss column 0
+ data[1::2, 1] = np.nan # odd rows miss column 1
+ assert (~np.isnan(data).any(axis=1)).sum() == 0 # no complete rows
+
+ with pytest.warns(RuntimeWarning, match="co-observation"):
+ fit = fit_gaussian_mixture_missing(
+ data,
+ n_components=1,
+ max_iter=500,
+ tol=1e-7,
+ n_init=3,
+ reg_covar=1e-6,
+ seed=3,
+ )
+
+ np.testing.assert_allclose(fit.means[0], [5.0, -3.0], atol=0.1)
+ assert fit.co_observation_graph_connected is False
+
+
+def test_missing_data_em_raises_on_never_observed_column_by_default():
+ """A never-observed column is unidentified -> raise unless explicitly allowed.
+
+ A column observed in no row contributes nothing to the likelihood: its mean
+ and (co)variances are arbitrary, not estimated. Returning a neutral seed for
+ it silently feeds noise into the downstream structural moments, so standalone
+ estimation must fail loudly rather than warn. Regression for audit finding F7.
+ """
+ rng = np.random.default_rng(5)
+ data = rng.normal(size=(200, 3))
+ data[:, 1] = np.nan # column 1 never observed
+
+ with pytest.raises(ValueError, match="never observed"):
+ fit_gaussian_mixture_missing(
+ data, n_components=1, max_iter=50, tol=1e-7, n_init=1, seed=0
+ )
+
+
+def test_missing_data_em_allows_never_observed_column_when_opted_in():
+ """`allow_never_observed=True` (the seeding path) keeps the warn+neutral-seed.
+
+ When the missing-data EM only seeds an estimator that re-fits every parameter
+ from the data (e.g. `estimate_chs`), a never-observed column dropped by row
+ subsampling must not crash the pipeline; it falls back to a neutral seed and
+ warns. Regression for audit finding F7.
+ """
+ rng = np.random.default_rng(5)
+ data = rng.normal(size=(200, 3))
+ data[:, 1] = np.nan # column 1 never observed
+
+ with pytest.warns(RuntimeWarning, match="never observed"):
+ fit = fit_gaussian_mixture_missing(
+ data,
+ n_components=1,
+ max_iter=50,
+ tol=1e-7,
+ n_init=1,
+ reg_covar=1e-6,
+ seed=0,
+ allow_never_observed=True,
+ )
+
+ assert fit.co_observation_graph_connected is False
+ assert fit.means.shape == (1, 3)
+ np.testing.assert_allclose(fit.means[0, [0, 2]], 0.0, atol=0.2)
+
+
+def test_missing_data_em_reports_connected_co_observation_graph_under_mcar():
+ """Under MCAR every column pair is co-observed somewhere, so the flag is True."""
+ data = _simulate_two_component(
+ n=3000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=7
+ )
+ rng = np.random.default_rng(7)
+ data[rng.uniform(size=data.shape) < 0.2] = np.nan
+
+ fit = fit_gaussian_mixture_missing(
+ data, n_components=2, max_iter=300, tol=1e-7, n_init=2, reg_covar=1e-6, seed=7
+ )
+
+ assert fit.co_observation_graph_connected is True
+
+
+def test_missing_data_em_reports_convergence_and_shapes():
+ data = _simulate_two_component(
+ n=1000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=4
+ )
+ data[::5, 0] = np.nan
+
+ fit = fit_gaussian_mixture_missing(
+ data, n_components=2, max_iter=500, tol=1e-7, n_init=2, reg_covar=1e-6, seed=4
+ )
+
+ assert fit.weights.shape == (2,)
+ assert fit.means.shape == (2, 2)
+ assert fit.covariances.shape == (2, 2, 2)
+ assert isinstance(fit.converged, bool)
+ assert fit.n_iter >= 1
+
+
+def test_run_em_returns_loglik_of_returned_params():
+ """The returned log-likelihood must score the returned parameters.
+
+ The score is computed in the E-step at the start of each iteration, but the
+ parameters are then updated by the M-step. Returning that pre-M-step score
+ alongside the post-M-step parameters makes the restart ranking one step
+ stale. A single EM step from a deliberately-off start moves the parameters
+ a lot, so the stale score lags the true score of the returned params by a
+ wide margin.
+ """
+ data = _simulate_two_component(
+ n=2000, weights=_WEIGHTS, means=_MEANS, chols=_CHOLS, seed=21
+ )
+ mask = np.ones_like(data)
+ weights0 = np.array([0.5, 0.5])
+ means0 = np.array([[0.0, 0.0], [0.5, -0.5]]) # far from the true means at ±2
+ covs0 = np.stack([np.eye(2), np.eye(2)])
+
+ weights, means, covs, loglik, _n_iter, _converged = _run_em(
+ data, mask, weights0, means0, covs0, max_iter=1, tol=0.0, reg_covar=1e-6
+ )
+
+ oracle = _mixture_loglik(data, weights, means, covs)
+ np.testing.assert_allclose(loglik, oracle, rtol=1e-6)
+
+
+def test_missing_data_em_raises_when_all_columns_missing_for_all_rows():
+ data = np.full((10, 2), np.nan)
+ with pytest.raises(ValueError, match="no observed"):
+ fit_gaussian_mixture_missing(
+ data,
+ n_components=1,
+ max_iter=10,
+ tol=1e-6,
+ n_init=1,
+ reg_covar=1e-6,
+ seed=0,
+ )
diff --git a/tests/test_amn_mixture_em.py b/tests/test_amn_mixture_em.py
new file mode 100644
index 00000000..96d86e21
--- /dev/null
+++ b/tests/test_amn_mixture_em.py
@@ -0,0 +1,259 @@
+"""Tests for `skillmodels.amn.mixture_em` (AMN Stage 1)."""
+
+import warnings
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn.mixture_em import (
+ InsufficientCompleteCasesError,
+ build_augmented_measure_layout,
+ build_augmented_measure_matrix,
+ fit_mixture_em,
+)
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+def _tiny_model() -> ModelSpec:
+ """Return a 2-period, 1-latent-factor model with 3 indicators per period."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _tiny_long_data(n: int = 200, seed: int = 0) -> pd.DataFrame:
+ """Two periods, three measurements each, drawn from N(0, 1) + noise."""
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ factor_0 = rng.normal()
+ factor_1 = 0.6 * factor_0 + rng.normal(0, 0.5)
+ for period, f in [(0, factor_0), (1, factor_1)]:
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y3": 1.1 * f + rng.normal(0, 0.5),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_layout_has_one_slot_per_measurement_update():
+ model = _tiny_model()
+ processed = process_model(model)
+
+ layout = build_augmented_measure_layout(processed)
+
+ # 2 periods x 3 measurements = 6 measurement slots, no observed factors
+ # or controls.
+ assert len(layout.measurement_slots) == 6
+ assert layout.observed_factor_slots == ()
+ assert layout.control_slots == ()
+ assert len(layout.columns) == 6
+
+
+def test_layout_records_period_factor_and_measurement_names():
+ model = _tiny_model()
+ processed = process_model(model)
+
+ layout = build_augmented_measure_layout(processed)
+
+ assert set(layout.measurement_meta) == {
+ (0, "skills", "y1"),
+ (0, "skills", "y2"),
+ (0, "skills", "y3"),
+ (1, "skills", "y1"),
+ (1, "skills", "y2"),
+ (1, "skills", "y3"),
+ }
+
+
+def test_layout_skips_anchoring_rows():
+ """Anchoring outcomes (purpose != measurement) must not become slots."""
+ base = _tiny_model()
+ from skillmodels.common.model_spec import AnchoringSpec # noqa: PLC0415
+
+ anchored = base.with_anchoring(
+ AnchoringSpec(
+ outcomes={"skills": "outcome"},
+ free_controls=False,
+ free_constant=False,
+ free_loadings=True,
+ ignore_constant_when_anchoring=True,
+ )
+ )
+ processed = process_model(anchored)
+
+ layout = build_augmented_measure_layout(processed)
+
+ # 6 measurement slots; anchoring update rows are filtered out.
+ for _, factor, _ in layout.measurement_meta:
+ assert factor == "skills"
+ assert len(layout.measurement_slots) == 6
+
+
+def test_matrix_fills_each_slot_from_the_right_period():
+ model = _tiny_model()
+ processed = process_model(model)
+ data = _tiny_long_data(n=50, seed=1)
+
+ layout = build_augmented_measure_layout(processed)
+ matrix = build_augmented_measure_matrix(data, processed, layout)
+
+ assert matrix.shape == (50, 6)
+
+ # Period 0 slot for y1 must equal data.loc[(*, 0), "y1"].
+ period0_y1_slot = next(
+ slot
+ for slot, meta in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ )
+ if meta == (0, "skills", "y1")
+ )
+ expected = data.xs(0, level="period")["y1"].to_numpy()
+ np.testing.assert_allclose(matrix[:, period0_y1_slot], expected)
+
+
+def test_matrix_marks_missing_caseids_as_nan():
+ model = _tiny_model()
+ processed = process_model(model)
+ layout = build_augmented_measure_layout(processed)
+ data = _tiny_long_data(n=10, seed=2)
+ # Drop period 1 for caseid 0 entirely.
+ data = data.drop(index=(0, 1))
+
+ matrix = build_augmented_measure_matrix(data, processed, layout)
+
+ # The first row corresponds to caseid 0; period-1 slots should be NaN.
+ period1_slots = [
+ slot
+ for slot, (period, _, _) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ )
+ if period == 1
+ ]
+ assert np.all(np.isnan(matrix[0, period1_slots]))
+ # Period-0 slots for the same caseid stay finite.
+ period0_slots = [
+ slot
+ for slot, (period, _, _) in zip(
+ layout.measurement_slots, layout.measurement_meta, strict=True
+ )
+ if period == 0
+ ]
+ assert np.all(np.isfinite(matrix[0, period0_slots]))
+
+
+def _simulate_two_component_panel(
+ *,
+ n: int,
+ weights: tuple[float, float],
+ means: tuple[np.ndarray, np.ndarray],
+ chols: tuple[np.ndarray, np.ndarray],
+ seed: int,
+) -> np.ndarray:
+ rng = np.random.default_rng(seed)
+ labels = rng.choice([0, 1], size=n, p=list(weights))
+ samples = np.empty((n, means[0].shape[0]))
+ for k in (0, 1):
+ idx = labels == k
+ if idx.any():
+ standard = rng.normal(size=(idx.sum(), means[k].shape[0]))
+ samples[idx] = standard @ chols[k].T + means[k]
+ return samples
+
+
+def test_fit_mixture_em_recovers_two_components_within_tolerance():
+ truth_weights = (0.4, 0.6)
+ truth_means = (np.array([-1.5, 1.0]), np.array([1.5, -1.0]))
+ truth_chols = (
+ np.linalg.cholesky(np.array([[1.0, 0.3], [0.3, 1.2]])),
+ np.linalg.cholesky(np.array([[0.8, -0.2], [-0.2, 1.0]])),
+ )
+ augmented = _simulate_two_component_panel(
+ n=4000,
+ weights=truth_weights,
+ means=truth_means,
+ chols=truth_chols,
+ seed=11,
+ )
+
+ result = fit_mixture_em(augmented, n_components=2, n_init=3, seed=11)
+
+ assert result.converged
+ # Order of components is arbitrary; line them up to the truth by
+ # nearest-mean.
+ order = np.argsort(result.means[:, 0])
+ truth_order = np.argsort([truth_means[0][0], truth_means[1][0]])
+
+ np.testing.assert_allclose(
+ result.weights[order],
+ np.array(truth_weights)[truth_order],
+ atol=0.05,
+ )
+ for fitted_k, truth_k in zip(order, truth_order, strict=True):
+ np.testing.assert_allclose(
+ result.means[fitted_k],
+ truth_means[truth_k],
+ atol=0.15,
+ )
+
+
+def test_fit_mixture_em_drops_incomplete_rows():
+ rng = np.random.default_rng(3)
+ augmented = rng.normal(size=(200, 4))
+ augmented[:50, 2] = np.nan # 50 rows incomplete
+
+ with pytest.warns(RuntimeWarning, match=r"50/200"):
+ result = fit_mixture_em(augmented, n_components=2, n_init=2, seed=3)
+
+ # n_complete = 150; loglikelihood should be ~150 * per-row mean.
+ # The check we actually want is that it runs without error and the
+ # iteration count is sensible.
+ assert result.n_iter >= 1
+ assert result.weights.shape == (2,)
+
+
+def test_fit_mixture_em_warns_on_complete_case_drop():
+ rng = np.random.default_rng(7)
+ augmented = rng.normal(size=(200, 4))
+ augmented[:30, 2] = np.nan # 30 incomplete rows -> 170 complete
+
+ with pytest.warns(RuntimeWarning, match=r"30/200"):
+ result = fit_mixture_em(augmented, n_components=2, n_init=2, seed=7)
+
+ assert result.weights.shape == (2,)
+
+
+def test_fit_mixture_em_no_warning_when_complete():
+ rng = np.random.default_rng(8)
+ augmented = rng.normal(size=(200, 4)) # no NaNs
+
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", RuntimeWarning)
+ # Must not raise: no complete-case rows dropped.
+ fit_mixture_em(augmented, n_components=2, n_init=2, seed=8)
+
+
+def test_fit_mixture_em_raises_when_too_few_complete_rows():
+ augmented = np.array([[np.nan, 1.0], [1.0, 2.0]])
+ with pytest.raises(InsufficientCompleteCasesError, match="missing_data"):
+ fit_mixture_em(augmented, n_components=3, n_init=1, seed=0)
diff --git a/tests/test_amn_moments.py b/tests/test_amn_moments.py
new file mode 100644
index 00000000..06f971c1
--- /dev/null
+++ b/tests/test_amn_moments.py
@@ -0,0 +1,213 @@
+"""Unit tests for `skillmodels.amn.moments` Spearman estimators."""
+
+import numpy as np
+import pytest
+
+from skillmodels.amn.moments import (
+ SpearmanResult,
+ derive_unexplained_sd,
+ seed_beta_from_ols,
+ spearman_factor_moments,
+)
+
+
+def _simulate_three_indicators(
+ *,
+ n: int,
+ loadings: np.ndarray,
+ meas_sds: np.ndarray,
+ factor_var: float,
+ seed: int = 0,
+) -> np.ndarray:
+ rng = np.random.default_rng(seed)
+ factor = rng.normal(0.0, np.sqrt(factor_var), size=n)
+ eps = rng.normal(0.0, 1.0, size=(n, len(loadings))) * meas_sds
+ return loadings * factor[:, None] + eps
+
+
+def test_spearman_recovers_loadings_within_30pct():
+ truth_loadings = np.array([1.0, 1.3, 0.8])
+ truth_meas_sds = np.array([0.4, 0.5, 0.3])
+ truth_factor_var = 1.5
+ measurements = _simulate_three_indicators(
+ n=2000,
+ loadings=truth_loadings,
+ meas_sds=truth_meas_sds,
+ factor_var=truth_factor_var,
+ seed=42,
+ )
+
+ result = spearman_factor_moments(measurements, anchor_idx=0)
+
+ assert result.valid
+ assert result.loadings[0] == pytest.approx(1.0, abs=1e-12)
+ assert result.loadings[1] == pytest.approx(truth_loadings[1], rel=0.30)
+ assert result.loadings[2] == pytest.approx(truth_loadings[2], rel=0.30)
+ assert result.latent_var == pytest.approx(truth_factor_var, rel=0.30)
+ for k in range(3):
+ assert result.meas_sds[k] == pytest.approx(truth_meas_sds[k], rel=0.30)
+
+
+def test_spearman_anchor_fallback_on_zero_cov():
+ rng = np.random.default_rng(0)
+ n = 1500
+ factor = rng.normal(0.0, 1.0, size=n)
+ # First measurement is independent noise; the next two share the factor.
+ indep = rng.normal(0.0, 1.0, size=n)
+ measurements = np.column_stack(
+ [
+ indep,
+ 1.2 * factor + 0.4 * rng.normal(size=n),
+ 0.9 * factor + 0.3 * rng.normal(size=n),
+ ]
+ )
+
+ result = spearman_factor_moments(measurements, anchor_idx=0)
+
+ # Anchor candidate 0 is uncorrelated with the others — but the routine
+ # rotates to a different anchor and still returns a valid result, with
+ # the user-requested anchor (idx 0) reported on a 1.0 loading scale.
+ assert result.valid
+ assert result.loadings[0] == pytest.approx(1.0, abs=1e-12)
+ # The loading on idx 0 is on a degenerate scale; what matters is that
+ # the routine didn't NaN out and returned finite values everywhere.
+ assert np.all(np.isfinite(result.loadings))
+ assert np.all(np.isfinite(result.meas_sds))
+ assert np.isfinite(result.latent_var)
+
+
+def test_spearman_handles_negative_residual_variance():
+ # Tiny n forces sample noise where S_kk < λ_k² Var(F) is possible.
+ truth_loadings = np.array([1.0, 0.9, 1.1])
+ truth_meas_sds = np.array([0.05, 0.05, 0.05])
+ measurements = _simulate_three_indicators(
+ n=20,
+ loadings=truth_loadings,
+ meas_sds=truth_meas_sds,
+ factor_var=1.0,
+ seed=7,
+ )
+
+ result = spearman_factor_moments(measurements, sd_floor=1e-3)
+
+ assert np.all(np.isfinite(result.meas_sds))
+ assert np.all(result.meas_sds >= 1e-3 - 1e-12)
+ assert np.isfinite(result.latent_var)
+
+
+def test_spearman_below_two_measurements_returns_invalid():
+ measurements = np.random.default_rng(0).normal(size=(100, 1))
+
+ result = spearman_factor_moments(measurements)
+
+ assert not result.valid
+ assert result.loadings.shape == (1,)
+
+
+def test_spearman_pairwise_complete_handles_nan():
+ truth_loadings = np.array([1.0, 1.2, 0.8])
+ truth_meas_sds = np.array([0.3, 0.3, 0.3])
+ truth_factor_var = 1.0
+ measurements = _simulate_three_indicators(
+ n=3000,
+ loadings=truth_loadings,
+ meas_sds=truth_meas_sds,
+ factor_var=truth_factor_var,
+ seed=1,
+ )
+ # Punch a few NaNs into different columns so listwise-complete would
+ # discard most rows.
+ rng = np.random.default_rng(2)
+ for col in range(3):
+ idx = rng.choice(3000, size=400, replace=False)
+ measurements[idx, col] = np.nan
+
+ result = spearman_factor_moments(measurements)
+
+ assert result.valid
+ assert result.loadings[1] == pytest.approx(truth_loadings[1], rel=0.30)
+ assert result.loadings[2] == pytest.approx(truth_loadings[2], rel=0.30)
+
+
+def test_derive_unexplained_sd_clamped():
+ # β'Σβ > latent_var → clamped to floor, not NaN.
+ sd = derive_unexplained_sd(
+ latent_var=0.5,
+ beta=np.array([2.0]),
+ prev_state_cov=np.array([[1.0]]),
+ sd_floor=1e-3,
+ )
+
+ assert sd == pytest.approx(1e-3, abs=1e-12)
+
+
+def test_derive_unexplained_sd_recovers_residual():
+ # latent_var = 1.0, β'Σβ = 0.36 → residual var = 0.64 → sd = 0.8.
+ sd = derive_unexplained_sd(
+ latent_var=1.0,
+ beta=np.array([0.6]),
+ prev_state_cov=np.array([[1.0]]),
+ )
+
+ assert sd == pytest.approx(0.8, rel=1e-9)
+
+
+def test_derive_unexplained_sd_handles_multivariate_state():
+ beta = np.array([0.3, 0.4])
+ cov = np.array([[1.0, 0.2], [0.2, 1.0]])
+ # β'Σβ = 0.09 + 2*0.3*0.4*0.2 + 0.16 = 0.298
+ expected = float(np.sqrt(1.0 - 0.298))
+
+ sd = derive_unexplained_sd(latent_var=1.0, beta=beta, prev_state_cov=cov)
+
+ assert sd == pytest.approx(expected, rel=1e-9)
+
+
+def test_seed_beta_from_ols_recovers_known_coefs():
+ rng = np.random.default_rng(0)
+ n = 500
+ x = rng.normal(size=(n, 2))
+ y = 0.7 * x[:, 0] - 0.3 * x[:, 1] + 0.1 * rng.normal(size=n)
+
+ beta = seed_beta_from_ols(y, x)
+
+ assert beta.shape == (2,)
+ assert beta[0] == pytest.approx(0.7, rel=0.10)
+ assert beta[1] == pytest.approx(-0.3, rel=0.20)
+
+
+def test_seed_beta_from_ols_handles_nan_pairwise():
+ rng = np.random.default_rng(0)
+ n = 500
+ x = rng.normal(size=(n, 2))
+ y = 0.5 * x[:, 0] + 0.05 * rng.normal(size=n)
+ y[::5] = np.nan
+ x[::7, 0] = np.nan
+
+ beta = seed_beta_from_ols(y, x)
+
+ assert beta.shape == (2,)
+ assert np.all(np.isfinite(beta))
+
+
+def test_seed_beta_from_ols_returns_zeros_on_rank_deficient():
+ n = 50
+ x = np.zeros((n, 3))
+ y = np.random.default_rng(0).normal(size=n)
+
+ beta = seed_beta_from_ols(y, x)
+
+ assert beta.shape == (3,)
+ assert np.allclose(beta, 0.0)
+
+
+def test_spearman_result_dataclass_is_frozen():
+ result = SpearmanResult(
+ loadings=np.zeros(2),
+ meas_sds=np.zeros(2),
+ latent_var=0.0,
+ valid=False,
+ )
+
+ with pytest.raises(AttributeError):
+ result.valid = True # type: ignore[misc]
diff --git a/tests/test_amn_plot_harmonization.py b/tests/test_amn_plot_harmonization.py
new file mode 100644
index 00000000..836e1079
--- /dev/null
+++ b/tests/test_amn_plot_harmonization.py
@@ -0,0 +1,84 @@
+"""Parametrised tests confirming plot helpers work for CHS, AF, and AMN."""
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn import AMNEstimationOptions, estimate_amn
+from skillmodels.common.individual_states import get_individual_states
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.variance_decomposition import decompose_measurement_variance
+
+
+def _tiny_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ n_mixtures=2,
+ )
+
+
+def _tiny_data(n: int = 500, seed: int = 0) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ rows = []
+ for caseid in range(n):
+ f0 = rng.normal()
+ f1 = 0.6 * f0 + rng.normal(0, 0.5)
+ for period, f in [(0, f0), (1, f1)]:
+ rows.append(
+ {
+ "caseid": caseid,
+ "period": period,
+ "y1": f + rng.normal(0, 0.3),
+ "y2": 0.9 * f + rng.normal(0, 0.4),
+ "y3": 1.1 * f + rng.normal(0, 0.5),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+@pytest.fixture(scope="module")
+def amn_fit():
+ model = _tiny_model()
+ data = _tiny_data(n=400)
+ options = AMNEstimationOptions(n_simulation_draws=1000, seed=0)
+ fit = estimate_amn(model, data, options)
+ return fit, data
+
+
+def test_get_individual_states_dispatches_to_amn(amn_fit):
+ fit, data = amn_fit
+
+ out = get_individual_states(data=data, result=fit)
+
+ assert "unanchored_states" in out
+ states = out["unanchored_states"]["states"]
+ assert "skills" in states.columns
+ assert {"id", "period", "skills"} <= set(states.columns)
+
+
+def test_decompose_measurement_variance_works_with_amn_result(amn_fit):
+ fit, data = amn_fit
+
+ filtered = get_individual_states(data=data, result=fit)
+ states_root = filtered.get("anchored_states", filtered["unanchored_states"])
+ decomp = decompose_measurement_variance(
+ fit.model_spec,
+ fit.params,
+ filtered_states=states_root["states"],
+ )
+
+ assert {"loading", "factor_variance", "meas_sd"} <= set(decomp.columns)
+ assert decomp.shape[0] > 0
diff --git a/tests/test_amn_simulate_and_regress.py b/tests/test_amn_simulate_and_regress.py
new file mode 100644
index 00000000..bf3b3c9e
--- /dev/null
+++ b/tests/test_amn_simulate_and_regress.py
@@ -0,0 +1,621 @@
+"""Tests for `skillmodels.amn.simulate_and_regress` (AMN Stage 3)."""
+
+from dataclasses import replace
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn.simulate_and_regress import (
+ _draw_factor_panel,
+ _fit_investment_residual,
+ _fit_linear,
+ _fit_log_ces,
+ simulate_and_regress,
+)
+from skillmodels.amn.types import MinimumDistanceResult
+from skillmodels.common.decorators import register_params
+from skillmodels.common.model_spec import (
+ CorrectionSpec,
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+@register_params(params=["self_coef", "ctrl_coef", "constant"])
+def _skills_with_obs_control(skills, obs_ctrl, params):
+ """Registered transition that uses an observed control factor."""
+ return (
+ params["constant"]
+ + params["self_coef"] * skills
+ + params["ctrl_coef"] * obs_ctrl
+ )
+
+
+def _endogenous_model() -> ModelSpec:
+ """2-period model with an endogenous investment factor and a state factor."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"), ("y1", "y2")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ "investment": FactorSpec(
+ measurements=(("i1", "i2"), ("i1", "i2")),
+ normalizations=Normalizations(
+ loadings=({"i1": 1}, {"i1": 1}),
+ intercepts=({"i1": 0}, {}),
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ )
+
+
+def _endogenous_structural() -> MinimumDistanceResult:
+ """Structural mixture covering the endogenous model's (period, factor) slots."""
+ slots = (
+ (0, "skills"),
+ (0, "investment"),
+ (1, "skills"),
+ (1, "investment"),
+ )
+ n = len(slots)
+ means = np.zeros((1, n))
+ covs = np.array([np.eye(n) + 0.3 * (np.ones((n, n)) - np.eye(n))])
+ return _make_structural(means, covs, slots)
+
+
+def _linear_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _make_structural(
+ means: np.ndarray,
+ covs: np.ndarray,
+ slots: tuple[tuple[int, str], ...],
+) -> MinimumDistanceResult:
+ return MinimumDistanceResult(
+ loadings=pd.DataFrame(),
+ measurement_intercepts=pd.DataFrame(),
+ measurement_sds=pd.DataFrame(),
+ factor_mixture_means=means,
+ factor_mixture_covariances=covs,
+ factor_period_slots=slots,
+ objective_value=0.0,
+ success=True,
+ )
+
+
+def test_fit_linear_recovers_known_coefficients():
+ rng = np.random.default_rng(0)
+ n = 1000
+ x_design = rng.normal(size=(n, 2))
+ y = 0.5 * x_design[:, 0] - 0.3 * x_design[:, 1] + 1.2 + rng.normal(0, 0.1, size=n)
+
+ params, sd = _fit_linear(y, x_design, ["a", "b"])
+
+ assert params["a"] == _pytest_approx(0.5, 0.05)
+ assert params["b"] == _pytest_approx(-0.3, 0.05)
+ assert params["constant"] == _pytest_approx(1.2, 0.05)
+ assert sd == _pytest_approx(0.1, abs_tol=0.02)
+
+
+def _pytest_approx(target: float, rel: float = 0.05, *, abs_tol: float | None = None):
+ import pytest # noqa: PLC0415
+
+ if abs_tol is not None:
+ return pytest.approx(target, abs=abs_tol)
+ return pytest.approx(target, rel=rel)
+
+
+def test_fit_log_ces_recovers_known_rho_and_share():
+ rng = np.random.default_rng(1)
+ n = 2000
+ x_design = rng.normal(0, 0.5, size=(n, 2))
+ rho_true = -0.5
+ gammas_true = np.array([0.65, 0.35])
+ exponents = x_design * rho_true
+ log_inside = np.log(
+ gammas_true[0] * np.exp(exponents[:, 0])
+ + gammas_true[1] * np.exp(exponents[:, 1])
+ )
+ y = log_inside / rho_true + rng.normal(0, 0.05, size=n)
+
+ params, sd = _fit_log_ces(y, x_design, ["a", "b"], with_constant=False)
+
+ assert params["a"] == _pytest_approx(0.65, 0.15)
+ assert params["b"] == _pytest_approx(0.35, 0.15)
+ assert params["phi"] == _pytest_approx(rho_true, abs_tol=0.15)
+ assert sd == _pytest_approx(0.05, abs_tol=0.05)
+
+
+def test_draw_factor_panel_yields_expected_shape_and_moments():
+ slots = ((0, "skills"), (1, "skills"))
+ truth_means = np.array([[-0.5, -0.2], [0.5, 0.3]])
+ truth_covs = np.array(
+ [
+ [[1.0, 0.3], [0.3, 1.1]],
+ [[0.9, 0.1], [0.1, 1.0]],
+ ]
+ )
+ structural = _make_structural(truth_means, truth_covs, slots)
+
+ panel = _draw_factor_panel(structural, np.array([0.4, 0.6]), n_draws=20000, seed=0)
+
+ assert panel.shape == (20000, 2)
+ # Sample-mean on slot 0: 0.4 * (-0.5) + 0.6 * 0.5 = 0.1
+ # Sample-mean on slot 1: 0.4 * (-0.2) + 0.6 * 0.3 = 0.1
+ np.testing.assert_allclose(panel.mean().to_numpy(), [0.1, 0.1], atol=0.05)
+
+
+def test_simulate_and_regress_returns_linear_transition_for_simple_model():
+ model = _linear_model()
+ processed = process_model(model)
+
+ # Build a structural result where both periods have a single
+ # factor; truth coefficient for the period-0 -> period-1 transition
+ # is 0.7 with intercept 0.1.
+ slots = ((0, "skills"), (1, "skills"))
+ truth_means = np.array([[0.0, 0.0]])
+ truth_covs = np.array([[[1.0, 0.7], [0.7, 1.0 * 0.7**2 + 0.51]]])
+ structural = _make_structural(truth_means, truth_covs, slots)
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=5000,
+ seed=0,
+ )
+
+ params = result.production_params
+ slope = float(
+ params.loc[("transition", 0, "skills", "skills"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert slope == _pytest_approx(0.7, abs_tol=0.05)
+
+
+def test_simulate_and_regress_handles_translog():
+ """Generic NLS path recovers translog params via the function callable."""
+ from skillmodels.common.model_spec import ( # noqa: PLC0415
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+ )
+ from skillmodels.common.process_model import process_model # noqa: PLC0415
+
+ model = ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"), ("y1", "y2", "y3")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="translog",
+ ),
+ },
+ )
+ processed = process_model(model)
+ slots = ((0, "skills"), (1, "skills"))
+ # Cov(period0, period1) chosen so OLS slope ≈ 0.6.
+ truth_means = np.array([[0.0, 0.0]])
+ truth_covs = np.array([[[1.0, 0.6], [0.6, 1.0 * 0.6**2 + 0.4]]])
+ structural = MinimumDistanceResult(
+ loadings=pd.DataFrame(),
+ measurement_intercepts=pd.DataFrame(),
+ measurement_sds=pd.DataFrame(),
+ factor_mixture_means=truth_means,
+ factor_mixture_covariances=truth_covs,
+ factor_period_slots=slots,
+ objective_value=0.0,
+ success=True,
+ )
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=5000,
+ seed=0,
+ )
+
+ params = result.production_params
+ # translog params: linear coefficient on `skills` plus `skills ** 2`
+ # plus `constant`. The linear coefficient should approach the
+ # cov / var slope (≈ 0.6); the square coefficient should be small.
+ assert ("transition", 0, "skills", "skills") in params.index
+ assert ("transition", 0, "skills", "skills ** 2") in params.index
+ assert ("transition", 0, "skills", "constant") in params.index
+ slope = float(
+ params.loc[("transition", 0, "skills", "skills"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ assert slope == _pytest_approx(0.6, abs_tol=0.1)
+
+
+def test_simulate_and_regress_no_investment_eq_category():
+ model = _endogenous_model()
+ processed = process_model(model)
+ structural = _endogenous_structural()
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=3000,
+ seed=0,
+ )
+
+ # Production params are produced; the misleading 'investment_eq' rows
+ # are gone and investment_params is empty.
+ assert not result.production_params.empty
+ assert len(result.investment_params) == 0
+ categories = set(result.production_params.index.get_level_values("category")) | set(
+ result.investment_params.index.get_level_values("category")
+ )
+ assert "investment_eq" not in categories
+
+
+# --- Control-function (investment-endogeneity) regression fixtures ----------
+#
+# Closed-form LINEAR DGP for the AMN/AF control-function correction. One
+# skill (state) factor + one endogenous investment factor + an observed
+# instrument `income`, over two periods. Primitives are independent
+# N(0, .): theta0 (var 1.0), income Y0 (var 1.0), eta_I (var 0.50),
+# eps_C (var 0.30), and an extra independent primitive feeding the
+# irrelevant f[1|investment] slot. The DGP sets investment I0 to
+# b_I times theta0 plus b_Y times Y0 plus eta_I (b_I=0.50, b_Y=0.70),
+# and next-period skills theta1 to lam times theta0 plus psi times I0
+# plus kappa times eta_I plus eps_C (lam=0.40, psi=0.60, kappa=0.80).
+# OLS of theta1 on theta0 and I0 is biased upward on the I0 coefficient
+# (I0 is correlated with eta_I, which enters theta1); adding the
+# first-stage residual eta_I as a control function `cf` recovers
+# psi=0.60 and identifies kappa=0.80.
+
+_CF_B_I = 0.50
+_CF_B_Y = 0.70
+_CF_LAM = 0.40
+_CF_PSI = 0.60
+_CF_KAPPA = 0.80
+_CF_SLOTS = (
+ (0, "skills"),
+ (0, "investment"),
+ (0, "income"),
+ (1, "skills"),
+ (1, "investment"),
+)
+
+
+def _cf_model() -> ModelSpec:
+ """Skill + endogenous investment factor with an observed instrument."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"), ("y1", "y2")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ "investment": FactorSpec(
+ measurements=(("i1", "i2"), ("i1", "i2")),
+ normalizations=Normalizations(
+ loadings=({"i1": 1}, {"i1": 1}),
+ intercepts=({"i1": 0}, {}),
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ correction=CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
+ ),
+ },
+ observed_factors=("income",),
+ )
+
+
+def _cf_structural() -> MinimumDistanceResult:
+ """Structural mixture built from the closed-form control-function DGP."""
+ # Primitive variances: theta0, Y0, eta_I, eps_C, extra.
+ prim_var = np.array([1.0, 1.0, 0.50, 0.30, 1.0])
+ # Rows = slots; cols = primitives [theta0, Y0, eta_I, eps_C, extra].
+ # Reduced form of theta1: loading (lam + psi*b_I) on theta0, psi*b_Y
+ # on Y0, (psi + kappa) on eta_I, and 1 on eps_C.
+ b_matrix = np.array(
+ [
+ [1.0, 0.0, 0.0, 0.0, 0.0], # (0, skills) = theta0
+ [_CF_B_I, _CF_B_Y, 1.0, 0.0, 0.0], # (0, investment) = I0
+ [0.0, 1.0, 0.0, 0.0, 0.0], # (0, income) = Y0
+ [
+ _CF_LAM + _CF_PSI * _CF_B_I,
+ _CF_PSI * _CF_B_Y,
+ _CF_PSI + _CF_KAPPA,
+ 1.0,
+ 0.0,
+ ], # (1, skills) = theta1
+ [0.0, 0.0, 0.0, 0.0, 1.0], # (1, investment) = extra
+ ]
+ )
+ cov = b_matrix @ np.diag(prim_var) @ b_matrix.T
+ means = np.zeros((1, len(_CF_SLOTS)))
+ return _make_structural(means, cov[None, :, :], _CF_SLOTS)
+
+
+def test_fit_investment_residual_recovers_first_stage():
+ rng = np.random.default_rng(0)
+ n = 5000
+ theta0 = rng.normal(size=n)
+ income = rng.normal(size=n)
+ eta_i = rng.normal(0, np.sqrt(0.50), size=n)
+ y_invest = _CF_B_I * theta0 + _CF_B_Y * income + eta_i
+ x_determinants = np.column_stack([theta0, income])
+
+ coefs, sd, residual = _fit_investment_residual(
+ y_invest, x_determinants, ["skills", "income"]
+ )
+
+ assert coefs["skills"] == _pytest_approx(_CF_B_I, abs_tol=0.03)
+ assert coefs["income"] == _pytest_approx(_CF_B_Y, abs_tol=0.03)
+ assert sd == _pytest_approx(np.sqrt(0.50), abs_tol=0.05)
+ corr = np.corrcoef(residual, eta_i)[0, 1]
+ assert corr == _pytest_approx(1.0, abs_tol=0.02)
+
+
+def test_simulate_and_regress_control_function_recovers_psi_and_kappa():
+ model = _cf_model()
+ processed = process_model(model)
+ structural = _cf_structural()
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=4000,
+ seed=0,
+ )
+
+ prod = result.production_params
+ psi = float(prod.loc[("transition", 0, "skills", "investment"), "value"]) # ty: ignore[invalid-argument-type]
+ lam = float(prod.loc[("transition", 0, "skills", "skills"), "value"]) # ty: ignore[invalid-argument-type]
+ kappa = float(prod.loc[("transition", 0, "skills", "cf"), "value"]) # ty: ignore[invalid-argument-type]
+ assert psi == _pytest_approx(_CF_PSI, abs_tol=0.08)
+ assert lam == _pytest_approx(_CF_LAM, abs_tol=0.08)
+ assert kappa == _pytest_approx(_CF_KAPPA, abs_tol=0.10)
+
+ inv = result.investment_params
+ assert float(
+ inv.loc[("investment_eq", 0, "investment", "income"), "value"] # ty: ignore[invalid-argument-type]
+ ) == _pytest_approx(_CF_B_Y, abs_tol=0.08)
+ assert float(
+ inv.loc[("investment_eq", 0, "investment", "skills"), "value"] # ty: ignore[invalid-argument-type]
+ ) == _pytest_approx(_CF_B_I, abs_tol=0.08)
+ assert ("investment_sds", 0, "investment", "-") in inv.index
+
+ # Gating: the investment factor's own transition gets no cf row.
+ assert ("transition", 0, "investment", "cf") not in prod.index
+
+
+_CF_SES = 0.5 # true production coefficient on the non-instrument control `ses`
+
+
+def _cf_model_with_control() -> ModelSpec:
+ """Corrected model with an observed instrument AND a non-instrument control."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"), ("y1", "y2")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ "investment": FactorSpec(
+ measurements=(("i1", "i2"), ("i1", "i2")),
+ normalizations=Normalizations(
+ loadings=({"i1": 1}, {"i1": 1}),
+ intercepts=({"i1": 0}, {}),
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ correction=CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
+ ),
+ },
+ observed_factors=("income", "ses"),
+ )
+
+
+def _cf_control_structural() -> MinimumDistanceResult:
+ """CF DGP where skills1 also loads on the non-instrument control ses0."""
+ slots = ((0, "skills"), (0, "investment"), (0, "income"), (0, "ses"), (1, "skills"))
+ # Primitives: [theta0, Y0, eta_I, ses0, eps_C].
+ prim_var = np.array([1.0, 1.0, 0.50, 1.0, 0.30])
+ b_matrix = np.array(
+ [
+ [1.0, 0.0, 0.0, 0.0, 0.0], # (0, skills) = theta0
+ [_CF_B_I, _CF_B_Y, 1.0, 0.0, 0.0], # (0, investment) = I0
+ [0.0, 1.0, 0.0, 0.0, 0.0], # (0, income) = Y0
+ [0.0, 0.0, 0.0, 1.0, 0.0], # (0, ses) = ses0
+ [
+ _CF_LAM + _CF_PSI * _CF_B_I,
+ _CF_PSI * _CF_B_Y,
+ _CF_PSI + _CF_KAPPA,
+ _CF_SES,
+ 1.0,
+ ], # (1, skills) = theta1, with a direct ses0 effect
+ ]
+ )
+ cov = b_matrix @ np.diag(prim_var) @ b_matrix.T
+ means = np.zeros((1, len(slots)))
+ return _make_structural(means, cov[None, :, :], slots)
+
+
+def test_simulate_and_regress_keeps_non_instrument_observed_controls():
+ """A non-instrument observed factor stays a production control under a CF.
+
+ Regression for audit F8: under an active control function the production
+ design dropped ALL observed factors (treating every one as an excluded
+ instrument), so a genuine observed control silently vanished from the
+ production equation (its column index was clamped under jax.vmap). Only
+ `CorrectionSpec.instruments` must be excluded; other observed factors remain
+ production inputs and their coefficients must be recovered.
+ """
+ model = _cf_model_with_control()
+ processed = process_model(model)
+ structural = _cf_control_structural()
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=8000,
+ seed=0,
+ )
+
+ prod = result.production_params
+ # The non-instrument control `ses` is a production input and is recovered.
+ assert ("transition", 0, "skills", "ses") in prod.index
+ ses_coef = float(prod.loc[("transition", 0, "skills", "ses"), "value"]) # ty: ignore[invalid-argument-type]
+ assert ses_coef == _pytest_approx(_CF_SES, abs_tol=0.08)
+ # The excluded instrument `income` is NOT a production input.
+ assert ("transition", 0, "skills", "income") not in prod.index
+
+
+def _obs_control_model() -> ModelSpec:
+ """One latent factor whose registered transition uses an observed control."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"), ("y1", "y2")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function=_skills_with_obs_control,
+ ),
+ },
+ observed_factors=("obs_ctrl",),
+ )
+
+
+def test_simulate_and_regress_tolerates_transition_arg_absent_from_panel():
+ """A registered transition may name a factor the simulated panel omits.
+
+ bw's registered production functions reference observed control factors that
+ the AMN structural panel does not simulate. Resolving such a transition must
+ look its arguments up against the full factor order (not the per-period
+ design columns) so the lookup does not raise; the absent column is read past
+ the end of the design row and clamped by jax -- a throwaway seed the CHS MLE
+ re-fits. Regression for the `tuple.index(x): x not in tuple` crash.
+ """
+ model = _obs_control_model()
+ processed = process_model(model)
+ # Panel has only the latent `skills` slots; `obs_ctrl` is not simulated.
+ slots = ((0, "skills"), (1, "skills"))
+ means = np.zeros((1, 2))
+ covs = (np.eye(2) + 0.3 * (np.ones((2, 2)) - np.eye(2)))[None]
+ structural = _make_structural(means, covs, slots)
+
+ result = simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=2000,
+ seed=0,
+ )
+
+ assert ("transition", 0, "skills", "self_coef") in result.production_params.index
+
+
+def test_simulate_and_regress_naive_path_is_biased():
+ model = _cf_model()
+ structural = _cf_structural()
+ naive_model = model.without_correction()
+
+ naive = simulate_and_regress(
+ structural,
+ process_model(naive_model),
+ naive_model,
+ mixture_weights=np.array([1.0]),
+ n_draws=4000,
+ seed=0,
+ )
+ corrected = simulate_and_regress(
+ structural,
+ process_model(model),
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=4000,
+ seed=0,
+ )
+
+ naive_psi = float(
+ naive.production_params.loc[("transition", 0, "skills", "investment"), "value"] # ty: ignore[invalid-argument-type]
+ )
+ corrected_psi = float(
+ corrected.production_params.loc[ # ty: ignore[invalid-argument-type]
+ ("transition", 0, "skills", "investment"), "value"
+ ]
+ )
+ # The naive OLS on I_t is biased well above the true psi=0.60.
+ assert naive_psi > 0.90
+ assert abs(naive_psi - _CF_PSI) > 0.25
+ # The control-function estimate is close to the truth.
+ assert abs(corrected_psi - _CF_PSI) < 0.10
+
+
+def test_simulate_and_regress_raises_on_higher_order_kappa():
+ # AMN implements only the linear cf term; a degree-2 (translog) CorrectionSpec
+ # basis must raise rather than silently estimate a linear correction.
+ model = _cf_model()
+ inv = model.factors["investment"]
+ assert inv.correction is not None
+ hi_correction = replace(inv.correction, kappa_degree=2)
+ model = model._replace(
+ factors=dict(model.factors)
+ | {"investment": replace(inv, correction=hi_correction)}
+ )
+ processed = process_model(model)
+ structural = _cf_structural()
+
+ with pytest.raises(NotImplementedError, match="linear control function"):
+ simulate_and_regress(
+ structural,
+ processed,
+ model,
+ mixture_weights=np.array([1.0]),
+ n_draws=200,
+ seed=0,
+ )
diff --git a/tests/test_amn_start_values.py b/tests/test_amn_start_values.py
new file mode 100644
index 00000000..c4d477a4
--- /dev/null
+++ b/tests/test_amn_start_values.py
@@ -0,0 +1,432 @@
+"""Tests for `skillmodels.amn.start_values.get_spearman_start_params`.
+
+These tests exercise the Spearman + Bartlett-OLS start-value pipeline
+(the legacy default, now opt-in via `start_params_strategy="spearman"`).
+The new default `"amn"` runs the full Attanasio-Meghir-Nix estimator
+upfront and is tested in `test_amn_estimate.py` and via
+`test_maximization_inputs.py`.
+"""
+
+import functools
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.amn.start_values import (
+ _amn_values_on_chs_index,
+ _apply_neutral_defaults,
+ _kmeans_labels,
+ get_spearman_start_params,
+ pool_equality_groups,
+)
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.constraints import select_by_loc
+from skillmodels.common.model_spec import (
+ CorrectionSpec,
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.process_model import process_model
+from skillmodels.common.utilities import reduce_n_periods
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
+
+
+def _cf_model() -> ModelSpec:
+ """2-period skill model with an endogenous investment factor + instrument."""
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2"), ("y1", "y2")),
+ normalizations=Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}),
+ intercepts=({"y1": 0}, {}),
+ ),
+ transition_function="linear",
+ ),
+ "investment": FactorSpec(
+ measurements=(("i1", "i2"), ("i1", "i2")),
+ normalizations=Normalizations(
+ loadings=({"i1": 1}, {"i1": 1}),
+ intercepts=({"i1": 0}, {}),
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ correction=CorrectionSpec(
+ state_predictors=("skills",),
+ instruments=("income",),
+ targets=("skills",),
+ ),
+ ),
+ },
+ observed_factors=("income",),
+ )
+
+
+def test_kmeans_labels_separates_bimodal_data() -> None:
+ rng = np.random.default_rng(0)
+ low = rng.normal(-4.0, 0.5, size=300)
+ high = rng.normal(6.0, 0.5, size=200)
+ features = np.concatenate([low, high]).reshape(-1, 1)
+ labels = _kmeans_labels(features, 2)
+ cluster_means = sorted(float(features[labels == k].mean()) for k in (0, 1))
+ assert cluster_means[0] < -2.0
+ assert cluster_means[1] > 4.0
+
+
+def test_kmeans_labels_is_deterministic() -> None:
+ rng = np.random.default_rng(1)
+ features = rng.normal(size=(200, 2))
+ a = _kmeans_labels(features, 3)
+ b = _kmeans_labels(features, 3)
+ assert np.array_equal(a, b)
+
+
+def test_amn_values_map_cf_to_kappa_and_calendar_to_aug_period():
+ """AMN seeds (calendar-time, cf-under-transition) land on the CHS index.
+
+ Regression for the silent index mismatch: CHS uses augmented periods and a
+ dedicated `kappa` category, while AMN emits in calendar time with the
+ control-function coefficient under `transition`/`cf`. The translator must
+ (a) route the AMN cf row to *every* CHS kappa aug_period that shares its
+ calendar period, and (b) place a calendar-1 skills loading at the skills
+ *state* aug_period (2), not the investment aug_period (1).
+ """
+ processed = process_model(_cf_model())
+ chs_index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ names = ["category", "aug_period", "name1", "name2"]
+ amn = pd.DataFrame(
+ {"value": [0.8, 0.37, 0.55]},
+ index=pd.MultiIndex.from_tuples(
+ [
+ ("transition", 0, "skills", "cf"), # AMN kappa, calendar 0
+ ("loadings", 1, "y1", "skills"), # calendar-1 skills loading
+ ("loadings", 0, "i2", "investment"), # calendar-0 investment loading
+ ],
+ names=names,
+ ),
+ )
+
+ seeded = _amn_values_on_chs_index(
+ amn, chs_index, processed.labels.aug_periods_to_periods
+ )
+
+ # cf -> kappa at both aug_periods sharing calendar 0; never onto a transition.
+ assert ("transition", 0, "skills", "cf") not in chs_index
+ assert seeded.loc[("kappa", 0, "skills", "cf")] == pytest.approx(0.8)
+ assert seeded.loc[("kappa", 1, "skills", "cf")] == pytest.approx(0.8)
+ # calendar-1 skills loading -> aug_period 2 (state), not 1 (investment).
+ assert seeded.loc[("loadings", 2, "y1", "skills")] == pytest.approx(0.37)
+ # calendar-0 investment loading -> aug_period 1.
+ assert seeded.loc[("loadings", 1, "i2", "investment")] == pytest.approx(0.55)
+
+
+def test_apply_neutral_defaults_fills_correction_categories() -> None:
+ """Neutral defaults must seed `investment_eq` and `kappa`.
+
+ The first-stage (`investment_eq`) and control-function (`kappa`)
+ coefficients are not produced by the moment / AMN overrides for every
+ model, so the neutral defaults must cover them; otherwise the seeded
+ start point keeps NaNs and `optimagic` rejects it. They seed to 0 — no
+ first-stage relationship and no correction initially.
+ """
+ index = pd.MultiIndex.from_tuples(
+ [
+ ("investment_eq", 2, "inv", "fac1"),
+ ("investment_eq", 2, "inv", "constant"),
+ ("kappa", 1, "fac1", "cf"),
+ ("transition", 0, "fac1", "fac1"),
+ ],
+ names=["category", "aug_period", "name1", "name2"],
+ )
+ params = pd.DataFrame({"value": [np.nan] * len(index)}, index=index)
+ free = params["value"].isna()
+
+ _apply_neutral_defaults(params, free, n_mixtures=1)
+
+ assert not params["value"].isna().any()
+ assert params.loc[("investment_eq", 2, "inv", "fac1"), "value"] == 0.0
+ assert params.loc[("kappa", 1, "fac1", "cf"), "value"] == 0.0
+
+
+def test_apply_neutral_defaults_seeds_higher_order_terms_small() -> None:
+ """Higher-order terms seed to a small 0.01, not the linear defaults.
+
+ Translog interactions / squares (`"fac1 * fac2"`, `"fac1 ** 2"`) and
+ higher-order control-function terms (`"cf * fac1"`, `"cf ** 2"`) are not
+ produced by the linear AMN/Spearman seeds. They get a small start so the
+ optimiser explores away from zero without the higher-order monomials
+ dominating the seeded production function.
+ """
+ index = pd.MultiIndex.from_tuples(
+ [
+ ("transition", 0, "fac1", "fac1"),
+ ("transition", 0, "fac1", "fac1 * fac2"),
+ ("transition", 0, "fac1", "fac1 ** 2"),
+ ("kappa", 1, "fac1", "cf"),
+ ("kappa", 1, "fac1", "cf * fac1"),
+ ("kappa", 1, "fac1", "cf ** 2"),
+ ],
+ names=["category", "aug_period", "name1", "name2"],
+ )
+ params = pd.DataFrame({"value": [np.nan] * len(index)}, index=index)
+ free = params["value"].isna()
+
+ _apply_neutral_defaults(params, free, n_mixtures=1)
+
+ # Linear terms keep their category defaults ...
+ assert params.loc[("transition", 0, "fac1", "fac1"), "value"] == 0.5
+ assert params.loc[("kappa", 1, "fac1", "cf"), "value"] == 0.0
+ # ... higher-order terms (a space in `name2`) seed small.
+ assert params.loc[("transition", 0, "fac1", "fac1 * fac2"), "value"] == 0.01
+ assert params.loc[("transition", 0, "fac1", "fac1 ** 2"), "value"] == 0.01
+ assert params.loc[("kappa", 1, "fac1", "cf * fac1"), "value"] == 0.01
+ assert params.loc[("kappa", 1, "fac1", "cf ** 2"), "value"] == 0.01
+
+
+@pytest.fixture
+def model2_short() -> ModelSpec:
+ spec = reduce_n_periods(MODEL2, new_n_periods=3)
+ assert isinstance(spec, ModelSpec)
+ return spec
+
+
+@pytest.fixture
+def model2_data() -> pd.DataFrame:
+ return pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta").set_index(
+ ["caseid", "period"]
+ )
+
+
+def test_default_strategy_is_amn() -> None:
+ """`CHSEstimationOptions().start_params_strategy` defaults to "amn"."""
+ assert CHSEstimationOptions().start_params_strategy == "amn"
+
+
+def test_template_filled_with_spearman_strategy(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """`start_params_strategy="spearman"` returns a fully-populated template."""
+ inputs = get_maximization_inputs(
+ model2_short,
+ model2_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="spearman"),
+ )
+ template = inputs["params_template"]
+ assert not template["value"].isna().any()
+
+
+def test_strategy_none_leaves_nan(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """`start_params_strategy="none"` reproduces the legacy NaN behaviour."""
+ inputs = get_maximization_inputs(
+ model2_short,
+ model2_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="none"),
+ )
+ template = inputs["params_template"]
+ assert template["value"].isna().any()
+
+
+def test_filled_template_yields_finite_loglike(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """The moment-seeded template produces a finite log-likelihood."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ val = inputs["loglike"](inputs["params_template"])
+ assert np.isfinite(val)
+
+
+def test_loadings_seeded_from_data_not_constant(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Loadings vary across measurements (Spearman seed, not flat 1.0)."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ template = inputs["params_template"]
+ loadings = template.loc["loadings", "value"]
+ free = (
+ template.loc["loadings", "lower_bound"]
+ != template.loc["loadings", "upper_bound"]
+ )
+ free_loadings = loadings[free].to_numpy()
+ assert (free_loadings != free_loadings[0]).any()
+ assert not np.allclose(free_loadings, 1.0)
+
+
+def test_meas_sds_seeded_from_data_not_constant(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Measurement SDs vary across indicators (residual SD seed, not 0.5)."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ template = inputs["params_template"]
+ meas_sds = template.loc["meas_sds", "value"].to_numpy()
+ assert (meas_sds != meas_sds[0]).any()
+ assert (meas_sds > 0).all()
+
+
+def test_initial_cholcovs_diagonal_is_positive(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Initial-cov diagonals are positive (sqrt(latent_var))."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ template = inputs["params_template"]
+ cholcov = template.loc["initial_cholcovs", "value"]
+ diag_mask = pd.Series(
+ [name2.split("-")[0] == name2.split("-")[1] for *_, name2 in cholcov.index],
+ index=cholcov.index,
+ )
+ assert (cholcov[diag_mask] > 0).all()
+
+
+def test_fixed_params_pin_survives_moment_fill(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Entries set by `fixed_params` keep their pinned value."""
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac3"), ("transition", 1, "fac1", "fac3")],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [0.0, 0.0]}, index=fixed_idx)
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS, fixed_params=fixed_df
+ )
+ template = inputs["params_template"]
+ assert template.loc[("transition", 0, "fac1", "fac3"), "value"] == 0.0
+ assert template.loc[("transition", 1, "fac1", "fac3"), "value"] == 0.0
+
+
+def test_explicit_strategy_argument_via_helper(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """The standalone helper produces the same fills as the wired-in spearman path."""
+ from skillmodels.common.constraints import ( # noqa: PLC0415
+ project_to_probability_constraints,
+ )
+
+ inputs_raw = get_maximization_inputs(
+ model2_short,
+ model2_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="none"),
+ )
+ template_raw = inputs_raw["params_template"]
+ filled = get_spearman_start_params(model2_short, model2_data, template_raw)
+ # The wired-in path renormalizes free entries of every
+ # ProbabilityConstraint to sum to one after the strategy step;
+ # apply the same projection here so the two paths can be compared.
+ filled = project_to_probability_constraints(
+ params_template=filled, constraints=inputs_raw["constraints"]
+ )
+
+ inputs_spearman = get_maximization_inputs(
+ model2_short,
+ model2_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="spearman"),
+ )
+ template_spearman = inputs_spearman["params_template"]
+
+ pd.testing.assert_series_equal(filled["value"], template_spearman["value"])
+
+
+def test_helper_does_not_overwrite_user_set_values(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """If the caller already set a non-NaN value, the helper preserves it."""
+ inputs = get_maximization_inputs(
+ model2_short,
+ model2_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="none"),
+ )
+ template = inputs["params_template"]
+ sentinel_loc = template.index[template["value"].isna()][0]
+ template.loc[sentinel_loc, "value"] = 999.0
+ filled = get_spearman_start_params(model2_short, model2_data, template)
+ assert filled.loc[sentinel_loc, "value"] == 999.0
+
+
+def test_transition_coefficients_seeded_via_ols(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Free transition rows get AMN-style OLS seeds, not constant 0.5."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ template = inputs["params_template"]
+ free_trans = template.loc["transition"]
+ free_mask = free_trans["lower_bound"] != free_trans["upper_bound"]
+ free_values = free_trans.loc[free_mask, "value"]
+ assert (free_values != 0.5).any()
+
+
+def test_shock_sds_seeded_via_residual_variance(
+ model2_short: ModelSpec, model2_data: pd.DataFrame
+) -> None:
+ """Free shock_sds rows get residual-variance seeds, not flat 0.5."""
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ template = inputs["params_template"]
+ free_sds = template.loc["shock_sds"]
+ free_mask = free_sds["lower_bound"] != free_sds["upper_bound"]
+ free_values = free_sds.loc[free_mask, "value"]
+ assert (free_values != 0.5).any()
+
+
+def test_pool_equality_groups_averages_unpinned() -> None:
+ """Members of an `om.EqualityConstraint` group are averaged."""
+ idx = pd.MultiIndex.from_tuples(
+ [
+ ("meas_sds", 0, "z1", "-"),
+ ("meas_sds", 1, "z1", "-"),
+ ("meas_sds", 2, "z1", "-"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ params = pd.DataFrame({"value": [0.2, 0.4, 0.6]}, index=idx)
+ constraints: list[om.constraints.Constraint] = [
+ om.EqualityConstraint(
+ selector=functools.partial(select_by_loc, loc=idx),
+ ),
+ ]
+ out = pool_equality_groups(params, constraints)
+ assert list(out["value"]) == pytest.approx([0.4, 0.4, 0.4])
+
+
+def test_pool_equality_groups_respects_pinned() -> None:
+ """If any group member is pinned, that value propagates to the rest."""
+ idx = pd.MultiIndex.from_tuples(
+ [
+ ("meas_sds", 0, "z1", "-"),
+ ("meas_sds", 1, "z1", "-"),
+ ("meas_sds", 2, "z1", "-"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ params = pd.DataFrame({"value": [0.2, 0.4, 0.6]}, index=idx)
+ pinned = pd.Series([False, True, False], index=idx)
+ constraints: list[om.constraints.Constraint] = [
+ om.EqualityConstraint(
+ selector=functools.partial(select_by_loc, loc=idx),
+ ),
+ ]
+ out = pool_equality_groups(params, constraints, keep_pinned_values=pinned)
+ assert list(out["value"]) == pytest.approx([0.4, 0.4, 0.4])
diff --git a/tests/test_ces_recovery.py b/tests/test_ces_recovery.py
new file mode 100644
index 00000000..da47941a
--- /dev/null
+++ b/tests/test_ces_recovery.py
@@ -0,0 +1,122 @@
+"""Tests for Freyberger's restricted-CES primitive scale recovery (audit F2).
+
+AMN's restricted-CES Stage 3 fits the production function in *transformed*
+(tilde) coordinates. The transformed CES (Freyberger eq prod_fn_ces_norm, psi=1)
+
+ ln theta~_{t+1} = (lambda_{theta,t+1,1}/sigma_t)
+ * ln( g1 theta~_t^{sigma_t/lambda_{theta,t,1}}
+ + g2 I~_t^{sigma_t/lambda_{I,t,1}} )
+
+is exactly the functional form of `log_ces_general`
+(`tfp * log(sum_i gamma_i * state_i^{sigma_i})`) with
+
+ tfp = lambda_{theta,t+1,1}/sigma_t (outside coefficient)
+ sigma_skills = sigma_t/lambda_{theta,t,1} (theta exponent)
+ sigma_inv = sigma_t/lambda_{I,t,1} (investment exponent).
+
+`recover_primitive_ces_scales` inverts that map: from the per-period
+(tfp, theta_exp, inv_exp) and the single scale anchor lambda_{theta,0,1}=1 it
+recovers the primitive sigma_t, lambda_{theta,t,1}, lambda_{I,t,1} recursively
+(paper lines 1357-1366).
+"""
+
+import jax.numpy as jnp
+import numpy as np
+import pytest
+
+from skillmodels.amn.ces_recovery import (
+ CESTransformedCoeffs,
+ recover_primitive_ces_scales,
+)
+from skillmodels.common.transition_functions import log_ces_general
+
+
+def _transformed_coeffs_from_primitives(
+ lambda_theta: list[float], # lambda_{theta,t,1} for t = 0..T (len T+1)
+ lambda_inv: list[float], # lambda_{I,t,1} for t = 0..T-1 (len T)
+ sigma: list[float], # sigma_t for t = 0..T-1 (len T)
+) -> list[CESTransformedCoeffs]:
+ """Forward map: primitive scales -> per-period transformed-form coefficients."""
+ coeffs = []
+ for t in range(len(sigma)):
+ coeffs.append(
+ CESTransformedCoeffs(
+ outside=lambda_theta[t + 1] / sigma[t],
+ theta_exponent=sigma[t] / lambda_theta[t],
+ inv_exponent=sigma[t] / lambda_inv[t],
+ )
+ )
+ return coeffs
+
+
+def test_recover_primitive_ces_scales_inverts_known_primitives() -> None:
+ # A known primitive CES with non-trivial, period-varying scales.
+ lambda_theta = [1.0, 0.82, 0.9] # lambda_{theta,0,1}=1 is the anchor
+ lambda_inv = [1.0, 1.1]
+ sigma = [-0.5, -0.4]
+ coeffs = _transformed_coeffs_from_primitives(lambda_theta, lambda_inv, sigma)
+
+ recovered = recover_primitive_ces_scales(coeffs, lambda_theta_0=1.0)
+
+ assert [r.sigma for r in recovered] == pytest.approx(sigma)
+ assert [r.lambda_theta for r in recovered] == pytest.approx(lambda_theta[:-1])
+ assert [r.lambda_inv for r in recovered] == pytest.approx(lambda_inv)
+ assert recovered[-1].lambda_theta_next == pytest.approx(lambda_theta[-1])
+
+
+def test_recover_raises_on_zero_anchor() -> None:
+ coeffs = [
+ CESTransformedCoeffs(outside=-2.0, theta_exponent=-0.5, inv_exponent=-0.5)
+ ]
+ with pytest.raises(ValueError, match=r"nonzero|finite"):
+ recover_primitive_ces_scales(coeffs, lambda_theta_0=0.0)
+
+
+def test_recover_raises_on_zero_inv_exponent() -> None:
+ coeffs = [CESTransformedCoeffs(outside=-2.0, theta_exponent=-0.5, inv_exponent=0.0)]
+ with pytest.raises(ValueError, match=r"nonzero|finite"):
+ recover_primitive_ces_scales(coeffs, lambda_theta_0=1.0)
+
+
+def test_recover_raises_on_nonfinite_coeff() -> None:
+ coeffs = [
+ CESTransformedCoeffs(
+ outside=float("inf"), theta_exponent=-0.5, inv_exponent=-0.5
+ )
+ ]
+ with pytest.raises(ValueError, match=r"nonzero|finite"):
+ recover_primitive_ces_scales(coeffs, lambda_theta_0=1.0)
+
+
+def test_recover_raises_on_overflowing_derived_scale() -> None:
+ # Finite nonzero inputs whose products overflow to inf must raise, not
+ # silently return infinite primitive scales (Pro F5).
+ coeffs = [CESTransformedCoeffs(outside=2.0, theta_exponent=2.0, inv_exponent=1.0)]
+ with pytest.raises(ValueError, match=r"nonzero|finite"):
+ recover_primitive_ces_scales(coeffs, lambda_theta_0=1e308)
+
+
+def test_log_ces_general_represents_transformed_ces() -> None:
+ # The audit counterexample: lambda_theta=2, lambda_inv=1, lambda_next=1,
+ # sigma=-0.5. The single-rho form cannot represent it (best-fit max abs
+ # error ~0.544); log_ces_general with the mapped params represents it
+ # exactly.
+ lam_theta, lam_inv, lam_next, sig = 2.0, 1.0, 1.0, -0.5
+ g1, g2 = 0.65, 0.35
+ tfp = lam_next / sig
+ s_theta = sig / lam_theta
+ s_inv = sig / lam_inv
+
+ rng = np.random.default_rng(42)
+ states = rng.normal(size=(50, 2)) # [ln theta~, ln I~]
+
+ # Direct transformed-CES target.
+ target = tfp * np.log(
+ g1 * np.exp(states[:, 0] * s_theta) + g2 * np.exp(states[:, 1] * s_inv)
+ )
+ # log_ces_general with the mapped params, evaluated row-wise.
+ params = jnp.asarray([g1, g2, s_theta, s_inv, tfp])
+ got = np.array([float(log_ces_general(jnp.asarray(row), params)) for row in states])
+
+ # Exact up to JAX float precision (x64 not enabled in this unit test).
+ np.testing.assert_allclose(got, target, rtol=1e-6, atol=1e-6)
diff --git a/tests/test_cf_recovery.py b/tests/test_cf_recovery.py
new file mode 100644
index 00000000..62254ad8
--- /dev/null
+++ b/tests/test_cf_recovery.py
@@ -0,0 +1,249 @@
+"""End-to-end recovery test for the CHS control-function correction.
+
+Simulate a panel from a known endogenous DGP with PERIOD-SPECIFIC kappa_t, then
+estimate and confirm the control function recovers the known kappa_t, the
+first-stage coefficients, and the corrected production-shock SD. This is the
+proof that the whole CHS control-function machinery (DAG graft, investment_eq /
+kappa params, carry-forward kappa zeroing, forced unscented path) works.
+"""
+
+import jax.numpy as jnp
+import numpy as np
+import optimagic as om
+import pytest
+
+from skillmodels import CorrectionSpec, FactorSpec, ModelSpec, Normalizations
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_data import process_data
+from skillmodels.common.process_model import process_model
+from skillmodels.common.simulate_data import _simulate_dataset
+
+N_OBS = 8000
+SEED = 20240615
+TRUE_FIRST_STAGE = {"fac1": 0.5, "fac2": 0.3, "z1": 0.7, "constant": 0.1}
+# Period-specific kappa lives on the FREE odd aug_periods (1 -> period 0,
+# 3 -> period 1). The even aug_periods are pinned to 0 by carry-forward zeroing.
+TRUE_KAPPA = {1: 0.6, 3: -0.4}
+TRUE_SHOCK_SD = 0.5
+TRUE_MEAS_SD = 0.3
+
+
+def _build_model() -> ModelSpec:
+ state_norm = Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}, {"y1": 1}), intercepts=({}, {}, {})
+ )
+ fac2_norm = Normalizations(
+ loadings=({"w1": 1}, {"w1": 1}, {"w1": 1}), intercepts=({}, {}, {})
+ )
+ inv_norm = Normalizations(
+ loadings=({"yi1": 1}, {"yi1": 1}, {}), intercepts=({}, {}, {})
+ )
+ factors = {
+ "fac1": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=state_norm,
+ transition_function="linear",
+ ),
+ "fac2": FactorSpec(
+ measurements=(("w1", "w2", "w3"),) * 3,
+ normalizations=fac2_norm,
+ transition_function="linear",
+ ),
+ "inv": FactorSpec(
+ # Endogenous factor must NOT be measured in the last period.
+ measurements=(("yi1", "yi2", "yi3"), ("yi1", "yi2", "yi3"), ()),
+ normalizations=inv_norm,
+ is_endogenous=True,
+ transition_function="linear",
+ correction=CorrectionSpec(
+ state_predictors=("fac1", "fac2"),
+ instruments=("z1",),
+ targets=("fac1", "fac2"),
+ ),
+ ),
+ }
+ return ModelSpec(factors=factors, observed_factors=("z1",))
+
+
+_MEAS_COLS = ["y1", "y2", "y3", "w1", "w2", "w3", "yi1", "yi2", "yi3"]
+
+
+def _z1_panel(rng: np.random.Generator):
+ import pandas as pd # noqa: PLC0415
+
+ index = pd.MultiIndex.from_product(
+ [np.arange(N_OBS), [0, 1, 2]], names=["caseid", "period"]
+ )
+ panel = pd.DataFrame(index=index)
+ panel["z1"] = rng.normal(size=len(index))
+ for col in _MEAS_COLS:
+ panel[col] = np.nan
+ return panel
+
+
+def _fill_true_params(template, all_factors):
+ """Fill every free template entry with its true DGP value."""
+ p = template.copy()
+ free = p["value"].isna()
+ cat = p.index.get_level_values("category")
+ name1 = p.index.get_level_values("name1")
+ name2 = p.index.get_level_values("name2")
+ aug_period = p.index.get_level_values("aug_period")
+
+ p.loc[free & (cat == "initial_states"), "value"] = 0.0
+ p.loc[free & (cat == "mixture_weights"), "value"] = 1.0
+ p.loc[free & (cat == "loadings"), "value"] = 1.0
+ p.loc[free & (cat == "meas_sds"), "value"] = TRUE_MEAS_SD
+ p.loc[free & (cat == "shock_sds"), "value"] = TRUE_SHOCK_SD
+ p.loc[free & (cat == "controls"), "value"] = 0.0
+
+ # initial cholcovs: identity (diagonal 1, off-diagonal 0).
+ diag = np.array([str(n).split("-")[0] == str(n).split("-")[-1] for n in name2])
+ p.loc[free & (cat == "initial_cholcovs") & diag, "value"] = 1.0
+ p.loc[free & (cat == "initial_cholcovs") & ~diag, "value"] = 0.0
+
+ # transition: self-persistence 0.7, constant 0, other cross terms 0.1.
+ is_trans = free & (cat == "transition")
+ p.loc[is_trans, "value"] = 0.1
+ p.loc[is_trans & (name2 == name1), "value"] = 0.7
+ p.loc[is_trans & (name2 == "constant"), "value"] = 0.0
+
+ # first-stage investment equation.
+ for predictor, value in TRUE_FIRST_STAGE.items():
+ p.loc[free & (cat == "investment_eq") & (name2 == predictor), "value"] = value
+
+ # period-specific kappa on the free odd aug_periods.
+ for ap, value in TRUE_KAPPA.items():
+ p.loc[free & (cat == "kappa") & (aug_period == ap), "value"] = value
+
+ assert not p["value"].isna().any(), "some params left unset"
+ return p
+
+
+@pytest.mark.end_to_end
+@pytest.mark.long_running
+def test_control_function_recovers_period_specific_kappa() -> None:
+
+ model = _build_model()
+ pm = process_model(model)
+ all_factors = pm.labels.all_factors
+
+ cf = pm.endogenous_factors_info.control_function
+ assert cf is not None
+ assert cf.investment_factor == "inv"
+ assert cf.targets == ("fac1", "fac2")
+
+ # --- known params on the template ---
+ rng = np.random.default_rng(SEED)
+ z1_panel = _z1_panel(rng)
+ template = get_maximization_inputs(
+ model,
+ z1_panel,
+ chs_options=CHSEstimationOptions(start_params_strategy="none"),
+ )["params_template"]
+ true_params = _fill_true_params(template, all_factors)
+
+ # carry-forward kappa zeroing must have pinned the even aug_periods to 0.
+ kappa_even = true_params.xs("kappa", level="category").reset_index()
+ pinned = kappa_even[kappa_even["aug_period"].isin([0, 2])]
+ assert (pinned["value"] == 0.0).all()
+
+ # --- simulate measurements from the known params ---
+ pidx = get_params_index(
+ update_info=pm.update_info,
+ labels=pm.labels,
+ dimensions=pm.dimensions,
+ transition_info=pm.transition_info,
+ endogenous_factors_info=pm.endogenous_factors_info,
+ )
+ parsing = create_parsing_info(
+ params_index=pidx,
+ update_info=pm.update_info,
+ labels=pm.labels,
+ anchoring=pm.anchoring,
+ has_endogenous_factors=True,
+ )
+ pds = process_data(
+ df=z1_panel,
+ has_endogenous_factors=True,
+ labels=pm.labels,
+ update_info=pm.update_info,
+ anchoring_info=pm.anchoring,
+ purpose="simulation",
+ )
+ states, covs, log_weights, parsed = parse_params(
+ jnp.array(true_params.reindex(pidx)["value"].to_numpy()),
+ parsing,
+ pm.dimensions,
+ pm.labels,
+ n_obs=N_OBS,
+ )
+ obs_meas, _ = _simulate_dataset(
+ latent_states=states,
+ covs=covs,
+ log_weights=log_weights,
+ parsed_params=parsed,
+ labels=pm.labels,
+ dimensions=pm.dimensions,
+ n_obs=N_OBS,
+ has_endogenous_factors=True,
+ update_info=pm.update_info,
+ control_data=pds["controls"],
+ observed_factors=pds["observed_factors"],
+ policies=None,
+ transition_info=pm.transition_info,
+ rng=np.random.default_rng(SEED + 1),
+ )
+
+ # --- assemble estimable panel ---
+ obs_meas = obs_meas.copy()
+ obs_meas["period"] = obs_meas["aug_period"].map(pm.labels.aug_periods_to_periods)
+ meas_cols = [c for c in _MEAS_COLS if c in obs_meas.columns]
+ collapsed = obs_meas.groupby(["id", "period"])[meas_cols].first().reset_index()
+ z1_long = z1_panel.reset_index()[["caseid", "period", "z1"]].rename(
+ columns={"caseid": "id"}
+ )
+ est_data = collapsed.merge(z1_long, on=["id", "period"]).set_index(["id", "period"])
+
+ # --- estimate ---
+ mi = get_maximization_inputs(
+ model,
+ est_data,
+ chs_options=CHSEstimationOptions(start_params_strategy="none"),
+ )
+ start = mi["params_template"].copy()
+ free = start["value"].isna()
+ start.loc[~free, "value"] = true_params.loc[~free, "value"]
+ noise = np.random.default_rng(SEED + 2).normal(scale=0.05, size=int(free.sum()))
+ start.loc[free, "value"] = true_params.loc[free, "value"].to_numpy() + noise
+
+ res = om.minimize(
+ fun=lambda q: -mi["loglike"](q),
+ params=start[["value"]],
+ algorithm="scipy_lbfgsb",
+ bounds=om.Bounds(lower=start["lower_bound"], upper=start["upper_bound"]),
+ constraints=mi["constraints"],
+ fun_and_jac=lambda q: tuple(
+ -np.asarray(v) for v in mi["loglike_and_gradient"](q)
+ ),
+ )
+ assert res.success
+ est = res.params["value"]
+
+ # --- assert recovery ---
+ for ap, true_kappa in TRUE_KAPPA.items():
+ for target in ("fac1", "fac2"):
+ got = est.loc[("kappa", ap, target, "cf")]
+ assert got == pytest.approx(true_kappa, abs=0.1)
+ # even aug_periods stay pinned at 0.
+ for ap in (0, 2):
+ for target in ("fac1", "fac2"):
+ assert est.loc[("kappa", ap, target, "cf")] == pytest.approx(0.0, abs=1e-8)
+ # first-stage betas.
+ for ap in (0, 1, 2, 3):
+ for predictor, value in TRUE_FIRST_STAGE.items():
+ got = est.loc[("investment_eq", ap, "inv", predictor)]
+ assert got == pytest.approx(value, abs=0.1)
diff --git a/tests/test_check_model.py b/tests/test_check_model.py
index 7f1a36bf..dcecb087 100644
--- a/tests/test_check_model.py
+++ b/tests/test_check_model.py
@@ -2,14 +2,34 @@
from types import SimpleNamespace
-from skillmodels.check_model import (
+import pytest
+
+from skillmodels.common.check_model import (
_check_anchoring,
_check_loadings_are_not_normalized_to_zero,
- _check_measurements,
_check_normalized_variables_are_present,
check_stagemap,
)
-from skillmodels.model_spec import FactorSpec, ModelSpec, Normalizations
+from skillmodels.common.model_spec import FactorSpec, ModelSpec, Normalizations
+from skillmodels.common.process_model import process_model
+from skillmodels.test_data.simplest_augmented_model import SIMPLEST_AUGMENTED_MODEL
+
+
+def test_check_model_rejects_two_endogenous_factors_sharing_measurement() -> None:
+ # A second endogenous factor reusing fac2's "inv" measurement — the kind of
+ # duplicate-measurement collision the old guard silently missed.
+ base = SIMPLEST_AUGMENTED_MODEL
+ inv_b = FactorSpec(
+ measurements=(("inv",), ("inv",)),
+ normalizations=Normalizations(
+ loadings=({"inv": 1}, {"inv": 1}), intercepts=({}, {})
+ ),
+ is_endogenous=True,
+ transition_function="linear",
+ )
+ model = base._replace(factors=dict(base.factors) | {"fac2b": inv_b})
+ with pytest.raises(ValueError, match="overlap"):
+ process_model(model)
def test_invalid_stagemap_length() -> None:
@@ -30,7 +50,7 @@ def test_invalid_anchoring_non_bool() -> None:
free_constant=False,
free_loadings=False,
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("bool" in msg for msg in result)
@@ -42,7 +62,7 @@ def test_invalid_anchoring_non_mapping_outcomes() -> None:
free_constant=False,
free_loadings=False,
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("Mapping" in msg for msg in result)
@@ -54,7 +74,7 @@ def test_invalid_anchoring_outcome_type() -> None:
free_constant=False,
free_loadings=False,
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("variable" in msg.lower() for msg in result)
@@ -66,34 +86,31 @@ def test_invalid_anchoring_free_controls_type() -> None:
free_constant=False,
free_loadings=False,
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("free_controls" in msg for msg in result)
def test_invalid_measurements_not_tuples() -> None:
- spec = ModelSpec(
- factors={
- "f1": FactorSpec(
- measurements=(["y1", "y2"],), # ty: ignore[invalid-argument-type]
- ),
- },
- )
- result = _check_measurements(model_spec=spec, factors=("f1",))
- assert any("tuples" in msg for msg in result)
+ """Bad measurements shape is caught at the FactorSpec beartype perimeter.
+
+ Pre-beartype, the spec built and the model-check aggregator
+ surfaced a soft error message. Now the construction itself
+ raises `ModelSpecInitializationError`. The soft-check arm of
+ `_check_measurements` is dead code (kept only for non-type
+ issues that beartype can't see).
+ """
+ from skillmodels.exceptions import ModelSpecInitializationError # noqa: PLC0415
+
+ with pytest.raises(ModelSpecInitializationError, match="measurements"):
+ FactorSpec(measurements=(["y1", "y2"],)) # ty: ignore[invalid-argument-type]
def test_invalid_measurement_type() -> None:
- spec = ModelSpec(
- factors={
- "f1": FactorSpec(
- measurements=((["nested_list"],),), # ty: ignore[invalid-argument-type]
- ),
- },
- )
- result = _check_measurements(model_spec=spec, factors=("f1",))
- assert any(
- "column names" in msg.lower() or "tuples" in msg.lower() for msg in result
- )
+ """Bad measurement element type fails at `FactorSpec.__init__` (beartype)."""
+ from skillmodels.exceptions import ModelSpecInitializationError # noqa: PLC0415
+
+ with pytest.raises(ModelSpecInitializationError, match="measurements"):
+ FactorSpec(measurements=((["nested_list"],),)) # ty: ignore[invalid-argument-type]
def test_normalized_variable_not_in_measurements() -> None:
@@ -124,7 +141,7 @@ def test_invalid_anchoring_free_constant_type() -> None:
free_constant="yes",
free_loadings=False,
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("free_constant" in msg for msg in result)
@@ -136,7 +153,7 @@ def test_invalid_anchoring_free_loadings_type() -> None:
free_constant=False,
free_loadings="yes",
)
- result = _check_anchoring(anchoring) # ty: ignore[invalid-argument-type]
+ result = _check_anchoring(anchoring)
assert any("free_loadings" in msg for msg in result)
diff --git a/tests/test_chs_estimate.py b/tests/test_chs_estimate.py
new file mode 100644
index 00000000..ed4a5f56
--- /dev/null
+++ b/tests/test_chs_estimate.py
@@ -0,0 +1,98 @@
+"""End-to-end smoke test for `skillmodels.chs.estimate.estimate_chs`."""
+
+from pathlib import Path
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.chs.estimate import estimate_chs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.chs.types import CHSEstimationResult
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.fixed_constraint import FixedConstraintWithValue
+from skillmodels.test_data.model2 import MODEL2
+
+REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
+
+
+@pytest.fixture
+def model2_data():
+ data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
+ return data.set_index(["caseid", "period"])
+
+
+@pytest.fixture
+def anchoring_start_params():
+ start_params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
+ return start_params.set_index(["category", "period", "name1", "name2"])
+
+
+def test_estimate_chs_returns_conforming_result(model2_data, anchoring_start_params):
+ """Converge from the known optimum to a conforming `CHSEstimationResult`.
+
+ Starting at the regression-vault optimum keeps the run cheap: the
+ optimiser terminates almost immediately. `start_params_strategy="none"`
+ skips the (slow) AMN/Spearman seeding since full start values are
+ supplied.
+ """
+ result = estimate_chs(
+ MODEL2,
+ model2_data,
+ CHSEstimationOptions(start_params_strategy="none"),
+ start_params=anchoring_start_params,
+ )
+
+ assert isinstance(result, CHSEstimationResult)
+ assert result.success
+ assert np.isfinite(result.loglikelihood)
+ assert result.md_criterion is None
+ assert result.model_spec is MODEL2
+ assert "value" in result.params.columns
+
+
+def test_estimate_chs_provides_ml_inference(model2_data, anchoring_start_params):
+ """`estimate_chs` drives `estimate_ml`, so the result carries inference.
+
+ The result exposes the estimagic `LikelihoodResult`, from which standard
+ errors (and covariances, summaries) are available — the reason apps that
+ need inference can adopt `estimate_chs` instead of hand-rolling
+ `estimate_ml` on top of `get_maximization_inputs`.
+ """
+ result = estimate_chs(
+ MODEL2,
+ model2_data,
+ CHSEstimationOptions(start_params_strategy="none"),
+ start_params=anchoring_start_params,
+ )
+
+ assert result.likelihood_result is not None
+ standard_errors = result.likelihood_result.se()
+ assert standard_errors is not None
+
+
+def test_estimate_chs_enforces_user_fixed_constraint_value(
+ model2_data, anchoring_start_params
+):
+ """A user `FixedConstraintWithValue` fixes the param at its requested value.
+
+ `om.FixedConstraint` pins a parameter at its *start* value, so the wrapper's
+ `.value` only takes effect if `estimate_chs` writes it into the start vector.
+ User `constraints=` are merged after `get_maximization_inputs` (which only
+ enforces the internal fixed constraints), so without an explicit enforce the
+ parameter was silently fixed at the seeded start value, not the requested
+ value. Regression for audit finding F9.
+ """
+ loc = ("controls", 0, "y1", "x1")
+ start_value = float(anchoring_start_params.loc[loc, "value"])
+ target = start_value - 2.0 # clearly different from the seeded start value
+
+ result = estimate_chs(
+ MODEL2,
+ model2_data,
+ CHSEstimationOptions(start_params_strategy="none"),
+ start_params=anchoring_start_params,
+ constraints=[FixedConstraintWithValue(loc=loc, value=target)],
+ )
+
+ assert result.params.loc[loc, "value"] == pytest.approx(target)
diff --git a/tests/test_clipping.py b/tests/test_clipping.py
index 1afd17e3..ae50d788 100644
--- a/tests/test_clipping.py
+++ b/tests/test_clipping.py
@@ -3,7 +3,7 @@
import jax.numpy as jnp
import numpy as np
-from skillmodels.clipping import soft_clipping
+from skillmodels.chs.clipping import soft_clipping
def test_one_sided_soft_maximum() -> None:
diff --git a/tests/test_constraints.py b/tests/test_constraints.py
index fede7622..f2961ae0 100644
--- a/tests/test_constraints.py
+++ b/tests/test_constraints.py
@@ -1,5 +1,6 @@
"""Tests for constraints."""
+import functools
from types import MappingProxyType
from typing import Any
@@ -9,7 +10,7 @@
import pytest
from pandas.testing import assert_frame_equal
-from skillmodels.constraints import (
+from skillmodels.common.constraints import (
FixedConstraintWithValue,
_get_anchoring_constraints,
_get_constant_factors_constraints,
@@ -21,10 +22,270 @@
_get_transition_constraints,
add_bounds,
get_constraints,
+ reconcile_start_to_equality,
+)
+from skillmodels.common.process_model import process_model
+from skillmodels.common.selector import select_by_loc
+from skillmodels.common.types import (
+ Anchoring,
+ EndogenousFactorsInfo,
+ Labels,
+ MeasurementType,
+ Normalizations,
)
-from skillmodels.process_model import process_model
from skillmodels.test_data.simplest_augmented_model import SIMPLEST_AUGMENTED_MODEL
-from skillmodels.types import Anchoring, Labels, Normalizations
+
+
+def test_reconcile_start_to_equality_pools_pairwise_groups():
+ """Pairwise-equality groups (e.g. time-invariant controls) are pooled too.
+
+ hc ties a measurement's control / loading / sd across periods via
+ `om.PairwiseEqualityConstraint`. A per-period seed (AMN/Spearman) fills each
+ member independently and breaks it, so the reconciler must average each
+ element-wise group, not only plain `om.EqualityConstraint`s. Regression for
+ the `InvalidParamsError` that AMN-seeded time-invariant controls triggered.
+ """
+ names = ["category", "period", "name1", "name2"]
+ index = pd.MultiIndex.from_tuples(
+ [("controls", p, "m1", "constant") for p in (0, 1, 2)], names=names
+ )
+ params = pd.DataFrame({"value": [1.0, 2.0, 3.0]}, index=index)
+ locs = [
+ pd.MultiIndex.from_tuples([("controls", p, "m1", "constant")], names=names)
+ for p in (0, 1, 2)
+ ]
+ constraint = om.PairwiseEqualityConstraint(
+ selectors=[functools.partial(select_by_loc, loc=loc) for loc in locs]
+ )
+
+ out = reconcile_start_to_equality(params, [constraint])
+
+ np.testing.assert_allclose(out["value"].to_numpy(), [2.0, 2.0, 2.0])
+
+
+def test_reconcile_start_to_equality_propagates_fixed_member_value():
+ """A fixed member's value propagates to its equality group, not the mean.
+
+ When a pairwise-equality group contains a `FixedConstraintWithValue` member,
+ the shared start value must be that fixed value, so that enforcing the fix and
+ then reconciling do not fight each other; averaging would move the fixed
+ coordinate off its target. Regression for audit finding F10.
+ """
+ names = ["category", "period", "name1", "name2"]
+ index = pd.MultiIndex.from_tuples(
+ [("loadings", p, "m1", "fac1") for p in (0, 1, 2)], names=names
+ )
+ params = pd.DataFrame({"value": [1.0, 2.0, 9.0]}, index=index)
+ locs = [
+ pd.MultiIndex.from_tuples([("loadings", p, "m1", "fac1")], names=names)
+ for p in (0, 1, 2)
+ ]
+ pairwise = om.PairwiseEqualityConstraint(
+ selectors=[functools.partial(select_by_loc, loc=loc) for loc in locs]
+ )
+ fixed = FixedConstraintWithValue(loc=("loadings", 2, "m1", "fac1"), value=9.0)
+
+ out = reconcile_start_to_equality(params, [pairwise, fixed])
+
+ np.testing.assert_allclose(out["value"].to_numpy(), [9.0, 9.0, 9.0])
+
+
+def test_reconcile_start_to_equality_raises_on_conflicting_fixed_members():
+ """Two fixed members in one equality group with different values is infeasible."""
+ names = ["category", "period", "name1", "name2"]
+ index = pd.MultiIndex.from_tuples(
+ [("loadings", p, "m1", "fac1") for p in (0, 1)], names=names
+ )
+ params = pd.DataFrame({"value": [1.0, 2.0]}, index=index)
+ locs = [
+ pd.MultiIndex.from_tuples([("loadings", p, "m1", "fac1")], names=names)
+ for p in (0, 1)
+ ]
+ pairwise = om.PairwiseEqualityConstraint(
+ selectors=[functools.partial(select_by_loc, loc=loc) for loc in locs]
+ )
+ fixed = [
+ FixedConstraintWithValue(loc=("loadings", 0, "m1", "fac1"), value=3.0),
+ FixedConstraintWithValue(loc=("loadings", 1, "m1", "fac1"), value=4.0),
+ ]
+
+ with pytest.raises(ValueError, match="Conflicting"):
+ reconcile_start_to_equality(params, [pairwise, *fixed])
+
+
+def _corr_model_processed():
+ """Process a correction model: an endogenous investment + an instrument."""
+ from dataclasses import replace # noqa: PLC0415
+
+ from skillmodels.common.model_spec import CorrectionSpec # noqa: PLC0415
+ from skillmodels.test_data.model2 import MODEL2 # noqa: PLC0415
+
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_factors = dict(MODEL2.factors) | {
+ "fac3": replace(fac3, is_endogenous=True, correction=corr)
+ }
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+ model = model._replace(observed_factors=("inv_z",))
+ return process_model(model)
+
+
+def test_get_constraints_pins_kappa_to_zero_on_carry_forward_periods() -> None:
+ processed = _corr_model_processed()
+ constraints = get_constraints(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ anchoring_info=processed.anchoring,
+ normalizations=processed.normalizations,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ bounds_distance=1e-8,
+ )
+ kappa_fixed = [
+ c
+ for c in constraints
+ if isinstance(c, FixedConstraintWithValue)
+ and isinstance(c.loc, tuple)
+ and c.loc[0] == "kappa"
+ ]
+ assert kappa_fixed, "kappa must be pinned to 0 on carry-forward periods"
+ # All such constraints pin kappa to exactly 0.
+ assert all(c.value == 0.0 for c in kappa_fixed)
+ # They fall only on the state factors' carry-forward (STATES) aug periods,
+ # never on the production (ENDOGENOUS) aug periods where kappa is free.
+ meas_types = processed.endogenous_factors_info.aug_periods_to_aug_period_meas_types
+ for c in kappa_fixed:
+ assert isinstance(c.loc, tuple)
+ _category, aug_period, target, _term = c.loc
+ assert target in ("fac1", "fac2")
+ assert meas_types[aug_period] == MeasurementType.STATES
+
+
+def test_constant_factor_shock_constraints_only_target_existing_rows() -> None:
+ # A constant-transition state factor combined with an endogenous factor must
+ # not emit shock-fix constraints at aug periods where the factor does not
+ # transition. With endogenous factors the transition index stops at
+ # aug_periods[:-2], so a naive aug_periods[:-1] loop emits one orphan
+ # ("shock_sds", last_aug, factor, "-") loc that trips the optimagic selector.
+ from dataclasses import replace # noqa: PLC0415
+
+ from skillmodels.common.model_spec import CorrectionSpec # noqa: PLC0415
+ from skillmodels.common.params_index import get_params_index # noqa: PLC0415
+ from skillmodels.test_data.model2 import MODEL2 # noqa: PLC0415
+
+ fac1 = MODEL2.factors["fac1"]
+ fac3 = MODEL2.factors["fac3"]
+ new_factors = dict(MODEL2.factors) | {
+ "fac1": replace(fac1, transition_function="constant"),
+ "fac3": replace(
+ fac3, is_endogenous=True, correction=CorrectionSpec(instruments=("inv_z",))
+ ),
+ }
+ model = (
+ MODEL2._replace(factors=new_factors)
+ ._replace(stagemap=None)
+ ._replace(observed_factors=("inv_z",))
+ )
+ processed = process_model(model)
+ index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ constraints = get_constraints(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ anchoring_info=processed.anchoring,
+ normalizations=processed.normalizations,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ bounds_distance=1e-8,
+ )
+ shock_fixes = [
+ c
+ for c in constraints
+ if isinstance(c, FixedConstraintWithValue)
+ and isinstance(c.loc, tuple)
+ and c.loc[0] == "shock_sds"
+ ]
+ assert shock_fixes, "the constant factor must have its shocks pinned to 0"
+ for c in shock_fixes:
+ assert c.loc in index, f"orphan shock constraint {c.loc} not in params index"
+
+
+def test_get_constraints_pins_instrument_out_of_production() -> None:
+ # Built-in production transitions enumerate a free coefficient for every
+ # observed factor, including the excluded instrument; that coefficient must be
+ # pinned to 0 on the production (ENDOGENOUS) aug periods so the instrument
+ # cannot leak into production.
+ processed = _corr_model_processed()
+ constraints = get_constraints(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ anchoring_info=processed.anchoring,
+ normalizations=processed.normalizations,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ bounds_distance=1e-8,
+ )
+ meas_types = processed.endogenous_factors_info.aug_periods_to_aug_period_meas_types
+ inst_pins = [
+ c
+ for c in constraints
+ if isinstance(c, FixedConstraintWithValue)
+ and isinstance(c.loc, tuple)
+ and c.loc[0] == "transition"
+ and "inv_z" in c.loc[3]
+ and meas_types[c.loc[1]] == MeasurementType.ENDOGENOUS_FACTORS
+ ]
+ assert inst_pins, "instrument coeffs must be pinned to 0 on production periods"
+ assert all(c.value == 0.0 for c in inst_pins)
+ for c in inst_pins:
+ assert isinstance(c.loc, tuple)
+ _category, _aug_period, target, _name2 = c.loc
+ assert target in ("fac1", "fac2")
+
+
+def test_get_constraints_skips_custom_target_transition() -> None:
+ # A custom (registered) production transition on a correction target has no
+ # built-in `params_` enumerator; the instrument-exclusion guard must
+ # skip it (custom-production leakage is validated separately by
+ # `check_model`) rather than raise AttributeError.
+ from dataclasses import replace # noqa: PLC0415
+
+ from skillmodels.common.decorators import register_params # noqa: PLC0415
+ from skillmodels.common.model_spec import CorrectionSpec # noqa: PLC0415
+ from skillmodels.test_data.model2 import MODEL2 # noqa: PLC0415
+
+ @register_params(params=["constant", "fac1", "fac2"])
+ def custom_prod(fac1, fac2, params):
+ return params["constant"] + params["fac1"] * fac1 + params["fac2"] * fac2
+
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_factors = dict(MODEL2.factors) | {
+ "fac1": replace(MODEL2.factors["fac1"], transition_function=custom_prod),
+ "fac3": replace(MODEL2.factors["fac3"], is_endogenous=True, correction=corr),
+ }
+ model = (
+ MODEL2._replace(factors=new_factors)
+ ._replace(stagemap=None)
+ ._replace(observed_factors=("inv_z",))
+ )
+ processed = process_model(model)
+
+ # Must not raise `AttributeError: ... has no attribute 'params_custom_prod'`.
+ constraints = get_constraints(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ anchoring_info=processed.anchoring,
+ normalizations=processed.normalizations,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ bounds_distance=1e-8,
+ )
+ assert constraints
def _to_dict(c: om.constraints.Constraint) -> dict[str, Any]:
@@ -189,7 +450,13 @@ def test_constant_factor_constraints() -> None:
{"loc": ("shock_sds", 1, "fac2", "-"), "type": "fixed", "value": 0.0},
]
- calculated = _get_constant_factors_constraints(labels)
+ no_endog = EndogenousFactorsInfo(
+ has_endogenous_factors=False,
+ aug_periods_to_aug_period_meas_types=MappingProxyType({}),
+ aug_periods_from_period=lambda p: [p],
+ factor_info=MappingProxyType({}),
+ )
+ calculated = _get_constant_factors_constraints(labels, no_endog)
as_dicts = [_to_dict(c) for c in calculated]
assert_list_equal_except_for_order(as_dicts, expected)
@@ -402,6 +669,7 @@ def test_get_constraints_with_endogenous_factors(
anchoring_info=simplest_augmented_model.anchoring,
normalizations=simplest_augmented_model.normalizations,
endogenous_factors_info=simplest_augmented_model.endogenous_factors_info,
+ bounds_distance=1e-8,
)
# Should contain augmented-period constraints
assert any(
@@ -418,6 +686,7 @@ def test_get_constraints_returns_om_objects(simplest_augmented_model) -> None:
anchoring_info=simplest_augmented_model.anchoring,
normalizations=simplest_augmented_model.normalizations,
endogenous_factors_info=simplest_augmented_model.endogenous_factors_info,
+ bounds_distance=1e-8,
)
assert len(constraints) > 0
for c in constraints:
@@ -428,26 +697,27 @@ def test_get_constraints_for_augmented_periods(simplest_augmented_model) -> None
calculated = _get_constraints_for_augmented_periods(
labels=simplest_augmented_model.labels,
endogenous_factors_info=simplest_augmented_model.endogenous_factors_info,
+ bounds_distance=1e-8,
)
as_dicts = [_to_dict(c) for c in calculated]
+ # Only the non-final aug-period of each meas-type should produce
+ # identity constraints: `get_transition_index_tuples` truncates
+ # transitions at `aug_periods[:-2]` when endogenous factors are
+ # present, so emitting fixed constraints at the last STATES- or
+ # ENDO-typed aug-period would target locs that don't exist in the
+ # params index. Aug 2 (last STATES-typed) and aug 3 (last
+ # ENDO-typed) are therefore intentionally absent from the expected
+ # list.
expected = [
{"loc": ("transition", 0, "fac1", "fac1"), "type": "fixed", "value": 1.0},
{"loc": ("transition", 0, "fac1", "fac2"), "type": "fixed", "value": 0.0},
{"loc": ("transition", 0, "fac1", "of"), "type": "fixed", "value": 0.0},
{"loc": ("transition", 0, "fac1", "constant"), "type": "fixed", "value": 0.0},
{"loc": ("shock_sds", 0, "fac1", "-"), "type": "fixed", "value": 0.00000001},
- {"loc": ("transition", 2, "fac1", "fac1"), "type": "fixed", "value": 1.0},
- {"loc": ("transition", 2, "fac1", "fac2"), "type": "fixed", "value": 0.0},
- {"loc": ("transition", 2, "fac1", "of"), "type": "fixed", "value": 0.0},
- {"loc": ("transition", 2, "fac1", "constant"), "type": "fixed", "value": 0.0},
{"loc": ("transition", 1, "fac2", "fac1"), "type": "fixed", "value": 0.0},
{"loc": ("transition", 1, "fac2", "fac2"), "type": "fixed", "value": 1.0},
{"loc": ("transition", 1, "fac2", "of"), "type": "fixed", "value": 0.0},
{"loc": ("transition", 1, "fac2", "constant"), "type": "fixed", "value": 0.0},
{"loc": ("shock_sds", 1, "fac2", "-"), "type": "fixed", "value": 0.00000001},
- {"loc": ("transition", 3, "fac2", "fac1"), "type": "fixed", "value": 0.0},
- {"loc": ("transition", 3, "fac2", "fac2"), "type": "fixed", "value": 1.0},
- {"loc": ("transition", 3, "fac2", "of"), "type": "fixed", "value": 0.0},
- {"loc": ("transition", 3, "fac2", "constant"), "type": "fixed", "value": 0.0},
]
assert_list_equal_except_for_order(as_dicts, expected)
diff --git a/tests/test_control_function.py b/tests/test_control_function.py
new file mode 100644
index 00000000..f7d9dbcd
--- /dev/null
+++ b/tests/test_control_function.py
@@ -0,0 +1,210 @@
+"""Tests for the control-function (cf) DAG-node construction."""
+
+from dataclasses import replace
+
+import jax.numpy as jnp
+import numpy as np
+import pytest
+from numpy.testing import assert_allclose
+
+from skillmodels.common.control_function import (
+ build_cf_node,
+ build_kappa_addition_node,
+ build_kappa_term_evaluators,
+ build_prediction_node,
+ compute_investment_residual_sds,
+ generate_kappa_terms,
+)
+from skillmodels.common.model_spec import CorrectionSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_model import process_model
+from skillmodels.test_data.model2 import MODEL2
+
+
+def _corr_model_with_instrument():
+ """MODEL2 with fac3 endogenous, an observed instrument, and a correction."""
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_fac3 = replace(fac3, is_endogenous=True, correction=corr)
+ new_factors = dict(MODEL2.factors) | {"fac3": new_fac3}
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+ model = model._replace(observed_factors=("inv_z",))
+ return process_model(model)
+
+
+def _period0_trans_coeffs(processed):
+ index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ parsing_info = create_parsing_info(
+ params_index=index,
+ update_info=processed.update_info,
+ labels=processed.labels,
+ anchoring=processed.anchoring,
+ has_endogenous_factors=True,
+ )
+ params_vec = jnp.arange(len(index)).astype(float)
+ _, _, _, parsed = parse_params(
+ params_vec, parsing_info, processed.dimensions, processed.labels, n_obs=5
+ )
+ return {key: value[0] for key, value in parsed.transition.items()}
+
+
+def test_transition_adds_kappa_times_cf_to_target_output() -> None:
+ """The wired transition adds kappa*cf to a target factor's base output.
+
+ Invariant test independent of the base production form: zeroing kappa
+ recovers the base, and the difference equals kappa * cf, where cf is formed
+ contemporaneously from the INPUT investment state and the first-stage
+ prediction of it.
+ """
+ processed = _corr_model_with_instrument()
+ all_factors = processed.labels.all_factors # ('fac1','fac2','fac3','inv_z')
+ trans = _period0_trans_coeffs(processed)
+
+ states = jnp.array([1.0, 2.0, 3.0, 4.0]) # one anchored sigma-point row
+ target = "fac2"
+ individual = processed.transition_info.individual_functions[target]
+
+ out_full = individual(trans, states[None, :])
+ trans_zero_kappa = {
+ **trans,
+ "__kappa_fac2__": jnp.zeros_like(trans["__kappa_fac2__"]),
+ }
+ out_base = individual(trans_zero_kappa, states[None, :])
+
+ # Reconstruct cf = ln_inv(fac3) - first-stage prediction.
+ betas = trans["__first_stage_fac3__"] # order: fac1, fac2, inv_z, constant
+ predictor_positions = [all_factors.index(f) for f in ("fac1", "fac2", "inv_z")]
+ x = jnp.concatenate([states[jnp.array(predictor_positions)], jnp.array([1.0])])
+ prediction = jnp.dot(x, betas)
+ cf = states[all_factors.index("fac3")] - prediction
+ kappa = trans["__kappa_fac2__"][0] # single 'cf' coefficient
+
+ assert_allclose(float(out_full[0] - out_base[0]), float(kappa * cf), rtol=1e-6)
+ # Sanity: kappa is non-zero here, so the correction actually moved the output.
+ assert abs(float(kappa * cf)) > 1e-6
+
+
+def test_prediction_node_is_contemporaneous_linear_combination() -> None:
+ # all_factors order: [health_mom, health_kid, ln_inv, z1]; predict ln_inv from
+ # the state factors (positions 0, 1) and the instrument z1 (position 3).
+ prediction = build_prediction_node(
+ beta_key="__first_stage_ln_inv__", predictor_positions=(0, 1, 3)
+ )
+ states = jnp.array([2.0, 3.0, 99.0, 5.0]) # ln_inv value (99) must be ignored
+ params = {"__first_stage_ln_inv__": jnp.array([1.0, 0.5, 2.0, 0.1])}
+ # 1.0*2 + 0.5*3 + 2.0*5 + 0.1(constant) = 2 + 1.5 + 10 + 0.1
+ assert_allclose(float(prediction(states, params)), 13.6)
+
+
+def test_cf_node_is_investment_minus_prediction() -> None:
+ cf = build_cf_node(inv_pos=2)
+ states = jnp.array([2.0, 3.0, 7.0, 5.0])
+ out = cf(states, jnp.array(4.0))
+ assert_allclose(float(out), 3.0) # ln_inv 7 - pred 4
+
+
+def test_kappa_term_evaluators_cover_cf_square_and_interaction() -> None:
+ evals = build_kappa_term_evaluators(
+ kappa_terms=("cf", "cf ** 2", "cf * health_mom"),
+ factor_positions={"health_mom": 0, "health_kid": 1},
+ )
+ states = jnp.array([2.0, 3.0, 7.0])
+ cf_val = jnp.array(4.0)
+ assert_allclose(float(evals[0](cf_val, states)), 4.0)
+ assert_allclose(float(evals[1](cf_val, states)), 16.0)
+ assert_allclose(float(evals[2](cf_val, states)), 8.0) # cf * health_mom = 4*2
+
+
+def test_kappa_term_evaluators_handle_higher_order_monomials() -> None:
+ evals = build_kappa_term_evaluators(
+ kappa_terms=("cf ** 2 * health_mom * health_kid", "cf * health_mom ** 2"),
+ factor_positions={"health_mom": 0, "health_kid": 1},
+ )
+ states = jnp.array([2.0, 3.0])
+ cf_val = jnp.array(4.0)
+ # cf**2 * mom * kid = 16 * 2 * 3 = 96
+ assert_allclose(float(evals[0](cf_val, states)), 96.0)
+ # cf * mom**2 = 4 * 4 = 16
+ assert_allclose(float(evals[1](cf_val, states)), 16.0)
+
+
+def test_kappa_term_evaluators_reject_term_without_cf() -> None:
+ with pytest.raises(ValueError, match="cf"):
+ build_kappa_term_evaluators(
+ kappa_terms=("health_mom",), factor_positions={"health_mom": 0}
+ )
+
+
+def test_generate_kappa_terms_reproduces_translog_set_at_degree_two() -> None:
+ terms = generate_kappa_terms(("health_mom", "health_kid"), max_degree=2)
+ assert set(terms) == {
+ "cf",
+ "cf * health_mom",
+ "cf * health_kid",
+ "cf ** 2",
+ }
+
+
+def test_generate_kappa_terms_degree_one_is_just_cf() -> None:
+ assert generate_kappa_terms(("health_mom", "health_kid"), max_degree=1) == ("cf",)
+
+
+def test_generate_kappa_terms_includes_higher_order_and_squares() -> None:
+ terms = set(generate_kappa_terms(("a", "b"), max_degree=4))
+ # the user's example, plus a state square, must be present at degree 4
+ assert "cf ** 2 * a * b" in terms
+ assert "cf * a ** 2" in terms
+ # every term has cf power >= 1 and total degree <= 4
+ assert all(t.startswith("cf") for t in terms)
+
+
+def test_kappa_addition_node_adds_kappa_times_cf_to_base_output() -> None:
+ # Kappa lives in its own key; the base node's output is passed in unchanged.
+ evals = build_kappa_term_evaluators(
+ kappa_terms=("cf", "cf ** 2"), factor_positions={}
+ )
+ add_kappa = build_kappa_addition_node(
+ kappa_key="__kappa_health_mom__", kappa_evaluators=evals
+ )
+ states = jnp.array([2.0, 3.0])
+ params = {"__kappa_health_mom__": jnp.array([0.2, 0.3])}
+ base_value = jnp.array(5.5)
+ cf_val = jnp.array(4.0)
+ # base unchanged + kappa = 5.5 + 0.2*4 + 0.3*16
+ expected = 5.5 + 0.2 * 4.0 + 0.3 * 16.0
+ out = add_kappa(base_value, params, cf_val, states)
+ assert_allclose(float(out), expected)
+
+
+def test_investment_residual_sds_recovers_known_noise_sd() -> None:
+ rng = np.random.default_rng(7)
+ n_obs, n_periods, n_pred = 20_000, 3, 2
+ betas = jnp.array([[1.0, -0.5, 0.3], [0.8, 0.2, 1.0], [0.5, 0.5, -0.4]])
+ predictors = jnp.asarray(rng.normal(size=(n_obs, n_periods, n_pred)))
+ ones = jnp.ones((n_obs, n_periods, 1))
+ design = jnp.concatenate([predictors, ones], axis=-1)
+ mean = jnp.einsum("opk,pk->op", design, betas)
+ true_sds = jnp.array([0.5, 1.0, 1.5])
+ noise = jnp.asarray(rng.normal(size=(n_obs, n_periods))) * true_sds
+ investment = mean + noise
+
+ sds = compute_investment_residual_sds(investment, predictors, betas)
+ assert sds.shape == (n_periods,)
+ assert_allclose(np.asarray(sds), np.asarray(true_sds), rtol=0.05)
+
+
+def test_kappa_addition_node_is_identity_when_kappa_is_zero() -> None:
+ evals = build_kappa_term_evaluators(kappa_terms=("cf",), factor_positions={})
+ add_kappa = build_kappa_addition_node(
+ kappa_key="__kappa_health_mom__", kappa_evaluators=evals
+ )
+ params = {"__kappa_health_mom__": jnp.array([0.0])}
+ out = add_kappa(jnp.array(5.5), params, jnp.array(4.0), jnp.array([2.0, 3.0]))
+ assert_allclose(float(out), 5.5)
diff --git a/tests/test_correlation_heatmap.py b/tests/test_correlation_heatmap.py
index 114dc9bc..df515409 100644
--- a/tests/test_correlation_heatmap.py
+++ b/tests/test_correlation_heatmap.py
@@ -9,7 +9,7 @@
import pytest
from pandas.testing import assert_frame_equal as afe
-from skillmodels.correlation_heatmap import (
+from skillmodels.common.correlation_heatmap import (
_get_mask,
_get_measurement_data_for_multiple_periods,
_get_measurement_data_for_single_period,
@@ -21,7 +21,7 @@
get_scores_corr,
plot_correlation_heatmap,
)
-from skillmodels.types import Labels
+from skillmodels.common.types import Labels
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
@@ -275,12 +275,12 @@ def test_process_factors() -> None:
observed_factor = "g"
factors = ["b", "d", "g"]
all_factors = None
- assert tuple("abcd") == _process_factors(model, all_factors)[0] # ty: ignore[invalid-argument-type]
- assert tuple("efg") == _process_factors(model, all_factors)[1] # ty: ignore[invalid-argument-type]
- assert (latent_factor,) == _process_factors(model, latent_factor)[0] # ty: ignore[invalid-argument-type]
- assert (observed_factor,) == _process_factors(model, observed_factor)[1] # ty: ignore[invalid-argument-type]
- assert tuple(factors[:-1]) == _process_factors(model, factors)[0] # ty: ignore[invalid-argument-type]
- assert (factors[-1],) == _process_factors(model, factors)[1] # ty: ignore[invalid-argument-type]
+ assert tuple("abcd") == _process_factors(model, all_factors)[0]
+ assert tuple("efg") == _process_factors(model, all_factors)[1]
+ assert (latent_factor,) == _process_factors(model, latent_factor)[0]
+ assert (observed_factor,) == _process_factors(model, observed_factor)[1]
+ assert tuple(factors[:-1]) == _process_factors(model, factors)[0]
+ assert (factors[-1],) == _process_factors(model, factors)[1]
def test_get_mask_lower_triangle_only() -> None:
diff --git a/tests/test_decorators.py b/tests/test_decorators.py
index 44dd7645..165d2618 100644
--- a/tests/test_decorators.py
+++ b/tests/test_decorators.py
@@ -3,7 +3,11 @@
import jax.numpy as jnp
import pytest
-from skillmodels.decorators import extract_params, jax_array_output, register_params
+from skillmodels.common.decorators import (
+ extract_params,
+ jax_array_output,
+ register_params,
+)
def test_extract_params_decorator_only_key() -> None:
diff --git a/tests/test_diagnostic_plots.py b/tests/test_diagnostic_plots.py
index c823aa39..d14f59c5 100644
--- a/tests/test_diagnostic_plots.py
+++ b/tests/test_diagnostic_plots.py
@@ -6,11 +6,12 @@
import plotly.graph_objects as go
import pytest
-from skillmodels.diagnostic_plots import (
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.diagnostic_plots import (
plot_likelihood_contributions,
plot_residual_boxplots,
)
-from skillmodels.maximization_inputs import get_maximization_inputs
+from skillmodels.test_data.model2 import MODEL2_CHS_OPTIONS
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
@@ -20,7 +21,9 @@ def model2_diag_params(model2, model2_data):
"""Prepare params that match the expected index for diagnostic plots."""
vault_params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
vault_params = vault_params.set_index(["category", "period", "name1", "name2"])
- max_inputs = get_maximization_inputs(model_spec=model2, data=model2_data)
+ max_inputs = get_maximization_inputs(
+ model_spec=model2, data=model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = max_inputs["params_template"].copy()
# Fill in values from vault params where indices match
common_idx = params.index.intersection(vault_params.index)
@@ -29,14 +32,20 @@ def model2_diag_params(model2, model2_data):
return params
+@pytest.fixture
+def model2_debug(model2, model2_data, model2_diag_params):
+ """Run the CHS debug loglike once to feed the plot helpers."""
+ max_inputs = get_maximization_inputs(
+ model_spec=model2, data=model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ return max_inputs["debug_loglike"](model2_diag_params)
+
+
@pytest.mark.integration
-def test_plot_residual_boxplots_single_period(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_residual_boxplots_single_period(model2, model2_debug) -> None:
fig = plot_residual_boxplots(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ residuals=model2_debug["residuals"],
period=0,
)
assert isinstance(fig, go.Figure)
@@ -44,13 +53,10 @@ def test_plot_residual_boxplots_single_period(
@pytest.mark.integration
-def test_plot_residual_boxplots_all_periods(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_residual_boxplots_all_periods(model2, model2_debug) -> None:
result = plot_residual_boxplots(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ residuals=model2_debug["residuals"],
period=None,
)
assert isinstance(result, dict)
@@ -59,13 +65,10 @@ def test_plot_residual_boxplots_all_periods(
@pytest.mark.integration
-def test_plot_residual_boxplots_no_reference_line(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_residual_boxplots_no_reference_line(model2, model2_debug) -> None:
fig = plot_residual_boxplots(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ residuals=model2_debug["residuals"],
period=0,
show_reference_line=False,
)
@@ -73,13 +76,10 @@ def test_plot_residual_boxplots_no_reference_line(
@pytest.mark.integration
-def test_plot_residual_boxplots_layout_kwargs(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_residual_boxplots_layout_kwargs(model2, model2_debug) -> None:
fig = plot_residual_boxplots(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ residuals=model2_debug["residuals"],
period=0,
layout_kwargs={"title": "Custom Title"},
)
@@ -88,13 +88,10 @@ def test_plot_residual_boxplots_layout_kwargs(
@pytest.mark.integration
-def test_plot_likelihood_contributions_single_period(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_likelihood_contributions_single_period(model2, model2_debug) -> None:
fig = plot_likelihood_contributions(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ contributions=model2_debug["all_contributions"],
period=0,
)
assert isinstance(fig, go.Figure)
@@ -102,13 +99,10 @@ def test_plot_likelihood_contributions_single_period(
@pytest.mark.integration
-def test_plot_likelihood_contributions_all_periods(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_likelihood_contributions_all_periods(model2, model2_debug) -> None:
result = plot_likelihood_contributions(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ contributions=model2_debug["all_contributions"],
period=None,
)
assert isinstance(result, dict)
@@ -117,13 +111,10 @@ def test_plot_likelihood_contributions_all_periods(
@pytest.mark.integration
-def test_plot_likelihood_contributions_layout_kwargs(
- model2, model2_data, model2_diag_params
-) -> None:
+def test_plot_likelihood_contributions_layout_kwargs(model2, model2_debug) -> None:
fig = plot_likelihood_contributions(
model_spec=model2,
- data=model2_data,
- params=model2_diag_params,
+ contributions=model2_debug["all_contributions"],
period=0,
layout_kwargs={"title": "Custom LL Title"},
)
diff --git a/tests/test_estimation_protocols.py b/tests/test_estimation_protocols.py
new file mode 100644
index 00000000..8faec749
--- /dev/null
+++ b/tests/test_estimation_protocols.py
@@ -0,0 +1,98 @@
+"""Conformance tests for the cross-estimator structural Protocols.
+
+Guards that the three concrete result / options dataclasses keep
+satisfying `CommonEstimationResult` / `CommonEstimationOptions` (so
+harmonised post-estimation code can rely on the shared surface) and that
+the exactly-one-objective invariant holds for the likelihood estimators.
+"""
+
+import dataclasses
+
+import pandas as pd
+import pytest
+
+from skillmodels.af.types import AFEstimationOptions, AFEstimationResult
+from skillmodels.amn.types import AMNEstimationOptions, AMNEstimationResult
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.chs.types import CHSEstimationResult
+from skillmodels.common.estimation import (
+ CommonEstimationOptions,
+ CommonEstimationResult,
+)
+from skillmodels.common.model_spec import FactorSpec, ModelSpec, Normalizations
+
+RESULT_CLASSES = [AFEstimationResult, AMNEstimationResult, CHSEstimationResult]
+OPTION_CLASSES = [AFEstimationOptions, AMNEstimationOptions, CHSEstimationOptions]
+
+REQUIRED_RESULT_FIELDS = frozenset(
+ {"model_spec", "params", "success", "loglikelihood", "md_criterion"}
+)
+REQUIRED_OPTION_FIELDS = frozenset({"optimizer_algorithm", "optimizer_options"})
+
+
+def _tiny_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"),),
+ normalizations=Normalizations(
+ loadings=({"y1": 1},),
+ intercepts=({},),
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+@pytest.mark.parametrize("cls", RESULT_CLASSES)
+def test_result_class_declares_common_result_fields(cls):
+ names = {f.name for f in dataclasses.fields(cls)}
+ assert names >= REQUIRED_RESULT_FIELDS
+
+
+@pytest.mark.parametrize("cls", OPTION_CLASSES)
+def test_options_class_declares_common_option_fields(cls):
+ names = {f.name for f in dataclasses.fields(cls)}
+ assert names >= REQUIRED_OPTION_FIELDS
+
+
+@pytest.mark.parametrize(
+ "options", [AFEstimationOptions(), AMNEstimationOptions(), CHSEstimationOptions()]
+)
+def test_options_instances_satisfy_common_options_protocol(options):
+ assert isinstance(options, CommonEstimationOptions)
+
+
+def _make_chs_result() -> CHSEstimationResult:
+ params = pd.DataFrame({"value": [0.5]})
+ return CHSEstimationResult(
+ model_spec=_tiny_model(),
+ params=params,
+ success=True,
+ loglikelihood=-123.0,
+ optimize_result=None,
+ )
+
+
+def _make_af_result() -> AFEstimationResult:
+ params = pd.DataFrame({"value": [0.5]})
+ return AFEstimationResult(
+ period_results=(),
+ params=params,
+ model_spec=_tiny_model(),
+ conditional_distributions=(),
+ success=True,
+ loglikelihood=-456.0,
+ )
+
+
+def test_chs_and_af_results_satisfy_common_result_protocol():
+ for result in (_make_chs_result(), _make_af_result()):
+ assert isinstance(result, CommonEstimationResult)
+
+
+def test_exactly_one_objective_is_non_none_for_likelihood_results():
+ for result in (_make_chs_result(), _make_af_result()):
+ assert result.loglikelihood is not None
+ assert result.md_criterion is None
diff --git a/tests/test_filtered_states.py b/tests/test_filtered_states.py
index 787e9764..f8024f44 100644
--- a/tests/test_filtered_states.py
+++ b/tests/test_filtered_states.py
@@ -6,10 +6,10 @@
import pandas as pd
import pytest
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.test_data.model2 import MODEL2
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.individual_states import get_individual_states_from_params
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
@@ -25,14 +25,18 @@ def model2_data():
return data.set_index(["caseid", "period"])
-def test_get_filtered_states(model2, model2_data) -> None:
+def test_get_individual_states_from_params(model2, model2_data) -> None:
params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
params = params.set_index(["category", "period", "name1", "name2"])
- max_inputs = get_maximization_inputs(model2, model2_data)
+ max_inputs = get_maximization_inputs(
+ model2, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = params.loc[max_inputs["params_template"].index]
- calculated = get_filtered_states(model_spec=model2, data=model2_data, params=params)
+ calculated = get_individual_states_from_params(
+ model_spec=model2, data=model2_data, params=params
+ )
factors = ["fac1", "fac2", "fac3"]
expected_ratios = [1.187757, 1, 1]
diff --git a/tests/test_identification.py b/tests/test_identification.py
new file mode 100644
index 00000000..a3b50b2e
--- /dev/null
+++ b/tests/test_identification.py
@@ -0,0 +1,179 @@
+"""Tests for the reusable transition-aware identification anchor check (audit F6).
+
+`check_identification` is the estimator-agnostic core of the AF period-0 anchor
+diagnostic: given a ModelSpec plus any fixed_params / constraints, it returns a
+list of human-readable problems with the initial-period affine anchoring. Every
+factor with an initial distribution needs both a loading (scale) and an intercept
+(location) anchor at period 0; the CES simplex does NOT supply the initial
+location anchor (Pro F1). It is exposed for CHS/common tooling but is deliberately
+NOT wired into the default process_model path (no pipeline-wide gating).
+"""
+
+import functools
+from collections.abc import Mapping
+
+import optimagic as om
+import pandas as pd
+
+from skillmodels.common.constraints import select_by_loc
+from skillmodels.common.identification import check_identification
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+def _model(
+ *,
+ skills_loadings: tuple[Mapping[str, float], ...],
+ skills_intercepts: tuple[Mapping[str, float], ...],
+ skills_transition: str = "translog",
+) -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skills": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 2,
+ normalizations=Normalizations(
+ loadings=skills_loadings,
+ intercepts=skills_intercepts,
+ ),
+ transition_function=skills_transition,
+ ),
+ "investment": FactorSpec(
+ measurements=(("z1", "z2", "z3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"z1": 1},) * 2,
+ intercepts=({"z1": 0},) * 2,
+ ),
+ transition_function="linear",
+ is_endogenous=True,
+ ),
+ },
+ )
+
+
+def test_check_identification_clean_translog_returns_no_problems() -> None:
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ assert check_identification(model) == []
+
+
+def test_check_identification_flags_missing_period0_loading() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ problems = check_identification(model)
+ assert any("period 0" in p for p in problems)
+
+
+def test_check_identification_log_ces_requires_initial_intercept_anchor() -> None:
+ # The CES simplex replaces only the CROSS-PERIOD location alternative, not
+ # the absolute initial anchor mu_theta,0,1=0 (Pro F1: f(x+c,i+c)=f(x,i)+c
+ # leaves a common-shift orbit). So plain log_ces still needs a period-0
+ # intercept anchor.
+ model = _model(
+ skills_loadings=({"y1": 1},) * 2,
+ skills_intercepts=({}, {}),
+ skills_transition="log_ces",
+ )
+ problems = check_identification(model)
+ assert any("period 0" in p and "location" in p for p in problems)
+
+
+def test_check_identification_equality_of_free_loadings_does_not_anchor() -> None:
+ # An equality among free loadings reduces dimension but leaves their common
+ # scale free (Pro F3): it is NOT an anchor unless connected to a fixed or
+ # normalized member. period-0 skills loading is empty and the group ties two
+ # otherwise-free loadings, so the scale stays unanchored -> a problem.
+ model = _model(
+ skills_loadings=({}, {}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ group = pd.MultiIndex.from_tuples(
+ [
+ ("loadings", 0, "y1", "skills"),
+ ("loadings", 1, "y1", "skills"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints: list[om.constraints.Constraint] = [
+ om.EqualityConstraint(selector=functools.partial(select_by_loc, loc=group))
+ ]
+ problems = check_identification(model, constraints=constraints)
+ assert any("period 0" in p and "scale" in p for p in problems)
+
+
+def test_check_identification_zero_loading_pin_is_not_a_scale_anchor() -> None:
+ # A loading fixed to 0 is invariant to every rescaling of the factor and
+ # cannot pin its scale (Pro F1). It must NOT count as a scale anchor.
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ fixed = pd.DataFrame(
+ {"value": [0.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ problems = check_identification(model, fixed_params=fixed)
+ assert any("period 0" in p and "scale" in p for p in problems)
+
+
+def test_check_identification_nonfinite_loading_pin_is_not_an_anchor() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ fixed = pd.DataFrame(
+ {"value": [float("inf")]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ problems = check_identification(model, fixed_params=fixed)
+ assert any("period 0" in p and "scale" in p for p in problems)
+
+
+def test_check_identification_equality_anchor_is_transitive() -> None:
+ # A=normalized, A=B, B=C across two constraints: the anchor must propagate
+ # transitively to C (Pro F2). Here the only period-0 loading anchor is
+ # reachable only through a two-hop equality chain.
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ g1 = pd.MultiIndex.from_tuples(
+ [("loadings", 1, "y1", "skills"), ("loadings", 1, "y2", "skills")],
+ names=["category", "period", "name1", "name2"],
+ )
+ g2 = pd.MultiIndex.from_tuples(
+ [("loadings", 1, "y2", "skills"), ("loadings", 0, "y1", "skills")],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints: list[om.constraints.Constraint] = [
+ om.EqualityConstraint(selector=functools.partial(select_by_loc, loc=g1)),
+ om.EqualityConstraint(selector=functools.partial(select_by_loc, loc=g2)),
+ ]
+ assert check_identification(model, constraints=constraints) == []
+
+
+def test_check_identification_honours_fixed_params_anchor() -> None:
+ model = _model(
+ skills_loadings=({}, {"y1": 1}),
+ skills_intercepts=({"y1": 0},) * 2,
+ )
+ fixed = pd.DataFrame(
+ {"value": [1.0]},
+ index=pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ assert check_identification(model, fixed_params=fixed) == []
diff --git a/tests/test_kalman_filters.py b/tests/test_kalman_filters.py
index 9099696d..73b04040 100644
--- a/tests/test_kalman_filters.py
+++ b/tests/test_kalman_filters.py
@@ -10,7 +10,7 @@
from filterpy.kalman import JulierSigmaPoints, KalmanFilter
from numpy.testing import assert_array_almost_equal as aaae
-from skillmodels.kalman_filters import (
+from skillmodels.chs.kalman_filters import (
_calculate_sigma_points,
calculate_sigma_scaling_factor_and_weights,
kalman_predict,
@@ -18,7 +18,7 @@
linear_kalman_predict,
transform_sigma_points,
)
-from skillmodels.kalman_filters_debug import kalman_update as kalman_update_debug
+from skillmodels.chs.kalman_filters_debug import kalman_update as kalman_update_debug
jax.config.update("jax_enable_x64", True)
diff --git a/tests/test_likelihood_regression.py b/tests/test_likelihood_regression.py
index cfe7a621..cc540be4 100644
--- a/tests/test_likelihood_regression.py
+++ b/tests/test_likelihood_regression.py
@@ -11,12 +11,12 @@
import pytest
from numpy.testing import assert_array_almost_equal as aaae
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.decorators import register_params
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.model_spec import ModelSpec, Normalizations
-from skillmodels.test_data.model2 import MODEL2
-from skillmodels.utilities import reduce_n_periods
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.decorators import register_params
+from skillmodels.common.model_spec import ModelSpec, Normalizations
+from skillmodels.common.utilities import reduce_n_periods
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
jax.config.update("jax_enable_x64", True)
@@ -86,7 +86,7 @@ def test_likelihood_values_have_not_changed(
["category", "period", "name1", "name2"],
)
- inputs = get_maximization_inputs(model, model2_data)
+ inputs = get_maximization_inputs(model, model2_data, chs_options=MODEL2_CHS_OPTIONS)
params = params.loc[inputs["params_template"].index]
@@ -99,8 +99,12 @@ def test_likelihood_values_have_not_changed(
def test_splitting_does_not_change_gradient(model2, model2_data) -> None:
- inputs = get_maximization_inputs(model2, model2_data)
- inputs_split = get_maximization_inputs(model2, model2_data, 13)
+ inputs = get_maximization_inputs(
+ model2, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
+ inputs_split = get_maximization_inputs(
+ model2, model2_data, 13, chs_options=MODEL2_CHS_OPTIONS
+ )
params = inputs["params_template"]
params["value"] = 0.1
@@ -123,7 +127,7 @@ def test_likelihood_contributions_have_not_changed(
["category", "period", "name1", "name2"],
)
- inputs = get_maximization_inputs(model, model2_data)
+ inputs = get_maximization_inputs(model, model2_data, chs_options=MODEL2_CHS_OPTIONS)
params = params.loc[inputs["params_template"].index]
@@ -190,7 +194,9 @@ def test_likelihood_contributions_large_nobs(
stacked_data = pd.concat(to_concat)
- inputs = get_maximization_inputs(model, stacked_data)
+ inputs = get_maximization_inputs(
+ model, stacked_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = params.loc[inputs["params_template"].index]
@@ -223,7 +229,9 @@ def test_likelihood_runs_with_empty_periods(model2, model2_data) -> None:
anchoring=None,
)
- func_dict = get_maximization_inputs(model, model2_data)
+ func_dict = get_maximization_inputs(
+ model, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = func_dict["params_template"]
params["value"] = 0.1
@@ -235,7 +243,9 @@ def test_likelihood_runs_with_empty_periods(model2, model2_data) -> None:
def test_likelihood_runs_with_too_long_data(model2, model2_data) -> None:
reduced = reduce_n_periods(model2, 2)
assert isinstance(reduced, ModelSpec)
- func_dict = get_maximization_inputs(reduced, model2_data)
+ func_dict = get_maximization_inputs(
+ reduced, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = func_dict["params_template"]
params["value"] = 0.1
@@ -248,7 +258,9 @@ def test_likelihood_runs_with_observed_factors(model2, model2_data) -> None:
model = model2.with_added_observed_factors("ob1", "ob2")
model2_data["ob1"] = np.arange(len(model2_data))
model2_data["ob2"] = np.ones(len(model2_data))
- func_dict = get_maximization_inputs(model, model2_data)
+ func_dict = get_maximization_inputs(
+ model, model2_data, chs_options=MODEL2_CHS_OPTIONS
+ )
params = func_dict["params_template"]
params["value"] = 0.1
diff --git a/tests/test_maximization_inputs.py b/tests/test_maximization_inputs.py
index eb807d48..d7c143ea 100644
--- a/tests/test_maximization_inputs.py
+++ b/tests/test_maximization_inputs.py
@@ -2,10 +2,68 @@
import jax.numpy as jnp
import numpy as np
+import optimagic as om
import pandas as pd
import pytest
-from skillmodels.maximization_inputs import _get_jnp_params_vec, _to_numpy
+from skillmodels.chs.maximization_inputs import (
+ _fail_if_start_params_incomplete,
+ _get_jnp_params_vec,
+ _to_numpy,
+ get_maximization_inputs,
+)
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.constraints import FixedConstraintWithValue
+from skillmodels.common.utilities import reduce_n_periods
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
+
+
+def test_fail_if_start_params_incomplete_flags_non_finite_rows() -> None:
+ """A seeded start point with a missing/non-finite value fails early + clearly."""
+ names = ["category", "period", "name1", "name2"]
+ idx = pd.MultiIndex.from_tuples(
+ [("loadings", 0, "y1", "skills"), ("meas_sds", 0, "y1", "-")], names=names
+ )
+
+ complete = pd.DataFrame({"value": [1.0, 0.5]}, index=idx)
+ _fail_if_start_params_incomplete(complete) # all finite -> no raise
+
+ incomplete = pd.DataFrame({"value": [1.0, np.nan]}, index=idx)
+ with pytest.raises(ValueError, match="without a finite value"):
+ _fail_if_start_params_incomplete(incomplete)
+
+
+@pytest.mark.long_running
+def test_amn_start_params_satisfy_equality_constraints() -> None:
+ """AMN-seeded start values must satisfy the stage-equality constraints.
+
+ AMN estimates parameters per aug_period, but the stage
+ `PairwiseEqualityConstraint`s tie transition / shock params across the
+ aug_periods of a stage. The AMN seed must re-pool those groups; otherwise
+ `optimagic` rejects the start point with `InvalidParamsError`.
+ """
+ data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta").set_index(
+ ["caseid", "period"]
+ )
+ mi = get_maximization_inputs(
+ model_spec=MODEL2,
+ data=data,
+ chs_options=CHSEstimationOptions(start_params_strategy="amn"),
+ )
+ template = mi["params_template"]
+ # optimagic validates start-point feasibility at setup and raises
+ # InvalidParamsError on a violated equality constraint. A trivial one-step
+ # maximize reaches that check without running the Kalman likelihood.
+ res = om.maximize(
+ fun=lambda p: float(p["value"].sum()),
+ params=template[["value"]],
+ algorithm="scipy_lbfgsb",
+ bounds=om.Bounds(lower=template["lower_bound"], upper=template["upper_bound"]),
+ constraints=mi["constraints"],
+ algo_options={"stopping_maxiter": 1},
+ )
+ assert res is not None
def test_to_numpy_with_dict() -> None:
@@ -56,3 +114,135 @@ def test_get_jnp_params_vec_additional_entries_raises() -> None:
)
with pytest.raises(ValueError, match="additional entries"):
_get_jnp_params_vec(params, target_index)
+
+
+@pytest.fixture
+def model2_short():
+ return reduce_n_periods(MODEL2, new_n_periods=3)
+
+
+@pytest.fixture
+def model2_data():
+ return pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta").set_index(
+ ["caseid", "period"]
+ )
+
+
+def test_get_maximization_inputs_with_fixed_params_pins_cross_factor_gamma(
+ model2_short, model2_data
+) -> None:
+ """Fix gamma_fac3 in log_ces at 0 via fixed_params; verify CHS pipeline.
+
+ Before probability + fixed-param support in optimagic, combining a
+ `ProbabilityConstraint` with a `FixedConstraint` on one of its selected
+ entries raised `InvalidConstraintError`. Now the fold machinery removes
+ the fixed entry from the selector; CHS should build a valid problem
+ whose params_template and constraint list reflect the pin and whose
+ log-likelihood evaluates to a finite number.
+ """
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [
+ ("transition", 0, "fac1", "fac3"),
+ ("transition", 1, "fac1", "fac3"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [0.0, 0.0]}, index=fixed_idx)
+
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS, fixed_params=fixed_df
+ )
+
+ template = inputs["params_template"]
+ assert template.loc[("transition", 0, "fac1", "fac3"), "value"] == 0.0
+ assert template.loc[("transition", 1, "fac1", "fac3"), "value"] == 0.0
+ user_fixed = [
+ c
+ for c in inputs["constraints"]
+ if isinstance(c, FixedConstraintWithValue) and c.loc in set(fixed_idx)
+ ]
+ assert len(user_fixed) == 2
+
+ # optimagic should accept the combined problem with our fold helper.
+ params = template.copy()
+ # Fill free entries with reasonable starting values compatible with the
+ # simplex constraint: split the remaining 1.0 between fac1 and fac2.
+ for t in (0, 1):
+ params.loc[("transition", t, "fac1", "fac1"), "value"] = 0.5
+ params.loc[("transition", t, "fac1", "fac2"), "value"] = 0.5
+ params["value"] = params["value"].fillna(0.1)
+
+ om.check_constraints(
+ params=params[["value"]],
+ constraints=inputs["constraints"],
+ )
+
+ loglike_val = inputs["loglike"](params)
+ assert np.isfinite(loglike_val)
+
+
+def test_get_maximization_inputs_with_fixed_params_non_zero(
+ model2_short, model2_data
+) -> None:
+ """Fix a gamma at a non-zero value; remaining simplex sums to 1 - c."""
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac3")],
+ names=["category", "period", "name1", "name2"],
+ )
+ fixed_df = pd.DataFrame({"value": [0.2]}, index=fixed_idx)
+
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS, fixed_params=fixed_df
+ )
+
+ template = inputs["params_template"]
+ assert template.loc[("transition", 0, "fac1", "fac3"), "value"] == 0.2
+ params = template.copy()
+ params.loc[("transition", 0, "fac1", "fac1"), "value"] = 0.4
+ params.loc[("transition", 0, "fac1", "fac2"), "value"] = 0.4
+ params.loc[("transition", 1, "fac1", "fac1"), "value"] = 0.4
+ params.loc[("transition", 1, "fac1", "fac2"), "value"] = 0.4
+ params.loc[("transition", 1, "fac1", "fac3"), "value"] = 0.2
+ params["value"] = params["value"].fillna(0.1)
+
+ om.check_constraints(
+ params=params[["value"]],
+ constraints=inputs["constraints"],
+ )
+
+ loglike_val = inputs["loglike"](params)
+ assert np.isfinite(loglike_val)
+
+
+def test_get_maximization_inputs_accepts_fixed_params_keyed_by_period(
+ model2_short, model2_data
+) -> None:
+ """`fixed_params` keyed by `period` (the public name) must pin the entry.
+
+ `params_index` uses `aug_period` internally; `MultiIndex.intersection`
+ silently returns an empty set when level names differ across the
+ operands, so without name alignment the user's pin would vanish.
+ Regression for that silent-drop bug.
+ """
+ fixed_idx = pd.MultiIndex.from_tuples(
+ [("transition", 0, "fac1", "fac3")],
+ names=["category", "period", "name1", "name2"], # public-facing name
+ )
+ fixed_df = pd.DataFrame({"value": [0.2]}, index=fixed_idx)
+
+ inputs = get_maximization_inputs(
+ model2_short, model2_data, chs_options=MODEL2_CHS_OPTIONS, fixed_params=fixed_df
+ )
+
+ template = inputs["params_template"]
+ assert template.loc[("transition", 0, "fac1", "fac3"), "value"] == pytest.approx(
+ 0.2
+ )
+ fixed_constraints = [
+ c
+ for c in inputs["constraints"]
+ if isinstance(c, FixedConstraintWithValue)
+ and c.loc == ("transition", 0, "fac1", "fac3")
+ ]
+ assert len(fixed_constraints) == 1
+ assert fixed_constraints[0].value == pytest.approx(0.2)
diff --git a/tests/test_model_spec.py b/tests/test_model_spec.py
index dda3958d..97d34aa1 100644
--- a/tests/test_model_spec.py
+++ b/tests/test_model_spec.py
@@ -2,8 +2,13 @@
import pytest
-from skillmodels.model_spec import AnchoringSpec, FactorSpec, ModelSpec, Normalizations
-from skillmodels.types import EstimationOptions
+from skillmodels.common.model_spec import (
+ AnchoringSpec,
+ CorrectionSpec,
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
def _minimal_dict():
@@ -25,7 +30,6 @@ def test_from_dict_minimal() -> None:
assert spec.factors["f1"].measurements == (("y1", "y2"), ("y1", "y2"))
assert spec.factors["f1"].transition_function == "linear"
assert spec.anchoring is None
- assert spec.estimation_options is None
assert spec.controls == ()
@@ -63,13 +67,11 @@ def test_from_dict_with_anchoring() -> None:
assert spec.anchoring.free_controls is True
-def test_from_dict_with_estimation_options() -> None:
+def test_from_dict_with_n_mixtures() -> None:
d = _minimal_dict()
- d["estimation_options"] = {"n_mixtures": 2, "robust_bounds": False}
+ d["n_mixtures"] = 2
spec = ModelSpec.from_dict(d)
- assert spec.estimation_options is not None
- assert spec.estimation_options.n_mixtures == 2
- assert spec.estimation_options.robust_bounds is False
+ assert spec.n_mixtures == 2
def test_from_dict_with_stagemap() -> None:
@@ -79,6 +81,107 @@ def test_from_dict_with_stagemap() -> None:
assert spec.stagemap == (0,)
+def test_correction_spec_defaults() -> None:
+ cf = CorrectionSpec(instruments=("z1",))
+ assert cf.instruments == ("z1",)
+ assert cf.state_predictors == ()
+ assert cf.targets == ()
+ assert cf.kappa_degree is None # None resolves to degree 1 downstream
+ assert cf.kappa_terms is None
+
+
+def test_correction_spec_requires_nonempty_instruments() -> None:
+ with pytest.raises(ValueError, match="instrument"):
+ CorrectionSpec(instruments=())
+
+
+def test_correction_spec_rejects_both_kappa_degree_and_kappa_terms() -> None:
+ with pytest.raises(ValueError, match="mutually exclusive"):
+ CorrectionSpec(
+ instruments=("z1",),
+ kappa_degree=2,
+ kappa_terms={"health_mom": ("cf",)},
+ )
+
+
+def test_correction_spec_stores_fields_and_makes_kappa_terms_immutable() -> None:
+ cf = CorrectionSpec(
+ instruments=("sum_inv_paid_log", "sum_inv_private_log"),
+ state_predictors=("health_mom", "health_kid"),
+ targets=("health_mom", "health_kid"),
+ kappa_terms={"health_mom": ("cf",), "health_kid": ("cf", "cf ** 2")},
+ )
+ assert cf.state_predictors == ("health_mom", "health_kid")
+ assert cf.instruments == ("sum_inv_paid_log", "sum_inv_private_log")
+ assert cf.targets == ("health_mom", "health_kid")
+ assert cf.kappa_terms is not None
+ assert cf.kappa_terms["health_kid"] == ("cf", "cf ** 2")
+ # kappa_terms must be converted to an immutable mapping.
+ with pytest.raises(TypeError):
+ cf.kappa_terms["health_mom"] = ("cf", "cf ** 2") # ty: ignore[invalid-assignment]
+
+
+def test_correction_spec_is_frozen() -> None:
+ cf = CorrectionSpec(instruments=("z1",))
+ with pytest.raises(AttributeError):
+ cf.targets = ("health_mom",) # ty: ignore[invalid-assignment]
+
+
+def test_factor_spec_correction_defaults_to_none() -> None:
+ spec = FactorSpec(measurements=(("y1",),))
+ assert spec.correction is None
+
+
+def test_factor_spec_accepts_correction() -> None:
+ cf = CorrectionSpec(
+ instruments=("z1",),
+ targets=("health_mom",),
+ )
+ spec = FactorSpec(
+ measurements=(("ln_inv",),),
+ is_endogenous=True,
+ correction=cf,
+ )
+ assert spec.correction is cf
+
+
+def test_from_dict_with_correction_parses_and_auto_registers_instruments() -> None:
+ d = {
+ "factors": {
+ "skills": {"measurements": [["y1"]], "transition_function": "linear"},
+ "investment": {
+ "measurements": [["ln_inv"]],
+ "is_endogenous": True,
+ "transition_function": "linear",
+ "correction": {"instruments": ["iv1", "iv2"], "kappa_degree": 2},
+ },
+ },
+ }
+ model = ModelSpec.from_dict(d)
+ corr = model.factors["investment"].correction
+ assert corr is not None
+ assert corr.instruments == ("iv1", "iv2")
+ assert corr.kappa_degree == 2
+ # Instruments are auto-registered as observed factors.
+ assert model.observed_factors == ("iv1", "iv2")
+
+
+def test_with_correction_attaches_and_auto_registers_instruments() -> None:
+ plain = FactorSpec(measurements=(("y1",),))
+ inv = FactorSpec(measurements=(("ln_inv",),), is_endogenous=True)
+ model = ModelSpec(
+ factors={"skills": plain, "investment": inv},
+ observed_factors=("income",),
+ )
+ cf = CorrectionSpec(instruments=("income", "iv2"))
+
+ result = model.with_correction("investment", cf)
+
+ assert result.factors["investment"].correction is cf
+ # Instruments are auto-registered as observed factors, deduped against existing.
+ assert result.observed_factors == ("income", "iv2")
+
+
def test_with_added_factor(model2) -> None:
new_factor = FactorSpec(
measurements=(("z1", "z2"),) * 8,
@@ -94,13 +197,6 @@ def test_with_added_observed_factors(model2) -> None:
assert result.observed_factors == ("obs1", "obs2")
-def test_with_estimation_options(model2) -> None:
- opts = EstimationOptions(n_mixtures=3)
- result = model2.with_estimation_options(opts)
- assert result.estimation_options is not None
- assert result.estimation_options.n_mixtures == 3
-
-
def test_with_anchoring(model2) -> None:
anch = AnchoringSpec(outcomes={"fac2": "Q2"})
result = model2.with_anchoring(anch)
@@ -118,6 +214,23 @@ def test_with_stagemap(model2) -> None:
assert result.stagemap == (0, 1, 2, 3, 4, 5, 6)
+def test_without_correction_strips_correction_from_all_factors() -> None:
+ corrected = FactorSpec(
+ measurements=(("ln_inv",),),
+ is_endogenous=True,
+ correction=CorrectionSpec(instruments=("z1",), targets=("skills",)),
+ )
+ plain = FactorSpec(measurements=(("y1",),))
+ model = ModelSpec(factors={"skills": plain, "investment": corrected})
+
+ stripped = model.without_correction()
+
+ assert all(f.correction is None for f in stripped.factors.values())
+ # The rest of the spec is preserved.
+ assert stripped.factors["investment"].is_endogenous is True
+ assert tuple(stripped.factors) == ("skills", "investment")
+
+
def test_with_transition_functions_valid(model2) -> None:
funcs = {"fac1": "linear", "fac2": "translog", "fac3": "constant"}
result = model2.with_transition_functions(funcs)
diff --git a/tests/test_params_index.py b/tests/test_params_index.py
index 9a3fc6c0..370b7550 100644
--- a/tests/test_params_index.py
+++ b/tests/test_params_index.py
@@ -1,12 +1,14 @@
"""Tests for params index."""
+from dataclasses import replace
from types import MappingProxyType
import pandas as pd
import pytest
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.params_index import (
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.model_spec import CorrectionSpec
+from skillmodels.common.params_index import (
get_control_params_index_tuples,
get_initial_cholcovs_index_tuples,
get_loadings_index_tuples,
@@ -17,9 +19,73 @@
get_transition_index_tuples,
initial_mean_index_tuples,
)
-from skillmodels.process_model import process_model
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import TransitionInfo
from skillmodels.test_data.model2 import MODEL2
-from skillmodels.types import TransitionInfo
+
+
+def _corr_model_processed():
+ """Process MODEL2 with fac3 endogenous + a control-function correction."""
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_fac3 = replace(fac3, is_endogenous=True, correction=corr)
+ new_factors = dict(MODEL2.factors) | {"fac3": new_fac3}
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+ model = model._replace(observed_factors=("inv_z",))
+ return process_model(model)
+
+
+def test_params_index_includes_investment_eq_rows() -> None:
+ processed = _corr_model_processed()
+ index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ df = index.to_frame(index=False)
+ inv_eq = df[df["category"] == "investment_eq"]
+ expected_periods = list(processed.labels.aug_periods[:-2])
+
+ # name1 is always the investment factor.
+ assert set(inv_eq["name1"]) == {"fac3"}
+ # Predictors = state_predictors (fac1, fac2) + instruments (inv_z) + constant.
+ assert set(inv_eq["name2"]) == {"fac1", "fac2", "inv_z", "constant"}
+ # Rows live on aug_periods[:-2] only (endogenous truncation).
+ assert sorted(inv_eq["aug_period"].unique()) == expected_periods
+ assert len(inv_eq) == len(expected_periods) * 4
+ # SD(eta_I) is NOT a free parameter in the CHS path (the contemporaneous
+ # first-stage residual variance is implied by the state covariance).
+ assert "investment_sds" not in set(df["category"])
+
+
+def test_params_index_includes_kappa_rows() -> None:
+ processed = _corr_model_processed()
+ index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ df = index.to_frame(index=False)
+ kappa = df[df["category"] == "kappa"]
+ expected_periods = list(processed.labels.aug_periods[:-2])
+
+ # Targets default to the state factors fac1, fac2; default kappa term is "cf".
+ assert set(kappa["name1"]) == {"fac1", "fac2"}
+ assert set(kappa["name2"]) == {"cf"}
+ assert sorted(kappa["aug_period"].unique()) == expected_periods
+ # one ("kappa", period, target, "cf") row per (period, target)
+ assert len(kappa) == len(expected_periods) * 2
+
+
+def test_params_index_no_investment_rows_without_correction(model2_inputs) -> None:
+ index = get_params_index(**model2_inputs)
+ cats = set(index.get_level_values("category"))
+ assert "investment_eq" not in cats
+ assert "kappa" not in cats
@pytest.fixture
diff --git a/tests/test_parse_params.py b/tests/test_parse_params.py
index 07272511..2d687194 100644
--- a/tests/test_parse_params.py
+++ b/tests/test_parse_params.py
@@ -6,6 +6,7 @@
"""
from collections.abc import Mapping
+from dataclasses import replace
from types import MappingProxyType
import jax.numpy as jnp
@@ -14,11 +15,60 @@
import pytest
from numpy.testing import assert_array_equal as aae
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.parse_params import create_parsing_info, parse_params
-from skillmodels.process_model import process_model
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.model_spec import CorrectionSpec
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.parse_params import create_parsing_info, parse_params
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import Anchoring
from skillmodels.test_data.model2 import MODEL2
-from skillmodels.types import Anchoring
+
+
+def test_parse_params_populates_first_stage_reserved_key() -> None:
+ """The first-stage betas parse into a reserved trans_coeffs key.
+
+ The contemporaneous first-stage equation's coefficients live under the
+ `investment_eq` params category but are threaded into the transition-coeffs
+ dict under a reserved `__first_stage___` key, so the prediction DAG
+ node reads them with no change to the predict signature.
+ """
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_fac3 = replace(fac3, is_endogenous=True, correction=corr)
+ new_factors = dict(MODEL2.factors) | {"fac3": new_fac3}
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+ model = model._replace(observed_factors=("inv_z",))
+ processed = process_model(model)
+
+ p_index = get_params_index(
+ update_info=processed.update_info,
+ labels=processed.labels,
+ dimensions=processed.dimensions,
+ transition_info=processed.transition_info,
+ endogenous_factors_info=processed.endogenous_factors_info,
+ )
+ parsing_info = create_parsing_info(
+ params_index=p_index,
+ update_info=processed.update_info,
+ labels=processed.labels,
+ anchoring=processed.anchoring,
+ has_endogenous_factors=True,
+ )
+ assert parsing_info.investment_factor == "fac3"
+
+ params_vec = jnp.arange(len(p_index)).astype(float)
+ _, _, _, parsed = parse_params(
+ params_vec, parsing_info, processed.dimensions, processed.labels, n_obs=5
+ )
+ reserved = "__first_stage_fac3__"
+ assert reserved in parsed.transition
+ n_aug = len(processed.labels.aug_periods)
+ # (aug_periods[:-2], state_predictors + instruments + constant) = (14, 4).
+ assert parsed.transition[reserved].shape == (n_aug - 2, 4)
+ # kappa reserved keys, one per target, with one cf column each.
+ assert "__kappa_fac1__" in parsed.transition
+ assert "__kappa_fac2__" in parsed.transition
+ assert parsed.transition["__kappa_fac1__"].shape == (n_aug - 2, 1)
@pytest.fixture
diff --git a/tests/test_process_data.py b/tests/test_process_data.py
index ec2fce30..f5c5b93a 100644
--- a/tests/test_process_data.py
+++ b/tests/test_process_data.py
@@ -10,8 +10,8 @@
import pytest
from numpy.testing import assert_array_equal as aae
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.process_data import (
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.process_data import (
_augment_data_for_endogenous_factors,
_generate_controls_array,
_generate_measurements_array,
@@ -19,9 +19,9 @@
_handle_controls_with_missings,
pre_process_data,
)
-from skillmodels.process_model import process_model
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import Labels
from skillmodels.test_data.simplest_augmented_model import SIMPLEST_AUGMENTED_MODEL
-from skillmodels.types import Labels
def test_pre_process_data() -> None:
diff --git a/tests/test_process_debug_data.py b/tests/test_process_debug_data.py
index 4b69e118..eea1c593 100644
--- a/tests/test_process_debug_data.py
+++ b/tests/test_process_debug_data.py
@@ -4,11 +4,11 @@
import pandas as pd
import pytest
-from skillmodels.process_debug_data import (
+from skillmodels.chs.process_debug_data import (
_create_post_update_states,
_process_residuals,
- create_state_ranges,
)
+from skillmodels.common.state_ranges import create_state_ranges
def test_create_state_ranges_invalid_quantile_raises() -> None:
@@ -26,7 +26,7 @@ def test_process_residuals_ids_with_mixtures() -> None:
index=pd.MultiIndex.from_tuples([(0, "m1"), (0, "m2")]),
)
- result = _process_residuals(residuals=residuals, update_info=update_info) # ty: ignore[invalid-argument-type]
+ result = _process_residuals(residuals=residuals, update_info=update_info)
# For each update, ids should be [0, 0, 1, 1, 2, 2] not [0, 1, 2, 3, 4, 5]
for _, group in result.groupby(["aug_period", "measurement"]):
@@ -49,7 +49,7 @@ def test_create_post_update_states_ids_with_mixtures() -> None:
)
result = _create_post_update_states(
- filtered_states=filtered_states, # ty: ignore[invalid-argument-type]
+ filtered_states=filtered_states,
factors=factors,
update_info=update_info,
)
diff --git a/tests/test_process_model.py b/tests/test_process_model.py
index 3b9a03e3..04adf0ce 100644
--- a/tests/test_process_model.py
+++ b/tests/test_process_model.py
@@ -3,16 +3,24 @@
import inspect
from dataclasses import replace
-import numpy as np
import pandas as pd
import pytest
from pandas.testing import assert_frame_equal
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.model_spec import FactorSpec
-from skillmodels.process_model import get_has_endogenous_factors, process_model
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.control_function import generate_kappa_terms
+from skillmodels.common.model_spec import CorrectionSpec, FactorSpec, ModelSpec
+from skillmodels.common.process_model import (
+ _resolve_control_function,
+ get_has_endogenous_factors,
+ process_model,
+)
+from skillmodels.common.types import (
+ ControlFunctionInfo,
+ Normalizations,
+ TransitionInfo,
+)
from skillmodels.test_data.model2 import MODEL2
-from skillmodels.types import Normalizations, TransitionInfo
@pytest.fixture
@@ -45,13 +53,6 @@ def test_labels(model2) -> None:
assert res.stages == (0,)
-def test_estimation_options(model2) -> None:
- res = process_model(model2).estimation_options
- assert res.sigma_points_scale == 2
- assert res.robust_bounds
- assert np.isclose(res.bounds_distance, 0.001)
-
-
def test_anchoring(model2) -> None:
res = process_model(model2).anchoring
assert res.outcomes == {"fac1": "Q1"}
@@ -201,13 +202,6 @@ def test_with_endog_labels(model2_inv) -> None:
assert res.aug_stages == tuple(range(n_aug_periods - 2))
-def test_with_endog_estimation_options(model2_inv) -> None:
- res = process_model(model2_inv).estimation_options
- assert res.sigma_points_scale == 2
- assert res.robust_bounds
- assert np.isclose(res.bounds_distance, 0.001)
-
-
def test_with_endog_anchoring_is_empty(model2_inv) -> None:
res = process_model(model2_inv).anchoring
assert res.outcomes == {}
@@ -317,24 +311,231 @@ def test_model_has_endogenous_factors_not_specified() -> None:
assert not get_has_endogenous_factors(factors)
-def test_get_has_endogenous_factors_wrong_constellation() -> None:
- factors = {"a": _fspec(is_endogenous=False, is_correction=True)}
- with pytest.raises(ValueError, match="is_endogenous"):
- get_has_endogenous_factors(factors)
-
-
def test_get_has_endogenous_factors_indeed() -> None:
factors = {
- "a": _fspec(is_endogenous=True, is_correction=False),
- "b": _fspec(is_endogenous=False, is_correction=False),
+ "a": _fspec(is_endogenous=True),
+ "b": _fspec(is_endogenous=False),
}
assert get_has_endogenous_factors(factors)
-def test_get_has_endogenous_factors_and_correction() -> None:
+def _corr_model(correction: CorrectionSpec) -> ModelSpec:
+ """Two state factors + one endogenous investment factor carrying a correction."""
factors = {
- "a": _fspec(is_endogenous=True, is_correction=False),
- "b": _fspec(is_endogenous=False, is_correction=False),
- "c": _fspec(is_endogenous=True, is_correction=True),
+ "health_mom": _fspec(transition_function="linear"),
+ "health_kid": _fspec(transition_function="linear"),
+ "ln_inv": _fspec(
+ is_endogenous=True,
+ transition_function="linear",
+ correction=correction,
+ ),
}
- assert get_has_endogenous_factors(factors)
+ return ModelSpec(
+ factors=factors,
+ observed_factors=("sum_inv_paid_log", "sum_inv_private_log"),
+ )
+
+
+def test_resolve_control_function_returns_none_without_correction() -> None:
+ model = ModelSpec(factors={"a": _fspec(transition_function="linear")})
+ assert _resolve_control_function(model) is None
+
+
+def test_resolve_control_function_resolves_defaults() -> None:
+ model = _corr_model(
+ CorrectionSpec(instruments=("sum_inv_paid_log", "sum_inv_private_log"))
+ )
+ info = _resolve_control_function(model)
+ assert isinstance(info, ControlFunctionInfo)
+ assert info.investment_factor == "ln_inv"
+ # Empty predictors/targets default to all state factors.
+ assert info.state_predictors == ("health_mom", "health_kid")
+ assert info.targets == ("health_mom", "health_kid")
+ assert info.instruments == ("sum_inv_paid_log", "sum_inv_private_log")
+ # Each target with no explicit kappa_terms defaults to ("cf",).
+ assert info.kappa_terms["health_mom"] == ("cf",)
+ assert info.kappa_terms["health_kid"] == ("cf",)
+
+
+def test_resolve_control_function_expands_kappa_degree() -> None:
+ model = _corr_model(
+ CorrectionSpec(instruments=("sum_inv_paid_log",), kappa_degree=2)
+ )
+ info = _resolve_control_function(model)
+ assert info is not None
+ expected = generate_kappa_terms(("health_mom", "health_kid"), max_degree=2)
+ assert "cf ** 2" in expected
+ assert info.kappa_terms["health_mom"] == expected
+ assert info.kappa_terms["health_kid"] == expected
+
+
+def test_resolve_control_function_preserves_explicit_fields() -> None:
+ model = _corr_model(
+ CorrectionSpec(
+ state_predictors=("health_mom",),
+ instruments=("sum_inv_paid_log",),
+ targets=("health_kid",),
+ kappa_terms={"health_kid": ("cf", "cf ** 2")},
+ )
+ )
+ info = _resolve_control_function(model)
+ assert info is not None
+ assert info.state_predictors == ("health_mom",)
+ assert info.targets == ("health_kid",)
+ assert info.kappa_terms["health_kid"] == ("cf", "cf ** 2")
+ # Targets not listed get no kappa block.
+ assert "health_mom" not in info.kappa_terms
+
+
+def test_resolve_control_function_rejects_multiple_investment_factors() -> None:
+ cf = CorrectionSpec(instruments=("sum_inv_paid_log",))
+ factors = {
+ "health_mom": _fspec(transition_function="linear"),
+ "ln_inv_a": _fspec(
+ is_endogenous=True, transition_function="linear", correction=cf
+ ),
+ "ln_inv_b": _fspec(
+ is_endogenous=True, transition_function="linear", correction=cf
+ ),
+ }
+ model = ModelSpec(factors=factors, observed_factors=("sum_inv_paid_log",))
+ with pytest.raises(NotImplementedError, match="one investment factor"):
+ _resolve_control_function(model)
+
+
+def test_process_model_wires_control_function_through_augmentation() -> None:
+ """The resolved control function must survive endogenous-period augmentation.
+
+ Regression: `_augment_periods_for_endogenous_factors` rebuilds each
+ `FactorSpec` and previously omitted `correction`, silently resetting it to
+ `None`. Because augmentation runs exactly when endogenous factors exist (the
+ only case that can carry a correction), `control_function` was always `None`
+ in the real `process_model` pipeline. The resolver unit tests missed it by
+ calling `_resolve_control_function` on the un-augmented spec directly.
+ """
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ new_fac3 = replace(fac3, is_endogenous=True, correction=corr)
+ new_factors = dict(MODEL2.factors) | {"fac3": new_fac3}
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+ # The instrument must be a declared observed factor (the prediction node
+ # resolves its position in all_factors).
+ model = model._replace(observed_factors=("inv_z",))
+
+ processed = process_model(model)
+ cf_info = processed.endogenous_factors_info.control_function
+ assert isinstance(cf_info, ControlFunctionInfo)
+ assert cf_info.investment_factor == "fac3"
+ assert cf_info.instruments == ("inv_z",)
+ # The endogenous investment is not a predictor/target of itself; the state
+ # factors fac1/fac2 are the defaults.
+ assert "fac3" not in cf_info.targets
+ assert set(cf_info.targets) == {"fac1", "fac2"}
+ assert set(cf_info.state_predictors) == {"fac1", "fac2"}
+
+
+def test_resolve_control_function_rejects_model_with_no_state_factors() -> None:
+ cf = CorrectionSpec(instruments=("z1",))
+ factors = {
+ "ln_inv": _fspec(
+ is_endogenous=True, transition_function="linear", correction=cf
+ ),
+ "other_inv": _fspec(is_endogenous=True, transition_function="linear"),
+ }
+ model = ModelSpec(factors=factors, observed_factors=("z1",))
+ with pytest.raises(ValueError, match="no state factors"):
+ _resolve_control_function(model)
+
+
+def test_resolve_control_function_rejects_instrument_in_custom_production() -> None:
+ from skillmodels.common.decorators import register_params # noqa: PLC0415
+
+ @register_params(params=["constant", "health_mom", "sum_inv_paid_log"])
+ def f_leaky(health_mom: object, sum_inv_paid_log: object, params: dict) -> object:
+ return (
+ params["constant"]
+ + params["health_mom"] * health_mom
+ + params["sum_inv_paid_log"] * sum_inv_paid_log
+ )
+
+ factors = {
+ "health_mom": _fspec(transition_function=f_leaky),
+ "health_kid": _fspec(transition_function="linear"),
+ "ln_inv": _fspec(
+ is_endogenous=True,
+ transition_function="linear",
+ correction=CorrectionSpec(instruments=("sum_inv_paid_log",)),
+ ),
+ }
+ model = ModelSpec(factors=factors, observed_factors=("sum_inv_paid_log",))
+ with pytest.raises(ValueError, match="instrument"):
+ _resolve_control_function(model)
+
+
+def test_resolve_control_function_rejects_instrument_not_observed() -> None:
+ factors = {
+ "health_mom": _fspec(transition_function="linear"),
+ "ln_inv": _fspec(
+ is_endogenous=True,
+ transition_function="linear",
+ correction=CorrectionSpec(instruments=("not_observed",)),
+ ),
+ }
+ model = ModelSpec(factors=factors, observed_factors=("sum_inv_paid_log",))
+ with pytest.raises(ValueError, match="observed"):
+ _resolve_control_function(model)
+
+
+def test_resolve_control_function_rejects_correction_on_non_endogenous() -> None:
+ factors = {
+ "health_mom": _fspec(transition_function="linear"),
+ "ln_inv": _fspec(
+ is_endogenous=False,
+ transition_function="linear",
+ correction=CorrectionSpec(instruments=("sum_inv_paid_log",)),
+ ),
+ }
+ model = ModelSpec(factors=factors, observed_factors=("sum_inv_paid_log",))
+ with pytest.raises(ValueError, match="endogenous"):
+ _resolve_control_function(model)
+
+
+def test_augmented_factor_spec_forwards_optional_flags() -> None:
+ """Augmentation must propagate every `FactorSpec` flag, not just the obvious ones.
+
+ Regression: the augmented `FactorSpec` constructor previously omitted
+ `has_production_shock` and `has_initial_distribution`, both of which
+ default to `True`. Any model that set either flag to `False` saw the
+ flag silently reset to `True` once endogenous-period augmentation ran,
+ producing a different model than the user specified.
+ """
+ from skillmodels.common.process_model import ( # noqa: PLC0415
+ _augment_periods_for_endogenous_factors,
+ _get_labels,
+ get_dimensions,
+ )
+
+ fac3 = MODEL2.factors["fac3"]
+ corr = CorrectionSpec(instruments=("inv_z",))
+ custom_fac3 = replace(
+ fac3,
+ is_endogenous=True,
+ has_production_shock=False,
+ has_initial_distribution=False,
+ correction=corr,
+ )
+ new_factors = dict(MODEL2.factors) | {"fac3": custom_fac3}
+ model = MODEL2._replace(factors=new_factors)._replace(stagemap=None)
+
+ dims = get_dimensions(model_spec=model, has_endogenous_factors=True)
+ labels = _get_labels(model_spec=model, has_endogenous_factors=True, dimensions=dims)
+ aug_spec = _augment_periods_for_endogenous_factors(
+ model_spec=model, dimensions=dims, labels=labels
+ )
+ aug_fac3 = aug_spec.factors["fac3"]
+ assert aug_fac3.has_production_shock is False
+ assert aug_fac3.has_initial_distribution is False
+ # Sanity: the explicitly-set is_endogenous survives too.
+ assert aug_fac3.is_endogenous is True
+ # The control-function correction must survive augmentation too.
+ assert aug_fac3.correction is corr
diff --git a/tests/test_qr.py b/tests/test_qr.py
index b6f74532..387702c3 100644
--- a/tests/test_qr.py
+++ b/tests/test_qr.py
@@ -7,7 +7,7 @@
from numpy.testing import assert_array_almost_equal as aaae
from numpy.typing import NDArray
-from skillmodels.qr import qr_gpu
+from skillmodels.chs.qr import qr_gpu
SEED = 20
diff --git a/tests/test_selector.py b/tests/test_selector.py
new file mode 100644
index 00000000..bd670193
--- /dev/null
+++ b/tests/test_selector.py
@@ -0,0 +1,252 @@
+"""Tests for `skillmodels.common.selector` and the projection helper.
+
+`select_by_loc`, `align_index_names`, `collect_fixed_locs`, and
+`project_to_probability_constraints` are the small, pure helpers that
+glue user-supplied `fixed_params` / `start_params` to optimagic's
+constraint pipeline. Each helper has a specific shape contract that
+matters in only one or two call sites; these tests pin those
+contracts so future refactors don't silently reintroduce the bugs
+they were written to fix.
+"""
+
+import functools
+
+import numpy as np
+import optimagic as om
+import pandas as pd
+import pytest
+
+from skillmodels.common.constraints import (
+ FixedConstraintWithValue,
+ collect_fixed_locs,
+ project_to_probability_constraints,
+)
+from skillmodels.common.selector import align_index_names, select_by_loc
+
+# --- select_by_loc ---------------------------------------------------------
+
+
+def _params_with_bounds() -> pd.DataFrame:
+ idx = pd.MultiIndex.from_tuples(
+ [
+ ("loadings", 0, "m1", "fac1"),
+ ("loadings", 0, "m2", "fac1"),
+ ("loadings", 0, "m3", "fac1"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ return pd.DataFrame(
+ {
+ "value": [1.0, 2.0, 3.0],
+ "lower_bound": [-np.inf, 0.1, -np.inf],
+ "upper_bound": [np.inf, np.inf, np.inf],
+ },
+ index=idx,
+ )
+
+
+def test_select_by_loc_single_tuple_returns_scalar_value() -> None:
+ """A single-tuple `loc` must return just the value, not the row Series.
+
+ `params.loc[single_tuple]` gives a row Series indexed by column
+ names; if optimagic's pytree walk sees it, the `±inf` bounds get
+ cast to int64 sentinels and `_fail_if_duplicates` raises
+ `IndexError`. The projection to the `value` cell prevents that.
+ """
+ params = _params_with_bounds()
+ out = select_by_loc(params, ("loadings", 0, "m1", "fac1"))
+ assert out == pytest.approx(1.0)
+ assert not isinstance(out, pd.Series)
+
+
+def test_select_by_loc_list_of_tuples_returns_value_series() -> None:
+ """A list-of-tuples `loc` projects the result DataFrame to the value column."""
+ params = _params_with_bounds()
+ locs = [
+ ("loadings", 0, "m1", "fac1"),
+ ("loadings", 0, "m2", "fac1"),
+ ]
+ out = select_by_loc(params, locs)
+ assert isinstance(out, pd.Series)
+ assert out.tolist() == [1.0, 2.0]
+ assert "lower_bound" not in (getattr(out, "name", None) or "")
+
+
+def test_select_by_loc_no_value_column_returns_unchanged() -> None:
+ """When the params frame has no `value` column, no projection happens."""
+ idx = pd.MultiIndex.from_tuples(
+ [("loadings", 0, "m1", "fac1")],
+ names=["category", "period", "name1", "name2"],
+ )
+ params = pd.DataFrame({"other": [9.0]}, index=idx)
+ out = select_by_loc(params, ("loadings", 0, "m1", "fac1"))
+ assert "other" in out.index
+ assert out["other"] == pytest.approx(9.0)
+
+
+# --- align_index_names -----------------------------------------------------
+
+
+def test_align_index_names_renames_period_to_aug_period() -> None:
+ """Renaming preserves the underlying tuples bit-for-bit."""
+ idx = pd.MultiIndex.from_tuples(
+ [("loadings", 1, "m1", "fac1")],
+ names=["category", "period", "name1", "name2"],
+ )
+ df = pd.DataFrame({"value": [0.7]}, index=idx)
+ out = align_index_names(
+ df, target_names=["category", "aug_period", "name1", "name2"]
+ )
+ assert list(out.index.names) == ["category", "aug_period", "name1", "name2"]
+ assert list(out.index[0]) == ["loadings", 1, "m1", "fac1"]
+ assert out.loc[("loadings", 1, "m1", "fac1"), "value"] == pytest.approx(0.7)
+
+
+def test_align_index_names_passes_through_when_already_matching() -> None:
+ """When the names already match, `align_index_names` returns the input as-is."""
+ idx = pd.MultiIndex.from_tuples(
+ [("loadings", 0, "m1", "fac1")],
+ names=["category", "aug_period", "name1", "name2"],
+ )
+ df = pd.DataFrame({"value": [0.5]}, index=idx)
+ out = align_index_names(
+ df, target_names=["category", "aug_period", "name1", "name2"]
+ )
+ assert out is df
+
+
+# --- collect_fixed_locs ----------------------------------------------------
+
+
+def test_collect_fixed_locs_unpacks_single_tuple() -> None:
+ constraints = [
+ FixedConstraintWithValue(loc=("loadings", 0, "m1", "fac1"), value=1.0),
+ ]
+ out = collect_fixed_locs(constraints)
+ assert out == {("loadings", 0, "m1", "fac1")}
+
+
+def test_collect_fixed_locs_unpacks_tuple_of_tuples() -> None:
+ """Anchoring constraints pack many locs into a single `tuple(loc_tuples)`."""
+ inner = (
+ ("controls", 0, "Q1_fac1", "constant"),
+ ("controls", 1, "Q1_fac1", "constant"),
+ )
+ constraints = [FixedConstraintWithValue(loc=inner, value=0.0)]
+ out = collect_fixed_locs(constraints)
+ assert out == set(inner)
+
+
+def test_collect_fixed_locs_unpacks_pd_multiindex() -> None:
+ """`FixedConstraintWithValue.loc` permits `pd.MultiIndex` per its annotation."""
+ mi = pd.MultiIndex.from_tuples(
+ [
+ ("loadings", 0, "m1", "fac1"),
+ ("loadings", 1, "m1", "fac1"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ constraints = [FixedConstraintWithValue(loc=mi, value=1.0)]
+ out = collect_fixed_locs(constraints)
+ assert out == {
+ ("loadings", 0, "m1", "fac1"),
+ ("loadings", 1, "m1", "fac1"),
+ }
+
+
+def test_collect_fixed_locs_skips_non_fixed_constraints() -> None:
+ """Equality / probability constraints don't carry parameter values."""
+ eq = om.EqualityConstraint(
+ selector=functools.partial(select_by_loc, loc=("transition", 0, "a", "b")),
+ )
+ out = collect_fixed_locs([eq])
+ assert out == set()
+
+
+# --- project_to_probability_constraints ------------------------------------
+
+
+def _gamma_constraint(period: int) -> om.ProbabilityConstraint:
+ locs = [
+ ("transition", period, "skills", "skills"),
+ ("transition", period, "skills", "MC"),
+ ("transition", period, "skills", "investment"),
+ ]
+ return om.ProbabilityConstraint(
+ selector=functools.partial(select_by_loc, loc=locs),
+ )
+
+
+def _three_gamma_template(period: int = 0, values=(0.5, 0.5, 0.5)) -> pd.DataFrame:
+ idx = pd.MultiIndex.from_tuples(
+ [
+ ("transition", period, "skills", "skills"),
+ ("transition", period, "skills", "MC"),
+ ("transition", period, "skills", "investment"),
+ ],
+ names=["category", "period", "name1", "name2"],
+ )
+ return pd.DataFrame({"value": list(values)}, index=idx)
+
+
+def test_project_renormalises_free_entries_to_one_when_none_pinned() -> None:
+ template = _three_gamma_template(values=(0.5, 0.5, 0.5))
+ out = project_to_probability_constraints(
+ params_template=template, constraints=[_gamma_constraint(period=0)]
+ )
+ assert out["value"].tolist() == pytest.approx([1.0 / 3, 1.0 / 3, 1.0 / 3])
+
+
+def test_project_leaves_pinned_entries_alone_and_rescales_free() -> None:
+ """Partial-pin path: pinned entries stay, free entries sum to 1 - pinned_total."""
+ template = _three_gamma_template(values=(0.7, 0.0, 0.7))
+ pinned_loc = ("transition", 0, "skills", "MC")
+ constraints = [
+ _gamma_constraint(period=0),
+ FixedConstraintWithValue(loc=pinned_loc, value=0.0),
+ ]
+ # Caller (`enforce_fixed_constraints`) is what writes 0.0 into the
+ # template at the pinned cell; the projection should preserve it.
+ out = project_to_probability_constraints(
+ params_template=template, constraints=constraints
+ )
+ assert out.loc[pinned_loc, "value"] == pytest.approx(0.0)
+ free = out["value"].drop(index=pinned_loc)
+ assert float(free.sum()) == pytest.approx(1.0)
+ # Free entries were both 0.7; they should be rescaled by 1 / 1.4 = 5/7.
+ assert free.iloc[0] == pytest.approx(0.5)
+ assert free.iloc[1] == pytest.approx(0.5)
+
+
+def test_project_respects_non_zero_pinned_value() -> None:
+ """When a gamma is pinned to a value in (0, 1), free entries fill the residual."""
+ template = _three_gamma_template(values=(0.5, 0.2, 0.5))
+ pinned_loc = ("transition", 0, "skills", "MC")
+ constraints = [
+ _gamma_constraint(period=0),
+ FixedConstraintWithValue(loc=pinned_loc, value=0.2),
+ ]
+ out = project_to_probability_constraints(
+ params_template=template, constraints=constraints
+ )
+ assert out.loc[pinned_loc, "value"] == pytest.approx(0.2)
+ free = out["value"].drop(index=pinned_loc)
+ assert float(free.sum()) == pytest.approx(0.8)
+
+
+def test_project_skips_when_already_on_simplex() -> None:
+ template = _three_gamma_template(values=(0.2, 0.3, 0.5))
+ out = project_to_probability_constraints(
+ params_template=template, constraints=[_gamma_constraint(period=0)]
+ )
+ # No mutation; same DataFrame object returned.
+ assert out is template
+
+
+def test_project_skips_when_free_entries_are_zero() -> None:
+ """Degenerate case: all-zero free entries. Caller has to fix it."""
+ template = _three_gamma_template(values=(0.0, 0.0, 0.0))
+ out = project_to_probability_constraints(
+ params_template=template, constraints=[_gamma_constraint(period=0)]
+ )
+ assert out["value"].tolist() == [0.0, 0.0, 0.0]
diff --git a/tests/test_simulate_data.py b/tests/test_simulate_data.py
index 782367e7..b6f84b02 100644
--- a/tests/test_simulate_data.py
+++ b/tests/test_simulate_data.py
@@ -7,15 +7,14 @@
import pytest
from numpy.testing import assert_array_almost_equal as aaae
-from skillmodels.model_spec import (
- EstimationOptions,
+from skillmodels.common.model_spec import (
FactorSpec,
ModelSpec,
Normalizations,
)
-from skillmodels.params_index import get_params_index
-from skillmodels.process_model import process_model
-from skillmodels.simulate_data import (
+from skillmodels.common.params_index import get_params_index
+from skillmodels.common.process_model import process_model
+from skillmodels.common.simulate_data import (
_collapse_aug_periods_to_periods,
_get_shock,
measurements_from_states,
@@ -237,11 +236,6 @@ def test_simulate_dataset_no_data_with_nobs() -> None:
transition_function="linear",
),
},
- estimation_options=EstimationOptions(
- robust_bounds=True,
- bounds_distance=0.001,
- n_mixtures=1,
- ),
)
processed = process_model(model_no_controls)
diff --git a/tests/test_transition_functions.py b/tests/test_transition_functions.py
index 363f3bdf..b5ed504e 100644
--- a/tests/test_transition_functions.py
+++ b/tests/test_transition_functions.py
@@ -6,7 +6,7 @@
import pytest
from numpy.testing import assert_array_almost_equal as aaae
-from skillmodels.transition_functions import (
+from skillmodels.common.transition_functions import (
constant,
constraints_log_ces,
identity_constraints_linear,
@@ -18,16 +18,20 @@
linear,
linear_and_squares,
log_ces,
+ log_ces_af,
log_ces_general,
params_constant,
params_linear,
params_linear_and_squares,
params_log_ces,
+ params_log_ces_af,
params_log_ces_general,
params_robust_translog,
params_translog,
+ params_translog_af,
robust_translog,
translog,
+ translog_af,
)
jax.config.update("jax_enable_x64", True)
@@ -81,6 +85,31 @@ def test_translog() -> None:
aaae(calculated, expected)
+def test_translog_af_has_no_square_terms() -> None:
+ # States are skill and investment.
+ states = jnp.array([2.0, 3.0])
+
+ # params layout for translog_af: [b_skill, b_inv, d_interaction, constant]
+ b_s, b_i, d, c = 0.2, 0.1, 0.05, 0.04
+ params = jnp.array([b_s, b_i, d, c])
+
+ # Parameter names: exactly linear + single interaction + constant, NO '** 2'.
+ names = params_translog_af(("skills", "investment"))
+ assert names == ["skills", "investment", "skills * investment", "constant"]
+
+ expected = b_s * 2.0 + b_i * 3.0 + d * 2.0 * 3.0 + c
+ aaae(translog_af(states, params), expected)
+
+
+def test_log_ces_af_matches_log_ces() -> None:
+ states = jnp.array([3.0, 7.5])
+ params = jnp.array([0.4, 0.6, 2.0])
+ aaae(log_ces_af(states, params), log_ces(states, params))
+ assert params_log_ces_af(("skills", "investment")) == params_log_ces(
+ ("skills", "investment")
+ )
+
+
def test_log_ces() -> None:
states = jnp.array([3, 7.5])
params = jnp.array([0.4, 0.6, 2])
@@ -99,7 +128,9 @@ def test_where_all_but_one_gammas_are_zero() -> None:
def test_constant() -> None:
- assert constant("bla", "blubb") == "bla" # ty: ignore[invalid-argument-type]
+ state = jnp.array([1.0, 2.0, 3.0])
+ params = jnp.array([])
+ aaae(constant(state, params), state)
def test_robust_translog() -> None:
@@ -260,14 +291,15 @@ def test_identity_constraints_linear_and_squares() -> None:
assert c.value == pytest.approx(0.0)
-def test_identity_constraints_log_ces_raises() -> None:
- with pytest.raises(NotImplementedError, match=r"^$"):
- identity_constraints_log_ces(("a", "b"), 0, ("a", "b"))
+def test_identity_constraints_log_ces_is_noop() -> None:
+ # log_ces carry-forward identity is a no-op (see docstring); the
+ # gammas are already pinned by the ProbabilityConstraint from
+ # `constraints_log_ces`.
+ assert identity_constraints_log_ces("a", 0, ("a", "b")) == []
-def test_identity_constraints_log_ces_general_raises() -> None:
- with pytest.raises(NotImplementedError, match=r"^$"):
- identity_constraints_log_ces_general(("a", "b"), 0, ("a", "b"))
+def test_identity_constraints_log_ces_general_is_noop() -> None:
+ assert identity_constraints_log_ces_general("a", 0, ("a", "b")) == []
def test_constraints_log_ces() -> None:
diff --git a/tests/test_types.py b/tests/test_types.py
index 4f03b868..d69f713e 100644
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -3,9 +3,7 @@
import pickle
from types import MappingProxyType
-import pytest
-
-from skillmodels.types import FactorInfo, _make_immutable
+from skillmodels.common.types import FactorInfo, _make_immutable
def test_make_immutable_list_to_tuple() -> None:
@@ -23,15 +21,11 @@ def test_mapping_proxy_pickle_roundtrip() -> None:
def test_factor_info_from_flags_all_false() -> None:
- info = FactorInfo.from_flags(is_endogenous=False, is_correction=False)
+ info = FactorInfo.from_flags(is_endogenous=False)
assert info.is_state
-def test_factor_info_from_flags_correction() -> None:
- info = FactorInfo.from_flags(is_endogenous=True, is_correction=True)
- assert info.is_correction
-
-
-def test_factor_info_from_flags_both_true_raises() -> None:
- with pytest.raises(ValueError, match=r"correction.*endogenous"):
- FactorInfo.from_flags(is_endogenous=False, is_correction=True)
+def test_factor_info_from_flags_endogenous() -> None:
+ info = FactorInfo.from_flags(is_endogenous=True)
+ assert info.is_endogenous
+ assert not info.is_state
diff --git a/tests/test_utilities.py b/tests/test_utilities.py
index 66e05632..7a8a3902 100644
--- a/tests/test_utilities.py
+++ b/tests/test_utilities.py
@@ -10,10 +10,9 @@
import pytest
from pandas.testing import assert_frame_equal, assert_index_equal
-from skillmodels.model_spec import ModelSpec
-from skillmodels.process_model import process_model
-from skillmodels.test_data.model2 import MODEL2
-from skillmodels.utilities import (
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.utilities import (
_extend_params,
_get_params_index,
extract_factors,
@@ -25,6 +24,7 @@
switch_translog_to_linear,
update_parameter_values,
)
+from skillmodels.test_data.model2 import MODEL2
@pytest.fixture
@@ -120,7 +120,7 @@ def test_switch_linear_and_translog_back_and_forth(model2) -> None:
assert orig.normalizations == back.normalizations
assert orig.transition_function == back.transition_function
assert orig.is_endogenous == back.is_endogenous
- assert orig.is_correction == back.is_correction
+ assert orig.correction == back.correction
def test_reduce_params_via_extract_factors(model2) -> None:
diff --git a/tests/test_utils_plotting.py b/tests/test_utils_plotting.py
index 728677a2..77e971bd 100644
--- a/tests/test_utils_plotting.py
+++ b/tests/test_utils_plotting.py
@@ -2,7 +2,7 @@
import numpy as np
-from skillmodels.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
+from skillmodels.common.utils_plotting import get_layout_kwargs, get_make_subplot_kwargs
def test_get_layout_kwargs_defaults() -> None:
diff --git a/tests/test_variance_decomposition.py b/tests/test_variance_decomposition.py
index acfa924e..8df36326 100644
--- a/tests/test_variance_decomposition.py
+++ b/tests/test_variance_decomposition.py
@@ -4,7 +4,7 @@
import pytest
from numpy.testing import assert_array_almost_equal as aaae
-from skillmodels.variance_decomposition import (
+from skillmodels.common.variance_decomposition import (
_compute_variance_decomposition,
summarize_measurement_reliability,
)
@@ -110,3 +110,37 @@ def test_summarize_measurement_reliability(expected_variance_decomposition):
assert summary.loc["y3", "mean_signal"] == pytest.approx(0.8)
assert summary.loc["y2", "mean_signal"] == pytest.approx(0.0)
assert summary.loc["y1", "mean_signal"] == pytest.approx(0.5)
+
+
+@pytest.fixture
+def af_format_variance_decomposition(setup_variance_decomposition):
+ """Rebuild `setup_variance_decomposition` with `period` as the level name.
+
+ AF and AMN produce params keyed by `period`; the CHS path uses
+ `aug_period`. `_compute_variance_decomposition`'s rename block
+ normalises both spellings before merging. This fixture exercises
+ the rename path that the CHS fixture leaves untouched.
+ """
+ params = setup_variance_decomposition["params"]
+ new_index = params.index.set_names(["category", "period", "name1", "name2"])
+ af_params = params.copy()
+ af_params.index = new_index
+ return {
+ **setup_variance_decomposition,
+ "params": af_params,
+ }
+
+
+def test_compute_variance_decomposition_with_period_level_params(
+ af_format_variance_decomposition, expected_variance_decomposition
+):
+ """Variance decomposition must handle params keyed by `period`.
+
+ Regression for the hard-coded `aug_period` rename target that
+ previously only worked for CHS params. AF and AMN expose their
+ params with `period` as the second level name, and a
+ `decompose_measurement_variance` call on them used to raise
+ `KeyError: 'aug_period'` during the loadings merge.
+ """
+ result = _compute_variance_decomposition(**af_format_variance_decomposition)
+ aaae(result.values, expected_variance_decomposition.values)
diff --git a/tests/test_visualize_factor_distributions.py b/tests/test_visualize_factor_distributions.py
index 3baa03bb..e021dff2 100644
--- a/tests/test_visualize_factor_distributions.py
+++ b/tests/test_visualize_factor_distributions.py
@@ -4,49 +4,57 @@
import pandas as pd
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.filtered_states import get_filtered_states
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.simulate_data import simulate_dataset
-from skillmodels.test_data.model2 import MODEL2
-from skillmodels.visualize_factor_distributions import (
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.individual_states import get_individual_states_from_params
+from skillmodels.common.simulate_data import simulate_dataset
+from skillmodels.common.visualize_factor_distributions import (
bivariate_density_contours,
bivariate_density_surfaces,
combine_distribution_plots,
univariate_densities,
)
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
-def test_visualize_factor_distributions_runs_with_filtered_states() -> None:
- model = MODEL2
-
+def _load_model2_filtered() -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
+ """Return (data, params, anchored_states) for MODEL2."""
params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
params = params.set_index(["category", "period", "name1", "name2"])
data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
data = data.set_index(["caseid", "period"])
- max_inputs = get_maximization_inputs(model, data)
+ max_inputs = get_maximization_inputs(MODEL2, data, chs_options=MODEL2_CHS_OPTIONS)
params = params.loc[max_inputs["params_template"].index]
+
+ states = get_individual_states_from_params(
+ model_spec=MODEL2, data=data, params=params
+ )["anchored_states"]["states"]
+ return data, params, states
+
+
+def test_visualize_factor_distributions_runs_with_filtered_states() -> None:
+ data, _params, states = _load_model2_filtered()
kde = univariate_densities(
data=data,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=states,
)
contours = bivariate_density_contours(
data=data,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=states,
)
surfaces = bivariate_density_surfaces(
data=data,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=states,
)
combine_distribution_plots(
kde_plots=kde,
@@ -56,34 +64,23 @@ def test_visualize_factor_distributions_runs_with_filtered_states() -> None:
def test_visualize_factor_distributions_runs_with_simulated_states() -> None:
- model = MODEL2
-
- data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
- data = data.set_index(["caseid", "period"])
-
- params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
- params = params.set_index(["category", "period", "name1", "name2"])
-
- max_inputs = get_maximization_inputs(model, data)
- params = params.loc[max_inputs["params_template"].index]
+ data, params, _ = _load_model2_filtered()
- latent_data = simulate_dataset(model, params, data=data, policies=None)[
+ latent_data = simulate_dataset(MODEL2, params, data=data, policies=None)[
"aug_unanchored_states"
]["states"]
kde = univariate_densities(
data=data,
- states=latent_data,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=latent_data,
)
contours = bivariate_density_contours(
data=data,
- states=latent_data,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=latent_data,
)
combine_distribution_plots(
kde_plots=kde,
@@ -93,85 +90,25 @@ def test_visualize_factor_distributions_runs_with_simulated_states() -> None:
def test_visualize_factor_distributions_with_period_indexed_states() -> None:
- """Test visualization with states indexed by (id, period) without aug_period.
-
- This mimics the scenario where states come from a downstream task that has
- already mapped aug_period to period and dropped the aug_period column.
- """
- model = MODEL2
-
- data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
- data = data.set_index(["caseid", "period"])
-
- params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
- params = params.set_index(["category", "period", "name1", "name2"])
-
- max_inputs = get_maximization_inputs(model, data)
- params = params.loc[max_inputs["params_template"].index]
-
- # Get filtered states (already has period column) and set index
- filtered_states = get_filtered_states(model_spec=model, data=data, params=params)[
- "anchored_states"
- ]["states"]
- filtered_states = filtered_states.set_index(["id", "period"])
+ """Visualisation with states indexed by (id, period) without aug_period.
- kde = univariate_densities(
- data=data,
- states=filtered_states,
- model_spec=model,
- params=params,
- period=1,
- )
- contours = bivariate_density_contours(
- data=data,
- states=filtered_states,
- model_spec=model,
- params=params,
- period=1,
- )
- combine_distribution_plots(
- kde_plots=kde,
- contour_plots=contours,
- surface_plots=None,
- )
-
-
-def test_visualize_factor_distributions_with_both_aug_period_and_period() -> None:
- """Test visualization with states having both aug_period and period.
-
- This mimics the scenario where states have aug_period as a column and period
- in the index (or both as columns).
+ Mimics a downstream pipeline that has already mapped aug_period to
+ period and dropped the aug_period column.
"""
- model = MODEL2
-
- data = pd.read_stata(TEST_DATA_DIR / "model2_simulated_data.dta")
- data = data.set_index(["caseid", "period"])
-
- params = pd.read_csv(REGRESSION_VAULT / "one_stage_anchoring.csv")
- params = params.set_index(["category", "period", "name1", "name2"])
-
- max_inputs = get_maximization_inputs(model, data)
- params = params.loc[max_inputs["params_template"].index]
-
- # Get filtered states (already has period column) and set index
- filtered_states = get_filtered_states(model_spec=model, data=data, params=params)[
- "anchored_states"
- ]["states"]
- filtered_states = filtered_states.set_index(["id", "period"])
+ data, _params, states = _load_model2_filtered()
+ states = states.set_index(["id", "period"])
kde = univariate_densities(
data=data,
- states=filtered_states,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=states,
)
contours = bivariate_density_contours(
data=data,
- states=filtered_states,
- model_spec=model,
- params=params,
+ model_spec=MODEL2,
period=1,
+ filtered_states=states,
)
combine_distribution_plots(
kde_plots=kde,
diff --git a/tests/test_visualize_transition_equations.py b/tests/test_visualize_transition_equations.py
index de630f7a..b0dfe37f 100644
--- a/tests/test_visualize_transition_equations.py
+++ b/tests/test_visualize_transition_equations.py
@@ -2,15 +2,19 @@
from pathlib import Path
+import numpy as np
import pandas as pd
-from skillmodels.config import TEST_DATA_DIR
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.test_data.model2 import MODEL2
-from skillmodels.visualize_transition_equations import (
+from skillmodels import CorrectionSpec, FactorSpec, ModelSpec, Normalizations
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.chs.options import CHSEstimationOptions
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.common.individual_states import get_individual_states_from_params
+from skillmodels.common.visualize_transition_equations import (
combine_transition_plots,
get_transition_plots,
)
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
@@ -25,23 +29,130 @@ def test_visualize_transition_equations_runs() -> None:
data = data.set_index(["caseid", "period"])
data["ob1"] = 0
- max_inputs = get_maximization_inputs(model, data)
+ max_inputs = get_maximization_inputs(model, data, chs_options=MODEL2_CHS_OPTIONS)
full_index = max_inputs["params_template"].index
params = params.reindex(full_index)
params["value"] = params["value"].fillna(0)
+
+ states = get_individual_states_from_params(
+ model_spec=model, data=data, params=params
+ )["anchored_states"]["states"]
+
subplots = get_transition_plots(
model_spec=model,
params=params,
period=0,
quantiles_of_other_factors=[0.1, 0.25, 0.5, 0.75, 0.9],
+ filtered_states=states,
data=data,
)
combine_transition_plots(subplots)
+
subplots = get_transition_plots(
model_spec=model,
params=params,
period=0,
quantiles_of_other_factors=None,
+ filtered_states=states,
data=data,
)
combine_transition_plots(subplots)
+
+ # `periods` may be a numpy array (apps pass `model.periods`, an ndarray).
+ # Regression for a beartype DiagnosticsCallError when the public hint was the
+ # strict `Sequence[int]`, which rejects an ndarray at the call boundary.
+ subplots = get_transition_plots(
+ model_spec=model,
+ params=params,
+ periods=np.array([0, 1]),
+ filtered_states=states,
+ data=data,
+ )
+ combine_transition_plots(subplots)
+
+
+def _correction_model() -> ModelSpec:
+ """Small correction model: fac1/fac2 states, `inv` endogenous, instrument z1."""
+ state_norm = Normalizations(
+ loadings=({"y1": 1}, {"y1": 1}, {"y1": 1}), intercepts=({}, {}, {})
+ )
+ fac2_norm = Normalizations(
+ loadings=({"w1": 1}, {"w1": 1}, {"w1": 1}), intercepts=({}, {}, {})
+ )
+ inv_norm = Normalizations(
+ loadings=({"yi1": 1}, {"yi1": 1}, {}), intercepts=({}, {}, {})
+ )
+ factors = {
+ "fac1": FactorSpec(
+ measurements=(("y1", "y2", "y3"),) * 3,
+ normalizations=state_norm,
+ transition_function="linear",
+ ),
+ "fac2": FactorSpec(
+ measurements=(("w1", "w2", "w3"),) * 3,
+ normalizations=fac2_norm,
+ transition_function="linear",
+ ),
+ "inv": FactorSpec(
+ # Endogenous factor must NOT be measured in the last period.
+ measurements=(("yi1", "yi2", "yi3"), ("yi1", "yi2", "yi3"), ()),
+ normalizations=inv_norm,
+ is_endogenous=True,
+ transition_function="linear",
+ correction=CorrectionSpec(
+ state_predictors=("fac1", "fac2"),
+ instruments=("z1",),
+ targets=("fac1", "fac2"),
+ ),
+ ),
+ }
+ return ModelSpec(factors=factors, observed_factors=("z1",))
+
+
+_CORRECTION_MEAS_COLS = ("y1", "y2", "y3", "w1", "w2", "w3", "yi1", "yi2", "yi3")
+
+
+def _correction_panel(n_obs: int = 200) -> pd.DataFrame:
+ rng = np.random.default_rng(7)
+ index = pd.MultiIndex.from_product(
+ [np.arange(n_obs), [0, 1, 2]], names=["caseid", "period"]
+ )
+ panel = pd.DataFrame(index=index)
+ panel["z1"] = rng.normal(size=len(index))
+ for col in _CORRECTION_MEAS_COLS:
+ panel[col] = rng.normal(size=len(index))
+ return panel
+
+
+def test_get_transition_plots_runs_for_correction_model() -> None:
+ """Transition plots evaluate a correction target's full cf DAG.
+
+ For a target factor the individual transition function is the grafted DAG
+ that reads the reserved first-stage (`__first_stage___`) and kappa
+ (`__kappa___`) coefficient keys on top of its own production
+ coefficients. The plotting helper must forward all transition keys, or
+ evaluating the transition raises `KeyError` on the first-stage betas.
+ """
+ model = _correction_model()
+ panel = _correction_panel()
+ template = get_maximization_inputs(
+ model,
+ panel,
+ chs_options=CHSEstimationOptions(start_params_strategy="spearman"),
+ )["params_template"]
+ assert not template["value"].isna().any()
+
+ states = get_individual_states_from_params(
+ model_spec=model, data=panel, params=template
+ )["anchored_states"]["states"]
+
+ plots = get_transition_plots(
+ model_spec=model,
+ params=template,
+ period=0,
+ quantiles_of_other_factors=None,
+ filtered_states=states,
+ data=panel,
+ )
+ # A target factor's plot exists -> its cf-corrected transition evaluated.
+ assert ("inv", "fac1") in plots