scale-forecasting 1.2.0__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/CHANGELOG.md +55 -0
  2. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/PKG-INFO +25 -6
  3. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/README.md +50 -29
  4. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/pyproject.toml +1 -1
  5. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/__init__.py +71 -1
  6. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/agent_surfaces.py +347 -1
  7. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/airflow_emit.py +99 -0
  8. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/airflow_tasks.py +328 -0
  9. scale_forecasting-1.3.0/src/scale_forecasting/auto.py +4507 -0
  10. scale_forecasting-1.3.0/src/scale_forecasting/auto_policy.py +2401 -0
  11. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/automl_submit.py +15 -0
  12. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/batch_telemetry.py +39 -8
  13. scale_forecasting-1.3.0/src/scale_forecasting/benchmarks.py +1738 -0
  14. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/calibration.py +54 -40
  15. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_submit.py +23 -0
  16. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/code_delivery.py +42 -0
  17. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/automl_engine.py +6 -2
  18. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_engine.py +4 -2
  19. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_sql.py +4 -1
  20. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/ray_engine.py +3 -1
  21. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/spark_explode.py +7 -1
  22. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ensemble_run.py +184 -40
  23. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ensembler.py +350 -139
  24. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/features.py +96 -18
  25. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/gce_submit.py +44 -2
  26. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/gke_submit.py +26 -0
  27. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/main.py +271 -3
  28. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/mcp.py +518 -2
  29. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_foundation_base.py +40 -32
  30. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/notebook_acceptance.py +2 -1
  31. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/runtimes.py +48 -8
  32. scale_forecasting-1.3.0/src/scale_forecasting/profiling/__init__.py +21 -0
  33. scale_forecasting-1.3.0/src/scale_forecasting/profiling/duration.py +826 -0
  34. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/quota.py +395 -4
  35. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_submit.py +21 -0
  36. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ids.py +14 -3
  37. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ops.py +4 -4
  38. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/rows.py +247 -19
  39. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/write_api.py +86 -9
  40. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/report.py +44 -0
  41. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/sdk.py +594 -1
  42. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/submit.py +103 -0
  43. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/vertex_submit.py +101 -38
  44. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/worker.py +15 -2
  45. scale_forecasting-1.2.0/src/scale_forecasting/profiling/__init__.py +0 -3
  46. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/.gitignore +0 -0
  47. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/LICENSE +0 -0
  48. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/_entry.py +0 -0
  49. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/_infra_args.py +0 -0
  50. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/backtest.py +0 -0
  51. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/batch_infra.py +0 -0
  52. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/capacity.py +0 -0
  53. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_deps.py +0 -0
  54. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_telemetry.py +0 -0
  55. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/commands.py +0 -0
  56. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/compute_fallback.py +0 -0
  57. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/config.py +0 -0
  58. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/dag.py +0 -0
  59. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/__init__.py +0 -0
  60. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/generator.py +0 -0
  61. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/seed_spark.py +0 -0
  62. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/dataproc_cluster.py +0 -0
  63. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/device_audit.py +0 -0
  64. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/diagnostics.py +0 -0
  65. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/__init__.py +0 -0
  66. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_names.py +0 -0
  67. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/ray_io.py +0 -0
  68. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/spark_io.py +0 -0
  69. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/vertex_engine.py +0 -0
  70. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/errors.py +0 -0
  71. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/hardware.py +0 -0
  72. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/hpo.py +0 -0
  73. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/identity.py +0 -0
  74. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_launch.py +0 -0
  75. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_outcome.py +0 -0
  76. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_wait.py +0 -0
  77. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/launch_plan.py +0 -0
  78. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/__init__.py +0 -0
  79. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/_intervals.py +0 -0
  80. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/base_metric.py +0 -0
  81. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/bias.py +0 -0
  82. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/coverage.py +0 -0
  83. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/cv.py +0 -0
  84. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/interval_score.py +0 -0
  85. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/interval_width.py +0 -0
  86. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/maape.py +0 -0
  87. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mae.py +0 -0
  88. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mape.py +0 -0
  89. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mase.py +0 -0
  90. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mase_seasonal.py +0 -0
  91. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mse.py +0 -0
  92. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/msis.py +0 -0
  93. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/msse.py +0 -0
  94. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/ope.py +0 -0
  95. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/pinball.py +0 -0
  96. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/r2.py +0 -0
  97. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmse.py +0 -0
  98. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmsle.py +0 -0
  99. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmsse.py +0 -0
  100. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/smape.py +0 -0
  101. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/wape.py +0 -0
  102. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/__init__.py +0 -0
  103. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_lag_forecaster.py +0 -0
  104. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_neuralforecast_base.py +0 -0
  105. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_vertex_automl_base.py +0 -0
  106. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_arima.py +0 -0
  107. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_ces.py +0 -0
  108. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_theta.py +0 -0
  109. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/autoets.py +0 -0
  110. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/base_model.py +0 -0
  111. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/bigquery_native.py +0 -0
  112. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/catboost_model.py +0 -0
  113. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/chronos2.py +0 -0
  114. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/chronos_bolt.py +0 -0
  115. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/croston.py +0 -0
  116. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/fft.py +0 -0
  117. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/holtwinters.py +0 -0
  118. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/kalman.py +0 -0
  119. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/lightgbm_model.py +0 -0
  120. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_drift.py +0 -0
  121. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_mean.py +0 -0
  122. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_moving_average.py +0 -0
  123. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_seasonal.py +0 -0
  124. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/neuralprophet_model.py +0 -0
  125. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/patchtst.py +0 -0
  126. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/prophet_model.py +0 -0
  127. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/random_forest.py +0 -0
  128. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/regression_lags.py +0 -0
  129. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/sarimax.py +0 -0
  130. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/stl_bagging.py +0 -0
  131. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tbats_model.py +0 -0
  132. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tft.py +0 -0
  133. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/theta.py +0 -0
  134. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tide.py +0 -0
  135. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/timesfm_torch.py +0 -0
  136. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tsmixer.py +0 -0
  137. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/ucm.py +0 -0
  138. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_l2l.py +0 -0
  139. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_seq2seq.py +0 -0
  140. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_tft.py +0 -0
  141. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_tide.py +0 -0
  142. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/xgboost_model.py +0 -0
  143. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/playground.py +0 -0
  144. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/__init__.py +0 -0
  145. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/cancel.py +0 -0
  146. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/reconcile.py +0 -0
  147. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/settle.py +0 -0
  148. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/vocabulary.py +0 -0
  149. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/baseline.py +0 -0
  150. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/cost.py +0 -0
  151. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/measure.py +0 -0
  152. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/numeric.py +0 -0
  153. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/sampling.py +0 -0
  154. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/signature.py +0 -0
  155. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/source.py +0 -0
  156. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/stats.py +0 -0
  157. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/py.typed +0 -0
  158. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_cluster.py +0 -0
  159. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_entry.py +0 -0
  160. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_infra.py +0 -0
  161. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_jobs.py +0 -0
  162. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_reaper.py +0 -0
  163. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_telemetry.py +0 -0
  164. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/reconciliation.py +0 -0
  165. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/__init__.py +0 -0
  166. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/artifacts.py +0 -0
  167. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/cells.py +0 -0
  168. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ddl.py +0 -0
  169. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/harvest.py +0 -0
  170. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/header.py +0 -0
  171. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/jobs.py +0 -0
  172. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/lifecycle.py +0 -0
  173. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/params.py +0 -0
  174. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/reads.py +0 -0
  175. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/tables.py +0 -0
  176. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/views.py +0 -0
  177. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/__init__.py +0 -0
  178. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/audit.py +0 -0
  179. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/catalog.py +0 -0
  180. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/cluster.py +0 -0
  181. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/fleet.py +0 -0
  182. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/serverless.py +0 -0
  183. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/slot.py +0 -0
  184. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/retry_policy.py +0 -0
  185. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/retry_run.py +0 -0
  186. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/review.py +0 -0
  187. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/router.py +0 -0
  188. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/scenarios.py +0 -0
  189. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/seasonality.py +0 -0
  190. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/settings.py +0 -0
  191. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/shared_clusters.py +0 -0
  192. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/smoke_run.py +0 -0
  193. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/spark_entry.py +0 -0
  194. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/staging.py +0 -0
  195. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/submitters.py +0 -0
  196. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/validation.py +0 -0
  197. {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/vertex_entry.py +0 -0
@@ -11,6 +11,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ---
13
13
 
14
+ ## [1.3.0] - 2026-10-16
15
+
16
+ ### Added
17
+
18
+ - **Glass-Box Auto-Forecaster (`Forecaster.build_config()` & `Forecaster.auto()`, [`auto_policy.py`](./src/scale_forecasting/auto_policy.py)):**
19
+ - Compiles a profiled time-series panel (or BigQuery source table) into a standard, inspectable [`RunConfig`](./src/scale_forecasting/config.py) (`AutoBlueprint.config`) paired with a structured per-parameter evidence ledger (`AutoBlueprint.rationale_df()`), automatic schema-backed column detection (`detect_panel_columns`), automatic regime classification (`smooth`, `intermittent`, `lumpy`, `erratic` via Syntetos-Boylan `ADI` and $\text{CV}^2$), automatic `log1p` target transform (`skewness >= 1.35`), and 5 series-count scale regimes (`micro`, `small`, `medium`, `large`, `hyperscale` up to 100,000+ series).
20
+ - Supports 4 observational exposure tiers (`first_light`, `wide_field`, `deep_field`, `survey`) and 4 execution targets (`where="local" | "bigquery" | "cloud_cpu" | "cloud_all"`), plus CLI (`python -m scale_forecasting.main --auto ...`) and MCP (`auto_compile_config` and `run_auto_forecaster` tools in [`mcp.py`](./src/scale_forecasting/mcp.py)).
21
+ - **Multi-Branch Bounded `autofocus` Tournament (`autofocus=True`, `autofocus_mode="dag" | "linear"`):**
22
+ - Explores up to 3 specialized Pass 2 refinement branches (`pass_2_prune_1`, `pass_2_cov_ablation`, `pass_2_transform_probe`) from Pass 1 telemetry (`leaderboard`, `fva_df`, `bias_report_df`, `horizon_decay_df`, `exceptions_df`), followed by a Pass 3 Synthesis Ensemble that borrows all evaluated models (`reuse_prior_runs=True` with snapshot-fingerprint verification) and fits `horizon_specialist`, `champion`, `nnls`, `ridge`, `ensemble_InverseError`, and `trimmed_mean` stackers.
23
+ - Enforces a strict **non-degradation ratchet**: returns the branch with the lowest out-of-fold backtest error (`MASE` / `WAPE`) across Pass 1, Pass 2, and Pass 3, guaranteeing zero regret relative to Pass 1.
24
+ - **7-Question Practitioner Assessment (`AutoForecastResult.assessment_df()`), 4-Anchor Baseline Value Ladder (`baseline_value_df()`), and Hierarchy Reconciliation Value (`hierarchy_value_df()`):**
25
+ - Every `Forecaster.auto()` run answers 7 practitioner trust questions from out-of-fold backtest evidence: (1) Baseline Value (`snaive`, `naive`, `historic_average`, `seasonal_window_average`), (2) Ensemble Parsimony (`parsimony_tolerance_pct`), (3) Covariate FVA & Overfitting Check, (4) Global Pooling vs. Local Independence, (5) Horizon Crossover (`horizon_specialist`), (6) Hierarchy Reconciliation Lift, and (7) Operational Readiness & Exceptions.
26
+ - **20-Panel Synthetic DGP & 9-Dataset Public Open-Data Benchmark Suites ([`benchmarks.py`](./src/scale_forecasting/benchmarks.py)):**
27
+ - Added 20 ground-truth synthetic Data Generating Process (DGP) panels (`dgp_01` through `dgp_20` across `h`, `D`, `W`, `MS` cadences, intermittent/lumpy demand, structural level breaks, true vs. decoy covariates, and 2/3-level hierarchies) via `load_benchmark()`.
28
+ - Added on-demand fetchers (`fetch_public_benchmark()`, zero repo data bloat) for 9 real-world open-data benchmarks (`m5_walmart`, `favorita_grocery`, `m4_daily`, `m4_weekly`, `m4_monthly`, `monash_tourism_monthly`, `monash_hospital`, `monash_car_parts`, `etth1`), achieving **9/9 non-negative held-out test MAE lift over `SNaive`** (`+14.92%` mean test lift, `+25.18%` mean OOF FVA).
29
+ - **Dynamic 6-Runtime Live Quota Preflight ([`quota.py`](./src/scale_forecasting/quota.py)) & Empirical 7-Runtime Duration Estimator ([`profiling/duration.py`](./src/scale_forecasting/profiling/duration.py)):**
30
+ - Live Cloud Quotas / Compute Engine regional quota preflight across all 6 compute-provisioning runtimes (`gce`, `vertex`, `ray`, `spark` cluster & Serverless DCU/shuffle guard, `gke`, `vertex_automl`) with automatic worker cap or machine downgrade before submission.
31
+ - Empirical duration estimator (`predict_run_duration()`) calibrated against 606 completed cloud jobs (`5.59M` evaluated cells).
32
+ - **Interactive Showcase Notebook 11 ([`notebooks/11_auto_forecaster_and_autofocus.ipynb`](./notebooks/11_auto_forecaster_and_autofocus.ipynb)):**
33
+ - End-to-end walkthrough of `Forecaster.build_config()`, `Forecaster.auto()`, multi-branch `autofocus`, the 4-Anchor Baseline Value Ladder, and the 7-Question Practitioner Assessment across local and cloud execution.
34
+
35
+ ### Changed
36
+
37
+ - **Physical Annual (`365.25d`) & Multi-Seasonal Sub-Daily (`24h`/`12h`/`168h`) Fourier Harmonics ([`features.py`](./src/scale_forecasting/features.py)) & Frequency-Matched Lags ([`auto_policy.py`](./src/scale_forecasting/auto_policy.py)):**
38
+ - [`_fourier_terms()`](./src/scale_forecasting/features.py) now normalizes daily, weekly, monthly, and quarterly timestamps by the physical `365.25`-day year and encodes multi-seasonal diurnal ($24\text{h}$), semi-diurnal ($12\text{h}$), and weekly ($168\text{h}$) harmonics for hourly (`h`/`H`) panels.
39
+ - [`_frequency_matched_lags()`](./src/scale_forecasting/auto_policy.py) aligns tabular lag depths (`lightgbm`, `catboost`, `xgboost`, `ridge`) with hourly (`[1, 2, 3, 6, 12, 24, 48, 168]`) and monthly (`[1, 2, 3, 6, 12]` / `[1, 2, 3, 6, 12, 24]`) cadences while preserving intermittent/lumpy series.
40
+ - **Leave-One-Fold-Out (LOFO) Out-of-Fold Ensemble Selection & Finite-Sample Conformal Bounds ([`ensembler.py`](./src/scale_forecasting/ensembler.py)):**
41
+ - [`_compute_oof_ensemble_scores()`](./src/scale_forecasting/ensembler.py) evaluates learned stackers (`nnls`, `ridge`, `xgb`, `ensemble_InverseError`) strictly out-of-fold across backtest folds (`n_folds >= 2`) so in-sample weight fitting cannot win `ensemble_champion`, and [`ensemble_oof_bounds()`](./src/scale_forecasting/ensembler.py) uses finite-sample conformal rank quantiles (`_empirical_quantile`).
42
+ - **Vectorized Local & Spark `applyInPandas` Baseline Fast-Path ([`playground.py`](./src/scale_forecasting/playground.py), [`spark_explode.py`](./src/scale_forecasting/engines/spark_explode.py)) & BigQuery Storage Write API Historical Window Fallback ([`write_api.py`](./src/scale_forecasting/registry/write_api.py)):**
43
+ - Added vectorized NumPy panel evaluation for baseline models (`naive`, `snaive`, `historic_average`, `seasonal_window_average`) in both local `playground` and Spark `applyInPandas` workers, cutting 100,000-series baseline execution from minutes to `< 2.5s`.
44
+ - [`write_dataframe_storage_api()`](./src/scale_forecasting/registry/write_api.py) automatically routes tables with partition dates outside BigQuery Storage Write API's `[-3650d, +366d]` streaming window to `load_table_from_dataframe` (Parquet batch load).
45
+
46
+ ---
47
+
48
+ ## [1.2.1] - 2026-10-14
49
+
50
+ ### Added
51
+
52
+ - **Atomic Version Bump Automation (`make bump VERSION=X.Y.Z`):**
53
+ - Added [`bump_version()`](./src/scale_forecasting/agent_surfaces.py) (`python -m scale_forecasting.agent_surfaces --bump-version X.Y.Z`) and `make bump VERSION=X.Y.Z` in [`Makefile`](./Makefile) to atomically update all 7 version-locked files ([`pyproject.toml`](./pyproject.toml), [`src/scale_forecasting/__init__.py`](./src/scale_forecasting/__init__.py), [`plugin.json`](./plugin.json), [`skills/scale-forecasting/SKILL.md`](./skills/scale-forecasting/SKILL.md), [`CHANGELOG.md`](./CHANGELOG.md), [`CITATION.cff`](./CITATION.cff), and [`docker/cloudbuild.yaml`](./docker/cloudbuild.yaml)), refresh `uv.lock` and `docker/requirements.txt`, sync the editable `.venv` `.dist-info`, and regenerate all 6 AI agent surface files.
54
+ - **Version-Tagged Runtime Containers (`:vX.Y.Z`) & Launcher $\leftrightarrow$ Worker Version Parity Guard (`code_delivery.py`):**
55
+ - [`docker/cloudbuild.yaml`](./docker/cloudbuild.yaml) and `make image` in [`Makefile`](./Makefile) now tag and push both `:latest` and `:v<version>` (`:v1.2.1`) to Artifact Registry alongside the content-addressed `venv_archive` tarball.
56
+ - Added [`verify_version_parity()`](./src/scale_forecasting/code_delivery.py), wired into `spark_explode._stamp_executed_fanout` and `ray_engine._stamp_executed_sizing` (shared across `ray`, `vertex`, `gce`, and `gke`), stamping `launcher` and `worker` `scale_forecasting.__version__` (`$.version`) into `run_registry.job_telemetry` and raising `ConfigError` on mismatch when `SF_STRICT_VERSION_PARITY=1`.
57
+ - **Complete 7-Runtime Provisioning vs. Execution Telemetry (`$.platform`):**
58
+ - Extended [`batch_telemetry.platform_phases()`](./src/scale_forecasting/batch_telemetry.py) (`_to_epoch_seconds` / `_rfc3339_seconds`) to accept protobuf `Timestamp`, `datetime`, epoch seconds/milliseconds, and RFC 3339 strings, and wired `$.platform` (`provision_s`, `execute_s`, `total_wall_s`) into `RayProbe`, `GceProbe`, `GkeProbe`, and `VertexAutoMLProbe` in [`src/scale_forecasting/probes/runtimes.py`](./src/scale_forecasting/probes/runtimes.py) as well as ephemeral submitters ([`gce_submit.py`](./src/scale_forecasting/gce_submit.py), [`gke_submit.py`](./src/scale_forecasting/gke_submit.py), [`ray_submit.py`](./src/scale_forecasting/ray_submit.py), [`cluster_submit.py`](./src/scale_forecasting/cluster_submit.py), [`automl_submit.py`](./src/scale_forecasting/automl_submit.py)) so `v_run_jobs.provision_seconds` and `execute_seconds` are populated across all compute runtimes.
59
+ - **Cross-Version BigQuery Registry Compatibility Tripwire ([`tests/unit/test_cross_version_resilience.py`](./tests/unit/test_cross_version_resilience.py)):**
60
+ - Verifies backward and forward compatibility of `Forecaster.from_run_id()`, `ops.match_reusable_models()` & `render_borrow_model_sql()`, `review._assemble_review()` & DataFrame builders, and `diagnostics.py` (`compute_fva`, `compute_inventory_policy`, `compute_anomalies`, `compute_change_points`) across historical `v1.0.0`, `v1.1.0`, and `v1.2.0` registry payloads.
61
+
62
+ ### Changed
63
+
64
+ - **Interactive Showcase Notebook Refresh ([`notebooks/01_bigquery_native_sql.ipynb`](./notebooks/01_bigquery_native_sql.ipynb) & [`notebooks/08_multi_engine_master_workflow.ipynb`](./notebooks/08_multi_engine_master_workflow.ipynb)):**
65
+ - Re-executed and persisted `01_bigquery_native_sql.ipynb` (`arima_plus`, `arima_plus_xreg`, `timesfm` `TimesFM 3.0` multivariate, `timesfm@univariate` `TimesFM 2.5`, Covariate FVA, Two-Tier `ML.EXPLAIN_FORECAST` attributions, anomaly/change-point detection, and $(s, S)$ inventory replenishment policy) and `08_multi_engine_master_workflow.ipynb` (4-family parallel DAG with `[models-foundation]` `chronos_bolt`, FVA, TreeSHAP attributions, `v_run_jobs` provisioning telemetry, anomaly/change-point detection, and inventory replenishment policy) against the `v1.2.1` runtime container.
66
+
67
+ ---
68
+
14
69
  ## [1.2.0] - 2026-10-14
15
70
 
16
71
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scale-forecasting
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Time-series forecasting on Google Cloud at any scale: one JSON configuration runs every model family on Dataproc Serverless, Ray, Vertex AI, GKE, Compute Engine, or BigQuery ML and writes forecasts and leaderboards back to BigQuery.
5
5
  Project-URL: Homepage, https://github.com/statmike/scale-forecasting
6
6
  Project-URL: Documentation, https://statmike.github.io/scale-forecasting/
@@ -205,11 +205,12 @@ import scale_forecasting as sf
205
205
  from scale_forecasting import playground
206
206
 
207
207
  result = playground.run_one(model="theta", horizon=14, backtest=True)
208
+ auto_run = sf.Forecaster.auto(playground.sample_data(n_series=3), tier="first_light", autofocus=True)
208
209
  plan = sf.Forecaster.from_file("configs/ensemble_demo.json").dry_run()
209
- print(result.metrics["wape"], plan.run_id)
210
+ print(result.metrics["wape"], auto_run.leaderboard_df().iloc[0]["model_type"], plan.run_id)
210
211
  ```
211
212
 
212
- Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
213
+ Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb), [`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb), [Auto-forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md), or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
213
214
 
214
215
  ### Journey 2 — Deploy to your Google Cloud project in 15 minutes
215
216
 
@@ -278,6 +279,23 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
278
279
 
279
280
  ---
280
281
 
282
+ ## Write a `RunConfig` by hand — or let the Glass-Box Auto-Forecaster compile & refine it
283
+
284
+ You can always author a [`RunConfig`](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) JSON file directly and run it with any method in this repository. Or, when starting on a new dataset, let **`Forecaster.build_config()`** and **`Forecaster.auto()`** profile your data (`Forecaster.profile_data()`), compile a standard `RunConfig` across **4 exposure tiers** (`first_light`, `wide_field`, `deep_sky`, `deep_field`), optionally refine it with multi-branch **`autofocus`**, and answer the 7 core questions every forecaster asks (`f.practitioner_assessment_df()`, `f.compare_models()`):
285
+
286
+ | What Forecasters Care About | Manual Trial-and-Error | Typical Black-Box AutoML | `scale-forecasting` Glass-Box Auto-Forecaster & `autofocus` |
287
+ | :--- | :--- | :--- | :--- |
288
+ | **Transparency & ownership** | Full control, but days of hand-tuning JSON/code across model families. | Swallows your data and hides *why* models or features were picked. | **100% glass-box:** Prints a plain-English rationale table (`bp.explain()`) and saves a standard, editable `RunConfig` JSON you own (`--init-config`). |
289
+ | **User constraints (`[PINNED]`)** | You wire every constraint and fallback by hand. | Take-it-or-leave-it automation; hard to lock specific families or metrics. | **Pin any dial:** Lock `allowed_families`, `models`, `decision_metric`, `n_folds`, `hpo`, `ensemble`, or `max_minutes`; `autofocus` optimizes strictly around your pins. |
290
+ | **Compute & scale awareness (`n_series`)** | You manually size VMs, GPUs, and worker pools for 10 vs. 100k series. | Assumes a single Python machine or a single fixed cluster. | **Co-designs models + 7 cloud runtimes:** Adapts portfolios from `micro` (`<15` series) to `hyperscale` (`25,000+` series) across `local`, `bigquery`, `spark`, `ray`, `vertex`, `gce`, and `gke`. |
291
+ | **Iterative learning & compute reuse** | Re-running a tweak refits every model from scratch. | Runs a single fixed pipeline or brute-forces everything upfront. | **Multi-branch `autofocus` DAG + cell borrowing:** Tests isolated upgrades (`2A` scale/outliers, `2B` feature pruning/horizon, `2C` intermittent/hierarchy/stockouts), **borrows Pass 1's finished models**, and guarantees non-degradation via the **Champion Ratchet**. |
292
+ | **"Earn your complexity" proof** | Easy to overfit noisy features without noticing a simple model was better. | Often crowns a heavy model without proving lift over simple baselines. | **4-anchor Baseline Ladder & 7-Question Assessment:** Benchmarks against seasonal naive, plain univariate (`theta`), and dual-mode foundation baselines (`@univariate` vs. `@global_cov_all`). If a simple univariate model wins, it becomes champion and lists the complex models it beat (`f.baseline_value_df()`, `f.practitioner_assessment_df()`). |
293
+ | **How the policy was built** | Individual intuition and ad-hoc rules of thumb. | Fixed vendor heuristics or slow, costly runtime LLM calls. | **Evolved with AlphaEvolve on Gemini Enterprise (`26.08 -> 74.82` fitness across 20 synthetic DGPs + 9 public benchmarks)** and compiled into deterministic pure Python (**zero LLM calls at runtime**). |
294
+
295
+ Full guide and interactive notebook: **[Glass-Box Auto-Forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)** and **[`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb)**.
296
+
297
+ ---
298
+
281
299
  ## Why Google Cloud for forecasting at any scale
282
300
 
283
301
  | Pillar | What it means for you | Proof in this repository |
@@ -303,15 +321,16 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
303
321
 
304
322
  - **Evaluation, quantiles & calibration:** **21 evaluation metrics** (16 point + 5 interval: `wape`, `smape`, `mape`, `maape`, `ope`, `mae`, `rmse`, `mse`, `rmsle`, `bias`, `mase`, `mase_seasonal`, `rmsse`, `msse`, `r2`, `cv`, `coverage`, `pinball`, `interval_score`, `interval_width`, `msis`), empirical conformal prediction intervals, monotone multi-percentile fans (`output.quantiles` with Chernozhukov rearrangement), and Newsvendor asymmetric cost targets (`underage_cost` / `overage_cost`) ([`docs/metrics_reference.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md)).
305
323
  - **Hierarchy, smart ensembles & explainability:** All 8 Hyndman FPP3 reconciliation methods (including active-set non-negative `"mint_nonneg"` alongside `mint_shrink`, `wls_var`, `wls_struct`, `ols`, `bottom_up`, `top_down`, `middle_out`), 8 ensemble strategies (`mean`, `median`, `inverse_error`, `champion`, `horizon_specialist`, `nnls`, `ridge`, `xgb`) with `top_k` & `parsimony_margin` pruning and calibrated ensemble intervals, physical bounds (`floor`, `cap`, `cumulative_round`), and two-tier feature attributions (`attributions_df` / `plot_attributions`).
324
+ - **Glass-box auto-forecaster & multi-branch `autofocus`:** Compile an explained `RunConfig` from any DataFrame or BigQuery table (`Forecaster.build_config()` / `--init-config`) across 4 exposure tiers (`first_light`, `wide_field`, `deep_sky`, `deep_field`) with optional user scope pins and approximate 7-runtime duration/cost estimates (`predict_run_duration`), or run a multi-branch `autofocus=True` tournament (`Forecaster.auto()`) whose pure-Python decision rules were evolved with **AlphaEvolve on Gemini Enterprise** across 20 synthetic ground-truth test panels and 9 public open-data benchmarks ([`docs/auto_forecaster.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)).
306
325
  - **Forecaster workbench, econometrics, inventory policy & executive reports:** Pre-fit data hygiene & SBC demand regime routing (`smooth`, `erratic`, `intermittent`, `lumpy`), Forecast Value Added (`compute_fva`) with Harvey–Leybourne–Newbold (1997) modified Diebold–Mariano $p$-values, lead-time horizon decay, Trigg tracking-signal bias audits, AR(1)-aware time rollups (`rollup_time`) and replenishment policy translators (`compute_inventory_policy` / `inventory_policy_df` for $(s, S)$, $(R, S)$, Fill Rate, and Newsvendor safety stock, reorder point, and EOQ), counterfactual promo/price scenario simulation (`simulate_scenarios`), live drift & whipsaw stability scoring, Top-$N$ exception triage (`exceptions_df`), and self-contained interactive HTML/JSON reports (`python -m scale_forecasting.report`) ([`docs/forecaster_workbench.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md)).
307
326
 
308
327
  ---
309
328
 
310
- ## Learn by doing (11 notebooks across 4 tracks)
329
+ ## Learn by doing (12 notebooks across 4 tracks)
311
330
 
312
331
  All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/README.md) include committed outputs and one-click **Colab Enterprise** launch links:
313
332
 
314
- - **Track 1 — Local sandbox & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
333
+ - **Track 1 — Local sandbox, auto-forecaster & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
315
334
  - **Track 2 — Cloud runtimes:** [`01_bigquery_native_sql.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/01_bigquery_native_sql.ipynb) · [`02_vertex_and_gce_vms.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/02_vertex_and_gce_vms.ipynb) · [`03_spark_serverless_and_connect.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/03_spark_serverless_and_connect.ipynb) · [`04_ray_on_vertex_gpu.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/04_ray_on_vertex_gpu.ipynb)
316
335
  - **Track 3 — Covariates, hierarchy, HPO & ensembles:** [`05_covariates_and_global_models.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/05_covariates_and_global_models.ipynb) · [`06_hierarchical_reconciliation.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/06_hierarchical_reconciliation.ipynb) · [`07_hpo_backtesting_and_ensembles.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/07_hpo_backtesting_and_ensembles.ipynb)
317
336
  - **Track 4 — Master multi-engine DAG & operations:** [`08_multi_engine_master_workflow.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/08_multi_engine_master_workflow.ipynb) · [`10_registry_operations_and_scale.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/10_registry_operations_and_scale.ipynb)
@@ -321,7 +340,7 @@ All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/bl
321
340
 
322
341
  ## Where next
323
342
 
324
- - **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
343
+ - **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Auto-forecaster & `autofocus`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
325
344
  - **Reference:** [Compute runtimes](https://github.com/statmike/scale-forecasting/blob/main/docs/runtimes_reference.md) · [Configuration](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) · [Models & ensembles](https://github.com/statmike/scale-forecasting/blob/main/docs/models_reference.md) · [Evaluation metrics](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md) · [Output schemas & views](https://github.com/statmike/scale-forecasting/blob/main/docs/output_schemas.md)
326
345
  - **Operate & extend:** [Python SDK (`Forecaster`)](https://github.com/statmike/scale-forecasting/blob/main/docs/using_the_sdk.md) · [Running & reviewing](https://github.com/statmike/scale-forecasting/blob/main/docs/running_and_reviewing.md) · [Operations & repair](https://github.com/statmike/scale-forecasting/blob/main/docs/operations.md) · [Quota & 100k scale](https://github.com/statmike/scale-forecasting/blob/main/docs/quota_and_scale.md) · [System validation ledger](https://github.com/statmike/scale-forecasting/blob/main/docs/validation.md) · [API reference](https://statmike.github.io/scale-forecasting/api/)
327
346
 
@@ -16,38 +16,40 @@
16
16
 
17
17
  ```mermaid
18
18
  flowchart LR
19
- subgraph IN["Your data in BigQuery"]
20
- SRC["Source table<br/>series · timestamps · covariates"]
19
+ subgraph PREP["1. Data, Config & Launch"]
20
+ direction TB
21
+ SRC["Your Data (BigQuery or DataFrame)<br/>series · timestamps · covariates · hierarchies"]
22
+ CFG["Create a Config File (JSON)<br/>Hand-crafted OR use Auto-Forecaster"]
23
+ LAUNCH["Launch & Orchestrate<br/>SDK · CLI · Notebooks · Airflow · Batch · MCP"]
24
+ R["Parallel Family DAG Router<br/>Routes active families (1 job or pool per family)<br/>statistical · ml · deep_learning · automl · native"]
25
+ SRC --> CFG --> LAUNCH --> R
21
26
  end
22
- CFG["One RunConfig (JSON)<br/>what to forecast · horizon · models · metrics"]
23
- subgraph ROUTE["Family DAG router"]
24
- R["One job per active model family<br/>statistical · ml · deep_learning · automl · native"]
25
- end
26
- subgraph RUN["Zero-idle compute on Google Cloud (chosen per family)"]
27
- S["Dataproc Serverless Spark"]
27
+ subgraph RUN["2. Zero-Idle Compute on Google Cloud (Chosen per Family)"]
28
+ direction LR
29
+ S["Serverless Spark or Spark Cluster"]
28
30
  RY["Ray on Vertex AI or GKE"]
29
31
  V["Vertex AI CustomJob"]
30
- G["Compute Engine single VM<br/>(self-deleting)"]
31
- K["GKE Indexed Job"]
32
- A["Vertex AI AutoML and<br/>Tabular Workflows"]
33
- B["BigQuery ML<br/>ARIMA_PLUS · AI.FORECAST"]
32
+ G["Compute Engine Single VM (Self-Deleting)"]
33
+ K["GKE (Indexed Job or Ray · Scale-to-Zero)"]
34
+ A["Vertex AI AutoML & Tabular Workflows"]
35
+ B["BigQuery ML (CREATE MODEL · AI.FORECAST)"]
34
36
  end
35
- subgraph OUT["Results back in BigQuery"]
36
- REG["5 registry tables<br/>forecasts · backtests · metadata · runs · jobs"]
37
- VIEWS["5 analytical views<br/>leaderboard · coverage · run summary"]
37
+ subgraph OUT["3. Governed Results & Trust in BigQuery"]
38
+ direction TB
39
+ REG["5 BigQuery Registry Tables<br/>forecasts · backtests · metadata<br/>runs · jobs"]
40
+ VIEWS["5 Analytical SQL Views<br/>Leaderboards · Backtest Coverage<br/>Run & Job Summaries"]
41
+ USE["Practitioner Trust & Consumption<br/>7-Question Assessment · FVA Ladder<br/>Attributions · SDK · Looker"]
42
+ REG --> VIEWS --> USE
38
43
  end
39
- USE["Notebooks · Python SDK · Looker · Cloud Composer DAGs"]
40
44
 
41
- SRC --> CFG --> R
42
- R --> S & RY & V & G & K & A & B
43
- S & RY & V & G & K & A & B --> REG --> VIEWS --> USE
45
+ PREP --> RUN --> OUT
44
46
 
45
- classDef data fill:#E8F0FE,stroke:#4285F4,color:#174EA6
46
- classDef config fill:#FEF7E0,stroke:#F9AB00,color:#7A5A00
47
- classDef route fill:#FCE8E6,stroke:#EA4335,color:#A50E0E
48
- classDef compute fill:#E6F4EA,stroke:#34A853,color:#0D652D
47
+ classDef data fill:#E8F0FE,stroke:#4285F4,stroke-width:2px,color:#174EA6
48
+ classDef config fill:#FEF7E0,stroke:#F9AB00,stroke-width:2px,color:#7A5A00
49
+ classDef route fill:#FCE8E6,stroke:#EA4335,stroke-width:2px,color:#A50E0E
50
+ classDef compute fill:#E6F4EA,stroke:#34A853,stroke-width:2px,color:#0D652D
49
51
  class SRC,REG,VIEWS,USE data
50
- class CFG config
52
+ class CFG,LAUNCH config
51
53
  class R route
52
54
  class S,RY,V,G,K,A,B compute
53
55
  ```
@@ -80,11 +82,12 @@ import scale_forecasting as sf
80
82
  from scale_forecasting import playground
81
83
 
82
84
  result = playground.run_one(model="theta", horizon=14, backtest=True)
85
+ auto_run = sf.Forecaster.auto(playground.sample_data(n_series=3), tier="first_light", autofocus=True)
83
86
  plan = sf.Forecaster.from_file("configs/ensemble_demo.json").dry_run()
84
- print(result.metrics["wape"], plan.run_id)
87
+ print(result.metrics["wape"], auto_run.leaderboard_df().iloc[0]["model_type"], plan.run_id)
85
88
  ```
86
89
 
87
- Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
90
+ Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb), [`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb), [Auto-forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md), or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
88
91
 
89
92
  ### Journey 2 — Deploy to your Google Cloud project in 15 minutes
90
93
 
@@ -153,6 +156,23 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
153
156
 
154
157
  ---
155
158
 
159
+ ## Write a `RunConfig` by hand — or let the Glass-Box Auto-Forecaster compile & refine it
160
+
161
+ You can always author a [`RunConfig`](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) JSON file directly and run it with any method in this repository. Or, when starting on a new dataset, let **`Forecaster.build_config()`** and **`Forecaster.auto()`** profile your data (`Forecaster.profile_data()`), compile a standard `RunConfig` across **4 exposure tiers** (`first_light`, `wide_field`, `deep_sky`, `deep_field`), optionally refine it with multi-branch **`autofocus`**, and answer the 7 core questions every forecaster asks (`f.practitioner_assessment_df()`, `f.compare_models()`):
162
+
163
+ | What Forecasters Care About | Manual Trial-and-Error | Typical Black-Box AutoML | `scale-forecasting` Glass-Box Auto-Forecaster & `autofocus` |
164
+ | :--- | :--- | :--- | :--- |
165
+ | **Transparency & ownership** | Full control, but days of hand-tuning JSON/code across model families. | Swallows your data and hides *why* models or features were picked. | **100% glass-box:** Prints a plain-English rationale table (`bp.explain()`) and saves a standard, editable `RunConfig` JSON you own (`--init-config`). |
166
+ | **User constraints (`[PINNED]`)** | You wire every constraint and fallback by hand. | Take-it-or-leave-it automation; hard to lock specific families or metrics. | **Pin any dial:** Lock `allowed_families`, `models`, `decision_metric`, `n_folds`, `hpo`, `ensemble`, or `max_minutes`; `autofocus` optimizes strictly around your pins. |
167
+ | **Compute & scale awareness (`n_series`)** | You manually size VMs, GPUs, and worker pools for 10 vs. 100k series. | Assumes a single Python machine or a single fixed cluster. | **Co-designs models + 7 cloud runtimes:** Adapts portfolios from `micro` (`<15` series) to `hyperscale` (`25,000+` series) across `local`, `bigquery`, `spark`, `ray`, `vertex`, `gce`, and `gke`. |
168
+ | **Iterative learning & compute reuse** | Re-running a tweak refits every model from scratch. | Runs a single fixed pipeline or brute-forces everything upfront. | **Multi-branch `autofocus` DAG + cell borrowing:** Tests isolated upgrades (`2A` scale/outliers, `2B` feature pruning/horizon, `2C` intermittent/hierarchy/stockouts), **borrows Pass 1's finished models**, and guarantees non-degradation via the **Champion Ratchet**. |
169
+ | **"Earn your complexity" proof** | Easy to overfit noisy features without noticing a simple model was better. | Often crowns a heavy model without proving lift over simple baselines. | **4-anchor Baseline Ladder & 7-Question Assessment:** Benchmarks against seasonal naive, plain univariate (`theta`), and dual-mode foundation baselines (`@univariate` vs. `@global_cov_all`). If a simple univariate model wins, it becomes champion and lists the complex models it beat (`f.baseline_value_df()`, `f.practitioner_assessment_df()`). |
170
+ | **How the policy was built** | Individual intuition and ad-hoc rules of thumb. | Fixed vendor heuristics or slow, costly runtime LLM calls. | **Evolved with AlphaEvolve on Gemini Enterprise (`26.08 -> 74.82` fitness across 20 synthetic DGPs + 9 public benchmarks)** and compiled into deterministic pure Python (**zero LLM calls at runtime**). |
171
+
172
+ Full guide and interactive notebook: **[Glass-Box Auto-Forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)** and **[`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb)**.
173
+
174
+ ---
175
+
156
176
  ## Why Google Cloud for forecasting at any scale
157
177
 
158
178
  | Pillar | What it means for you | Proof in this repository |
@@ -178,15 +198,16 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
178
198
 
179
199
  - **Evaluation, quantiles & calibration:** **21 evaluation metrics** (16 point + 5 interval: `wape`, `smape`, `mape`, `maape`, `ope`, `mae`, `rmse`, `mse`, `rmsle`, `bias`, `mase`, `mase_seasonal`, `rmsse`, `msse`, `r2`, `cv`, `coverage`, `pinball`, `interval_score`, `interval_width`, `msis`), empirical conformal prediction intervals, monotone multi-percentile fans (`output.quantiles` with Chernozhukov rearrangement), and Newsvendor asymmetric cost targets (`underage_cost` / `overage_cost`) ([`docs/metrics_reference.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md)).
180
200
  - **Hierarchy, smart ensembles & explainability:** All 8 Hyndman FPP3 reconciliation methods (including active-set non-negative `"mint_nonneg"` alongside `mint_shrink`, `wls_var`, `wls_struct`, `ols`, `bottom_up`, `top_down`, `middle_out`), 8 ensemble strategies (`mean`, `median`, `inverse_error`, `champion`, `horizon_specialist`, `nnls`, `ridge`, `xgb`) with `top_k` & `parsimony_margin` pruning and calibrated ensemble intervals, physical bounds (`floor`, `cap`, `cumulative_round`), and two-tier feature attributions (`attributions_df` / `plot_attributions`).
201
+ - **Glass-box auto-forecaster & multi-branch `autofocus`:** Compile an explained `RunConfig` from any DataFrame or BigQuery table (`Forecaster.build_config()` / `--init-config`) across 4 exposure tiers (`first_light`, `wide_field`, `deep_sky`, `deep_field`) with optional user scope pins and approximate 7-runtime duration/cost estimates (`predict_run_duration`), or run a multi-branch `autofocus=True` tournament (`Forecaster.auto()`) whose pure-Python decision rules were evolved with **AlphaEvolve on Gemini Enterprise** across 20 synthetic ground-truth test panels and 9 public open-data benchmarks ([`docs/auto_forecaster.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)).
181
202
  - **Forecaster workbench, econometrics, inventory policy & executive reports:** Pre-fit data hygiene & SBC demand regime routing (`smooth`, `erratic`, `intermittent`, `lumpy`), Forecast Value Added (`compute_fva`) with Harvey–Leybourne–Newbold (1997) modified Diebold–Mariano $p$-values, lead-time horizon decay, Trigg tracking-signal bias audits, AR(1)-aware time rollups (`rollup_time`) and replenishment policy translators (`compute_inventory_policy` / `inventory_policy_df` for $(s, S)$, $(R, S)$, Fill Rate, and Newsvendor safety stock, reorder point, and EOQ), counterfactual promo/price scenario simulation (`simulate_scenarios`), live drift & whipsaw stability scoring, Top-$N$ exception triage (`exceptions_df`), and self-contained interactive HTML/JSON reports (`python -m scale_forecasting.report`) ([`docs/forecaster_workbench.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md)).
182
203
 
183
204
  ---
184
205
 
185
- ## Learn by doing (11 notebooks across 4 tracks)
206
+ ## Learn by doing (12 notebooks across 4 tracks)
186
207
 
187
208
  All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/README.md) include committed outputs and one-click **Colab Enterprise** launch links:
188
209
 
189
- - **Track 1 — Local sandbox & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
210
+ - **Track 1 — Local sandbox, auto-forecaster & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
190
211
  - **Track 2 — Cloud runtimes:** [`01_bigquery_native_sql.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/01_bigquery_native_sql.ipynb) · [`02_vertex_and_gce_vms.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/02_vertex_and_gce_vms.ipynb) · [`03_spark_serverless_and_connect.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/03_spark_serverless_and_connect.ipynb) · [`04_ray_on_vertex_gpu.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/04_ray_on_vertex_gpu.ipynb)
191
212
  - **Track 3 — Covariates, hierarchy, HPO & ensembles:** [`05_covariates_and_global_models.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/05_covariates_and_global_models.ipynb) · [`06_hierarchical_reconciliation.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/06_hierarchical_reconciliation.ipynb) · [`07_hpo_backtesting_and_ensembles.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/07_hpo_backtesting_and_ensembles.ipynb)
192
213
  - **Track 4 — Master multi-engine DAG & operations:** [`08_multi_engine_master_workflow.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/08_multi_engine_master_workflow.ipynb) · [`10_registry_operations_and_scale.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/10_registry_operations_and_scale.ipynb)
@@ -196,7 +217,7 @@ All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/bl
196
217
 
197
218
  ## Where next
198
219
 
199
- - **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
220
+ - **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Auto-forecaster & `autofocus`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
200
221
  - **Reference:** [Compute runtimes](https://github.com/statmike/scale-forecasting/blob/main/docs/runtimes_reference.md) · [Configuration](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) · [Models & ensembles](https://github.com/statmike/scale-forecasting/blob/main/docs/models_reference.md) · [Evaluation metrics](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md) · [Output schemas & views](https://github.com/statmike/scale-forecasting/blob/main/docs/output_schemas.md)
201
222
  - **Operate & extend:** [Python SDK (`Forecaster`)](https://github.com/statmike/scale-forecasting/blob/main/docs/using_the_sdk.md) · [Running & reviewing](https://github.com/statmike/scale-forecasting/blob/main/docs/running_and_reviewing.md) · [Operations & repair](https://github.com/statmike/scale-forecasting/blob/main/docs/operations.md) · [Quota & 100k scale](https://github.com/statmike/scale-forecasting/blob/main/docs/quota_and_scale.md) · [System validation ledger](https://github.com/statmike/scale-forecasting/blob/main/docs/validation.md) · [API reference](https://statmike.github.io/scale-forecasting/api/)
202
223
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "scale-forecasting"
3
- version = "1.2.0"
3
+ version = "1.3.0"
4
4
  description = "Time-series forecasting on Google Cloud at any scale: one JSON configuration runs every model family on Dataproc Serverless, Ray, Vertex AI, GKE, Compute Engine, or BigQuery ML and writes forecasts and leaderboards back to BigQuery."
5
5
  dynamic = ["readme"]
6
6
  # Two different pins, on purpose. `requires-python` is what *the package* installs on: the pure
@@ -53,7 +53,7 @@ from .settings import Settings
53
53
  try:
54
54
  __version__: str = _pkg_version("scale-forecasting")
55
55
  except PackageNotFoundError: # pragma: no cover - zip-staged cloud worker without .dist-info
56
- __version__ = "1.2.0"
56
+ __version__ = "1.3.0"
57
57
 
58
58
  # Lazy (heavy): name -> (module, attribute). Resolved on first access by ``__getattr__`` (PEP 562)
59
59
  # so the model modules (statsmodels et al., ~5s) load only when a caller actually reaches for the
@@ -150,6 +150,40 @@ _LAZY: dict[str, tuple[str, str]] = {
150
150
  "build_report_payload": (".report", "build_report_payload"),
151
151
  "render_html_report": (".report", "render_html_report"),
152
152
  "export_report": (".report", "export_report"),
153
+ # Glass-Box Auto-Forecaster, Duration Predictor & DGP Benchmarks.
154
+ "EXPOSURE_TIERS": (".auto", "EXPOSURE_TIERS"),
155
+ "SCALE_REGIMES": (".auto", "SCALE_REGIMES"),
156
+ "classify_scale_regime": (".auto", "classify_scale_regime"),
157
+ "select_default_baselines": (".auto", "select_default_baselines"),
158
+ "select_hierarchy_reconciliation_methods": (
159
+ ".auto",
160
+ "select_hierarchy_reconciliation_methods",
161
+ ),
162
+ "ConfigBlueprint": (".auto", "ConfigBlueprint"),
163
+ "AutofocusPassRecord": (".auto", "AutofocusPassRecord"),
164
+ "NextLoopPreview": (".auto", "NextLoopPreview"),
165
+ "PanelAutoProfile": (".auto", "PanelAutoProfile"),
166
+ "inspect_panel_for_auto": (".auto", "inspect_panel_for_auto"),
167
+ "build_config": (".auto", "build_config"),
168
+ "auto_forecast": (".auto", "auto_forecast"),
169
+ "DurationEstimate": (".profiling.duration", "DurationEstimate"),
170
+ "FamilyDurationBreakdown": (".profiling.duration", "FamilyDurationBreakdown"),
171
+ "DurationCalibration": (".profiling.duration", "DurationCalibration"),
172
+ "predict_run_duration": (".profiling.duration", "predict_run_duration"),
173
+ "calibrate_duration_from_frames": (".profiling.duration", "calibrate_duration_from_frames"),
174
+ "calibrate_duration_from_registry": (".profiling.duration", "calibrate_duration_from_registry"),
175
+ "BENCHMARK_NAMES": (".benchmarks", "BENCHMARK_NAMES"),
176
+ "BenchmarkSpec": (".benchmarks", "BenchmarkSpec"),
177
+ "BenchmarkDataset": (".benchmarks", "BenchmarkDataset"),
178
+ "list_benchmarks": (".benchmarks", "list_benchmarks"),
179
+ "benchmark_catalog": (".benchmarks", "benchmark_catalog"),
180
+ "load_benchmark": (".benchmarks", "load_benchmark"),
181
+ "PUBLIC_BENCHMARK_NAMES": (".benchmarks", "PUBLIC_BENCHMARK_NAMES"),
182
+ "PUBLIC_BENCHMARK_SPECS": (".benchmarks", "PUBLIC_BENCHMARK_SPECS"),
183
+ "PublicBenchmarkSpec": (".benchmarks", "PublicBenchmarkSpec"),
184
+ "list_public_benchmarks": (".benchmarks", "list_public_benchmarks"),
185
+ "public_benchmark_catalog": (".benchmarks", "public_benchmark_catalog"),
186
+ "fetch_public_benchmark": (".benchmarks", "fetch_public_benchmark"),
153
187
  }
154
188
 
155
189
  __all__ = [
@@ -174,6 +208,34 @@ __all__ = [
174
208
 
175
209
  if TYPE_CHECKING: # so IDEs / type-checkers see the lazy names as real imports (re-exported below)
176
210
  from .agent_surfaces import probe_environment # noqa: F401
211
+ from .auto import ( # noqa: F401
212
+ EXPOSURE_TIERS,
213
+ SCALE_REGIMES,
214
+ AutofocusPassRecord,
215
+ ConfigBlueprint,
216
+ NextLoopPreview,
217
+ PanelAutoProfile,
218
+ auto_forecast,
219
+ build_config,
220
+ classify_scale_regime,
221
+ inspect_panel_for_auto,
222
+ select_default_baselines,
223
+ select_hierarchy_reconciliation_methods,
224
+ )
225
+ from .benchmarks import ( # noqa: F401
226
+ BENCHMARK_NAMES,
227
+ PUBLIC_BENCHMARK_NAMES,
228
+ PUBLIC_BENCHMARK_SPECS,
229
+ BenchmarkDataset,
230
+ BenchmarkSpec,
231
+ PublicBenchmarkSpec,
232
+ benchmark_catalog,
233
+ fetch_public_benchmark,
234
+ list_benchmarks,
235
+ list_public_benchmarks,
236
+ load_benchmark,
237
+ public_benchmark_catalog,
238
+ )
177
239
  from .dag import DagNode # noqa: F401
178
240
  from .diagnostics import ( # noqa: F401
179
241
  compute_anomalies,
@@ -205,6 +267,14 @@ if TYPE_CHECKING: # so IDEs / type-checkers see the lazy names as real imports
205
267
  from .mcp import McpServer # noqa: F401
206
268
  from .models import get_model, list_models # noqa: F401
207
269
  from .playground import metric_catalog, model_catalog # noqa: F401
270
+ from .profiling.duration import ( # noqa: F401
271
+ DurationCalibration,
272
+ DurationEstimate,
273
+ FamilyDurationBreakdown,
274
+ calibrate_duration_from_frames,
275
+ calibrate_duration_from_registry,
276
+ predict_run_duration,
277
+ )
208
278
  from .reconciliation import ( # noqa: F401
209
279
  HierarchySpec,
210
280
  build_hierarchy,