diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 2877891b..8943e7ea 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -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/docs/explanations/architecture.md b/docs/explanations/architecture.md
new file mode 100644
index 00000000..3ddad85b
--- /dev/null
+++ b/docs/explanations/architecture.md
@@ -0,0 +1,100 @@
+# 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 / ...
+│ ├── 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
+│ ├── 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 conditional-distribution materialisation
+│ ├── inference.py compute_af_standard_errors (cluster bootstrap)
+│ └── jaxopt_backend.py on-device L-BFGS-B alternative
+└── 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
+ ├── 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)
+```
+
+## 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..32e87086 100644
--- a/docs/explanations/names_and_concepts.md
+++ b/docs/explanations/names_and_concepts.md
@@ -76,12 +76,47 @@ 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_backend**: `"auto"` (default), `"optimagic"`, or `"jaxopt"`. Auto
+ picks `"jaxopt"` if a JAX GPU is visible and the model has no probability or
+ equality constraints; otherwise `"optimagic"`.
+- **optimizer_algorithm**: the optimagic algorithm name used when the backend
+ is `"optimagic"`. Ignored under `"jaxopt"`.
+- **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) or
+ `"optimal"`.
+- **investment_endogeneity**: include the control-function residual in Stage 3
+ for endogenous-investment models.
+
+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/getting_started/tutorial.ipynb b/docs/getting_started/tutorial.ipynb
index b123b437..1d88cb44 100644
--- a/docs/getting_started/tutorial.ipynb
+++ b/docs/getting_started/tutorial.ipynb
@@ -5,63 +5,216 @@
"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": 1,
"id": "2",
- "metadata": {},
+ "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": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n"
+ ]
+ }
+ ],
"source": [
- ""
+ "from skillmodels import FactorSpec, ModelSpec, Normalizations\n",
+ "from skillmodels.af import AFEstimationOptions, estimate_af\n",
+ "from skillmodels.af.posterior_states import get_af_posterior_states\n",
+ "from skillmodels.amn import AMNEstimationOptions, estimate_amn\n",
+ "from skillmodels.amn.posterior_states import get_amn_posterior_states\n",
+ "from skillmodels.chs import (\n",
+ " CHSEstimationOptions,\n",
+ " get_filtered_states,\n",
+ " get_maximization_inputs,\n",
+ ")\n",
+ "from skillmodels.common.config import CNLSY_DATA_PATH\n",
+ "from skillmodels.common.variance_decomposition import (\n",
+ " decompose_measurement_variance,\n",
+ " summarize_measurement_reliability,\n",
+ ")\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n",
+ "pd.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,51 +222,334 @@
"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,
+ "execution_count": 6,
"id": "8",
- "metadata": {},
- "outputs": [],
+ "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": [
+ {
+ "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"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " mean_signal | \n",
+ " min_signal | \n",
+ " max_signal | \n",
+ "
\n",
+ " \n",
+ " | measurement | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | skill_recog | \n",
+ " 0.804 | \n",
+ " 0.748 | \n",
+ " 0.880 | \n",
+ "
\n",
+ " \n",
+ " | mc_2 | \n",
+ " 0.704 | \n",
+ " 0.704 | \n",
+ " 0.704 | \n",
+ "
\n",
+ " \n",
+ " | mc_1 | \n",
+ " 0.701 | \n",
+ " 0.701 | \n",
+ " 0.701 | \n",
+ "
\n",
+ " \n",
+ " | skill_comp | \n",
+ " 0.683 | \n",
+ " 0.613 | \n",
+ " 0.798 | \n",
+ "
\n",
+ " \n",
+ " | mc_6 | \n",
+ " 0.676 | \n",
+ " 0.676 | \n",
+ " 0.676 | \n",
+ "
\n",
+ " \n",
+ " | mc_3 | \n",
+ " 0.671 | \n",
+ " 0.671 | \n",
+ " 0.671 | \n",
+ "
\n",
+ " \n",
+ " | mc_4 | \n",
+ " 0.523 | \n",
+ " 0.523 | \n",
+ " 0.523 | \n",
+ "
\n",
+ " \n",
+ " | skill_math | \n",
+ " 0.453 | \n",
+ " 0.427 | \n",
+ " 0.467 | \n",
+ "
\n",
+ " \n",
+ " | mn_neg | \n",
+ " 0.444 | \n",
+ " 0.444 | \n",
+ " 0.444 | \n",
+ "
\n",
+ " \n",
+ " | mc_5 | \n",
+ " 0.429 | \n",
+ " 0.429 | \n",
+ " 0.429 | \n",
+ "
\n",
+ " \n",
+ " | mn_pos | \n",
+ " 0.422 | \n",
+ " 0.422 | \n",
+ " 0.422 | \n",
+ "
\n",
+ " \n",
+ " | inv_praised | \n",
+ " 0.155 | \n",
+ " 0.146 | \n",
+ " 0.165 | \n",
+ "
\n",
+ " \n",
+ " | inv_reads | \n",
+ " 0.135 | \n",
+ " 0.131 | \n",
+ " 0.139 | \n",
+ "
\n",
+ " \n",
+ " | inv_museum | \n",
+ " 0.133 | \n",
+ " 0.123 | \n",
+ " 0.143 | \n",
+ "
\n",
+ " \n",
+ " | mn_rotter | \n",
+ " 0.087 | \n",
+ " 0.087 | \n",
+ " 0.087 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " mean_signal min_signal max_signal\n",
+ "measurement \n",
+ "skill_recog 0.804 0.748 0.880\n",
+ "mc_2 0.704 0.704 0.704\n",
+ "mc_1 0.701 0.701 0.701\n",
+ "skill_comp 0.683 0.613 0.798\n",
+ "mc_6 0.676 0.676 0.676\n",
+ "mc_3 0.671 0.671 0.671\n",
+ "mc_4 0.523 0.523 0.523\n",
+ "skill_math 0.453 0.427 0.467\n",
+ "mn_neg 0.444 0.444 0.444\n",
+ "mc_5 0.429 0.429 0.429\n",
+ "mn_pos 0.422 0.422 0.422\n",
+ "inv_praised 0.155 0.146 0.165\n",
+ "inv_reads 0.135 0.131 0.139\n",
+ "inv_museum 0.133 0.123 0.143\n",
+ "mn_rotter 0.087 0.087 0.087"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "params_template = max_inputs[\"params_template\"]\n",
- "params_template.head(10)"
+ "chs_filtered = get_filtered_states(model_spec=model, data=data, params=chs_params)\n",
+ "chs_states = chs_filtered[\"unanchored_states\"][\"states\"]\n",
+ "chs_decomp = decompose_measurement_variance(\n",
+ " model_spec=model, params=chs_params, filtered_states=chs_states\n",
+ ")\n",
+ "chs_reliability = summarize_measurement_reliability(chs_decomp)\n",
+ "chs_reliability"
]
},
{
@@ -121,150 +557,2544 @@
"id": "9",
"metadata": {},
"source": [
- "## Choosing Starting Values\n",
- "\n",
- "Good starting values are important for optimization. As a rule of thumb:\n",
+ "## AF: sequential Halton-quadrature MLE\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",
+ "AF 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. `optimizer_backend=\"auto\"` (the default) picks `jaxopt` if the model is jaxopt-compatible *and* a GPU is visible; otherwise falls back to `optimagic`. Our `log_ces` skills production triggers probability constraints, so this model falls back to `optimagic` either way.\n",
"\n",
- "Here we set reasonable defaults:"
+ "Default `initialization_strategy=\"amn\"` runs the full AMN three-stage estimator upfront and uses its parameters to seed each AF period."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 7,
"id": "10",
- "metadata": {},
- "outputs": [],
+ "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": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:347: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"lower_bound\"] = bounds_distance\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:354: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"value\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:355: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"lower_bound\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:356: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"upper_bound\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:362: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"value\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:363: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"lower_bound\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/params.py:364: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[loc, \"upper_bound\"] = val\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/initial_period.py:430: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = obs_sds.get(parts[0], meas_sd * 0.5)\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/initial_period.py:432: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 0.0\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/initial_period.py:378: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = max(obs_sd * 0.5, 0.01)\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/initial_period.py:384: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 1.0\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/initial_period.py:393: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 0.0\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:806: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 0.5\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:817: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = max(obs_sd * 0.5, 0.01)\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:823: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 1.0\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:806: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 0.5\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:817: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = max(obs_sd * 0.5, 0.01)\n",
+ "/home/hmg/econ/skillmodels-applications/skillmodels/src/skillmodels/af/transition_period.py:823: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " params.loc[idx, \"value\"] = 1.0\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "AF per-period success: [True, True, False], per-period log-likelihoods: ['-19.07', '-25.26', '-15.25']\n"
+ ]
+ }
+ ],
"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)"
+ "af_options = AFEstimationOptions(\n",
+ " n_halton_points=100,\n",
+ " n_halton_points_shock=50,\n",
+ " n_mixture_components=2,\n",
+ " optimizer_algorithm=\"scipy_lbfgsb\",\n",
+ ")\n",
+ "af_result = estimate_af(\n",
+ " model_spec=model,\n",
+ " data=data,\n",
+ " af_options=af_options,\n",
+ " fixed_params=fixed_params,\n",
+ ")\n",
+ "af_lls = [pr.loglikelihood for pr in af_result.period_results]\n",
+ "print(\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": 8,
"id": "11",
- "metadata": {},
+ "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": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " mean_signal | \n",
+ " min_signal | \n",
+ " max_signal | \n",
+ "
\n",
+ " \n",
+ " | measurement | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | skill_recog | \n",
+ " 0.751 | \n",
+ " 0.681 | \n",
+ " 0.813 | \n",
+ "
\n",
+ " \n",
+ " | mc_2 | \n",
+ " 0.708 | \n",
+ " 0.708 | \n",
+ " 0.708 | \n",
+ "
\n",
+ " \n",
+ " | mc_3 | \n",
+ " 0.685 | \n",
+ " 0.685 | \n",
+ " 0.685 | \n",
+ "
\n",
+ " \n",
+ " | skill_comp | \n",
+ " 0.681 | \n",
+ " 0.570 | \n",
+ " 0.822 | \n",
+ "
\n",
+ " \n",
+ " | mc_1 | \n",
+ " 0.665 | \n",
+ " 0.665 | \n",
+ " 0.665 | \n",
+ "
\n",
+ " \n",
+ " | mc_6 | \n",
+ " 0.651 | \n",
+ " 0.651 | \n",
+ " 0.651 | \n",
+ "
\n",
+ " \n",
+ " | mc_4 | \n",
+ " 0.518 | \n",
+ " 0.518 | \n",
+ " 0.518 | \n",
+ "
\n",
+ " \n",
+ " | skill_math | \n",
+ " 0.512 | \n",
+ " 0.419 | \n",
+ " 0.671 | \n",
+ "
\n",
+ " \n",
+ " | mc_5 | \n",
+ " 0.427 | \n",
+ " 0.427 | \n",
+ " 0.427 | \n",
+ "
\n",
+ " \n",
+ " | mn_neg | \n",
+ " 0.358 | \n",
+ " 0.358 | \n",
+ " 0.358 | \n",
+ "
\n",
+ " \n",
+ " | mn_pos | \n",
+ " 0.343 | \n",
+ " 0.343 | \n",
+ " 0.343 | \n",
+ "
\n",
+ " \n",
+ " | inv_museum | \n",
+ " 0.098 | \n",
+ " 0.090 | \n",
+ " 0.106 | \n",
+ "
\n",
+ " \n",
+ " | inv_praised | \n",
+ " 0.087 | \n",
+ " 0.081 | \n",
+ " 0.092 | \n",
+ "
\n",
+ " \n",
+ " | inv_reads | \n",
+ " 0.080 | \n",
+ " 0.072 | \n",
+ " 0.088 | \n",
+ "
\n",
+ " \n",
+ " | mn_rotter | \n",
+ " 0.071 | \n",
+ " 0.071 | \n",
+ " 0.071 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " mean_signal min_signal max_signal\n",
+ "measurement \n",
+ "skill_recog 0.751 0.681 0.813\n",
+ "mc_2 0.708 0.708 0.708\n",
+ "mc_3 0.685 0.685 0.685\n",
+ "skill_comp 0.681 0.570 0.822\n",
+ "mc_1 0.665 0.665 0.665\n",
+ "mc_6 0.651 0.651 0.651\n",
+ "mc_4 0.518 0.518 0.518\n",
+ "skill_math 0.512 0.419 0.671\n",
+ "mc_5 0.427 0.427 0.427\n",
+ "mn_neg 0.358 0.358 0.358\n",
+ "mn_pos 0.343 0.343 0.343\n",
+ "inv_museum 0.098 0.090 0.106\n",
+ "inv_praised 0.087 0.081 0.092\n",
+ "inv_reads 0.080 0.072 0.088\n",
+ "mn_rotter 0.071 0.071 0.071"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"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."
+ "af_posterior = get_af_posterior_states(\n",
+ " af_result=af_result,\n",
+ " model_spec=model,\n",
+ " data=data,\n",
+ " n_halton_points=200,\n",
+ ")\n",
+ "af_states = af_posterior[\"unanchored_states\"][\"states\"]\n",
+ "af_decomp = decompose_measurement_variance(\n",
+ " model_spec=model, params=af_result.all_params, filtered_states=af_states\n",
+ ")\n",
+ "af_reliability = summarize_measurement_reliability(af_decomp)\n",
+ "af_reliability"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"id": "12",
"metadata": {},
- "outputs": [],
"source": [
- "loglike = max_inputs[\"loglike\"]\n",
- "gradient = max_inputs[\"gradient\"]\n",
- "loglike_and_gradient = max_inputs[\"loglike_and_gradient\"]"
+ "## AMN: three-stage mixture-of-normals\n",
+ "\n",
+ "AMN'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 `n_mixture_components=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,
+ "execution_count": 9,
"id": "13",
- "metadata": {},
- "outputs": [],
+ "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": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "AMN success: True\n"
+ ]
+ }
+ ],
"source": [
- "# First call includes compilation time\n",
- "loglike_value = loglike(params)\n",
- "print(f\"Log-likelihood at starting values: {loglike_value:.2f}\")"
+ "amn_options = AMNEstimationOptions(\n",
+ " n_mixture_components=2,\n",
+ " em_max_iter=500,\n",
+ " n_simulation_draws=50_000,\n",
+ " seed=0,\n",
+ ")\n",
+ "amn_result = estimate_amn(\n",
+ " model_spec=model,\n",
+ " data=data,\n",
+ " amn_options=amn_options,\n",
+ " fixed_params=fixed_params,\n",
+ ")\n",
+ "print(f\"AMN success: {amn_result.success}\")"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": 10,
"id": "14",
- "metadata": {},
+ "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": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " mean_signal | \n",
+ " min_signal | \n",
+ " max_signal | \n",
+ "
\n",
+ " \n",
+ " | measurement | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | mc_2 | \n",
+ " 0.744 | \n",
+ " 0.744 | \n",
+ " 0.744 | \n",
+ "
\n",
+ " \n",
+ " | skill_recog | \n",
+ " 0.706 | \n",
+ " 0.675 | \n",
+ " 0.755 | \n",
+ "
\n",
+ " \n",
+ " | mc_3 | \n",
+ " 0.693 | \n",
+ " 0.693 | \n",
+ " 0.693 | \n",
+ "
\n",
+ " \n",
+ " | skill_comp | \n",
+ " 0.670 | \n",
+ " 0.636 | \n",
+ " 0.737 | \n",
+ "
\n",
+ " \n",
+ " | mc_1 | \n",
+ " 0.623 | \n",
+ " 0.623 | \n",
+ " 0.623 | \n",
+ "
\n",
+ " \n",
+ " | mc_6 | \n",
+ " 0.613 | \n",
+ " 0.613 | \n",
+ " 0.613 | \n",
+ "
\n",
+ " \n",
+ " | mc_4 | \n",
+ " 0.590 | \n",
+ " 0.590 | \n",
+ " 0.590 | \n",
+ "
\n",
+ " \n",
+ " | skill_math | \n",
+ " 0.557 | \n",
+ " 0.541 | \n",
+ " 0.579 | \n",
+ "
\n",
+ " \n",
+ " | mc_5 | \n",
+ " 0.491 | \n",
+ " 0.491 | \n",
+ " 0.491 | \n",
+ "
\n",
+ " \n",
+ " | mn_neg | \n",
+ " 0.475 | \n",
+ " 0.475 | \n",
+ " 0.475 | \n",
+ "
\n",
+ " \n",
+ " | mn_pos | \n",
+ " 0.324 | \n",
+ " 0.324 | \n",
+ " 0.324 | \n",
+ "
\n",
+ " \n",
+ " | inv_reads | \n",
+ " 0.192 | \n",
+ " 0.166 | \n",
+ " 0.219 | \n",
+ "
\n",
+ " \n",
+ " | inv_museum | \n",
+ " 0.184 | \n",
+ " 0.136 | \n",
+ " 0.232 | \n",
+ "
\n",
+ " \n",
+ " | inv_praised | \n",
+ " 0.121 | \n",
+ " 0.120 | \n",
+ " 0.121 | \n",
+ "
\n",
+ " \n",
+ " | mn_rotter | \n",
+ " 0.107 | \n",
+ " 0.107 | \n",
+ " 0.107 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " mean_signal min_signal max_signal\n",
+ "measurement \n",
+ "mc_2 0.744 0.744 0.744\n",
+ "skill_recog 0.706 0.675 0.755\n",
+ "mc_3 0.693 0.693 0.693\n",
+ "skill_comp 0.670 0.636 0.737\n",
+ "mc_1 0.623 0.623 0.623\n",
+ "mc_6 0.613 0.613 0.613\n",
+ "mc_4 0.590 0.590 0.590\n",
+ "skill_math 0.557 0.541 0.579\n",
+ "mc_5 0.491 0.491 0.491\n",
+ "mn_neg 0.475 0.475 0.475\n",
+ "mn_pos 0.324 0.324 0.324\n",
+ "inv_reads 0.192 0.166 0.219\n",
+ "inv_museum 0.184 0.136 0.232\n",
+ "inv_praised 0.121 0.120 0.121\n",
+ "mn_rotter 0.107 0.107 0.107"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "## Constraints\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",
- "\n",
- "You can add additional constraints for your specific model."
+ "amn_posterior = get_amn_posterior_states(amn_result=amn_result, data=data)\n",
+ "amn_states = amn_posterior[\"unanchored_states\"][\"states\"]\n",
+ "amn_decomp = decompose_measurement_variance(\n",
+ " model_spec=model, params=amn_result.all_params, filtered_states=amn_states\n",
+ ")\n",
+ "amn_reliability = summarize_measurement_reliability(amn_decomp)\n",
+ "amn_reliability"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"id": "15",
"metadata": {},
- "outputs": [],
"source": [
- "constraints = max_inputs[\"constraints\"]\n",
- "print(f\"Number of auto-generated constraints: {len(constraints)}\")"
+ "## Cross-estimator comparison\n",
+ "\n",
+ "The three estimators target the same likelihood under different approximations / objectives. Below we line up:\n",
+ "\n",
+ "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": "markdown",
+ "cell_type": "code",
+ "execution_count": 11,
"id": "16",
- "metadata": {},
+ "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": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | estimator | \n",
+ " AF | \n",
+ " AMN | \n",
+ " CHS | \n",
+ "
\n",
+ " \n",
+ " | measurement | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | skill_comp | \n",
+ " 1.380 | \n",
+ " 1.170 | \n",
+ " 1.353 | \n",
+ "
\n",
+ " \n",
+ " | skill_math | \n",
+ " 1.000 | \n",
+ " 1.000 | \n",
+ " 1.000 | \n",
+ "
\n",
+ " \n",
+ " | skill_recog | \n",
+ " 1.373 | \n",
+ " 1.172 | \n",
+ " 1.417 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "estimator AF AMN CHS\n",
+ "measurement \n",
+ "skill_comp 1.380 1.170 1.353\n",
+ "skill_math 1.000 1.000 1.000\n",
+ "skill_recog 1.373 1.172 1.417"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "## Estimation with optimagic\n",
+ "estimators = {\n",
+ " \"CHS\": chs_params,\n",
+ " \"AF\": af_result.all_params,\n",
+ " \"AMN\": amn_result.all_params,\n",
+ "}\n",
"\n",
- "To estimate the model, use optimagic's `maximize` function:\n",
"\n",
- "```python\n",
- "import optimagic as om\n",
+ "def _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",
- "result = om.maximize(\n",
- " fun=loglike,\n",
- " params=params,\n",
- " algorithm=\"scipy_lbfgsb\",\n",
- " fun_and_jac=loglike_and_gradient,\n",
- " constraints=constraints,\n",
+ "\n",
+ "loading_rows = []\n",
+ "for 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})\n",
+ "loadings_df = pd.DataFrame(loading_rows)\n",
+ "loadings_pivot = loadings_df.pivot(\n",
+ " index=\"measurement\", columns=\"estimator\", values=\"loading\"\n",
")\n",
- "```\n",
+ "loadings_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.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#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.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.0,
+ "#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.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.0,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0.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.0,
+ "#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": [
+ "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": "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": [
+ "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",
"\n",
- "The `fun_and_jac` argument is important: it uses the combined function that\n",
- "computes both the likelihood and gradient efficiently."
+ "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.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0.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.0,
+ "#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.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.0,
+ "#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.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.0,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0.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.0,
+ "#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",
+ "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",
+ "## 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"
+ "- [How to estimate AF](../how_to_guides/how_to_estimate_af.md) covers the AF API in depth, including the jaxopt optimizer backend.\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..cdf06b31
--- /dev/null
+++ b/docs/how_to_guides/how_to_compare_estimators.md
@@ -0,0 +1,206 @@
+# 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 sandwich standard errors from `estimagic.estimate_ml`.
+2. **AF**: score-resampling cluster 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 sandwich (AF, AMN) |
+| --------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| CHS | Analytic sandwich (`estimate_ml`'s Fisher + outer) | Closed-form is valid; bootstrap is just slower. |
+| AF | Score-resampling bootstrap | The closed-form variance ignores estimation error in period-$t-1$ nuisance params, biasing every period-$t \geq 1$ SE down. The score bootstrap captures the propagation. |
+| 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
+
+`get_maximization_inputs` returns the jitted log-likelihood and gradient that
+`estimagic.estimate_ml` consumes directly. Its result carries the analytic
+sandwich variance.
+
+```python
+from estimagic import estimate_ml
+
+chs_inference = estimate_ml(
+ loglike=max_inputs["loglikeobs"],
+ params=chs_result.params,
+ optimize_options=False,
+ constraints=max_inputs["constraints"],
+ loglike_kwargs={},
+)
+chs_inference.summary()
+```
+
+`optimize_options=False` skips re-optimisation: `estimagic` evaluates the
+likelihood and its derivatives at `chs_result.params` and assembles the
+robust sandwich. The output's `params` column has 95% confidence intervals
+ready to plot.
+
+## AF: score-resampling bootstrap
+
+`compute_af_standard_errors` precomputes the per-observation scores at the
+optimum once, then for each of `n_boot` replicates resamples caseids,
+averages the resampled scores, and applies a one-step Newton update from the
+point estimate. 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 all_params.index
+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 per-replicate 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).
+
+```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_inference.summary().loc[phi_loc, "ci_lower"],
+ "upper": chs_inference.summary().loc[phi_loc, "ci_upper"],
+ })
+ rows.append({
+ "period": period,
+ "estimator": "AF",
+ "estimate": af_result.all_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.all_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_filtered_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..9a1d6940
--- /dev/null
+++ b/docs/how_to_guides/how_to_estimate_af.md
@@ -0,0 +1,122 @@
+# Estimate a Model with AF (sequential Halton MLE)
+
+The Attanasio & 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
+ n_mixture_components=2,
+)
+result = estimate_af(model, data, af_options=af_options)
+
+result.all_params # canonical skillmodels params DataFrame
+result.period_results[0] # per-period AFPeriodResult
+```
+
+For cluster-bootstrap standard errors, pass the same `model`, `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=200, seed=0
+)
+inference.standard_errors
+```
+
+## Optimizer backends
+
+By default each period's MLE runs through `optimagic.minimize`. 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.
+
+For models without probability or equality constraints, an on-device backend
+can replace this. Set `optimizer_backend="jaxopt"` to run `jaxopt.LBFGSB`
+directly on the device-resident parameter vector:
+
+```python
+af_options = AFEstimationOptions(
+ n_halton_points=200,
+ n_halton_points_shock=50,
+ optimizer_backend="jaxopt",
+ optimizer_options={"maxiter": 500, "tol": 1e-7, "history_size": 10},
+)
+```
+
+The trade-offs:
+
+- **Supported**: pinned values from normalisations, user-supplied
+ `fixed_params`, and parameter bounds.
+- **Not supported**: probability constraints (raised by `log_ces` transitions
+ whose `gamma` weights live on a simplex) and equality constraints (within-
+ step and cross-period equalities passed through `estimate_af(constraints=)`).
+ The jaxopt backend raises `NotImplementedError` with a clear hint to fall
+ back to `optimizer_backend="optimagic"`.
+- The `optimizer_algorithm` field is ignored; jaxopt always uses L-BFGS-B.
+
+When to pick which:
+
+| Situation | Backend |
+| ------------------------------------------------------ | ------------- |
+| Any `log_ces` transition | `"optimagic"` |
+| Within-step / cross-period equality constraints | `"optimagic"` |
+| Linear / translog model with many iterations on GPU | `"jaxopt"` |
+| Small CPU run, debuggability matters | `"optimagic"` |
+
+## Initialization strategy
+
+`AFEstimationOptions.initialization_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.
+
+The bootstrap inference path internally re-runs the optimizer with
+`initialization_strategy="constant"` on each replicate so that the AMN seeds
+are computed only once.
+
+## 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`.
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..e6b157b2
--- /dev/null
+++ b/docs/how_to_guides/how_to_estimate_amn.md
@@ -0,0 +1,218 @@
+# 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(
+ n_mixture_components=2,
+ em_max_iter=500,
+ n_simulation_draws=100_000,
+ seed=0,
+)
+result = estimate_amn(model, data, amn_options=amn_options)
+
+result.all_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(
+ n_mixture_components=2,
+ em_max_iter=500,
+ n_simulation_draws=50_000,
+ seed=0,
+ ),
+)
+
+result.all_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
+
+`n_mixture_components` controls the flexibility of the Stage-1 EM fit. 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) is fast and
+robust. The `"optimal"` option computes an Avar-based weighting matrix from
+the EM score outer product; it is slower but tighter under correct
+specification.
+
+### 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. 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.
+
+## 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.
+- **Custom transition functions.** AMN's Stage 3 currently supports `linear`,
+ `translog`, `linear_and_squares`, `log_ces`, and `log_ces_general`. Custom
+ `@register_params` transitions work for CHS / AF but raise a
+ `NotImplementedError` from `simulate_and_regress`. Extension is mechanical;
+ see the per-transition branches in `amn/simulate_and_regress.py`.
+- **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..fdc2ba30 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
@@ -10,16 +10,17 @@
"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",
+ "from skillmodels.chs.filtered_states import get_filtered_states\n",
+ "from skillmodels.chs.maximization_inputs import get_maximization_inputs\n",
+ "from skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
+ "from skillmodels.common.simulate_data import simulate_dataset\n",
+ "from skillmodels.common.visualize_factor_distributions import (\n",
" bivariate_density_contours,\n",
" bivariate_density_surfaces,\n",
" combine_distribution_plots,\n",
" univariate_densities,\n",
- ")"
+ ")\n",
+ "from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS"
]
},
{
@@ -29,15 +30,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 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",
+ "There are two kinds of data that the plotting functions consume:\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",
+ "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",
- "## Getting filtered states "
+ "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"
]
},
{
@@ -52,7 +54,10 @@
"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\"])"
+ "data = data.set_index([\"caseid\", \"period\"])\n",
+ "\n",
+ "filtered = get_filtered_states(model_spec=model, data=data, params=params)\n",
+ "states = filtered[\"anchored_states\"][\"states\"]"
]
},
{
@@ -73,14 +78,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 +99,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 +133,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 +146,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 +196,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 +210,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 +247,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 +265,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "20",
+ "id": "19",
"metadata": {},
"outputs": [],
"source": [
@@ -280,33 +276,37 @@
{
"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"
+ "params = get_maximization_inputs(\n",
+ " model_spec=model, data=data, chs_options=MODEL2_CHS_OPTIONS\n",
+ ")[\"params_template\"]\n",
+ "params[\"value\"] = 0.1\n",
+ "filtered = get_filtered_states(model_spec=model, data=data, params=params)\n",
+ "states = 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 +314,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..861e3acf 100644
--- a/docs/how_to_guides/how_to_visualize_transition_equations.ipynb
+++ b/docs/how_to_guides/how_to_visualize_transition_equations.ipynb
@@ -9,12 +9,13 @@
"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",
+ "from skillmodels.chs.filtered_states import get_filtered_states\n",
+ "from skillmodels.common.config import REGRESSION_VAULT, TEST_DATA_DIR\n",
+ "from skillmodels.common.visualize_transition_equations import (\n",
" combine_transition_plots,\n",
" get_transition_plots,\n",
- ")"
+ ")\n",
+ "from skillmodels.test_data.model2 import MODEL2"
]
},
{
@@ -53,7 +54,10 @@
"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\"])"
+ "data = data.set_index([\"caseid\", \"period\"])\n",
+ "\n",
+ "filtered = get_filtered_states(model_spec=model, data=data, params=params)\n",
+ "states = filtered[\"anchored_states\"][\"states\"]"
]
},
{
@@ -75,6 +79,7 @@
" model_spec=model,\n",
" params=params,\n",
" data=data,\n",
+ " filtered_states=states,\n",
" period=0,\n",
")"
]
@@ -112,6 +117,7 @@
" params=params,\n",
" data=data,\n",
" period=0,\n",
+ " filtered_states=states,\n",
" quantiles_of_other_factors=None,\n",
")"
]
@@ -147,6 +153,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..def0f614 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:
@@ -114,7 +131,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..0d6405e3 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,52 +1,100 @@
# 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:
-
-- **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
+Skillmodels was developed for skill-formation research but works for any dynamic
+nonlinear latent-factor model. Key features:
+
+- **Three estimators with one model spec**:
+ - `chs` — Kalman MLE (CHS 2010), the historical core.
+ - `af` — sequential Halton-quadrature MLE (Attanasio & 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.
+- **Optional on-device optimizer for AF**: `optimizer_backend="jaxopt"` runs
+ `jaxopt.LBFGSB` on the device-resident params vector, eliminating the
+ host↔device transfer that `optimagic` incurs once per likelihood call.
## 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 four model-spec dataclasses
+that every estimator consumes:
+
+- `ModelSpec`
+- `FactorSpec`
+- `AnchoringSpec`
+- `Normalizations`
+
+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,
+ get_maximization_inputs, # likelihood + gradients + constraints for optimagic
+ get_filtered_states,
+)
+from skillmodels.af import (
+ AFEstimationOptions,
+ estimate_af,
+ compute_af_standard_errors,
+)
+from skillmodels.amn import (
+ AMNEstimationOptions,
+ estimate_amn,
+ compute_amn_standard_errors,
+)
+```
+
+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. Uses normalizations that account for the
+ [critique](https://tinyurl.com/y3wl43kz) of Wiswall and Agostinelli.
+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/transition_functions.md b/docs/reference_guides/transition_functions.md
index caee530f..511684af 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
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..633d1ff7 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -18,6 +18,15 @@ environments:
- 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/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/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
@@ -29,6 +38,7 @@ environments:
- 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
@@ -74,6 +84,8 @@ environments:
- 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/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/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
@@ -88,6 +100,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
@@ -110,13 +123,16 @@ environments:
- 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
@@ -131,6 +147,7 @@ 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
@@ -138,6 +155,7 @@ environments:
- 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
@@ -145,7 +163,7 @@ environments:
- 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/libzlib-1.3.2-h25fd6f3_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
@@ -202,6 +220,8 @@ environments:
- 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
@@ -211,6 +231,7 @@ 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/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
@@ -227,6 +248,7 @@ environments:
- 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/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
@@ -235,6 +257,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -247,7 +270,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -269,7 +292,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -302,6 +325,15 @@ environments:
- 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/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/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
@@ -311,6 +343,7 @@ environments:
- 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
@@ -332,6 +365,8 @@ environments:
- 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/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/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
@@ -345,6 +380,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
@@ -366,13 +402,16 @@ environments:
- 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
@@ -386,17 +425,19 @@ 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.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.1-hb9d3cd8_2.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
@@ -448,6 +489,8 @@ environments:
- 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/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
@@ -456,6 +499,7 @@ environments:
- 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/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
@@ -472,6 +516,7 @@ environments:
- 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/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
@@ -480,6 +525,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -491,7 +537,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -502,7 +548,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -531,6 +577,15 @@ environments:
- 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/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/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
@@ -540,6 +595,7 @@ environments:
- 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/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
@@ -561,6 +617,8 @@ environments:
- 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/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/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
@@ -574,6 +632,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
@@ -593,14 +652,17 @@ environments:
- 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/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
@@ -612,14 +674,16 @@ environments:
- 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.1-h8359307_2.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
@@ -674,6 +738,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -682,6 +747,7 @@ environments:
- 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
@@ -698,6 +764,7 @@ environments:
- 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/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
@@ -706,6 +773,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -716,7 +784,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -727,7 +795,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -755,6 +823,15 @@ environments:
- 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/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/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
@@ -786,6 +863,8 @@ environments:
- 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/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/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
@@ -798,6 +877,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
@@ -817,11 +897,13 @@ environments:
- 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/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
@@ -838,13 +920,14 @@ environments:
- 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.1-h2466b09_2.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
@@ -896,6 +979,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -905,6 +989,7 @@ environments:
- 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/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
@@ -927,6 +1012,7 @@ environments:
- 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/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- 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
@@ -935,6 +1021,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -946,7 +1033,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -957,7 +1044,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -994,6 +1081,15 @@ environments:
- 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/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/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
@@ -1003,6 +1099,7 @@ environments:
- 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
@@ -1025,6 +1122,8 @@ environments:
- 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/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/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
@@ -1039,6 +1138,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
@@ -1060,13 +1160,16 @@ environments:
- 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
@@ -1080,17 +1183,19 @@ 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/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.1-hb9d3cd8_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_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
@@ -1147,6 +1252,8 @@ environments:
- 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
@@ -1155,6 +1262,7 @@ environments:
- 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/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
@@ -1171,6 +1279,7 @@ environments:
- 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/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
@@ -1179,6 +1288,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -1189,7 +1299,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -1198,7 +1308,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -1224,6 +1334,15 @@ environments:
- 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/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/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
@@ -1233,6 +1352,7 @@ environments:
- 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/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
@@ -1255,6 +1375,8 @@ environments:
- 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/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/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
@@ -1269,6 +1391,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
@@ -1288,14 +1411,17 @@ environments:
- 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/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
@@ -1307,14 +1433,16 @@ environments:
- 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.1-h8359307_2.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/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
@@ -1374,6 +1502,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -1382,6 +1511,7 @@ environments:
- 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
@@ -1398,6 +1528,7 @@ environments:
- 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/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
@@ -1406,6 +1537,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -1415,7 +1547,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -1424,7 +1556,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -1449,6 +1581,15 @@ environments:
- 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/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/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
@@ -1480,6 +1621,8 @@ environments:
- 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/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/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
@@ -1493,6 +1636,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
@@ -1512,11 +1656,13 @@ environments:
- 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/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
@@ -1533,13 +1679,14 @@ environments:
- 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.1-h2466b09_2.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
@@ -1593,6 +1740,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -1602,6 +1750,7 @@ environments:
- 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/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
@@ -1624,6 +1773,7 @@ environments:
- 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/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- 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
@@ -1632,6 +1782,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -1642,7 +1793,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -1653,7 +1804,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -1688,6 +1839,15 @@ environments:
- 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/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/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
@@ -1725,6 +1885,8 @@ environments:
- 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/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/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
@@ -1739,6 +1901,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
@@ -1760,6 +1923,7 @@ environments:
- 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
@@ -1803,7 +1967,7 @@ 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/linux-64/libzlib-1.3.2-h25fd6f3_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
@@ -1870,6 +2034,8 @@ environments:
- 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
@@ -1880,6 +2046,7 @@ 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/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
@@ -1897,6 +2064,7 @@ environments:
- 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/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
@@ -1905,6 +2073,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -1915,7 +2084,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -1924,7 +2093,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -1950,6 +2119,15 @@ environments:
- 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/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/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
@@ -1959,6 +2137,7 @@ environments:
- 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/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
@@ -1983,6 +2162,8 @@ environments:
- 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/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/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
@@ -1997,6 +2178,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
@@ -2016,14 +2198,17 @@ environments:
- 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/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
@@ -2035,14 +2220,16 @@ environments:
- 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.1-h8359307_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_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/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
@@ -2109,6 +2296,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -2119,6 +2307,7 @@ 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
@@ -2136,6 +2325,7 @@ environments:
- 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/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
@@ -2144,6 +2334,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -2153,7 +2344,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -2162,7 +2353,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -2187,6 +2378,15 @@ environments:
- 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/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/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
@@ -2220,6 +2420,8 @@ environments:
- 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/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/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
@@ -2233,6 +2435,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
@@ -2252,11 +2455,13 @@ environments:
- 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/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
@@ -2273,13 +2478,14 @@ environments:
- 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.1-h2466b09_2.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
@@ -2335,6 +2541,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -2345,6 +2552,7 @@ environments:
- 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/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
@@ -2367,6 +2575,7 @@ environments:
- 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/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- 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
@@ -2375,6 +2584,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -2385,7 +2595,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -2396,7 +2606,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -2431,6 +2641,15 @@ environments:
- 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/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/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
@@ -2493,6 +2712,8 @@ environments:
- 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/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/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
@@ -2507,6 +2728,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
@@ -2529,6 +2751,7 @@ environments:
- 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
@@ -2577,7 +2800,7 @@ 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/linux-64/libzlib-1.3.2-h25fd6f3_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
@@ -2644,6 +2867,8 @@ environments:
- 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
@@ -2655,6 +2880,7 @@ environments:
- 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
@@ -2672,6 +2898,7 @@ environments:
- 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/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
@@ -2680,6 +2907,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -2692,7 +2920,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -2714,7 +2942,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -2747,6 +2975,15 @@ environments:
- 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/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/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
@@ -2809,6 +3046,8 @@ environments:
- 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/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/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
@@ -2823,6 +3062,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
@@ -2845,6 +3085,7 @@ environments:
- 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
@@ -2893,7 +3134,7 @@ 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/linux-64/libzlib-1.3.2-h25fd6f3_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
@@ -2960,6 +3201,8 @@ environments:
- 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
@@ -2971,6 +3214,7 @@ environments:
- 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
@@ -2988,6 +3232,7 @@ environments:
- 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/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
@@ -2996,6 +3241,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -3008,7 +3254,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -3030,7 +3276,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -3045,6 +3291,343 @@ environments:
- 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-cuda13:
+ 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.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/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.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/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/noarch/babel-2.18.0-pyhcf101f3_1.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/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/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.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.4.22-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.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/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.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/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/noarch/cuda-cudart-dev_linux-64-13.2.75-h376f20c_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/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/linux-64/cuda-nvcc-13.2.78-hcdd1206_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/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/noarch/cuda-nvvm-dev_linux-64-13.2.78-ha770c72_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/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/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.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/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/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/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/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.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-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/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.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-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.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/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.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/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.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/noarch/libnvptxcompiler-dev_linux-64-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/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.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/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.2.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.9-py314h1194b4b_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/linux-64/memray-1.19.3-py314hef15ded_0.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.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/linux-64/ncurses-6.6-hdb14827_0.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.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/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.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.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/linux-64/pillow-12.2.0-py314h8ec4b1a_0.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/linux-64/prek-0.3.13-hb17b654_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/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.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-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/linux-64/python-3.14.4-habeac84_100_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.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/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.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/noarch/rich-15.0.0-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.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/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.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/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_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/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.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/xlrd-2.0.2-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.1-pyhcf101f3_0.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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ba/6c/ff8bf52315064dbeb55cb5067e191120a5b2e58bb648d0d34cf7969dc2c2/choreographer-1.3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-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/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-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/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/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.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/8f/2b/5c63c29d155afdf1d7827f8c04efe8cac47fc6783d8c53959e43de879dcc/jax_cuda13_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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/9e/b9/a6d8bb7d228940f01885bd9f327ab7f9d366a9be775c4bf366bf9d9477ae/kaleido-1.3.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/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/c7/e1/68c2256b69a314eba133673377ba9118c356f6342a0c02b61de449cf2bf2/narwhals-2.21.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/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.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/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/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_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/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/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/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_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/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_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/3e/93/6d020a69fc37e57fae8a96ab0c53102d96538db256e933e914d100e5a430/nvidia_nccl_cu13-2.30.4-py3-none-manylinux_2_18_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/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/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/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl
+ - pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
+ - 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/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - 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/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/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.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/5b/f2/44a7dd795a52d34d033b1cb1a6b1162eada650079e557e236fb6b88943be/pytask_parallel-0.5.4-py3-none-any.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/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/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.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/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl
+ - pypi: ./
type-checking:
channels:
- url: https://conda.anaconda.org/conda-forge/
@@ -3063,6 +3646,15 @@ environments:
- 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/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/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
@@ -3072,6 +3664,7 @@ environments:
- 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
@@ -3094,6 +3687,8 @@ environments:
- 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/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/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
@@ -3108,6 +3703,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
@@ -3129,13 +3725,16 @@ environments:
- 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
@@ -3149,17 +3748,19 @@ 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/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.1-hb9d3cd8_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_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
@@ -3216,6 +3817,8 @@ environments:
- 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
@@ -3224,6 +3827,7 @@ environments:
- 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/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
@@ -3240,6 +3844,7 @@ environments:
- 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/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
@@ -3248,6 +3853,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -3258,7 +3864,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -3267,7 +3873,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -3296,6 +3902,15 @@ environments:
- 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/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/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
@@ -3305,6 +3920,7 @@ environments:
- 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/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
@@ -3327,6 +3943,8 @@ environments:
- 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/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/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
@@ -3341,6 +3959,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
@@ -3360,14 +3979,17 @@ environments:
- 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/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
@@ -3379,14 +4001,16 @@ environments:
- 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.1-h8359307_2.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/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
@@ -3446,6 +4070,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh5552912_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -3454,6 +4079,7 @@ environments:
- 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
@@ -3470,6 +4096,7 @@ environments:
- 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/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
@@ -3478,6 +4105,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -3487,7 +4115,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -3496,7 +4124,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -3524,6 +4152,15 @@ environments:
- 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/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/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
@@ -3555,6 +4192,8 @@ environments:
- 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/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/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
@@ -3568,6 +4207,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
@@ -3587,11 +4227,13 @@ environments:
- 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/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
@@ -3608,13 +4250,14 @@ environments:
- 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.1-h2466b09_2.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
@@ -3668,6 +4311,7 @@ environments:
- 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/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/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
@@ -3677,6 +4321,7 @@ environments:
- 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/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
@@ -3699,6 +4344,7 @@ environments:
- 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/noarch/xlrd-2.0.2-pyhd8ed1ab_0.conda
- 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
@@ -3707,6 +4353,7 @@ environments:
- 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/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-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
@@ -3717,7 +4364,7 @@ environments:
- 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/45/d8/55e0901103c93d57bab3b932294c216f0cbd49054187ce29f8f13808d530/jaxopt-0.8.5-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
@@ -3728,7 +4375,7 @@ environments:
- 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: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
- 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
@@ -3825,6 +4472,25 @@ packages:
- 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
@@ -3937,6 +4603,19 @@ packages:
- 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
@@ -3949,65 +4628,640 @@ packages:
- 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
+- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
+ sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab
+ md5: c6b0543676ecb1fb2d7643941fe375f2
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
+ - pkg:pypi/attrs?source=hash-mapping
+ size: 64927
+ timestamp: 1773935801332
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda
+ sha256: 292aa18fe6ab5351710e6416fbd683eaef3aa5b1b7396da9350ff08efc660e4f
+ md5: 675ea6d90900350b1dcfa8231a5ea2dd
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
+ - 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: 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
+ 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:
- - binutils_impl_linux-64 2.45.1 default_hfdba357_101
+ - 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/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/win-64/aws-c-auth-0.10.1-h5d51246_2.conda
+ sha256: f937d40f01493c4799a673f56d70434d6cddb2ec967cf642a39e0e04282a9a1e
+ md5: 908d5d8755564e2c3f3770fca7ff0736
+ 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
+ - 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: []
+ size: 127421
+ timestamp: 1774275018076
+- 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/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/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda
+ sha256: 5f61082caea9fbdd6ba02702935e9dea9997459a7e6c06fd47f21b81aac882fb
+ md5: 7cc4953d504d4e8f3d6f4facb8549465
+ depends:
+ - 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/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/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/win-64/aws-c-common-0.12.6-hfd05255_0.conda
+ sha256: 0627691c34eb3d9fcd18c71346d9f16f83e8e58f9983e792138a2cccf387d18a
+ md5: b1465f33b05b9af02ad0887c01837831
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 236441
+ timestamp: 1763586152571
+- 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/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/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/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/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/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/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/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/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda
+ sha256: 3c9d50fb7895df4edd72d177299551608c24d8b0b82db0cf34c8e2bf6644979c
+ md5: ce36c60ed6b15c8dbb7ccddec4ebf57f
+ 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
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 182296
+ timestamp: 1773868342627
+- 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/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/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda
+ sha256: 62367b6d4d8aa1b43fb63e51d779bb829dfdd53d908c1b6700efa23255dd38db
+ md5: 2d90128559ec4b3c78d1b889b8b13b50
+ depends:
+ - 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: []
+ size: 141733
+ timestamp: 1774282227215
+- 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/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/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda
+ sha256: c86c30edba7457e04d905c959328142603b62d7d1888aed893b2e21cca9c302c
+ md5: 3c97faee5be6fd0069410cf2bca71c85
+ 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: 56509
+ timestamp: 1764610148907
+- 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/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/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
+ - 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/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
+- 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'
+- 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_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/noarch/bleach-6.3.0-pyhcf101f3_1.conda
sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46
md5: 7c5ebdc286220e8021bf55e6384acd67
@@ -4208,6 +5462,16 @@ packages:
purls: []
size: 207882
timestamp: 1765214722852
+- 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/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda
sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6
md5: f001e6e220355b7f87403a4d0e5bf1ca
@@ -4226,6 +5490,15 @@ packages:
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
@@ -4258,6 +5531,16 @@ packages:
- 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/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda
sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e
md5: cf45f4278afd6f4e6d03eda0f435d527
@@ -4317,6 +5600,17 @@ packages:
- 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
- pypi: https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl
name: choreographer
version: 1.2.1
@@ -4325,6 +5619,15 @@ packages:
- logistro>=2.0.1
- simplejson>=3.19.3
requires_python: '>=3.8'
+- 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/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl
name: click
version: 8.3.1
@@ -4332,6 +5635,13 @@ packages:
requires_dist:
- colorama ; sys_platform == 'win32'
requires_python: '>=3.10'
+- 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/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl
name: click-default-group
version: 1.2.4
@@ -4473,6 +5783,17 @@ packages:
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
@@ -4482,6 +5803,15 @@ packages:
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
@@ -4491,6 +5821,15 @@ packages:
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/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45
md5: 503a94e20d2690d534d676a764a1852c
@@ -4500,6 +5839,15 @@ packages:
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
@@ -4513,6 +5861,19 @@ packages:
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
@@ -4528,6 +5889,21 @@ packages:
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/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5
md5: 86e40eb67d83f1a58bdafdd44e5a77c6
@@ -4540,6 +5916,18 @@ packages:
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/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda
sha256: 6261e1d9af80e1ec308e3e5e2ff825d189ef922d24093beaf6efca12e67ce060
md5: d3c4ac48f4967f09dd910d9c15d40c81
@@ -4553,6 +5941,19 @@ packages:
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/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032
md5: b87bf315d81218dd63eb46cc1eaef775
@@ -4562,6 +5963,15 @@ packages:
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
@@ -4571,6 +5981,15 @@ packages:
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
@@ -4580,6 +5999,15 @@ packages:
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/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda
sha256: f7c5de6b1f0f463f73c78cc73439027cdd5cb94fb4ce099116969812973cabcb
md5: 02289b10ac97bac35ad1add086c5072a
@@ -4591,6 +6019,17 @@ packages:
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/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda
sha256: a1672a34439a72869de9e011e935d41b62fc8dfb1a2700e85ed8a7a129b79981
md5: 19d4e090217f0ea89d30bedb7461c048
@@ -4606,6 +6045,21 @@ packages:
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/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda
sha256: 961cf20d411b7685cd744e6c6ed35efea547d095c62151d6f3053d9931bb994d
md5: 67458d2685e7503933efa550f3ee40f3
@@ -4623,6 +6077,23 @@ packages:
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
@@ -4639,6 +6110,22 @@ packages:
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
@@ -4654,6 +6141,21 @@ packages:
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/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda
sha256: 522722dcaffd133e0c7500c69dc70e21ac34d6762dcbaabfe847439f944028f0
md5: 7b386291414c7eea113d25ac28a33772
@@ -4663,6 +6165,15 @@ packages:
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/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda
sha256: f4d34556174e4faa9d374ba2244707082870e1bbc1bb441ad3d9d2cea37da6af
md5: 82125dd3c0c4aa009faa00e2829b93d8
@@ -4674,6 +6185,17 @@ packages:
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
@@ -4685,6 +6207,17 @@ packages:
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/noarch/cuda-version-12.9-h4f385c5_3.conda
sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656
md5: b6d5d7f1c171cbd228ea06b556cfa859
@@ -4695,6 +6228,16 @@ packages:
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
@@ -4858,6 +6401,11 @@ packages:
- 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/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'
- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
sha256: ed4462f6e49b8dea4e45f7294cca576a38cf4fc41e04bbcd95f9cf55be7776b9
md5: 049f68f9c90f00069c748cd6fb7bfb55
@@ -4874,6 +6422,22 @@ packages:
- 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
@@ -4896,6 +6460,16 @@ packages:
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/osx-arm64/freetype-2.14.2-hce30654_0.conda
sha256: 3c02ecdbfd94d25721811f51d0f400bf705005a728011e19db9975a8985e1021
md5: ca730d8e7d1de1f71013edfef0e08f13
@@ -4918,8 +6492,116 @@ packages:
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
+ 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/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'
@@ -5041,6 +6723,23 @@ packages:
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
@@ -5053,6 +6752,18 @@ packages:
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
@@ -5080,6 +6791,23 @@ packages:
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
- 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
@@ -5102,6 +6830,17 @@ packages:
- psutil ; extra == 'test'
- setuptools ; extra == 'test'
requires_python: '>=3.10'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda
sha256: 38ffca57cc9c264d461ac2ce9464a9d605e0f606d92d831de9075cb0d95fc68a
md5: 6514b3a10e84b6a849e1b15d3753eb22
@@ -5115,6 +6854,19 @@ packages:
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
@@ -5128,6 +6880,19 @@ packages:
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/noarch/h11-0.16.0-pyhcf101f3_1.conda
sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb
md5: b8993c19b0c32a2f7b66cbb58ca27069
@@ -5155,6 +6920,151 @@ packages:
- pkg:pypi/h2?source=hash-mapping
size: 95967
timestamp: 1756364871835
+- 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/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/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/h5py?source=hash-mapping
+ size: 1101679
+ timestamp: 1775582027560
+- 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/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/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/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba
md5: 0a802cb9888dd14eeefc611f05c40b6e
@@ -5240,6 +7150,18 @@ packages:
- 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
@@ -5253,6 +7175,19 @@ packages:
- 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
- pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
name: iniconfig
version: 2.3.0
@@ -5395,6 +7330,30 @@ packages:
- 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
@@ -5449,6 +7408,36 @@ packages:
- kubernetes ; extra == 'k8s'
- xprof ; extra == 'xprof'
requires_python: '>=3.11'
+- 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/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
@@ -5472,6 +7461,30 @@ packages:
- 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/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/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/54/0d/a8e27c1c434e489883c1182bd52de27775b8a78013de62e6eabf80991df5/jaxlib-0.9.1-cp314-cp314-win_amd64.whl
name: jaxlib
version: 0.9.1
@@ -5490,15 +7503,33 @@ packages:
- 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
+- 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/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl
name: jaxlib
- version: 0.9.1
- sha256: 3071bf493f6f48207c56b1e9a5bf895e2acebc5bd40f6f35458e76eb8bf210c7
+ version: 0.10.0
+ sha256: 2a42cf04c0f88bc03b150a17fa7ddbb2f40e096667ec8a1b840ed87913e6e735
requires_dist:
- - scipy>=1.13
+ - scipy>=1.14
- numpy>=2.0
- ml-dtypes>=0.5.0
requires_python: '>=3.11'
+- 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
- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8
md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9
@@ -5523,11 +7554,18 @@ packages:
- 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/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
@@ -5539,6 +7577,17 @@ packages:
- 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
@@ -5551,6 +7600,18 @@ packages:
- 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
@@ -5612,6 +7673,19 @@ packages:
- markdown ; extra == 'docs'
- pandas ; extra == 'docs'
requires_python: '>=3.9'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda
sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2
md5: 62b7c96c6cd77f8173cc5cada6a9acaa
@@ -5626,6 +7700,20 @@ packages:
- 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
@@ -5699,6 +7787,26 @@ packages:
- 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
@@ -5729,6 +7837,36 @@ packages:
- 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
@@ -5767,6 +7905,31 @@ packages:
- 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
@@ -5811,6 +7974,16 @@ packages:
- packaging
- pytest-timeout>=2.4.0
requires_python: '>=3.8'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda
sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a
md5: 86d9cba083cd041bfbf242a01a7a1999
@@ -5943,6 +8116,19 @@ packages:
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/osx-arm64/lcms2-2.18-hdfa7624_0.conda
sha256: d768da024ab74a4b30642401877fa914a68bdc238667f16b1ec2e0e98b2451a6
md5: 6631a7bd2335bb9699b1dbc234b19784
@@ -5982,6 +8168,19 @@ packages:
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
@@ -6017,6 +8216,41 @@ packages:
purls: []
size: 172395
timestamp: 1773113455582
+- 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/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/win-64/libaec-1.1.5-haf901d7_0.conda
+ sha256: e54c08964262c73671d9e80e400333e59c617e0b454476ad68933c0c458156c8
+ md5: 43b6385cfad52a7083f2c41984eb4e91
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 34463
+ timestamp: 1769221960556
- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda
sha256: 69ea8da58658ad26cb64fb0bfccd8a3250339811f0b57c6b8a742e5e51bacf70
md5: 981d372c31a23e1aa9965d4e74d085d5
@@ -6037,6 +8271,26 @@ packages:
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
@@ -6055,6 +8309,24 @@ packages:
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/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
build_number: 5
sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d
@@ -6209,6 +8481,21 @@ packages:
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/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
build_number: 5
sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0
@@ -6256,6 +8543,54 @@ packages:
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/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/win-64/libcurl-8.19.0-h8206538_0.conda
+ sha256: 6b2143ba5454b399dab4471e9e1d07352a2f33b569975e6b8aedc2d9bf51cbb0
+ md5: ed181e29a7ebf0f60b84b98d6140a340
+ depends:
+ - 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: []
+ size: 392543
+ timestamp: 1773218585056
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda
sha256: 3c8142cdd3109c250a926c492ec45bc954697b288e5d1154ada95272ffa21be8
md5: 7a290d944bc0c481a55baf33fa289deb
@@ -6334,6 +8669,14 @@ packages:
purls: []
size: 112766
timestamp: 1702146165126
+- 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/linux-64/libexpat-2.7.4-hecca717_0.conda
sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5
md5: e7f7ce06ec24cfcfb9e36d28cf82ba57
@@ -6347,6 +8690,19 @@ packages:
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/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda
sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf
md5: a92e310ae8dfc206ff449f362fc4217f
@@ -6415,6 +8771,15 @@ packages:
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/osx-arm64/libfreetype-2.14.2-hce30654_0.conda
sha256: 6061ef5321b8e697d5577d8dfe7a4c75bfe3e706c956d0d84bfec6bea3ed9f77
md5: a3a53232936b55ffea76806aefe19e8b
@@ -6447,6 +8812,20 @@ packages:
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/osx-arm64/libfreetype6-2.14.2-hdfa99f5_0.conda
sha256: 24dd0e0bee56e87935f885929f67659f1d3b8a01e7546568de2919cffd9e2e36
md5: e726e134a392ae5d7bafa6cc4a3d5725
@@ -6489,6 +8868,20 @@ packages:
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/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda
sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e
md5: 92df6107310b1fff92c4cc84f0de247b
@@ -6527,6 +8920,16 @@ packages:
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/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893
md5: d5e96b1ed75ca01906b3d2469b4ce493
@@ -6537,6 +8940,16 @@ packages:
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
@@ -6549,6 +8962,18 @@ packages:
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/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda
sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836
md5: 26981599908ed2205366e8fc91b37fc6
@@ -6574,6 +8999,19 @@ packages:
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/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda
sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e
md5: c4a6f7989cffb0544bfd9207b6789971
@@ -6596,6 +9034,16 @@ packages:
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/win-64/libgomp-15.2.0-h8ee18e1_18.conda
sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da
md5: 939fb173e2a4d4e980ef689e99b35223
@@ -6666,8 +9114,20 @@ packages:
- jpeg <0.0.0a
license: IJG AND BSD-3-Clause AND Zlib
purls: []
- size: 633710
- timestamp: 1762094827865
+ 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/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda
sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f
md5: f0695fbecf1006f27f4395d64bd0c4b8
@@ -6707,6 +9167,21 @@ packages:
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/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda
build_number: 5
sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb
@@ -6749,6 +9224,18 @@ packages:
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/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e
md5: 009f0d956d7bfb00de86901d16e486c7
@@ -6835,6 +9322,39 @@ packages:
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/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/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda
sha256: 1e7a7b34f8639a5feb75ba864127059e4d83edfe1a516547f0dbb9941e7b8f8b
md5: 3fd926c321c6dbf386aa14bd8b125bfb
@@ -6845,6 +9365,16 @@ packages:
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/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda
sha256: 17952c32eac197a59c119fdf3fb6f08c6a29c225a80bae141ac904ad212b87dd
md5: a66a909acf08924aced622903832a937
@@ -6854,6 +9384,15 @@ packages:
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/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5
md5: be43915efc66345cccb3c310b6ed0374
@@ -6869,6 +9408,21 @@ packages:
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/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa
md5: a6f6d3a31bb29e48d37ce65de54e2df0
@@ -6895,6 +9449,17 @@ packages:
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/osx-arm64/libpng-1.6.55-h132b30e_0.conda
sha256: 7a4fd29a6ee2d7f7a6e610754dfdf7410ed08f40d8d8b488a27bc0f9981d5abb
md5: 871dc88b0192ac49b6a5509932c31377
@@ -6929,6 +9494,18 @@ packages:
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
@@ -6971,6 +9548,17 @@ packages:
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/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda
sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c
md5: f6233a3fddc35a2ec9f617f79d6f3d71
@@ -7006,6 +9594,31 @@ packages:
purls: []
size: 304790
timestamp: 1745608545575
+- 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/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: []
+ size: 292785
+ timestamp: 1745608759342
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e
md5: 1b08cd684f34175e4514474793d44bcb
@@ -7019,6 +9632,19 @@ packages:
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/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda
sha256: b1c3824769b92a1486bf3e2cc5f13304d83ae613ea061b7bc47bb6080d6dfdba
md5: 865a399bce236119301ebd1532fced8d
@@ -7029,6 +9655,16 @@ packages:
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/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145
md5: 6235adb93d064ecdf3d44faee6f468de
@@ -7039,6 +9675,16 @@ packages:
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
@@ -7133,6 +9779,17 @@ packages:
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
@@ -7242,6 +9899,22 @@ packages:
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/win-64/libxml2-2.15.2-h5d26750_0.conda
sha256: f905eb7046987c336122121759e7f09144729f6898f48cd06df2a945b86998d8
md5: 1007e1bfe181a2aee214779ee7f13d30
@@ -7277,6 +9950,23 @@ packages:
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/win-64/libxml2-16-2.15.2-h692994f_0.conda
sha256: b8c71b3b609c7cfe17f3f2a47c75394d7b30acfb8b34ad7a049ea8757b4d33df
md5: e365238134188e42ed36ee996159d482
@@ -7295,45 +9985,44 @@ packages:
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
+- 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
- - libgcc >=13
constrains:
- - zlib 1.3.1 *_2
+ - zlib 1.3.2 *_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
+ size: 63629
+ timestamp: 1774072609062
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
+ sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05
+ md5: bc5a5721b6439f2f62a84f2548136082
depends:
- __osx >=11.0
constrains:
- - zlib 1.3.1 *_2
+ - zlib 1.3.2 *_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
+ size: 47759
+ timestamp: 1774072956767
+- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
+ sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061
+ md5: dbabbd6234dea34040e631f87676292f
depends:
- ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
constrains:
- - zlib 1.3.1 *_2
+ - zlib 1.3.2 *_2
license: Zlib
license_family: Other
purls: []
- size: 55476
- timestamp: 1727963768015
+ size: 58347
+ timestamp: 1774072851498
- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda
sha256: 991a82fbb64aba6d10719a017ce354e28df02ea5df1d9c7b0221da573c168d27
md5: 1005e1f39083adad2384772e8e384e43
@@ -7468,6 +10157,18 @@ packages:
- 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/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf
md5: 9a17c4307d23318476d7fbf0fedc0cde
@@ -7547,6 +10248,36 @@ packages:
- 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/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda
sha256: 198dcc0ed83e78bc7bf48e6ef8d4ecd220e9cf1f07db98508251b2bc0be067f9
md5: c84152e510d41378b8758826655b6ed7
@@ -7617,6 +10348,18 @@ packages:
- 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
@@ -7629,6 +10372,18 @@ packages:
- 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
- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
name: mdurl
version: 0.1.2
@@ -7665,6 +10420,26 @@ packages:
- 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/osx-arm64/memray-1.19.2-py314h44d60dd_0.conda
sha256: 5e053a64dbcdc98bd470f358f3fce1cde9b9fe362280a87cb66f1587e9f09e26
md5: f29f08f053a687bcfe09089f8a410bc9
@@ -7696,6 +10471,19 @@ packages:
- 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/win-64/mkl-2025.3.0-hac47afa_455.conda
sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d
md5: fd05d1e894497b012d05a804232254ed
@@ -7758,6 +10546,15 @@ packages:
- pylint>=2.6.0 ; extra == 'dev'
- pyink ; extra == 'dev'
requires_python: '>=3.9'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90
md5: 37293a85a0f4f77bbd9cf7aaefc62609
@@ -7791,6 +10588,28 @@ packages:
- sqlparse ; extra == 'sql'
- sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe'
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'
- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda
sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b
md5: 00f5b8dafa842e0c27c1cd7296aa4875
@@ -7836,6 +10655,36 @@ packages:
- 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
@@ -7861,6 +10710,16 @@ packages:
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/osx-arm64/ncurses-6.5-h5e97a16_3.conda
sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733
md5: 068d497125e4bf8a66bf707254fff5ae
@@ -7946,6 +10805,26 @@ packages:
- 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/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda
sha256: 43b5ed0ead36e5133ee8462916d23284f0bce0e5f266fa4bd31a020a6cc22f14
md5: 0f0ddf0575b98d91cda9e3ca9eaeb9a2
@@ -7986,31 +10865,72 @@ packages:
- pkg:pypi/numpy?source=hash-mapping
size: 7309134
timestamp: 1770098414535
+- 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/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/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/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/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/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/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/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/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/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/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/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/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
@@ -8023,6 +10943,20 @@ packages:
requires_dist:
- nvidia-cublas-cu12
requires_python: '>=3'
+- 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/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/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
@@ -8030,6 +10964,15 @@ packages:
requires_dist:
- nvidia-nvjitlink-cu12
requires_python: '>=3'
+- 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/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
@@ -8039,6 +10982,13 @@ packages:
- nvidia-nvjitlink-cu12
- nvidia-cusparse-cu12
requires_python: '>=3'
+- 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/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
@@ -8051,6 +11001,16 @@ packages:
version: 2.29.7
sha256: ecd0a012051abc20c1aa87328841efa8cade3ced65803046e38c2f03c0891fea
requires_python: '>=3'
+- 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/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/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
@@ -8063,6 +11023,18 @@ packages:
requires_dist:
- nvidia-cuda-cccl-cu12
requires_python: '>=3'
+- 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/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'
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d
md5: 11b3379b191f63139e29c0d19dee24cd
@@ -8119,6 +11091,18 @@ packages:
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/osx-arm64/openssl-3.6.1-hd24854e_1.conda
sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67
md5: f4f6ad63f98f64191c3e77c5f5f29d76
@@ -8148,22 +11132,21 @@ packages:
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
+- pypi: git+https://github.com/optimagic-dev/optimagic.git?branch=probability-allow-fixed-entries#ecd9ebe0dfb3abc09ab015d78774a30794d779d0
name: optimagic
- version: 0.5.3
- sha256: 6723076dad2c186a7f7871e5676eeb579f340030c988136196246e0fe8995a68
+ version: 0.5.4.dev9+gecd9ebe0d
requires_dist:
- - annotated-types
- - cloudpickle
- - joblib
- - numpy
- - pandas
- - plotly
+ - 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.2.1
- - sqlalchemy>=1.3
- - typing-extensions
- requires_python: '>=3.10'
+ - scipy>=1.11
+ - sqlalchemy>=2.0
+ - typing-extensions>=4.5
+ requires_python: '>=3.12'
- 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
@@ -8284,6 +11267,48 @@ packages:
- numpy ; extra == 'docs'
- torch ; extra == 'docs'
requires_python: '>=3.9'
+- 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/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl
name: orjson
version: 3.11.7
@@ -8299,6 +11324,11 @@ packages:
version: 3.11.7
sha256: de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0
requires_python: '>=3.10'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda
sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c
md5: e51f1e4089cad105b6cac64bd8166587
@@ -8336,6 +11366,18 @@ packages:
- 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
- pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl
name: pandas
version: 3.0.1
@@ -8606,6 +11648,96 @@ packages:
- xlsxwriter>=3.2.0 ; extra == 'all'
- zstandard>=0.23.0 ; extra == 'all'
requires_python: '>=3.11'
+- 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/7c/2f/f91e4eee21585ff548e83358332d5632ee49f6b2dcd96cb5dca4e0468951/pandas_stubs-3.0.0.260204-py3-none-any.whl
name: pandas-stubs
version: 3.0.0.260204
@@ -8636,6 +11768,18 @@ packages:
- 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
- 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
@@ -8684,6 +11828,29 @@ packages:
- 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/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda
sha256: 1659ff6e8ea6170a90fb8eb7291990d12bba270aab18176defa0717ed34ce186
md5: bcb38a8005e93a3b240a0dbcf28df87a
@@ -8743,6 +11910,18 @@ packages:
- 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
- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl
name: plotly
version: 6.6.0
@@ -8783,6 +11962,78 @@ packages:
- xarray ; extra == 'dev-optional'
- plotly[dev-optional] ; extra == 'dev'
requires_python: '>=3.8'
+- 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/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
name: pluggy
version: 1.6.0
@@ -8806,6 +12057,19 @@ packages:
- pkg:pypi/pluggy?source=compressed-mapping
size: 25877
timestamp: 1764896838868
+- 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
@@ -8854,6 +12118,17 @@ packages:
- 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
@@ -8999,6 +12274,17 @@ packages:
- 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/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda
sha256: df5af268c5a74b7160d772c263ece6f43257faff571783443e34b5f1d5a61cf2
md5: 75a84fc8337557347252cc4fd3ba2a93
@@ -9081,13 +12367,31 @@ packages:
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
+ 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/d7/54/c30cb1d08258612ece1dfa72c6918998bebecb916c54fca6d806bc780f2b/pytask-0.6.0-py3-none-any.whl
+ name: pytask
+ version: 0.6.0
+ sha256: cc4c31ead39f5c64be037640f7bf589b68bd0e87ea9e1a049ba86ceab42c9d13
requires_dist:
- - attrs>=21.3.0
- click>=8.1.8,!=8.2.0
- click-default-group>=1.2.4
- - networkx>=2.4.0
+ - msgspec>=0.18.6
+ - msgspec[toml]>=0.18.6
- optree>=0.9.0
- packaging>=23.0.0
- pluggy>=1.3.0
@@ -9096,6 +12400,7 @@ packages:
- 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/88/b9/19ecce5c57114b703b97378ded69ffde1f9f9d471d4db361bbfa6105861e/pytask_parallel-0.5.2-py3-none-any.whl
name: pytask-parallel
@@ -9110,6 +12415,19 @@ packages:
- pytask>=0.5.2
- rich
requires_python: '>=3.10'
+- 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/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl
name: pytest
version: 9.0.2
@@ -9151,6 +12469,27 @@ packages:
- 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
@@ -9166,6 +12505,21 @@ packages:
- 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
@@ -9229,6 +12583,34 @@ packages:
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/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda
build_number: 101
sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce
@@ -9314,6 +12696,16 @@ packages:
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
@@ -9325,6 +12717,18 @@ packages:
- 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
@@ -9336,6 +12740,17 @@ packages:
- 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
@@ -9568,6 +12983,24 @@ packages:
- 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
@@ -9628,6 +13061,21 @@ packages:
- 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/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda
sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446
md5: c1c368b5437b0d1a68f372ccf01cb133
@@ -9675,6 +13123,92 @@ packages:
- pkg:pypi/rpds-py?source=hash-mapping
size: 235780
timestamp: 1764543046065
+- 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/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/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/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972
md5: d0510124f87c75403090e220db1e9d41
@@ -9799,6 +13333,11 @@ packages:
version: 3.20.2
sha256: 3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017
requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*'
+- 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.*'
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d
md5: 3339e3b65d58accf4ca4fb8748ab16b3
@@ -9813,11 +13352,13 @@ packages:
timestamp: 1753199211006
- pypi: ./
name: skillmodels
- version: 0.0.24.dev242+g859d7ecae
- sha256: 4f390213c39753657a315f50f7597b22802fe529305722f787011d8fd2e88b1c
+ version: 0.0.24.dev338+g220621200.d20260514
+ sha256: d6e4277c6d291d2758728c64f846f7413ce3f40fca556e1040e279a3e6c23d41
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
@@ -9826,6 +13367,7 @@ packages:
- plotly>=6.6
- pytask-parallel>=0.5.2
- pytask>=0.5.8
+ - scikit-learn>=1.5
requires_python: '>=3.14,<3.15'
- conda: https://conda.anaconda.org/conda-forge/noarch/snakeviz-2.2.2-pyhd8ed1ab_1.conda
sha256: 833326122c18887b338262c13365cb146b6702c79d72da74a1c6b8af4c50e162
@@ -9975,6 +13517,44 @@ packages:
- typing-extensions!=3.10.0.1 ; extra == 'aiosqlite'
- sqlcipher3-binary ; extra == 'sqlcipher'
requires_python: '>=3.7'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41
md5: b1b505328da7a6b246787df4b5a49fbc
@@ -10008,6 +13588,13 @@ packages:
requires_dist:
- pyreadline3 ; sys_platform == 'win32'
requires_python: '>=3.8'
+- 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'
- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9
md5: 0f9817ffbe25f9e69ceba5ea70c52606
@@ -10073,6 +13660,39 @@ packages:
- 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
@@ -10134,6 +13754,23 @@ packages:
- 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
+- 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'
- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
sha256: b8f9f9ae508d79c9c697eb01b6a8d2ed4bc1899370f44aa6497c8abbd15988ea
md5: e35f08043f54d26a1be93fdbf90d30c3
@@ -10148,6 +13785,20 @@ packages:
- 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/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda
sha256: affbc6300e1baef5848f6e69569733a3e7a118aa642487c853f53d6f2bd23b89
md5: 83e1a2d7b0c1352870bbe9d9406135cf
@@ -10188,6 +13839,18 @@ packages:
- 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
- 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
@@ -10370,6 +14033,21 @@ packages:
- 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/win-64/vc-14.3-h41ae7f8_34.conda
sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a
md5: 1e610f2416b6acdd231c5f573d754a0f
@@ -10418,6 +14096,17 @@ packages:
- 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
@@ -10469,6 +14158,17 @@ packages:
license_family: MIT
purls: []
size: 1176306
+- 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/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b
md5: b2895afaf55bf96a8c8282a2e47a5de0
@@ -10624,6 +14324,18 @@ packages:
- 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/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f
md5: 2aadb0d17215603a82a2a6b0afd9a4cb
diff --git a/pyproject.toml b/pyproject.toml
index bb09d59a..3b8bffde 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"
@@ -84,8 +87,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 +100,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"
@@ -149,8 +155,14 @@ 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.filterwarnings = [
+ "ignore::pandas.errors.PerformanceWarning",
+]
+ini_options.markers = [
+ "integration: integration tests requiring MODEL2 + data",
+ "long_running: slow tests skipped in CI (run with -m long_running)",
+ "end_to_end: end-to-end estimation tests requiring external data",
+]
ini_options.norecursedirs = [ "docs" ]
[tool.pixi.dependencies]
@@ -162,7 +174,10 @@ 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" }
@@ -170,6 +185,7 @@ 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" }
@@ -182,6 +198,13 @@ 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" }
@@ -190,10 +213,11 @@ 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"
+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 \
@@ -212,7 +236,8 @@ 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" }
+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]
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..f97183d5 100644
--- a/src/skillmodels/__init__.py
+++ b/src/skillmodels/__init__.py
@@ -1,43 +1,46 @@
"""Skillmodels: A Python package for estimating latent factor models."""
-import contextlib
+# 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 os
+
+os.environ.setdefault("JAX_ENABLE_X64", "1")
+
+# Workaround for a JAX 0.10 XLA bug surfaced by jaxopt's `LBFGSB.update`.
+# The `permutation_sort_simplifier` HLO pass mis-lowers the `argsort`
+# inside `update`: it emits an s32 reduction accumulator into the s64
+# scatter operand built by the rest of the optimizer, and the HLO
+# verifier rejects the resulting mismatch with `INVALID_ARGUMENT:
+# Reduction function's accumulator shape at index 0 differs from the
+# init_value shape: s32[] vs s64[]`. Disabling just that one pass via
+# `XLA_FLAGS` keeps every other XLA optimisation intact and is a no-op
+# on JAX < 0.10 (pre-0.10 lacks the pass). Must be set *before* `import
+# jax` because XLA reads `XLA_FLAGS` once at backend init.
+_xla_pass_disable = "--xla_disable_hlo_passes=permutation_sort_simplifier" # noqa: S105
+_existing_xla_flags = os.environ.get("XLA_FLAGS", "")
+if _xla_pass_disable not in _existing_xla_flags:
+ os.environ["XLA_FLAGS"] = f"{_existing_xla_flags} {_xla_pass_disable}".strip()
+
+import contextlib # noqa: E402
+
+import jax # noqa: E402
+
+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.filtered_states import get_filtered_states
-from skillmodels.maximization_inputs import get_maximization_inputs
-from skillmodels.model_spec import (
+from skillmodels.common.model_spec import ( # noqa: E402
AnchoringSpec,
- EstimationOptions,
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__ = [
"AnchoringSpec",
- "EstimationOptions",
"FactorSpec",
"ModelSpec",
"Normalizations",
- "create_state_ranges",
- "decompose_measurement_variance",
- "get_filtered_states",
- "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..dc50e6b4
--- /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_filtered_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..8b417eed
--- /dev/null
+++ b/src/skillmodels/af/estimate.py
@@ -0,0 +1,484 @@
+"""Main driver for the AF estimation procedure."""
+
+import warnings
+
+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 validate_af_model
+from skillmodels.amn.estimate import estimate_amn
+from skillmodels.common.constraints import FixedConstraintWithValue
+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,
+ af_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).
+ af_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.
+
+ """
+ jax.config.update("jax_enable_x64", val=True)
+
+ if af_options is None:
+ af_options = AFEstimationOptions()
+
+ af_options = _resolve_optimizer_backend(af_options, model_spec, constraints)
+
+ validate_af_model(model_spec)
+ 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 `initialization_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.initialization_strategy == "amn":
+ amn_result = estimate_amn(model_spec=model_spec, data=data)
+ amn_start = amn_result.all_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,
+ n_mixture_components=af_options.n_mixture_components,
+ optimizer_backend=af_options.optimizer_backend,
+ 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,
+ initialization_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 = _filter_step_constraints(
+ constraints, optimizer_backend=af_options.optimizer_backend
+ )
+
+ # 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 + jaxopt
+ # update). 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),
+ all_params=all_params,
+ model_spec=model_spec,
+ conditional_distributions=conditional_dists_out,
+ )
+
+
+_PROBABILITY_TRANSITIONS = frozenset(
+ {"log_ces", "log_ces_with_constant", "log_ces_general"}
+)
+
+
+def _resolve_optimizer_backend(
+ af_options: AFEstimationOptions,
+ model_spec: ModelSpec,
+ constraints: list[om.constraints.Constraint] | None,
+) -> AFEstimationOptions:
+ """Resolve `optimizer_backend="auto"` to "jaxopt" or "optimagic".
+
+ Pick `"jaxopt"` iff a JAX GPU is visible and the model is
+ jaxopt-compatible (no `log_ces*` transition -- which triggers a
+ `ProbabilityConstraint` jaxopt can't fold -- and no user-supplied
+ constraints, which would arrive as equality / probability
+ constraints that jaxopt also can't fold). Otherwise fall back to
+ `"optimagic"`.
+
+ Explicit `"jaxopt"` / `"optimagic"` requests are honoured as-is.
+ """
+ if af_options.optimizer_backend != "auto":
+ return af_options
+
+ has_gpu = any(d.platform == "gpu" for d in jax.devices())
+ uses_probability_transition = any(
+ spec.transition_function in _PROBABILITY_TRANSITIONS
+ for spec in model_spec.factors.values()
+ )
+ has_user_constraints = bool(constraints)
+
+ use_jaxopt = (
+ has_gpu and not uses_probability_transition and not has_user_constraints
+ )
+ resolved = "jaxopt" if use_jaxopt else "optimagic"
+
+ return AFEstimationOptions(
+ n_halton_points=af_options.n_halton_points,
+ n_halton_points_shock=af_options.n_halton_points_shock,
+ n_mixture_components=af_options.n_mixture_components,
+ optimizer_backend=resolved,
+ 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,
+ initialization_strategy=af_options.initialization_strategy,
+ keep_conditional_distributions=af_options.keep_conditional_distributions,
+ n_halton_points_posterior_summary=af_options.n_halton_points_posterior_summary,
+ )
+
+
+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 _filter_step_constraints(
+ constraints: list[om.constraints.Constraint] | None,
+ *,
+ optimizer_backend: str,
+) -> list[om.constraints.Constraint] | None:
+ """Strip jaxopt-incompatible constraints from the per-step list.
+
+ Cross-period equality groups are still extracted upstream by
+ `_extract_equality_groups` and propagated via fixed-value pinning
+ in `_propagate_equality_groups`, so dropping the equality
+ constraints from the per-step optimizer's list does not silently
+ erase that channel. Within-step equality constraints, however,
+ have no jaxopt analogue and *are* lost; warn once so the user
+ knows the model becomes weaker under `optimizer_backend="jaxopt"`.
+ """
+ if optimizer_backend != "jaxopt" or not constraints:
+ return constraints
+ filtered: list[om.constraints.Constraint] = [
+ c for c in constraints if isinstance(c, FixedConstraintWithValue)
+ ]
+ if len(filtered) != len(constraints):
+ dropped = len(constraints) - len(filtered)
+ warnings.warn(
+ f"AF jaxopt backend cannot enforce {dropped} non-fixed user "
+ "constraint(s) (e.g. EqualityConstraint). Cross-period equality "
+ "groups are still propagated via fixed-value pinning, but "
+ "within-step equalities are dropped. Switch to "
+ "`optimizer_backend='optimagic'` if those are load-bearing.",
+ RuntimeWarning,
+ stacklevel=3,
+ )
+ return filtered
+
+
+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..05211674
--- /dev/null
+++ b/src/skillmodels/af/inference.py
@@ -0,0 +1,1062 @@
+"""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: per-observation
+scores are computed once at the optimum, then for each of ``n_boot``
+replicates we resample caseids with replacement, average their scores,
+and take a one-step Newton update from the optimum. 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). Per-observation scores are computed once at the
+ optimum; for each of ``n_boot`` replicates we resample caseids with
+ replacement, average the resampled scores, and apply a one-step
+ Newton update from the optimum:
+
+ theta_b = theta_hat - A_t^{-1} * bar_g_b
+
+ where ``A_t`` is the period-``t`` information matrix and
+ ``bar_g_b`` is the bootstrap-averaged per-obs score restricted to
+ period-``t`` free parameters. Periods are resampled independently
+ — joint resampling would couple periods through the
+ block-diagonal information matrix the same way separate draws do,
+ so we report own-block bootstrap SEs.
+
+ The analytical Newey-McFadden sandwich is **not** provided: as AF
+ §4.2 notes, the closed-form variance ignores estimation error in
+ the previous-period nuisance parameters tau_{t-1}, ..., tau_1, so
+ it is incorrect for any t >= 1. The 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,
+ )
+
+ # Precompute per-period score and information matrices at the
+ # optimum. The bootstrap then resamples score rows (caseids) and
+ # applies a one-step Newton update; no re-estimation per replicate.
+ period_score_info = _compute_block_diagonal_sandwich(result, metas)
+
+ rng = np.random.default_rng(seed)
+ all_params = result.all_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])
+
+ for period_res in period_score_info:
+ score = np.array(period_res.score_matrix) # (n, n_free_own)
+ info = np.array(period_res.information_matrix)
+ # Use pinv for the same null-space-tolerant reasons as
+ # ``_block_diagonal_sandwich_single``.
+ a_inv = np.linalg.pinv(info)
+
+ idx = rng.integers(0, n_clusters, size=(n_boot, n_clusters))
+ mean_score = score[idx].mean(axis=1) # (n_boot, n_free_own)
+ delta = -mean_score @ a_inv.T # (n_boot, n_free_own); one-step shift
+
+ global_cols = np.array(
+ [pos_lookup[loc] for loc in period_res.free_param_locs],
+ dtype=np.int64,
+ )
+ replicate_values[:, global_cols] += 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 = af_options.n_mixture_components
+
+ 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)
+
+
+__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..4803bb23
--- /dev/null
+++ b/src/skillmodels/af/initial_period.py
@@ -0,0 +1,713 @@
+"""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.jaxopt_backend import minimize_with_jaxopt
+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 = af_options.n_mixture_components
+ 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.initialization_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
+ )
+
+ if af_options.optimizer_backend == "jaxopt":
+ opt_res = minimize_with_jaxopt(
+ loglike_and_grad=loglike_and_grad,
+ full_params_df=full_params_df,
+ constraints=combined_constraints,
+ optimizer_options=dict(af_options.optimizer_options),
+ )
+ else:
+ 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/jaxopt_backend.py b/src/skillmodels/af/jaxopt_backend.py
new file mode 100644
index 00000000..0d5302da
--- /dev/null
+++ b/src/skillmodels/af/jaxopt_backend.py
@@ -0,0 +1,207 @@
+"""JAX-native optimizer backend for AF estimation via `jaxopt.LBFGSB`.
+
+Runs L-BFGS-B directly on device, so the params vector never leaves
+the accelerator between iterations. This avoids the host->device->host
+roundtrip that occurs once per iteration when AF's likelihood is
+called from optimagic.
+
+The backend supports `FixedConstraintWithValue` (pinned-value rows)
+plus parameter bounds. It does NOT support `ProbabilityConstraint`
+or `EqualityConstraint`: those require constraint folding that
+optimagic provides and that jaxopt's LBFGS-B does not. Models that
+include log_ces transitions or cross-section equalities should use
+`optimizer_backend="optimagic"`.
+"""
+
+import os
+
+# Belt-and-suspenders for callers that import this module directly without
+# going through `skillmodels/__init__.py`. Two things must be set before
+# `import jax` / `from jaxopt import LBFGSB`:
+#
+# 1. `JAX_ENABLE_X64=1` — the AF pipeline assumes float64 throughout.
+# 2. `XLA_FLAGS=--xla_disable_hlo_passes=permutation_sort_simplifier` —
+# works around a JAX 0.10 bug where the `argsort` inside
+# `LBFGSB.update` emits an s32 reduction accumulator into an s64
+# scatter operand, and XLA's `permutation_sort_simplifier` pass
+# rejects the mismatch. See `skillmodels/__init__.py` for the full
+# explanation.
+os.environ.setdefault("JAX_ENABLE_X64", "1")
+
+_xla_pass_disable = "--xla_disable_hlo_passes=permutation_sort_simplifier" # noqa: S105
+_existing_xla_flags = os.environ.get("XLA_FLAGS", "")
+if _xla_pass_disable not in _existing_xla_flags:
+ os.environ["XLA_FLAGS"] = f"{_existing_xla_flags} {_xla_pass_disable}".strip()
+
+import jax # noqa: E402
+
+jax.config.update("jax_enable_x64", True) # noqa: FBT003
+
+from collections.abc import Callable # noqa: E402
+from dataclasses import dataclass # noqa: E402
+from typing import Any, cast # noqa: E402
+
+import jax.numpy as jnp # noqa: E402
+import numpy as np # noqa: E402
+import optimagic as om # noqa: E402
+import pandas as pd # noqa: E402
+from jax import Array # noqa: E402
+from jaxopt import LBFGSB # noqa: E402
+
+from skillmodels.common.constraints import FixedConstraintWithValue # noqa: E402
+
+
+@dataclass(frozen=True)
+class JaxoptResult:
+ """Minimal stand-in for `optimagic.OptimizeResult`.
+
+ Only carries the fields downstream AF code reads from the
+ optimagic result: ``params`` (DataFrame with the optimized
+ ``"value"`` column), ``fun`` (the minimized negative
+ log-likelihood, matching the attribute name on
+ `optimagic.OptimizeResult`), and ``success``.
+ """
+
+ params: pd.DataFrame
+ fun: float
+ success: bool
+ n_iter: int
+
+
+def _check_constraints_supported(
+ constraints: list[om.constraints.Constraint],
+) -> None:
+ for c in constraints:
+ if not isinstance(c, FixedConstraintWithValue):
+ msg = (
+ f"jaxopt backend supports only `FixedConstraintWithValue`; "
+ f"got `{type(c).__name__}`. Use "
+ f'`optimizer_backend="optimagic"` for models with '
+ f"probability or equality constraints (e.g. log_ces "
+ f"transitions or within-step / cross-period equalities)."
+ )
+ raise NotImplementedError(msg)
+
+
+def minimize_with_jaxopt(
+ loglike_and_grad: Callable[[Array], tuple[Array, Array]],
+ full_params_df: pd.DataFrame,
+ constraints: list[om.constraints.Constraint],
+ optimizer_options: dict[str, Any] | None = None,
+) -> JaxoptResult:
+ """Minimize the negative log-likelihood with `jaxopt.LBFGSB`.
+
+ The optimization is performed over the un-pinned coordinates only;
+ pinned values from `FixedConstraintWithValue` rows are spliced
+ back into the full parameter vector before each likelihood
+ evaluation. Bounds on the free coordinates are taken from
+ `full_params_df["lower_bound"]` and `full_params_df["upper_bound"]`.
+
+ Args:
+ loglike_and_grad: Jitted function mapping the full parameter
+ vector (length `n_params`) to ``(neg_loglike, gradient)``.
+ full_params_df: DataFrame indexed by the AF params MultiIndex
+ with columns ``value``, ``lower_bound``, ``upper_bound``.
+ constraints: Must contain only `FixedConstraintWithValue`
+ objects. Other constraint kinds raise `NotImplementedError`.
+ optimizer_options: Forwarded to `LBFGSB` (e.g. `maxiter`,
+ `tol`, `history_size`).
+
+ Return:
+ `JaxoptResult` carrying the final params DataFrame and the
+ attained criterion value.
+
+ """
+ _check_constraints_supported(constraints)
+ options = dict(optimizer_options or {})
+
+ # Pre-compute which positions are pinned + their target values.
+ is_pinned = np.zeros(len(full_params_df), dtype=bool)
+ pinned_values = full_params_df["value"].to_numpy().astype(np.float64).copy()
+ for c in constraints:
+ # `_check_constraints_supported` guarantees every entry is
+ # `FixedConstraintWithValue`; the cast lets ty see `loc`/`value`.
+ fc = cast("FixedConstraintWithValue", c)
+ idx = full_params_df.index.get_loc(fc.loc)
+ is_pinned[idx] = True
+ pinned_values[idx] = float(fc.value) # ty: ignore[invalid-argument-type]
+
+ free_idx_np = np.where(~is_pinned)[0]
+ free_idx = jnp.array(free_idx_np)
+ full_template = jnp.array(pinned_values)
+ free_initial = jnp.array(pinned_values[free_idx_np])
+
+ raw_lower = full_params_df["lower_bound"].to_numpy()[free_idx_np]
+ raw_upper = full_params_df["upper_bound"].to_numpy()[free_idx_np]
+ # jaxopt.LBFGSB rejects non-finite bounds, so clip infinities to a
+ # very wide finite range. The clip is large enough that LBFGSB will
+ # never run into it for sensibly-scaled likelihoods.
+ free_lower = jnp.array(np.where(np.isfinite(raw_lower), raw_lower, -1e30))
+ free_upper = jnp.array(np.where(np.isfinite(raw_upper), raw_upper, 1e30))
+
+ def objective_and_grad(free_vec: Array) -> tuple[Array, Array]:
+ full_vec = full_template.at[free_idx].set(free_vec) # noqa: PD008
+ val, grad = loglike_and_grad(full_vec)
+ return val, grad[free_idx]
+
+ # Match scipy_lbfgsb's stopping rule: stop when EITHER
+ # * max|projected_grad| < gtol_abs ("gtol channel"), OR
+ # * (f_k - f_{k+1}) / max(|f_k|, |f_{k+1}|, 1) < ftol_rel
+ # ("ftol channel"; this is the criterion that typically fires in
+ # practice for skill-formation likelihoods that go locally flat
+ # before the gradient does).
+ # Accept the canonical scipy keys so the same `optimizer_options`
+ # dict works for both backends; fall back to historical jaxopt
+ # names for compatibility.
+ gtol_abs = float(options.pop("convergence_gtol_abs", options.pop("tol", 1e-5)))
+ ftol_rel = float(options.pop("convergence_ftol_rel", 2.22e-9))
+ maxiter = int(options.pop("stopping_maxiter", options.pop("maxiter", 15_000)))
+ history_size = int(options.pop("history_size", 10))
+
+ solver = LBFGSB(
+ fun=objective_and_grad,
+ value_and_grad=True,
+ # `maxiter` here is jaxopt's *internal* fail-safe cap; the outer
+ # Python loop below drives stopping. Set huge so jaxopt never
+ # interrupts us mid-iteration.
+ maxiter=maxiter,
+ tol=gtol_abs,
+ history_size=history_size,
+ **options,
+ )
+
+ bounds = (free_lower, free_upper)
+ state = solver.init_state(free_initial, bounds=bounds)
+ params = free_initial
+ prev_val = jnp.inf
+ stopped_on = "maxiter"
+ n_iter = 0
+ # fallback if `maxiter == 0` and the loop body never executes.
+ for n_iter in range(1, maxiter + 1): # noqa: B007
+ params, state = solver.update(params, state, bounds=bounds)
+ cur_val = state.value
+ # gtol channel
+ if bool(state.error < gtol_abs):
+ stopped_on = "gtol"
+ break
+ # ftol channel (skip first iteration where prev_val == inf)
+ denom = jnp.maximum(
+ jnp.maximum(jnp.abs(prev_val), jnp.abs(cur_val)),
+ 1.0,
+ )
+ rel_drop = jnp.abs(prev_val - cur_val) / denom
+ if bool(jnp.isfinite(prev_val)) and bool(rel_drop < ftol_rel):
+ stopped_on = "ftol"
+ break
+ prev_val = cur_val
+
+ final_full = full_template.at[free_idx].set(params) # noqa: PD008
+ result_df = full_params_df.copy()
+ result_df["value"] = np.asarray(jax.device_get(final_full))
+
+ return JaxoptResult(
+ params=result_df,
+ fun=float(jax.device_get(state.value)),
+ success=stopped_on != "maxiter",
+ n_iter=n_iter,
+ )
diff --git a/src/skillmodels/af/likelihood.py b/src/skillmodels/af/likelihood.py
new file mode 100644
index 00000000..c1bbd41f
--- /dev/null
+++ b/src/skillmodels/af/likelihood.py
@@ -0,0 +1,1263 @@
+"""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.
+
+ 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).
+
+ """
+ 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
+ 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``.
+ """
+ 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.
+ 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..a1e9a241
--- /dev/null
+++ b/src/skillmodels/af/posterior_states.py
@@ -0,0 +1,262 @@
+"""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.halton import create_halton_nodes_and_weights
+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,
+) -> dict[str, dict[str, Any]]:
+ """Compute posterior state means from AF estimation results.
+
+ For each individual i and period t, compute::
+
+ E[theta_t | Z_t,i] = sum_q w_q theta_q p(Z_t,i | theta_q)
+ / sum_q w_q p(Z_t,i | theta_q)
+
+ where theta_q are quadrature nodes from the estimated conditional
+ distribution at period t, and p(Z_t,i | theta_q) is the measurement
+ density.
+
+ Args:
+ af_result: Result from `estimate_af()`.
+ model_spec: Model specification.
+ data: Dataset in long format with MultiIndex (id, period).
+ n_halton_points: Quadrature points for posterior computation.
+
+ 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
+
+ nodes, weights = create_halton_nodes_and_weights(n_halton_points, n_state)
+
+ 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"],
+ nodes=nodes,
+ weights=weights,
+ )
+
+ 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,
+ nodes: Array,
+ weights: Array,
+) -> Array:
+ """Compute posterior means for all individuals at one period.
+
+ Return shape (n_obs, n_factors).
+ """
+ n_components = len(cond_dist.components)
+ means = jnp.stack([c.mean for c in cond_dist.components])
+ chol_covs = jnp.stack([c.chol_cov for c in cond_dist.components])
+ mix_weights = cond_dist.mixture_weights
+
+ residuals_base = measurements - control_contrib
+
+ def _single_obs(residual_base: Array) -> Array:
+ """Posterior mean for one individual."""
+
+ def _node_kernel(z_q: Array) -> tuple[Array, Array]:
+ """Return (log_weight, weighted_theta) for one quadrature node."""
+ log_component_vals = []
+ theta_components = []
+ for l_idx in range(n_components):
+ theta = means[l_idx] + chol_covs[l_idx] @ z_q
+ residuals = residual_base - full_loadings @ theta
+ log_lik = jnp.sum(
+ _log_normal_pdf(
+ residuals,
+ jnp.zeros_like(residuals),
+ meas_sds,
+ )
+ )
+ log_component_vals.append(
+ jnp.log(mix_weights[l_idx] + 1e-300) + log_lik
+ )
+ theta_components.append(theta)
+
+ log_w = jax.scipy.special.logsumexp(jnp.array(log_component_vals))
+ # Weighted theta across mixture components
+ comp_weights = jax.nn.softmax(jnp.array(log_component_vals))
+ avg_theta = jnp.zeros_like(theta_components[0])
+ for cw, tv in zip(comp_weights, theta_components, strict=True):
+ avg_theta = avg_theta + cw * tv
+ return log_w, avg_theta
+
+ log_ws, thetas = jax.vmap(_node_kernel)(nodes)
+
+ # Posterior weights: softmax of log_ws + log(quadrature_weights)
+ log_posterior = log_ws + jnp.log(weights)
+ posterior_weights = jax.nn.softmax(log_posterior)
+
+ return jnp.sum(posterior_weights[:, None] * thetas, axis=0)
+
+ return jax.vmap(_single_obs)(residuals_base)
diff --git a/src/skillmodels/af/transition_period.py b/src/skillmodels/af/transition_period.py
new file mode 100644
index 00000000..6afda51e
--- /dev/null
+++ b/src/skillmodels/af/transition_period.py
@@ -0,0 +1,1262 @@
+"""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.
+"""
+
+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.jaxopt_backend import JaxoptResult, minimize_with_jaxopt
+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) where the
+ distribution represents f(theta_t | data_{0:t}).
+
+ """
+ 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 | JaxoptResult]:
+ """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` (or
+ `jaxopt.LBFGSB` when `af_options.optimizer_backend == "jaxopt"`).
+
+ 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
+ )
+
+ if af_options.optimizer_backend == "jaxopt":
+ opt_res = minimize_with_jaxopt(
+ loglike_and_grad=loglike_and_grad,
+ full_params_df=full_params_df,
+ constraints=combined_constraints,
+ optimizer_options=dict(af_options.optimizer_options),
+ )
+ else:
+ 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.initialization_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.initialization_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..4dae9e88
--- /dev/null
+++ b/src/skillmodels/af/types.py
@@ -0,0 +1,430 @@
+"""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."""
+
+ n_mixture_components: int
+ """Gaussian mixture components for initial distribution."""
+
+ optimizer_backend: Literal["auto", "optimagic", "jaxopt"]
+ """Optimizer backend.
+
+ `"auto"` (default) picks `"jaxopt"` when a JAX GPU is visible and
+ the model is jaxopt-compatible (no `log_ces` transitions that
+ would trigger `ProbabilityConstraint`s, no cross-section
+ `EqualityConstraint`s passed via `estimate_af(constraints=...)`).
+ Otherwise falls back to `"optimagic"`. The decision is taken
+ once at the start of `estimate_af` and the resolved value is
+ available on `AFEstimationResult.af_options.optimizer_backend`.
+
+ `"optimagic"` explicit: each period's MLE runs via
+ `optimagic.minimize` with the algorithm in `optimizer_algorithm`.
+ Supports the full set of optimagic constraint kinds
+ (`FixedConstraintWithValue`, `ProbabilityConstraint`,
+ `EqualityConstraint`).
+
+ `"jaxopt"` explicit: keeps the parameter vector on device through
+ the L-BFGS-B iterations via `jaxopt.LBFGSB`, eliminating the
+ host<->device transfer that occurs once per likelihood call when
+ optimagic is used. Supports only `FixedConstraintWithValue`
+ plus bounds; raises on probability or equality constraints
+ (i.e. models with log_ces transitions or cross-section
+ equalities must use `"optimagic"`).
+ """
+
+ optimizer_algorithm: str
+ """Optimization algorithm for each period's MLE.
+
+ Only consulted by the `"optimagic"` backend; ignored when
+ `optimizer_backend="jaxopt"` (jaxopt always uses L-BFGS-B).
+ """
+
+ optimizer_options: MappingProxyType[str, Any]
+ """Additional options passed to the optimizer.
+
+ Forwarded to `optimagic.minimize(**optimizer_options)` for the
+ `"optimagic"` backend or to `jaxopt.LBFGSB(**optimizer_options)`
+ for the `"jaxopt"` backend.
+ """
+
+ 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.
+ """
+
+ initialization_strategy: Literal["constant", "spearman", "amn"]
+ """Strategy for seeding optimizer start values.
+
+ `"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.
+ """
+
+ 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,
+ n_mixture_components: int = 2,
+ optimizer_backend: Literal["auto", "optimagic", "jaxopt"] = "auto",
+ 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,
+ initialization_strategy: Literal["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)
+ if optimizer_backend not in ("auto", "optimagic", "jaxopt"):
+ msg = (
+ 'optimizer_backend must be "auto", "optimagic", or "jaxopt", '
+ f"got {optimizer_backend!r}."
+ )
+ 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, "n_mixture_components", n_mixture_components)
+ object.__setattr__(self, "optimizer_backend", optimizer_backend)
+ 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, "initialization_strategy", initialization_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`. For later periods these are unused (chain replays from
+ period 0).
+
+ 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."""
+
+ all_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)."""
+
+ 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..48bae8e0
--- /dev/null
+++ b/src/skillmodels/af/validate.py
@@ -0,0 +1,124 @@
+"""AF-specific ModelSpec validation."""
+
+import warnings
+
+from skillmodels.common.model_spec import FactorSpec, ModelSpec
+
+# Transition functions compatible with AF estimation (parametric, differentiable).
+_AF_COMPATIBLE_TRANSITIONS = frozenset(
+ {
+ "linear",
+ "translog",
+ "robust_translog",
+ "log_ces",
+ "log_ces_with_constant",
+ "log_ces_general",
+ "linear_and_squares",
+ }
+)
+
+# 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) -> 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
+
+ Raise:
+ ValueError: If validation fails, with a detailed error message.
+
+ """
+ errors: list[str] = []
+ for factor_name, factor_spec in model_spec.factors.items():
+ errors.extend(_validate_factor(factor_name, factor_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
+ if factor_spec.normalizations is None:
+ errors.append(
+ f"Factor '{factor_name}': AF requires explicit normalizations "
+ f"(loading=1, intercept=0 for at least one measurement per period)."
+ )
+
+ # 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
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/estimate.py b/src/skillmodels/amn/estimate.py
new file mode 100644
index 00000000..bc410450
--- /dev/null
+++ b/src/skillmodels/amn/estimate.py
@@ -0,0 +1,182 @@
+"""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 optimagic as om
+import pandas as pd
+from beartype import beartype
+
+from skillmodels._beartype_conf import ESTIMATION_CONF
+from skillmodels.amn.minimum_distance import 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,
+)
+from skillmodels.common.model_spec import ModelSpec
+from skillmodels.common.process_model import process_model
+from skillmodels.common.selector import align_index_names
+
+
+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 _apply_overrides(
+ params: pd.DataFrame,
+ *,
+ fixed_params: pd.DataFrame | None,
+ start_params: pd.DataFrame | None,
+) -> pd.DataFrame:
+ """Overlay user-supplied fixed_params and start_params on `params`.
+
+ `fixed_params` wins over `start_params`, which wins over the
+ estimated values. Rows in the overrides not present in `params` are
+ added; rows in `params` not present in the overrides are kept.
+ """
+ out = params.copy()
+ if start_params is not None and not start_params.empty:
+ aligned = align_index_names(start_params, target_names=out.index.names)
+ merged = out.reindex(out.index.union(aligned.index))
+ merged.loc[aligned.index, "value"] = aligned["value"]
+ out = merged
+ if fixed_params is not None and not fixed_params.empty:
+ aligned = align_index_names(fixed_params, target_names=out.index.names)
+ merged = out.reindex(out.index.union(aligned.index))
+ merged.loc[aligned.index, "value"] = aligned["value"]
+ out = merged
+ return out.sort_index()
+
+
+@beartype(conf=ESTIMATION_CONF)
+def estimate_amn(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ amn_options: AMNEstimationOptions | None = None,
+ start_params: pd.DataFrame | None = None,
+ fixed_params: pd.DataFrame | None = None,
+ constraints: list[om.constraints.Constraint] | None = None,
+) -> 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).
+ amn_options: AMN-specific options. If None, uses defaults.
+ start_params: Optional starting parameter values; overlaid on the
+ estimated combined params DataFrame as well as on Stage 1 EM
+ starts (the latter not yet wired).
+ fixed_params: Parameters to pin during estimation. Currently
+ applied as a post-hoc override on the combined params
+ DataFrame; future revisions may enforce them inside each
+ stage's optimizer.
+ constraints: Reserved for forward-compatibility (equality
+ constraints from optimagic). Not yet honoured inside the AMN
+ stages; pass-through only.
+
+ Return:
+ AMNEstimationResult containing per-stage outputs and the combined
+ params DataFrame.
+
+ """
+ del constraints # forward-compat hook; AMN stages do not yet honour these
+ if amn_options is None:
+ amn_options = AMNEstimationOptions()
+
+ processed_model = process_model(model_spec)
+ layout = build_augmented_measure_layout(processed_model)
+ augmented = build_augmented_measure_matrix(data, processed_model, layout)
+
+ mixture = fit_mixture_em(
+ augmented,
+ n_components=amn_options.n_mixture_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,
+ )
+
+ structural = solve_minimum_distance(
+ mixture,
+ processed_model,
+ weighting=amn_options.minimum_distance_weighting,
+ algorithm=amn_options.optimizer_algorithm,
+ )
+
+ production = simulate_and_regress(
+ structural,
+ processed_model,
+ model_spec,
+ mixture_weights=mixture.weights,
+ n_draws=amn_options.n_simulation_draws,
+ seed=amn_options.seed,
+ investment_endogeneity=amn_options.investment_endogeneity,
+ )
+
+ measurement = _measurement_params_dataframe(structural)
+ all_params = pd.concat(
+ [measurement, production.production_params, production.investment_params]
+ ).sort_index()
+ all_params = _apply_overrides(
+ all_params, fixed_params=fixed_params, start_params=start_params
+ )
+
+ success = structural.success and mixture.converged
+
+ return AMNEstimationResult(
+ model_spec=model_spec,
+ stages=AMNStageResults(
+ mixture=mixture,
+ structural=structural,
+ production=production,
+ ),
+ all_params=all_params,
+ success=success,
+ synthetic_panel=None,
+ )
diff --git a/src/skillmodels/amn/inference.py b/src/skillmodels/amn/inference.py
new file mode 100644
index 00000000..90a89f24
--- /dev/null
+++ b/src/skillmodels/amn/inference.py
@@ -0,0 +1,133 @@
+"""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 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.all_params.index
+ replicate_rows: list[pd.Series] = []
+ n_failed = 0
+ for b in range(n_boot):
+ boot_data = _resample_by_caseid(data, rng)
+ try:
+ boot_result = estimate_amn(
+ result.model_spec,
+ boot_data,
+ amn_options,
+ )
+ row = boot_result.all_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..b73b0073
--- /dev/null
+++ b/src/skillmodels/amn/minimum_distance.py
@@ -0,0 +1,559 @@
+"""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.
+"""
+
+from dataclasses import dataclass
+
+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
+
+
+@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 is free (the mixture mean
+ # shifts the slot).
+ 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_free_mask[aug_idx] = True
+
+ # 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_free_mask[aug_idx] = True
+
+ 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
+ return float(np.sum(diff_mean**2) + np.sum(diff_cov**2))
+
+
+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
+
+
+def solve_minimum_distance(
+ mixture: MixtureFitResult,
+ processed_model: ProcessedModel,
+ *,
+ weighting: str = "identity",
+ algorithm: str = "scipy_lbfgsb",
+) -> 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, fast) or ``"optimal"``
+ (uses an Avar estimate of the EM moments).
+ algorithm: optimagic algorithm name (default ``scipy_lbfgsb``).
+
+ 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 = "Optimal weighting not yet implemented; use 'identity'."
+ 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)
+
+ 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)
+
+ def fun(theta: np.ndarray) -> float:
+ return _objective(
+ theta,
+ struct,
+ slices,
+ n_components=n_components,
+ mixture_weights=mixture.weights,
+ target_means=target_means,
+ target_covs=target_covs,
+ )
+
+ result = om.minimize(
+ fun=fun,
+ params=flat0,
+ algorithm=algorithm,
+ bounds=om.Bounds(lower=lower),
+ )
+ 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/mixture_em.py b/src/skillmodels/amn/mixture_em.py
new file mode 100644
index 00000000..7c09303a
--- /dev/null
+++ b/src/skillmodels/amn/mixture_em.py
@@ -0,0 +1,302 @@
+"""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`).
+"""
+
+from collections.abc import Mapping
+from itertools import chain
+
+import numpy as np
+import pandas as pd
+from sklearn.mixture import GaussianMixture
+
+from skillmodels.amn.types import AugmentedMeasureLayout, MixtureFitResult
+from skillmodels.common.types import ProcessedModel
+
+
+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_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,
+) -> MixtureFitResult:
+ """Fit a Gaussian mixture to the augmented measure matrix via EM.
+
+ Uses `sklearn.mixture.GaussianMixture` under the hood with k-means
+ initialization and multiple restarts. Rows containing any NaN are
+ dropped before fitting (listwise complete-case); a future revision
+ will integrate over missing dimensions in the E-step.
+
+ 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.
+
+ 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)
+
+ complete_mask = ~np.isnan(augmented).any(axis=1)
+ n_complete = int(complete_mask.sum())
+ if n_complete < n_components:
+ msg = (
+ f"Only {n_complete} complete-case rows available for "
+ f"{n_components}-component mixture."
+ )
+ raise ValueError(msg)
+ 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)
+
+ 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=np.asarray(gm.weights_, dtype=float),
+ means=np.asarray(gm.means_, dtype=float),
+ covariances=np.asarray(gm.covariances_, dtype=float),
+ loglikelihood=float(gm.score(fit_data) * n_complete),
+ n_iter=int(gm.n_iter_),
+ converged=bool(gm.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..9e9d9247
--- /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_filtered_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..4ba8f029
--- /dev/null
+++ b/src/skillmodels/amn/simulate_and_regress.py
@@ -0,0 +1,450 @@
+"""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
+
+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],
+) -> tuple[dict[str, float], float]:
+ """OLS regression with an intercept (added as the last column).
+
+ Returns:
+ ``(params_by_name, residual_sd)`` with `constant` included as
+ the trailing parameter.
+
+ """
+ n = x_design.shape[0]
+ full_design = np.column_stack([x_design, np.ones(n)])
+ coefs, *_ = np.linalg.lstsq(full_design, y, rcond=None)
+ resid = y - full_design @ coefs
+ sd = float(np.sqrt(np.mean(resid**2)))
+ out = dict(zip([*regressor_names, "constant"], coefs.tolist(), strict=True))
+ return out, sd
+
+
+def _fit_log_ces(
+ y: np.ndarray,
+ x_design: np.ndarray,
+ regressor_names: list[str],
+ *,
+ with_constant: bool,
+) -> 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.
+ """
+ n_reg = len(regressor_names)
+ eps = 1e-12
+
+ 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
+ return pred - y
+
+ n_unknowns = n_reg + (1 if with_constant 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
+ 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.
+ """
+ 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 _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,
+) -> 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.
+
+ """
+ init_overrides = init_overrides or {}
+
+ @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:
+ preds = predict_batch(jnp.asarray(theta_np), states_jnp)
+ return np.asarray(preds) - y
+
+ theta0 = np.zeros(len(param_names))
+ for name, val in init_overrides.items():
+ if name in param_names:
+ theta0[param_names.index(name)] = val
+ # phi-style elasticity defaults: any "phi", "rho", "sigma" param
+ # that doesn't otherwise have an override gets seeded at 0.5 so the
+ # CES / general-CES log expressions don't divide by zero.
+ for j, name in enumerate(param_names):
+ if name in {"phi", "rho", "sigma"} and name not in init_overrides:
+ theta0[j] = 0.5
+ # Simplex-style "gammas" (anything listed as a factor name in the
+ # param list) get a uniform initial share if the function looks
+ # CES-shaped (has a "phi"-like param).
+ has_elasticity = any(n in {"phi", "rho", "sigma"} for n in param_names)
+ if has_elasticity:
+ share_candidates = [
+ j
+ for j, n in enumerate(param_names)
+ if n not in {"phi", "rho", "sigma", "constant"}
+ ]
+ if share_candidates:
+ theta0[share_candidates] = 1.0 / len(share_candidates)
+
+ 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 = dict(zip(param_names, [float(v) for v in theta], strict=True))
+ 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],
+) -> 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.
+ """
+ if transition_name == "linear":
+ return _fit_linear(y, x_design, regressor_names)
+ if transition_name == "log_ces":
+ return _fit_log_ces(y, x_design, regressor_names, with_constant=False)
+ if transition_name == "log_ces_with_constant":
+ return _fit_log_ces(y, x_design, regressor_names, with_constant=True)
+
+ func, param_names = _resolve_transition_callable(
+ transition_name, factor, processed_model, model_spec
+ )
+ return _fit_generic_nls(func, param_names, y, x_design)
+
+
+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 simulate_and_regress( # noqa: C901
+ structural: MinimumDistanceResult,
+ processed_model: ProcessedModel,
+ model_spec: ModelSpec,
+ mixture_weights: np.ndarray,
+ *,
+ n_draws: int = 100_000,
+ seed: int = 0,
+ investment_endogeneity: bool = True,
+) -> 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.
+ investment_endogeneity: Reserved for future control-function
+ extension; currently the investment equation is fit with
+ plain OLS regardless.
+
+ Return:
+ ProductionFitResult with production-function and investment-equation
+ parameter DataFrames.
+
+ """
+ del investment_endogeneity # placeholder; control function is v2
+
+ panel = _draw_factor_panel(structural, mixture_weights, n_draws=n_draws, seed=seed)
+
+ periods = processed_model.labels.periods
+ endog_info = processed_model.endogenous_factors_info
+ 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()
+
+ for factor in processed_model.labels.latent_factors:
+ is_endog = (
+ factor in endog_info.factor_info
+ and endog_info.factor_info[factor].is_endogenous
+ )
+ target_col = _slot_column(t_next, factor)
+ if target_col not in panel.columns:
+ continue
+ y = panel[target_col].to_numpy()
+ trans_name = factor_to_function_name.get(factor, "linear")
+ if trans_name == "constant":
+ continue
+ if is_endog:
+ params, sd = _fit_linear(y, x_design, present_factor_names)
+ for regname, value in params.items():
+ investment_rows.append(
+ ("investment_eq", t, factor, regname, float(value))
+ )
+ investment_rows.append(("investment_sds", t, factor, "-", sd))
+ else:
+ params, sd = _fit_transition(
+ trans_name,
+ factor,
+ processed_model,
+ model_spec,
+ y,
+ x_design,
+ present_factor_names,
+ )
+ for regname, value in params.items():
+ transition_rows.append(
+ ("transition", t, factor, regname, float(value))
+ )
+ transition_rows.append(("shock_sds", t, factor, "-", sd))
+
+ 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..67f7f1b7
--- /dev/null
+++ b/src/skillmodels/amn/start_values.py
@@ -0,0 +1,658 @@
+"""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)
+
+ 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 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 _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
+ 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..17ea0806
--- /dev/null
+++ b/src/skillmodels/amn/types.py
@@ -0,0 +1,293 @@
+"""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."""
+
+ n_mixture_components: int
+ """Components in the Gaussian-mixture approximation to F_{theta,X}."""
+
+ 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 weighting matrix. `"optimal"` uses a 2-step Avar estimate;
+ `"identity"` is faster and the paper's default."""
+
+ investment_endogeneity: bool
+ """If True, Stage 3 includes the control-function residual in the
+ production-function regression (AMN eq. 8). Ignored when the model has
+ no endogenous (investment) factors."""
+
+ 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."""
+
+ def __init__( # noqa: D107
+ self,
+ n_mixture_components: int = 2,
+ 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,
+ *,
+ investment_endogeneity: bool = True,
+ keep_synthetic_panel: bool = False,
+ seed: int = 0,
+ ) -> None:
+ object.__setattr__(self, "n_mixture_components", n_mixture_components)
+ 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, "investment_endogeneity", investment_endogeneity)
+ 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)
+
+
+@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. Empty
+ if the model has no endogenous factors."""
+
+ 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."""
+
+ all_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."""
+
+ 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..adadbeac
--- /dev/null
+++ b/src/skillmodels/chs/__init__.py
@@ -0,0 +1,33 @@
+"""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.
+* `maximization_inputs` — `get_maximization_inputs()`, the canonical
+ entry point that bundles likelihood / gradients / constraints /
+ params template for `optimagic.maximize`.
+* `filtered_states` — `get_filtered_states()` post-estimation helper.
+* `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
+(`get_maximization_inputs`, `get_filtered_states`) so most callers
+don't need to touch the `chs.` prefix. The estimator-agnostic
+`create_state_ranges` lives under `skillmodels.common.state_ranges`.
+"""
+
+from skillmodels.chs.filtered_states import get_filtered_states
+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
+
+__all__ = [
+ "CHSEstimationOptions",
+ "get_filtered_states",
+ "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/filtered_states.py b/src/skillmodels/chs/filtered_states.py
new file mode 100644
index 00000000..d2c7c87a
--- /dev/null
+++ b/src/skillmodels/chs/filtered_states.py
@@ -0,0 +1,120 @@
+"""Functions to compute and process filtered latent states."""
+
+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 that the beartype
+# perimeter at `get_filtered_states` can resolve the annotation
+# without a forward-ref string. The two `types` modules are
+# negligible-cost; AMN's already 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.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_filtered_states(
+ model_spec: ModelSpec,
+ data: pd.DataFrame,
+ params: pd.DataFrame,
+ af_result: AFEstimationResult | None = None,
+ amn_result: AMNEstimationResult | None = None,
+) -> dict[str, dict[str, Any]]:
+ """Compute latent state estimates given data and estimated parameters.
+
+ For CHS (Kalman filter) estimation, computes filtered states via the
+ debug likelihood. For AF estimation, computes posterior means via
+ Halton quadrature. For AMN estimation, computes mixture-Schur
+ conditional posteriors of the latent factors given the augmented
+ measure vector.
+
+ Args:
+ model_spec: Model specification.
+ data: Dataset in long format with MultiIndex (id, period).
+ params: Estimated parameter DataFrame.
+ af_result: If provided, use AF posterior computation instead of
+ CHS Kalman filtering.
+ amn_result: If provided, use AMN mixture-Schur posteriors
+ instead. Only one of `af_result` and `amn_result` may be
+ set.
+
+ Return:
+ Dict with "unanchored_states" (always present) and
+ "anchored_states" (CHS only), each containing "states"
+ DataFrame and "state_ranges".
+
+ """
+ if af_result is not None and amn_result is not None:
+ msg = "Pass only one of af_result / amn_result."
+ raise ValueError(msg)
+
+ if af_result is not None:
+ from skillmodels.af.posterior_states import ( # noqa: PLC0415
+ get_af_posterior_states,
+ )
+
+ return get_af_posterior_states(
+ af_result=af_result,
+ model_spec=model_spec,
+ data=data,
+ )
+
+ if amn_result is not None:
+ from skillmodels.amn.posterior_states import ( # noqa: PLC0415
+ get_amn_posterior_states,
+ )
+
+ return get_amn_posterior_states(
+ amn_result=amn_result,
+ data=data,
+ )
+
+ 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,
+ },
+ }
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 68%
rename from src/skillmodels/maximization_inputs.py
rename to src/skillmodels/chs/maximization_inputs.py
index a01c55cd..f8f99fb7 100644
--- a/src/skillmodels/maximization_inputs.py
+++ b/src/skillmodels/chs/maximization_inputs.py
@@ -8,37 +8,49 @@
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,
-)
-from skillmodels.kalman_filters import (
+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.start_values import get_spearman_start_params
+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 +59,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 +86,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 +94,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 +122,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 +145,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 +202,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 +222,37 @@ 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(model_spec=model_spec, data=data)
+ # First fill template via Spearman for entries AMN doesn't touch
+ # (mixture weights, initial Cholesky diagonals not directly
+ # produced by AMN's three stages); then overlay AMN values onto
+ # the common index. Skip indices pre-pinned by
+ # `enforce_fixed_constraints`.
+ pre_pinned = params_template["value"].notna()
+ params_template = get_spearman_start_params(
+ model_spec=model_spec,
+ data=data,
+ params_template=params_template,
+ )
+ common = amn_result.all_params.index.intersection(params_template.index)
+ free_common = common[~pre_pinned.reindex(common, fill_value=False)]
+ params_template.loc[free_common, "value"] = amn_result.all_params.loc[
+ free_common, "value"
+ ]
+
+ params_template = project_to_probability_constraints(
+ params_template=params_template, constraints=constraints
+ )
+
return {
"loglike": loglike,
"loglikeobs": loglikeobs,
@@ -199,6 +263,34 @@ def debug_loglike(params: pd.DataFrame) -> dict[str, Any]:
}
+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 +300,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()
@@ -256,7 +349,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..47c2351b
--- /dev/null
+++ b/src/skillmodels/chs/options.py
@@ -0,0 +1,41 @@
+"""CHS-specific estimation options."""
+
+from dataclasses import dataclass
+from typing import Literal
+
+from skillmodels._beartype_conf import OPTIONS_CONF, beartype_init
+
+
+@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", "spearman", "amn"] = "amn"
+ """How to populate the `value` column of the `params_template`.
+
+ `"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.
+ """
+
+ def __post_init__(self) -> None: # noqa: D105
+ if not self.robust_bounds:
+ object.__setattr__(self, "bounds_distance", 0.0)
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/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 95%
rename from src/skillmodels/check_model.py
rename to src/skillmodels/common/check_model.py
index 18f85af7..90d853cd 100644
--- a/src/skillmodels/check_model.py
+++ b/src/skillmodels/common/check_model.py
@@ -1,11 +1,12 @@
"""Functions to validate model specifications."""
from collections.abc import Mapping
+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 +91,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.")
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/constraints.py b/src/skillmodels/common/constraints.py
similarity index 66%
rename from src/skillmodels/constraints.py
rename to src/skillmodels/common/constraints.py
index 4285ac0e..0207d888 100644
--- a/src/skillmodels/constraints.py
+++ b/src/skillmodels/common/constraints.py
@@ -2,16 +2,17 @@
import functools
import warnings
-from collections.abc import Mapping
-from dataclasses import dataclass
+from collections.abc import Iterable, Mapping
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 (
+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,
Dimensions,
EndogenousFactorsInfo,
@@ -20,39 +21,165 @@
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 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 reconcile_start_to_equality(
+ params: pd.DataFrame,
+ equality_constraints: list[om.constraints.Constraint],
+) -> pd.DataFrame:
+ """Average 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 constraint
+ in `equality_constraints` whose selector is
+ `functools.partial(select_by_loc, loc=...)`, set every member's
+ `value` to the mean of the group's current values. Returns a copy;
+ `params` is not modified.
+ """
+ if not equality_constraints:
+ return params
+ out = params.copy()
+ for c in equality_constraints:
+ loc = _equality_constraint_loc(c)
+ if loc is None or not all(tup in out.index for tup in loc):
+ continue
+ out.loc[loc, "value"] = float(out.loc[loc, "value"].mean())
+ 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 select_by_loc(params: pd.DataFrame, loc: Any) -> pd.DataFrame: # noqa: ANN401
- """Select parameters by location."""
- return params.loc[loc]
+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)
-@dataclass(frozen=True)
-class FixedConstraintWithValue(om.FixedConstraint):
- """Fixed constraint that carries the target value and parameter location.
+ 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
- `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).
- """
+ 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
- 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),
- )
+ 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(
@@ -62,6 +189,7 @@ def get_constraints(
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.
@@ -76,6 +204,8 @@ def get_constraints(
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.
@@ -107,6 +237,7 @@ def get_constraints(
constraints += _get_constraints_for_augmented_periods(
labels=labels,
endogenous_factors_info=endogenous_factors_info,
+ bounds_distance=bounds_distance,
)
return constraints
@@ -148,7 +279,7 @@ def add_bounds(params: pd.DataFrame, bounds_distance: float) -> pd.DataFrame:
return df
-def _is_diagonal_entry(ind_tup: tuple[str, ...]) -> bool:
+def _is_diagonal_entry(ind_tup: tuple[Any, ...]) -> bool:
name2 = ind_tup[-1]
middle_pos = int(len(name2) // 2)
if (
@@ -390,6 +521,7 @@ def _get_anchoring_constraints( # noqa: C901
def _get_constraints_for_augmented_periods(
labels: Labels,
endogenous_factors_info: EndogenousFactorsInfo,
+ bounds_distance: float,
) -> list[om.constraints.Constraint]:
"""Constraints for augmented periods.
@@ -404,6 +536,8 @@ def _get_constraints_for_augmented_periods(
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.
@@ -429,7 +563,16 @@ def _get_constraints_for_augmented_periods(
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:
+ # 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,
@@ -441,7 +584,7 @@ def _get_constraints_for_augmented_periods(
constraints.append(
FixedConstraintWithValue(
loc=loc,
- value=endogenous_factors_info.bounds_distance,
+ value=bounds_distance,
)
)
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/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/model_spec.py b/src/skillmodels/common/model_spec.py
similarity index 82%
rename from src/skillmodels/model_spec.py
rename to src/skillmodels/common/model_spec.py
index 9959c2cd..53ccba78 100644
--- a/src/skillmodels/model_spec.py
+++ b/src/skillmodels/common/model_spec.py
@@ -11,13 +11,14 @@
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 FactorSpec:
"""Specification for a single latent factor."""
@@ -32,6 +33,27 @@ class FactorSpec:
"""Whether this factor is a correction factor."""
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 +64,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 +86,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 +103,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 +113,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 +121,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,7 +129,7 @@ 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.
@@ -129,16 +153,14 @@ def from_dict(cls, d: dict[str, Any]) -> Self:
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),
)
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")
return cls(
@@ -147,7 +169,7 @@ def from_dict(cls, d: dict[str, Any]) -> Self:
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 +185,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,21 +254,6 @@ def with_added_observed_factors(
observed_factors=self.observed_factors + names,
)
- def with_estimation_options(
- self,
- estimation_options: EstimationOptions,
- ) -> Self:
- """Return a new ModelSpec with the given estimation options.
-
- Args:
- estimation_options: New estimation options.
-
- Returns:
- New ModelSpec with the updated estimation options.
-
- """
- return self._replace(estimation_options=estimation_options)
-
def with_anchoring(
self,
anchoring: AnchoringSpec,
diff --git a/src/skillmodels/params_index.py b/src/skillmodels/common/params_index.py
similarity index 99%
rename from src/skillmodels/params_index.py
rename to src/skillmodels/common/params_index.py
index c3a19587..ce0491ac 100644
--- a/src/skillmodels/params_index.py
+++ b/src/skillmodels/common/params_index.py
@@ -2,7 +2,7 @@
import pandas as pd
-from skillmodels.types import (
+from skillmodels.common.types import (
Dimensions,
EndogenousFactorsInfo,
Labels,
diff --git a/src/skillmodels/parse_params.py b/src/skillmodels/common/parse_params.py
similarity index 99%
rename from src/skillmodels/parse_params.py
rename to src/skillmodels/common/parse_params.py
index 21e06a5e..70a0f0c1 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,
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 95%
rename from src/skillmodels/process_model.py
rename to src/skillmodels/common/process_model.py
index 43b5aedc..6bdb61ab 100644
--- a/src/skillmodels/process_model.py
+++ b/src/skillmodels/common/process_model.py
@@ -12,15 +12,14 @@
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.decorators import extract_params, jax_array_output
+from skillmodels.common.model_spec import FactorSpec, ModelSpec
+from skillmodels.common.types import (
Anchoring,
Dimensions,
EndogenousFactorsInfo,
- EstimationOptions,
FactorInfo,
Labels,
MeasurementType,
@@ -72,12 +71,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,
@@ -95,7 +92,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,
@@ -134,7 +130,7 @@ def get_has_endogenous_factors(factors: Mapping[str, FactorSpec]) -> bool:
"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]
+ return bool(endogenous_factors["is_endogenous"].any())
def get_dimensions(
@@ -153,13 +149,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 +173,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]
@@ -325,6 +320,8 @@ def _augment_periods_for_endogenous_factors(
is_endogenous=fspec.is_endogenous,
is_correction=fspec.is_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)
@@ -392,7 +389,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(
@@ -406,7 +403,6 @@ 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 = {}
@@ -422,7 +418,6 @@ 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,
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/transition_functions.py b/src/skillmodels/common/transition_functions.py
similarity index 67%
rename from src/skillmodels/transition_functions.py
rename to src/skillmodels/common/transition_functions.py
index 9e384614..7ca4d7d5 100644
--- a/src/skillmodels/transition_functions.py
+++ b/src/skillmodels/common/transition_functions.py
@@ -29,20 +29,14 @@
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]
+from skillmodels.common.fixed_constraint import FixedConstraintWithValue
+from skillmodels.common.selector import select_by_loc
def linear(states: Array, params: Array) -> Array:
@@ -63,8 +57,6 @@ def identity_constraints_linear(
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
@@ -111,8 +103,6 @@ def identity_constraints_translog(
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
@@ -122,17 +112,22 @@ def identity_constraints_translog(
def log_ces(states: Array, params: Array) -> Array:
- """Log CES production function (KLS version)."""
+ """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``.
+ """
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)
+ 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
@@ -153,12 +148,79 @@ def constraints_log_ces(
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_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.
+ """
+ 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,
- all_factors: tuple[str, ...],
+) -> 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."""
- raise NotImplementedError
+ """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
@@ -227,8 +289,6 @@ def identity_constraints_linear_and_squares(
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
@@ -259,9 +319,12 @@ def params_log_ces_general(factors: tuple[str, ...]) -> list[str]:
def identity_constraints_log_ces_general(
- factors: tuple[str, ...],
- aug_period: int,
- all_factors: tuple[str, ...],
+ 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."""
- raise NotImplementedError
+ """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 92%
rename from src/skillmodels/types.py
rename to src/skillmodels/common/types.py
index 05c8a795..416802e5 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),)
@@ -196,32 +221,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."""
@@ -294,14 +293,13 @@ 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`."""
+@beartype_init(MODEL_SPEC_CONF)
@dataclass(frozen=True)
class Normalizations:
"""Normalizations for factor identification."""
@@ -339,8 +337,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
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..383c1648 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_filtered_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..b8494bad 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_filtered_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 96%
rename from src/skillmodels/visualize_transition_equations.py
rename to src/skillmodels/common/visualize_transition_equations.py
index e74e51b0..b53ec819 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,9 +142,12 @@ 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,
@@ -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_filtered_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,6 +214,7 @@ 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)
@@ -251,13 +260,6 @@ def get_transition_plots( # noqa: C901, PLR0912
if not processed_model.endogenous_factors_info.factor_info[lf].is_correction
]
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,
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/exceptions.py b/src/skillmodels/exceptions.py
new file mode 100644
index 00000000..c2ddfaf6
--- /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_filtered_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/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..78328a97
--- /dev/null
+++ b/tests/test_af_equality_propagation.py
@@ -0,0 +1,242 @@
+"""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,
+ n_mixture_components=1,
+ 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,
+ af_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..7d3851c5
--- /dev/null
+++ b/tests/test_af_estimate.py
@@ -0,0 +1,2238 @@
+"""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
+from skillmodels.af.types import ChainLink
+from skillmodels.chs.filtered_states import get_filtered_states
+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 (
+ 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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(
+ model_spec=model2_af,
+ data=model2_data,
+ af_options=af_options,
+ )
+
+ # Basic checks
+ assert len(result.period_results) == 3
+ assert result.all_params is not None
+ assert len(result.all_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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(
+ model_spec=model2_af,
+ data=model2_data,
+ af_options=af_options,
+ )
+
+ # Compare period 0 measurement SDs
+ af_meas_sds = result.all_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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(model_spec=model, data=data, af_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.all_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,
+ af_options=AFEstimationOptions(
+ n_halton_points=50,
+ n_halton_points_shock=20,
+ n_mixture_components=1,
+ 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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(model_spec=model, data=data, af_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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(model_spec=model, data=data, af_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,
+ af_options=AFEstimationOptions(
+ n_halton_points=40,
+ n_halton_points_shock=20,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=60,
+ n_halton_points_shock=30,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ n_mixture_components=2,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ result = estimate_af(
+ model_spec=model,
+ data=data,
+ af_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_filtered_states() -> None:
+ """Verify get_filtered_states works with AF results.
+
+ Run AF on a simple single-factor model, then call get_filtered_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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ ),
+ )
+
+ result = get_filtered_states(
+ model_spec=model,
+ data=data,
+ params=af_result.all_params,
+ af_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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=40,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=30,
+ n_halton_points_shock=15,
+ n_mixture_components=1,
+ 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,
+ af_options=AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ 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")
diff --git a/tests/test_af_inference.py b/tests/test_af_inference.py
new file mode 100644
index 00000000..e7fa1f9b
--- /dev/null
+++ b/tests/test_af_inference.py
@@ -0,0 +1,246 @@
+"""Tests for ``skillmodels.af.inference.compute_af_standard_errors``.
+
+The AF inference path is the score bootstrap of Antweiler & Freyberger
+(2025) §4.2 (Armstrong-Bertanha-Hong 2014 style). 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 numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.af.estimate import estimate_af
+from skillmodels.af.inference import (
+ AFInferenceResult,
+ compute_af_standard_errors,
+)
+from skillmodels.af.types import AFEstimationOptions
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+ fit = estimate_af(model_spec=model, data=data, af_options=af_opts)
+ inference = compute_af_standard_errors(fit, data, af_opts, n_boot=2000, seed=0)
+ return inference, fit.all_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,
+ n_mixture_components=1,
+ 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, af_options=af_opts)
+ fit_large = estimate_af(model_spec=model, data=data_large, af_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})"
+ )
diff --git a/tests/test_af_initialization.py b/tests/test_af_initialization.py
new file mode 100644
index 00000000..3a890909
--- /dev/null
+++ b/tests/test_af_initialization.py
@@ -0,0 +1,106 @@
+"""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_initialization_strategy_is_amn():
+ """Default initialization runs the full AMN estimator upfront."""
+ opts = AFEstimationOptions()
+
+ assert opts.initialization_strategy == "amn"
+
+
+def test_initialization_strategy_can_be_set_to_spearman():
+ """Legacy Spearman pre-pass is available under the `"spearman"` name."""
+ opts = AFEstimationOptions(initialization_strategy="spearman")
+
+ assert opts.initialization_strategy == "spearman"
+
+
+def test_initialization_strategy_can_be_set_to_constant():
+ """Legacy constant init remains available for regression testing."""
+ opts = AFEstimationOptions(
+ initialization_strategy="constant",
+ )
+
+ assert opts.initialization_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_initialization_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.n_mixture_components == 2
+ 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_jaxopt_backend.py b/tests/test_af_jaxopt_backend.py
new file mode 100644
index 00000000..eb9c5b91
--- /dev/null
+++ b/tests/test_af_jaxopt_backend.py
@@ -0,0 +1,282 @@
+"""Tests for the jaxopt optimizer backend in AF estimation.
+
+The jaxopt backend (`optimizer_backend="jaxopt"`) keeps the parameter
+vector on device through L-BFGS-B iterations, avoiding the
+host<->device transfer that optimagic incurs once per likelihood call.
+It supports `FixedConstraintWithValue` plus bounds; probability and
+equality constraints raise.
+"""
+
+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.jaxopt_backend import (
+ JaxoptResult,
+ minimize_with_jaxopt,
+)
+from skillmodels.common.constraints import FixedConstraintWithValue
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+
+
+def _linear_single_factor_model() -> ModelSpec:
+ return ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * 2,
+ intercepts=({"m1": 0},) * 2,
+ ),
+ transition_function="linear",
+ ),
+ },
+ )
+
+
+def _linear_single_factor_data(n_obs: int = 200, seed: int = 42) -> pd.DataFrame:
+ rng = np.random.default_rng(seed)
+ theta = rng.normal(0, 1, n_obs)
+ rows = []
+ for i in range(n_obs):
+ for t in range(2):
+ rows.append(
+ {
+ "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),
+ }
+ )
+ return pd.DataFrame(rows).set_index(["caseid", "period"])
+
+
+def test_optimizer_backend_defaults_to_auto() -> None:
+ """The default backend is `"auto"`; resolved inside `estimate_af`.
+
+ Resolution picks `"jaxopt"` when a JAX GPU is visible and the
+ model is jaxopt-compatible (no `log_ces*` transitions, no
+ user-supplied constraints); otherwise falls back to
+ `"optimagic"`. See ``af.estimate._resolve_optimizer_backend``.
+ """
+ options = AFEstimationOptions()
+ assert options.optimizer_backend == "auto"
+
+
+def test_optimizer_backend_rejects_unknown_value() -> None:
+ """Typos in the backend name fail fast via the beartype perimeter."""
+ from skillmodels.exceptions import OptionsInitializationError # noqa: PLC0415
+
+ with pytest.raises(OptionsInitializationError, match="optimizer_backend"):
+ AFEstimationOptions(optimizer_backend="lbfgsb") # ty: ignore[invalid-argument-type]
+
+
+def test_minimize_with_jaxopt_recovers_quadratic_minimum() -> None:
+ """Smoke-test the wrapper on a small quadratic loss."""
+ target = jnp.array([1.0, -2.0, 0.5])
+
+ def loglike_and_grad(x):
+ loss = jnp.sum((x - target) ** 2)
+ return loss, jax.grad(lambda y: jnp.sum((y - target) ** 2))(x)
+
+ df = pd.DataFrame(
+ {
+ "value": [0.0, 0.0, 0.0],
+ "lower_bound": [-np.inf, -np.inf, -np.inf],
+ "upper_bound": [np.inf, np.inf, np.inf],
+ },
+ index=pd.MultiIndex.from_tuples(
+ [("a", 0, "x", "-"), ("a", 0, "y", "-"), ("a", 0, "z", "-")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+
+ result = minimize_with_jaxopt(
+ loglike_and_grad=loglike_and_grad,
+ full_params_df=df,
+ constraints=[],
+ optimizer_options={"maxiter": 200, "tol": 1e-8},
+ )
+
+ assert isinstance(result, JaxoptResult)
+ np.testing.assert_allclose(
+ result.params["value"].to_numpy(),
+ [1.0, -2.0, 0.5],
+ atol=1e-4,
+ )
+ assert result.fun < 1e-6
+
+
+def test_minimize_with_jaxopt_respects_pinned_values() -> None:
+ """Pinned coordinates keep their target value, others are optimized."""
+ target = jnp.array([3.0, -1.5, 7.0])
+
+ def loglike_and_grad(x):
+ loss = jnp.sum((x - target) ** 2)
+ return loss, jax.grad(lambda y: jnp.sum((y - target) ** 2))(x)
+
+ locs = [("a", 0, "x", "-"), ("a", 0, "y", "-"), ("a", 0, "z", "-")]
+ df = pd.DataFrame(
+ {
+ "value": [0.0, 0.0, 0.0],
+ "lower_bound": [-np.inf, -np.inf, -np.inf],
+ "upper_bound": [np.inf, np.inf, np.inf],
+ },
+ index=pd.MultiIndex.from_tuples(
+ locs, names=["category", "period", "name1", "name2"]
+ ),
+ )
+ # Pin the second coordinate to a value that is NOT the unconstrained
+ # minimum; the optimizer should leave it alone.
+ constraints: list[om.constraints.Constraint] = [
+ FixedConstraintWithValue(loc=locs[1], value=2.0)
+ ]
+
+ result = minimize_with_jaxopt(
+ loglike_and_grad=loglike_and_grad,
+ full_params_df=df,
+ constraints=constraints,
+ optimizer_options={"maxiter": 200, "tol": 1e-8},
+ )
+
+ values = result.params["value"].to_numpy()
+ assert values[1] == pytest.approx(2.0)
+ assert values[0] == pytest.approx(3.0, abs=1e-4)
+ assert values[2] == pytest.approx(7.0, abs=1e-4)
+
+
+def test_minimize_with_jaxopt_rejects_unsupported_constraints() -> None:
+ """Probability / equality constraints raise a clear error."""
+
+ def loglike_and_grad(x):
+ loss = jnp.sum(x**2)
+ return loss, 2 * x
+
+ df = pd.DataFrame(
+ {
+ "value": [0.0, 0.0],
+ "lower_bound": [-np.inf] * 2,
+ "upper_bound": [np.inf] * 2,
+ },
+ index=pd.MultiIndex.from_tuples(
+ [("a", 0, "x", "-"), ("a", 0, "y", "-")],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+ with pytest.raises(NotImplementedError, match="optimagic"):
+ minimize_with_jaxopt(
+ loglike_and_grad=loglike_and_grad,
+ full_params_df=df,
+ constraints=[om.EqualityConstraint(selector=lambda p: p.loc[("a", 0)])],
+ optimizer_options=None,
+ )
+
+
+@pytest.mark.end_to_end
+def test_estimate_af_jaxopt_matches_optimagic_on_linear_model() -> None:
+ """Both backends converge to similar measurement params on a linear model."""
+ model = _linear_single_factor_model()
+ data = _linear_single_factor_data(n_obs=200)
+
+ res_optimagic = estimate_af(
+ model_spec=model,
+ data=data,
+ af_options=AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ optimizer_backend="optimagic",
+ optimizer_algorithm="scipy_lbfgsb",
+ initialization_strategy="spearman",
+ ),
+ )
+ res_jaxopt = estimate_af(
+ model_spec=model,
+ data=data,
+ af_options=AFEstimationOptions(
+ n_halton_points=25,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ optimizer_backend="jaxopt",
+ optimizer_options={"maxiter": 500, "tol": 1e-7},
+ initialization_strategy="spearman",
+ ),
+ )
+
+ # Period-level log-likelihoods should match within optimizer tolerance.
+ for i in range(2):
+ ll_opt = res_optimagic.period_results[i].loglikelihood
+ ll_jax = res_jaxopt.period_results[i].loglikelihood
+ assert np.isfinite(ll_opt)
+ assert np.isfinite(ll_jax)
+ # 0.5 nats per period: enough slack for stochastic line searches but
+ # tight enough to catch a real divergence.
+ assert abs(ll_opt - ll_jax) < 0.5, (
+ f"period {i}: optimagic={ll_opt:.4f} vs jaxopt={ll_jax:.4f}"
+ )
+
+ # Period-0 free loadings should land in the same neighbourhood.
+ free_loadings = res_optimagic.all_params.query(
+ "category == 'loadings' and period == 0"
+ )
+ free_loadings = free_loadings[
+ ~free_loadings.index.get_level_values("name2").isin(["m1"])
+ ]
+ for idx in free_loadings.index:
+ v_opt = float(free_loadings.loc[idx, "value"])
+ v_jax = float(res_jaxopt.all_params.loc[idx, "value"])
+ assert abs(v_opt - v_jax) < 0.1, (
+ f"loading {idx}: optimagic={v_opt:.3f} vs jaxopt={v_jax:.3f}"
+ )
+
+
+@pytest.mark.end_to_end
+def test_estimate_af_jaxopt_rejects_log_ces_model() -> None:
+ """Models with log_ces transitions (probability constraints) must reject."""
+ model = ModelSpec(
+ factors={
+ "skill": FactorSpec(
+ measurements=(("m1", "m2", "m3"),) * 2,
+ normalizations=Normalizations(
+ loadings=({"m1": 1},) * 2,
+ intercepts=({"m1": 0},) * 2,
+ ),
+ transition_function="log_ces",
+ ),
+ },
+ )
+ rng = np.random.default_rng(0)
+ rows = []
+ for i in range(100):
+ theta = rng.normal(0, 1, size=2)
+ for t in range(2):
+ rows.append(
+ {
+ "caseid": i,
+ "period": t,
+ "m1": theta[t] + rng.normal(0, 0.3),
+ "m2": 0.8 * theta[t] + rng.normal(0, 0.4),
+ "m3": 1.2 * theta[t] + rng.normal(0, 0.35),
+ }
+ )
+ data = pd.DataFrame(rows).set_index(["caseid", "period"])
+
+ af_options = AFEstimationOptions(
+ n_halton_points=20,
+ n_halton_points_shock=10,
+ n_mixture_components=1,
+ optimizer_backend="jaxopt",
+ initialization_strategy="spearman",
+ )
+
+ with pytest.raises(NotImplementedError, match="optimagic"):
+ estimate_af(model_spec=model, data=data, af_options=af_options)
diff --git a/tests/test_af_t5_extension.py b/tests/test_af_t5_extension.py
new file mode 100644
index 00000000..add8655e
--- /dev/null
+++ b/tests/test_af_t5_extension.py
@@ -0,0 +1,167 @@
+"""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,
+ n_mixture_components=1,
+ optimizer_algorithm="scipy_lbfgsb",
+ )
+
+ result = estimate_af(model_spec=model, data=data, af_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_amn_estimate.py b/tests/test_amn_estimate.py
new file mode 100644
index 00000000..465a27b9
--- /dev/null
+++ b/tests/test_amn_estimate.py
@@ -0,0 +1,142 @@
+"""Tests for `skillmodels.amn.estimate.estimate_amn` (end-to-end orchestration)."""
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn import 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",
+ ),
+ },
+ )
+
+
+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_mixture_components=2, n_simulation_draws=5000, seed=0
+ )
+
+ result = estimate_amn(model, data, options)
+
+ assert result.all_params.index.names == [
+ "category",
+ "aug_period",
+ "name1",
+ "name2",
+ ]
+ cats = set(result.all_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 test_estimate_amn_honors_fixed_params():
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(
+ n_mixture_components=2, n_simulation_draws=5000, seed=0
+ )
+
+ pin_loc = ("loadings", 1, "y2", "skills")
+ fixed = pd.DataFrame(
+ {"value": [0.42]},
+ index=pd.MultiIndex.from_tuples(
+ [pin_loc], names=["category", "aug_period", "name1", "name2"]
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=fixed)
+
+ assert result.all_params.loc[pin_loc, "value"] == pytest.approx(0.42)
+
+
+def test_estimate_amn_returns_success_flag():
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(
+ n_mixture_components=2, 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_honors_fixed_params_keyed_by_period():
+ """`fixed_params` keyed by `period` (the public level name) must pin.
+
+ AMN's combined `all_params` uses `aug_period` internally; users
+ supply overrides keyed by `period`. `align_index_names` should
+ rename the override's level so `MultiIndex.union` keeps the
+ level names intact and the pin survives. Regression for the
+ silent-strip behaviour that produced anonymous-level params
+ frames and broke `decompose_measurement_variance` downstream.
+ """
+ model = _tiny_model()
+ data = _tiny_data(n=1500)
+ options = AMNEstimationOptions(
+ n_mixture_components=2, n_simulation_draws=5000, seed=0
+ )
+
+ pin_loc = ("loadings", 1, "y2", "skills")
+ fixed = pd.DataFrame(
+ {"value": [0.42]},
+ index=pd.MultiIndex.from_tuples(
+ [pin_loc],
+ names=["category", "period", "name1", "name2"],
+ ),
+ )
+
+ result = estimate_amn(model, data, options, fixed_params=fixed)
+
+ assert list(result.all_params.index.names) == [
+ "category",
+ "aug_period",
+ "name1",
+ "name2",
+ ]
+ assert result.all_params.loc[pin_loc, "value"] == pytest.approx(0.42)
diff --git a/tests/test_amn_inference.py b/tests/test_amn_inference.py
new file mode 100644
index 00000000..8ae1f7ba
--- /dev/null
+++ b/tests/test_amn_inference.py
@@ -0,0 +1,83 @@
+"""Tests for `skillmodels.amn.inference.compute_amn_standard_errors`."""
+
+import numpy as np
+import pandas as pd
+
+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",
+ ),
+ },
+ )
+
+
+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_mixture_components=2, 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.all_params.shape[0]
+ assert inference.replicate_params.shape == (5, fit.all_params.shape[0])
+ assert inference.vcov.shape == (fit.all_params.shape[0], fit.all_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_mixture_components=2, 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
diff --git a/tests/test_amn_minimum_distance.py b/tests/test_amn_minimum_distance.py
new file mode 100644
index 00000000..7bc5e231
--- /dev/null
+++ b/tests/test_amn_minimum_distance.py
@@ -0,0 +1,217 @@
+"""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,
+ _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 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 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
diff --git a/tests/test_amn_mixture_em.py b/tests/test_amn_mixture_em.py
new file mode 100644
index 00000000..c31a7b2b
--- /dev/null
+++ b/tests/test_amn_mixture_em.py
@@ -0,0 +1,234 @@
+"""Tests for `skillmodels.amn.mixture_em` (AMN Stage 1)."""
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from skillmodels.amn.mixture_em import (
+ 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
+
+ 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_raises_when_too_few_complete_rows():
+ augmented = np.array([[np.nan, 1.0], [1.0, 2.0]])
+ with pytest.raises(ValueError, match="complete-case"):
+ 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..2192d4a1
--- /dev/null
+++ b/tests/test_amn_plot_harmonization.py
@@ -0,0 +1,120 @@
+"""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.chs.filtered_states import get_filtered_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",
+ ),
+ },
+ )
+
+
+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_mixture_components=2, n_simulation_draws=1000, seed=0
+ )
+ fit = estimate_amn(model, data, options)
+ return fit, data
+
+
+def test_get_filtered_states_dispatches_to_amn(amn_fit):
+ fit, data = amn_fit
+
+ out = get_filtered_states(
+ model_spec=fit.model_spec,
+ data=data,
+ params=fit.all_params,
+ amn_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_get_filtered_states_rejects_both_af_and_amn_results(amn_fit):
+ """Passing an AMN result to `af_result=` triggers the beartype perimeter.
+
+ Pre-beartype, the test passed `fit` (an `AMNEstimationResult`) to
+ both `af_result=` and `amn_result=` and the function body's
+ `only one of` `ValueError` fired. Beartype now intercepts first
+ because `AMNEstimationResult` is not assignable to
+ `AFEstimationResult | None`. The body-level guard remains in
+ place for the still-valid case of two real results of the right
+ type; that combination requires fitting both estimators, which
+ this fixture deliberately skips.
+ """
+ from skillmodels.exceptions import EstimationCallError # noqa: PLC0415
+
+ fit, data = amn_fit
+ with pytest.raises(EstimationCallError, match="af_result"):
+ get_filtered_states(
+ model_spec=fit.model_spec,
+ data=data,
+ params=fit.all_params,
+ af_result=fit,
+ amn_result=fit,
+ )
+
+
+def test_decompose_measurement_variance_works_with_amn_result(amn_fit):
+ fit, data = amn_fit
+
+ filtered = get_filtered_states(
+ model_spec=fit.model_spec,
+ data=data,
+ params=fit.all_params,
+ amn_result=fit,
+ )
+ states_root = filtered.get("anchored_states", filtered["unanchored_states"])
+ decomp = decompose_measurement_variance(
+ fit.model_spec,
+ fit.all_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..eff624cf
--- /dev/null
+++ b/tests/test_amn_simulate_and_regress.py
@@ -0,0 +1,199 @@
+"""Tests for `skillmodels.amn.simulate_and_regress` (AMN Stage 3)."""
+
+import numpy as np
+import pandas as pd
+
+from skillmodels.amn.simulate_and_regress import (
+ _draw_factor_panel,
+ _fit_linear,
+ _fit_log_ces,
+ simulate_and_regress,
+)
+from skillmodels.amn.types import MinimumDistanceResult
+from skillmodels.common.model_spec import (
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
+from skillmodels.common.process_model import process_model
+
+
+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)
diff --git a/tests/test_amn_start_values.py b/tests/test_amn_start_values.py
new file mode 100644
index 00000000..cc83f0ba
--- /dev/null
+++ b/tests/test_amn_start_values.py
@@ -0,0 +1,264 @@
+"""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 (
+ 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 ModelSpec
+from skillmodels.common.utilities import reduce_n_periods
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
+
+
+@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_check_model.py b/tests/test_check_model.py
index 7f1a36bf..b0f6dc42 100644
--- a/tests/test_check_model.py
+++ b/tests/test_check_model.py
@@ -2,14 +2,15 @@
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
def test_invalid_stagemap_length() -> None:
@@ -30,7 +31,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 +43,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 +55,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 +67,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 +122,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 +134,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_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..fdcd256d 100644
--- a/tests/test_constraints.py
+++ b/tests/test_constraints.py
@@ -9,7 +9,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,
@@ -22,9 +22,9 @@
add_bounds,
get_constraints,
)
-from skillmodels.process_model import process_model
+from skillmodels.common.process_model import process_model
+from skillmodels.common.types import Anchoring, Labels, Normalizations
from skillmodels.test_data.simplest_augmented_model import SIMPLEST_AUGMENTED_MODEL
-from skillmodels.types import Anchoring, Labels, Normalizations
def _to_dict(c: om.constraints.Constraint) -> dict[str, Any]:
@@ -402,6 +402,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 +419,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 +430,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_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_filtered_states.py b/tests/test_filtered_states.py
index 787e9764..33a6bd1a 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.filtered_states import get_filtered_states
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+from skillmodels.test_data.model2 import MODEL2, MODEL2_CHS_OPTIONS
REGRESSION_VAULT = Path(__file__).parent / "regression_vault"
@@ -29,7 +29,9 @@ def test_get_filtered_states(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)
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..3346decb 100644
--- a/tests/test_maximization_inputs.py
+++ b/tests/test_maximization_inputs.py
@@ -2,10 +2,19 @@
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 (
+ _get_jnp_params_vec,
+ _to_numpy,
+ get_maximization_inputs,
+)
+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_to_numpy_with_dict() -> None:
@@ -56,3 +65,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..839ac83b 100644
--- a/tests/test_model_spec.py
+++ b/tests/test_model_spec.py
@@ -2,8 +2,12 @@
import pytest
-from skillmodels.model_spec import AnchoringSpec, FactorSpec, ModelSpec, Normalizations
-from skillmodels.types import EstimationOptions
+from skillmodels.common.model_spec import (
+ AnchoringSpec,
+ FactorSpec,
+ ModelSpec,
+ Normalizations,
+)
def _minimal_dict():
@@ -25,7 +29,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 +66,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:
@@ -94,13 +95,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)
diff --git a/tests/test_params_index.py b/tests/test_params_index.py
index 9a3fc6c0..55210ed6 100644
--- a/tests/test_params_index.py
+++ b/tests/test_params_index.py
@@ -5,8 +5,8 @@
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.params_index import (
get_control_params_index_tuples,
get_initial_cholcovs_index_tuples,
get_loadings_index_tuples,
@@ -17,9 +17,9 @@
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
@pytest.fixture
diff --git a/tests/test_parse_params.py b/tests/test_parse_params.py
index 07272511..b273233c 100644
--- a/tests/test_parse_params.py
+++ b/tests/test_parse_params.py
@@ -14,11 +14,11 @@
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.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
@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..d8d8cd56 100644
--- a/tests/test_process_model.py
+++ b/tests/test_process_model.py
@@ -3,16 +3,15 @@
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.model_spec import FactorSpec
+from skillmodels.common.process_model import get_has_endogenous_factors, process_model
+from skillmodels.common.types import Normalizations, TransitionInfo
from skillmodels.test_data.model2 import MODEL2
-from skillmodels.types import Normalizations, TransitionInfo
@pytest.fixture
@@ -45,13 +44,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 +193,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 == {}
@@ -338,3 +323,40 @@ def test_get_has_endogenous_factors_and_correction() -> None:
"c": _fspec(is_endogenous=True, is_correction=True),
}
assert get_has_endogenous_factors(factors)
+
+
+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"]
+ custom_fac3 = replace(
+ fac3,
+ is_endogenous=True,
+ has_production_shock=False,
+ has_initial_distribution=False,
+ )
+ 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
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..b6146e75 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,
@@ -99,7 +99,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 +262,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..1716cdc9 100644
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -5,7 +5,7 @@
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:
diff --git a/tests/test_utilities.py b/tests/test_utilities.py
index 66e05632..70794d57 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
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..49667eda 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.filtered_states import get_filtered_states
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+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_filtered_states(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"])
+ data, params, _ = _load_model2_filtered()
- max_inputs = get_maximization_inputs(model, data)
- params = params.loc[max_inputs["params_template"].index]
-
- 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"])
-
- 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,
- )
-
+ """Visualisation with states indexed by (id, period) without aug_period.
-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..31495cb6 100644
--- a/tests/test_visualize_transition_equations.py
+++ b/tests/test_visualize_transition_equations.py
@@ -4,13 +4,14 @@
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.chs.filtered_states import get_filtered_states
+from skillmodels.chs.maximization_inputs import get_maximization_inputs
+from skillmodels.common.config import TEST_DATA_DIR
+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 +26,31 @@ 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_filtered_states(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)