Publish party-position estimates and validation materials

This commit is contained in:
Armin Seimel
2026-08-13 15:26:21 +00:00
commit 7666224565
119 changed files with 87813 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
#!/usr/bin/env bash
set -euo pipefail
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
cd "$repo_root"
if [[ "${PARTY2D_APPROVE_POSTESTIMATION:-}" != "YES" ]]; then
echo "Refusing to read chains or run post-estimation without explicit approval." >&2
echo "After approval, rerun with PARTY2D_APPROVE_POSTESTIMATION=YES." >&2
exit 64
fi
run_dir="${1:-$repo_root/_local/validation/blocked_party}"
summary_dir="${2:-$repo_root/validation/outputs}"
estimation_dir="$run_dir/estimations"
if [[ ! -f "$run_dir/model_fit.complete" ]]; then
echo "Refusing to finalize: the guarded fit is not marked complete." >&2
exit 1
fi
if [[ ! -f "$run_dir/model_fit.exit_code" ]] || [[ "$(tr -dc '0-9' < "$run_dir/model_fit.exit_code")" != "0" ]]; then
echo "Refusing to finalize: the guarded fit has no successful exit code." >&2
exit 1
fi
mapfile -t model_runs < <(find "$run_dir/model_run/latest" -mindepth 1 -maxdepth 1 -type d -name 'run_*' 2>/dev/null | sort)
if [[ "${#model_runs[@]}" -eq 0 ]]; then
# The production saver currently writes its run under the repository-level
# output directory even when --data-dir points at a validation workspace.
# Match the completed fit by timestamp instead of relying on "latest" alone.
fit_started="$(tr -d '\r\n' < "$run_dir/model_fit.started")"
fit_completed="$(tr -d '\r\n' < "$run_dir/model_fit.complete")"
mapfile -t model_runs < <(find "$repo_root/outputs/model_outputs/latest" -mindepth 1 -maxdepth 1 -type d -name 'run_*' -newermt "$fit_started" ! -newermt "$fit_completed" | sort)
fi
if [[ "${#model_runs[@]}" -ne 1 ]]; then
echo "Expected exactly one blocked model run; found ${#model_runs[@]}." >&2
printf '%s\n' "${model_runs[@]}" >&2
exit 1
fi
model_run="${model_runs[0]}"
mkdir -p "$estimation_dir" "$summary_dir/blocked_fit_diagnostics"
nice -n 10 julia --project=. src/julia/02_post_estimation.jl \
--run-dir "$model_run" --output-dir "$estimation_dir" \
2>&1 | tee "$run_dir/post_estimation.log"
mapfile -t position_files < <(find "$estimation_dir" -maxdepth 1 -type f -name 'party_positions_*.csv' | sort)
if [[ "${#position_files[@]}" -ne 1 ]]; then
echo "Expected exactly one blocked position file; found ${#position_files[@]}." >&2
exit 1
fi
julia --project=. validation/summarize_blocked_validation.jl \
"${position_files[0]}" "$run_dir" "$summary_dir" \
2>&1 | tee "$run_dir/blocked_summary.log"
cp "$model_run/metadata.json" "$summary_dir/blocked_fit_diagnostics/metadata.json"
cp "$model_run/diagnostics/run_metrics.json" "$summary_dir/blocked_fit_diagnostics/run_metrics.json"
cp "$run_dir/blocked_validation_manifest.csv" "$summary_dir/blocked_fit_diagnostics/blocked_validation_manifest.csv"
cp "$run_dir/blocked_validation_strata.csv" "$summary_dir/blocked_fit_diagnostics/blocked_validation_strata.csv"
cp "$run_dir/blocked_parties.csv" "$summary_dir/blocked_fit_diagnostics/blocked_parties.csv"
cp "$run_dir/input_sha256sums.txt" "$summary_dir/blocked_fit_diagnostics/input_sha256sums.txt"
cp "$run_dir/model_fit.environment" "$summary_dir/blocked_fit_diagnostics/model_fit.environment"
cp "$run_dir/stanc_version.txt" "$summary_dir/blocked_fit_diagnostics/stanc_version.txt"
echo "Blocked validation finalized from: $model_run"
echo "Position file: ${position_files[0]}"
echo "Summary directory: $summary_dir"