hypernix 0.45.2__tar.gz → 0.45.3__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 (85) hide show
  1. {hypernix-0.45.2 → hypernix-0.45.3}/PKG-INFO +5 -9
  2. {hypernix-0.45.2 → hypernix-0.45.3}/README.md +4 -8
  3. {hypernix-0.45.2 → hypernix-0.45.3}/pyproject.toml +1 -1
  4. {hypernix-0.45.2 → hypernix-0.45.3}/setup.cfg +1 -1
  5. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/__init__.py +1 -1
  6. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/smoke_alarm.py +82 -5
  7. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix.egg-info/SOURCES.txt +1 -0
  8. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_alarms_and_presets.py +64 -0
  9. hypernix-0.45.3/wiki/Changelog.md +248 -0
  10. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Home.md +9 -2
  11. {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/build.yml +0 -0
  12. {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/ci.yml +0 -0
  13. {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/public-release.yml +0 -0
  14. {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/release.yml +0 -0
  15. {hypernix-0.45.2 → hypernix-0.45.3}/LICENSE +0 -0
  16. {hypernix-0.45.2 → hypernix-0.45.3}/MANIFEST.in +0 -0
  17. {hypernix-0.45.2 → hypernix-0.45.3}/examples/custom_arch.py +0 -0
  18. {hypernix-0.45.2 → hypernix-0.45.3}/examples/quickstart.py +0 -0
  19. {hypernix-0.45.2 → hypernix-0.45.3}/examples/run_hypernix.py +0 -0
  20. {hypernix-0.45.2 → hypernix-0.45.3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
  21. {hypernix-0.45.2 → hypernix-0.45.3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
  22. {hypernix-0.45.2 → hypernix-0.45.3}/examples/upload_to_hub.py +0 -0
  23. {hypernix-0.45.2 → hypernix-0.45.3}/pytest.ini +0 -0
  24. {hypernix-0.45.2 → hypernix-0.45.3}/ruff.toml +0 -0
  25. {hypernix-0.45.2 → hypernix-0.45.3}/scripts/install_deps.sh +0 -0
  26. {hypernix-0.45.2 → hypernix-0.45.3}/scripts/quantize_i7_7660u.sh +0 -0
  27. {hypernix-0.45.2 → hypernix-0.45.3}/setup.py +0 -0
  28. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/__main__.py +0 -0
  29. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/arch.py +0 -0
  30. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/blender.py +0 -0
  31. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/cli.py +0 -0
  32. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/coffee_maker.py +0 -0
  33. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/convert.py +0 -0
  34. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/deps.py +0 -0
  35. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/doctor.py +0 -0
  36. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/download.py +0 -0
  37. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/espresso_maker.py +0 -0
  38. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/fetcher.py +0 -0
  39. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/food_processor.py +0 -0
  40. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/freezer.py +0 -0
  41. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/generate.py +0 -0
  42. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/industrial_range.py +0 -0
  43. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/instant_pot.py +0 -0
  44. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/mediocre_fridge.py +0 -0
  45. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/microwave.py +0 -0
  46. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/nano_nano.py +0 -0
  47. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/new_fridge.py +0 -0
  48. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/new_range.py +0 -0
  49. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_fridge.py +0 -0
  50. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_oven.py +0 -0
  51. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_range.py +0 -0
  52. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/pans.py +0 -0
  53. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/pressure_cooker.py +0 -0
  54. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/py.typed +0 -0
  55. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/quantize.py +0 -0
  56. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/sink.py +0 -0
  57. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/smoker.py +0 -0
  58. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/table.py +0 -0
  59. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/toaster.py +0 -0
  60. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/train.py +0 -0
  61. {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/upload.py +0 -0
  62. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_arch_mapping.py +0 -0
  63. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_cli_integration.py +0 -0
  64. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_deps_and_windows.py +0 -0
  65. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_fetcher.py +0 -0
  66. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_freezer.py +0 -0
  67. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_fridges.py +0 -0
  68. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_kitchen_v044.py +0 -0
  69. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_kitchen_v045.py +0 -0
  70. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_new_archs_v035.py +0 -0
  71. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_old_oven.py +0 -0
  72. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_ranges.py +0 -0
  73. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_snapshot_roundtrip.py +0 -0
  74. {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_v031_chat_and_archs.py +0 -0
  75. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Alarms.md +0 -0
  76. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Architectures.md +0 -0
  77. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/CLI.md +0 -0
  78. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Freezer.md +0 -0
  79. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Fridges.md +0 -0
  80. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Kitchen.md +0 -0
  81. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Ovens.md +0 -0
  82. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Pascal.md +0 -0
  83. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Quantization.md +0 -0
  84. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Ranges.md +0 -0
  85. {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Training.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypernix
3
- Version: 0.45.2
3
+ Version: 0.45.3
4
4
  Summary: Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
5
5
  Home-page: https://github.com/minerofthesoal/hypernix-pip
6
6
  Author: HyperNix contributors
@@ -53,11 +53,6 @@ Dynamic: license-file
53
53
  **End-to-end toolkit for the `ray0rf1re/hyper-nix.1` family of PyTorch
54
54
  language models.**
55
55
 
56
- `hypernix` started as a one-shot GGUF converter and has since grown into
57
- a small but opinionated framework covering the whole lifecycle — from a
58
- blank directory to a trained, quantized, uploaded HuggingFace snapshot.
59
- Every subsystem is a plain Python module you can pick up and use in
60
- isolation.
61
56
 
62
57
  | Subsystem | What it does |
63
58
  |---|---|
@@ -325,6 +320,7 @@ Topic-focused reference guides live in the `wiki/` directory:
325
320
  - [`wiki/Training.md`](wiki/Training.md) — scratch training, expansion, and fine-tuning flows
326
321
  - [`wiki/CLI.md`](wiki/CLI.md) — full CLI cheat sheet
327
322
  - [`wiki/Quantization.md`](wiki/Quantization.md) — GGUF conversion + k-quant pipeline
323
+ - [`wiki/Changelog.md`](wiki/Changelog.md) — full per-release version history
328
324
 
329
325
  ## How the GGUF pipeline works
330
326
 
@@ -340,9 +336,9 @@ k-quant in the plan.
340
336
 
341
337
  ## Platform notes
342
338
 
343
- - **Linux**: full support, every distro tested (Ubuntu, Debian, Arch, Fedora, openSUSE, Alpine, NixOS).
344
- - **macOS**: Metal for inference, Homebrew for `llama-quantize`.
345
- - **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps.
339
+ - **Linux**: full support, every distro tested on: (Ubuntu, Debian, Arch.)
340
+ - **macOS**: Metal for inference, Homebrew for `llama-quantize`. (untested)
341
+ - **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps. (untested)
346
342
  - **Pascal (GTX 1080 / 1080 Ti / Titan Xp)**: install torch from the CUDA 11.8 index first (see above). Use `OldFreezer` or `auto_freezer()`; `pascal_safe_dtype()` picks fp16. `hypernix.freezer.pascal_mode_hints()` returns the full Pascal cheat sheet.
347
343
 
348
344
  ## Build / release
@@ -7,11 +7,6 @@
7
7
  **End-to-end toolkit for the `ray0rf1re/hyper-nix.1` family of PyTorch
8
8
  language models.**
9
9
 
10
- `hypernix` started as a one-shot GGUF converter and has since grown into
11
- a small but opinionated framework covering the whole lifecycle — from a
12
- blank directory to a trained, quantized, uploaded HuggingFace snapshot.
13
- Every subsystem is a plain Python module you can pick up and use in
14
- isolation.
15
10
 
16
11
  | Subsystem | What it does |
17
12
  |---|---|
@@ -279,6 +274,7 @@ Topic-focused reference guides live in the `wiki/` directory:
279
274
  - [`wiki/Training.md`](wiki/Training.md) — scratch training, expansion, and fine-tuning flows
280
275
  - [`wiki/CLI.md`](wiki/CLI.md) — full CLI cheat sheet
281
276
  - [`wiki/Quantization.md`](wiki/Quantization.md) — GGUF conversion + k-quant pipeline
277
+ - [`wiki/Changelog.md`](wiki/Changelog.md) — full per-release version history
282
278
 
283
279
  ## How the GGUF pipeline works
284
280
 
@@ -294,9 +290,9 @@ k-quant in the plan.
294
290
 
295
291
  ## Platform notes
296
292
 
297
- - **Linux**: full support, every distro tested (Ubuntu, Debian, Arch, Fedora, openSUSE, Alpine, NixOS).
298
- - **macOS**: Metal for inference, Homebrew for `llama-quantize`.
299
- - **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps.
293
+ - **Linux**: full support, every distro tested on: (Ubuntu, Debian, Arch.)
294
+ - **macOS**: Metal for inference, Homebrew for `llama-quantize`. (untested)
295
+ - **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps. (untested)
300
296
  - **Pascal (GTX 1080 / 1080 Ti / Titan Xp)**: install torch from the CUDA 11.8 index first (see above). Use `OldFreezer` or `auto_freezer()`; `pascal_safe_dtype()` picks fp16. `hypernix.freezer.pascal_mode_hints()` returns the full Pascal cheat sheet.
301
297
 
302
298
  ## Build / release
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hypernix"
7
- version = "0.45.2"
7
+ version = "0.45.3"
8
8
  description = "Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M)."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = hypernix
3
- version = 0.45.2
3
+ version = 0.45.3
4
4
  description = Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -157,5 +157,5 @@ __all__ = [
157
157
  "verify_snapshot",
158
158
  ]
159
159
 
160
- __version__ = "0.45.2"
160
+ __version__ = "0.45.3"
161
161
  DEFAULT_REPO_ID = "ray0rf1re/hyper-nix.1"
@@ -32,7 +32,7 @@ from __future__ import annotations
32
32
 
33
33
  import time
34
34
  from collections.abc import Callable
35
- from dataclasses import dataclass
35
+ from dataclasses import dataclass, field
36
36
  from typing import Any
37
37
 
38
38
  import torch
@@ -198,6 +198,39 @@ class RadsAlarm(Alarm):
198
198
  object.__setattr__(self, "name", "RadsAlarm")
199
199
 
200
200
 
201
+ # ---------------------------------------------------------------------------
202
+ # Preset name resolution — shared by GasAlarm, AutoAlarm, and the
203
+ # public factory helpers. The ``preset=`` kwarg is the intuitive
204
+ # single-string entry point ("give me the alarm for an i7-7700HQ" or
205
+ # "give me the alarm for an H100"); it's resolved against GPU_PRESETS
206
+ # first (GPU bandwidth is the dominant signal for training throughput)
207
+ # and CPU_PRESETS as a fallback.
208
+ # ---------------------------------------------------------------------------
209
+
210
+
211
+ def _resolve_preset(
212
+ preset: str | None,
213
+ ) -> tuple[CPUPreset | None, GPUPreset | None]:
214
+ """Resolve a single ``preset=`` string to ``(cpu, gpu)``.
215
+
216
+ GPU matches win over CPU matches. Raises :class:`ValueError` with
217
+ a useful list of valid names when the string doesn't match any
218
+ preset.
219
+ """
220
+ if preset is None:
221
+ return None, None
222
+ g = gpu_preset(preset)
223
+ if g is not None:
224
+ return None, g
225
+ c = cpu_preset(preset)
226
+ if c is not None:
227
+ return c, None
228
+ raise ValueError(
229
+ f"unknown preset {preset!r}; valid GPU presets: "
230
+ f"{sorted(GPU_PRESETS)}; valid CPU presets: {sorted(CPU_PRESETS)}"
231
+ )
232
+
233
+
201
234
  # ---------------------------------------------------------------------------
202
235
  # GasAlarm — mid tier
203
236
  # ---------------------------------------------------------------------------
@@ -205,13 +238,29 @@ class RadsAlarm(Alarm):
205
238
  @dataclass
206
239
  class GasAlarm(Alarm):
207
240
  """Mid tier. Looks up CPU and GPU presets and scales the per-step
208
- estimate by their throughput vs. the generic baseline."""
241
+ estimate by their throughput vs. the generic baseline.
242
+
243
+ Accepts three equivalent ways to name the hardware:
244
+
245
+ * ``cpu=CPUPreset(...)``, ``gpu=GPUPreset(...)`` — explicit objects.
246
+ * ``cpu_name=``, ``gpu_name=`` via :meth:`from_names` or the
247
+ :func:`gas_alarm` factory.
248
+ * ``preset="i7-7700hq"`` / ``preset="h100"`` — single-string
249
+ shortcut, resolved against GPU first then CPU.
250
+ """
209
251
 
210
252
  cpu: CPUPreset | None = None
211
253
  gpu: GPUPreset | None = None
254
+ preset: str | None = field(default=None, kw_only=True)
212
255
 
213
256
  def __post_init__(self) -> None:
214
257
  object.__setattr__(self, "name", "GasAlarm")
258
+ if self.preset is not None:
259
+ c, g = _resolve_preset(self.preset)
260
+ if c is not None and self.cpu is None:
261
+ self.cpu = c
262
+ if g is not None and self.gpu is None:
263
+ self.gpu = g
215
264
 
216
265
  @classmethod
217
266
  def from_names(
@@ -220,12 +269,14 @@ class GasAlarm(Alarm):
220
269
  *,
221
270
  cpu_name: str | None = None,
222
271
  gpu_name: str | None = None,
272
+ preset: str | None = None,
223
273
  **kwargs: Any,
224
274
  ) -> GasAlarm:
225
275
  return cls(
226
276
  time_budget_seconds=time_budget_seconds,
227
277
  cpu=cpu_preset(cpu_name) if cpu_name else None,
228
278
  gpu=gpu_preset(gpu_name) if gpu_name else None,
279
+ preset=preset,
229
280
  **kwargs,
230
281
  )
231
282
 
@@ -396,10 +447,20 @@ def gas_alarm(
396
447
  *,
397
448
  cpu_name: str | None = None,
398
449
  gpu_name: str | None = None,
450
+ preset: str | None = None,
399
451
  **kw: Any,
400
452
  ) -> GasAlarm:
453
+ """Construct a :class:`GasAlarm`.
454
+
455
+ ``cpu_name`` / ``gpu_name`` resolve against ``CPU_PRESETS`` /
456
+ ``GPU_PRESETS`` respectively. ``preset`` is a one-string alias
457
+ that resolves against GPU first, then CPU — use it when you just
458
+ want "the alarm for my card / chip" without caring which registry
459
+ the name comes from.
460
+ """
401
461
  return GasAlarm.from_names(
402
- time_budget_seconds, cpu_name=cpu_name, gpu_name=gpu_name, **kw,
462
+ time_budget_seconds,
463
+ cpu_name=cpu_name, gpu_name=gpu_name, preset=preset, **kw,
403
464
  )
404
465
 
405
466
 
@@ -423,6 +484,7 @@ def auto_alarm(
423
484
  *,
424
485
  cpu_name: str | None = None,
425
486
  gpu_name: str | None = None,
487
+ preset: str | None = None,
426
488
  warmup_step_fn: Callable[[], Any] | None = None,
427
489
  detect_hardware: bool = True,
428
490
  **kw: Any,
@@ -430,9 +492,24 @@ def auto_alarm(
430
492
  """Convenience entry point that returns a concrete alarm.
431
493
 
432
494
  When ``detect_hardware=True`` (the default) and no ``cpu_name`` /
433
- ``gpu_name`` was supplied, :func:`detect_cpu_preset` and
434
- :func:`detect_gpu_preset` are consulted first.
495
+ ``gpu_name`` / ``preset`` was supplied, :func:`detect_cpu_preset`
496
+ and :func:`detect_gpu_preset` are consulted first.
497
+
498
+ ``preset`` is the one-string shortcut — resolved against GPU
499
+ presets first and CPU presets second.
435
500
  """
501
+ if preset is not None:
502
+ c, g = _resolve_preset(preset)
503
+ if c is not None and cpu_name is None:
504
+ for k, v in CPU_PRESETS.items():
505
+ if v is c:
506
+ cpu_name = k
507
+ break
508
+ if g is not None and gpu_name is None:
509
+ for k, v in GPU_PRESETS.items():
510
+ if v is g:
511
+ gpu_name = k
512
+ break
436
513
  if detect_hardware and gpu_name is None:
437
514
  det_gpu = detect_gpu_preset()
438
515
  if det_gpu is not None:
@@ -71,6 +71,7 @@ tests/test_v031_chat_and_archs.py
71
71
  wiki/Alarms.md
72
72
  wiki/Architectures.md
73
73
  wiki/CLI.md
74
+ wiki/Changelog.md
74
75
  wiki/Freezer.md
75
76
  wiki/Fridges.md
76
77
  wiki/Home.md
@@ -245,6 +245,70 @@ def test_auto_alarm_with_warmup_picks_modern() -> None:
245
245
  assert a.measured_step_seconds is not None
246
246
 
247
247
 
248
+ # Regression: GasAlarm(preset="i7-7700hq") used to raise
249
+ # "unexpected keyword argument 'preset'". Every constructor / factory
250
+ # now accepts ``preset=`` as a one-string shortcut that resolves
251
+ # against GPU_PRESETS first, then CPU_PRESETS.
252
+
253
+
254
+ def test_gas_alarm_accepts_preset_cpu() -> None:
255
+ from hypernix import smoke_alarm
256
+
257
+ a = smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="i7-7700hq")
258
+ assert a.cpu is not None
259
+ assert a.cpu.name.startswith("Intel Core i7-7700HQ")
260
+ assert a.gpu is None
261
+
262
+
263
+ def test_gas_alarm_accepts_preset_gpu() -> None:
264
+ from hypernix import smoke_alarm
265
+
266
+ a = smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="rtx-3080-ti")
267
+ assert a.gpu is not None
268
+ assert a.gpu.name.startswith("NVIDIA GeForce RTX 3080 Ti")
269
+ assert a.cpu is None
270
+
271
+
272
+ def test_gas_alarm_factory_accepts_preset() -> None:
273
+ from hypernix import smoke_alarm
274
+
275
+ a = smoke_alarm.gas_alarm(time_budget_seconds=3600.0, preset="h100")
276
+ assert a.gpu is not None
277
+ assert "H100" in a.gpu.name
278
+
279
+
280
+ def test_auto_alarm_accepts_preset() -> None:
281
+ from hypernix import smoke_alarm
282
+
283
+ a = smoke_alarm.auto_alarm(
284
+ time_budget_seconds=3600.0, preset="i7-7700hq",
285
+ detect_hardware=False,
286
+ )
287
+ assert isinstance(a, smoke_alarm.GasAlarm)
288
+ assert a.cpu is not None
289
+
290
+
291
+ def test_gas_alarm_unknown_preset_lists_valid() -> None:
292
+ import pytest
293
+
294
+ from hypernix import smoke_alarm
295
+
296
+ with pytest.raises(ValueError, match="unknown preset"):
297
+ smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="not-real-cpu")
298
+
299
+
300
+ def test_preset_does_not_override_explicit_cpu() -> None:
301
+ """Explicit ``cpu=`` wins over a conflicting ``preset=`` hint."""
302
+ from hypernix import smoke_alarm
303
+ from hypernix.freezer import cpu_preset
304
+
305
+ explicit = cpu_preset("i7-14700k")
306
+ a = smoke_alarm.GasAlarm(
307
+ time_budget_seconds=3600.0, cpu=explicit, preset="i7-7660u",
308
+ )
309
+ assert a.cpu is explicit
310
+
311
+
248
312
  def test_auto_alarm_with_gpu_name_picks_gas() -> None:
249
313
  from hypernix import smoke_alarm
250
314
 
@@ -0,0 +1,248 @@
1
+ # Changelog
2
+
3
+ Full per-release notes for `hypernix`. The top-level `wiki/Home.md`
4
+ keeps a running "recent highlights" list; this page is the canonical
5
+ history. Semver-ish: minor bumps add features, patch bumps are bug
6
+ fixes and UX papercuts. Dates are `YYYY-MM-DD` for PyPI-published
7
+ releases; in-branch commits between releases are grouped under the
8
+ next release header.
9
+
10
+ ## Legend
11
+
12
+ - ✨ new feature
13
+ - 🐛 bug fix
14
+ - 🛡️ UX / error-message polish
15
+ - 📚 documentation
16
+ - 🔧 internal / plumbing
17
+
18
+ ---
19
+
20
+ ## 0.45.3
21
+
22
+ 🛡️ **`smoke_alarm.GasAlarm` accepts `preset=`.** One-string shortcut
23
+ that resolves against `GPU_PRESETS` first, then `CPU_PRESETS`. Works
24
+ on the class (`GasAlarm(..., preset="i7-7700hq")`), on the factory
25
+ (`gas_alarm(..., preset="h100")`), and on the selector
26
+ (`auto_alarm(..., preset="rtx-3080-ti")`). Unknown names raise
27
+ `ValueError` with the full list of valid presets.
28
+
29
+ 🛡️ Explicit `cpu=` / `gpu=` instances still win over a conflicting
30
+ `preset=` hint — no silent overwrite.
31
+
32
+ 🔧 Shared `_resolve_preset` helper in `smoke_alarm.py`.
33
+
34
+ ## 0.45.2
35
+
36
+ 🐛 **Every pan accepts `context_length=` and `max_chars=`.** Reported:
37
+ `FryingPan(context_length=CONTEXT_LEN)` raised a bare `TypeError`.
38
+ Both are now keyword-only fields on the `Pan` base class; when set,
39
+ lines are truncated to fit. `context_length` is treated as
40
+ `max_chars = context_length * 4` (English-BPE heuristic); the direct
41
+ `max_chars=` wins when both are set. For precise chunking by tokens
42
+ use `hypernix.food_processor` instead.
43
+
44
+ ## 0.45.1
45
+
46
+ 🐛 **Pan positional-argument fix.** `Pan` inherited `name: str` as a
47
+ dataclass field, so `Skillet(src, "instruct")` silently set
48
+ `name="instruct"` and left `mode="chat"`. Fix: `name` is now a
49
+ `typing.ClassVar` on every pan — still the pan's label, no longer
50
+ part of `__init__`. `GrillPan._seen` (internal dedupe state) marked
51
+ `init=False`.
52
+
53
+ 🛡️ `pick_pan` error messages now list valid tiers / valid kwargs
54
+ instead of raising `KeyError` or cryptic `TypeError`.
55
+
56
+ ## 0.45.0
57
+
58
+ ✨ **Espresso, blender, toaster, food_processor, smoker** — five new
59
+ appliances, each 4 tiers. Shared interface per module.
60
+
61
+ ✨ **+3 microwave tiers** — now `defrost` (preheat-only) / `low_zap`
62
+ (deterministic one-liner) / `zap` (existing) / `high_zap`
63
+ (long-temp draft) / `chat_zap` (existing). Plus `reheat(oven,
64
+ prior_output)` for continuation without rebuild.
65
+
66
+ ✨ **+2 coffee_maker tiers and one new type.**
67
+ `FrenchPressMaker` (batch), `PercolatorMaker` (cyclic with optional
68
+ convergence), and a new `ColdBrewMaker` (long single brew with
69
+ mandatory JSON checkpoints, resumes cleanly after a crash).
70
+
71
+ ✨ **CLI `hypernix brew recipe.json`** — runs `instant_pot.brew`
72
+ from a JSON recipe. Supports `--set KEY=VALUE` overrides with JSON
73
+ literals.
74
+
75
+ 📚 `wiki/Kitchen.md` gets full sections for every new appliance.
76
+
77
+ ## 0.44.0
78
+
79
+ ✨ **Kitchen modules + pressure_cooker optimizer.** Seven new
80
+ top-level modules (pans, microwave, table, sink, instant_pot,
81
+ coffee_maker, pressure_cooker) covering preprocessing, throwaway
82
+ inference, log inspection, file output, end-to-end pipelines,
83
+ scheduled repetition, and a custom optimizer.
84
+
85
+ ✨ `pressure_cooker` — `torch.optim.Optimizer` subclass: AdamW +
86
+ three-phase LR schedule (linear warmup → plateau → cosine cooldown)
87
+ + Zhang-et-al-2019 Lookahead "pressure seal". No separate scheduler
88
+ object; the LR lives inside the optimizer.
89
+
90
+ 📚 README gains a **"Who this is actually for"** section framing the
91
+ package around the solo-GPU / consumer-card / QLoRA-to-Hub workflow,
92
+ with an explicit disclaimer that `train()` is a smoke-tester, not a
93
+ production trainer. New `wiki/Kitchen.md`.
94
+
95
+ ## 0.43.0
96
+
97
+ ✨ **`smoke_alarm`** — four-tier training-step planner + mid-run
98
+ monitor. `RadsAlarm` (constants, lightest), `GasAlarm` (CPU/GPU
99
+ presets), `ModernAlarm` (warmup-measured), `AutoAlarm` (selector).
100
+
101
+ ✨ **16 CPU presets** (`hypernix.freezer.CPU_PRESETS`): i7 7th gen
102
+ (7660U / 7700HQ / 7700K), 11th–14th gen K/H/HX, Core Ultra Series 1
103
+ (Meteor / Lunar Lake), Series 2 (Arrow Lake, AVX10).
104
+
105
+ ✨ **20 GPU presets** (`hypernix.freezer.GPU_PRESETS`): Hopper
106
+ (H100/H200), Ampere workstation (A4500–A6000), RTX PRO Ada +
107
+ Blackwell, RTX 4070 Ti Super / 4080 Super, RTX 3080 Ti, Turing
108
+ consumer (1660 Ti, 2080, 2080 Super, 2080 Ti), Pascal (1080, 1080 Ti).
109
+
110
+ 📚 New `wiki/Alarms.md` with both preset tables.
111
+
112
+ ## 0.42.0
113
+
114
+ ✨ **`new_range` / `old_range` / `industrial_range`** — three
115
+ sophistication tiers of labeling rubrics that drop into
116
+ `mediocre_fridge.collect_responses_from(label_rule=...)`.
117
+
118
+ - `new_range` — zero-dep first-fail rubric (is_empty, is_refusal,
119
+ math_lacks_digit, is_repetition).
120
+ - `old_range` — weighted-mean scored rubric with `None` = "no
121
+ opinion", any-rule-at-0 short-circuits to BAD, references / keywords
122
+ / stopword-filtered overlap built in.
123
+ - `industrial_range` — LLM-as-judge wrapper around any CodeOven;
124
+ pointwise + pairwise with caching.
125
+
126
+ 📚 New `wiki/Ranges.md`.
127
+
128
+ ## 0.41.0
129
+
130
+ ✨ **CUDA 6.1 / Pascal support.** `compute_capability`, `is_pascal`,
131
+ `pascal_safe_dtype` (fp32 on CPU, fp16 on Pascal / Volta / Turing,
132
+ bf16 on Ampere+), `pascal_mode_hints` (one-stop dict of recommended
133
+ settings for sm_61).
134
+
135
+ ✨ **`examples/train_hypernix_1_5_gtx1080.py`** — HyperNix 1.5,
136
+ verified 92,130,048 params, trains on an 8 GB Pascal card via
137
+ `auto_freezer` + `flash_freezer(slow=True)`.
138
+
139
+ 📚 New `wiki/Pascal.md` with a full sm_61 playbook.
140
+
141
+ ## 0.40.0
142
+
143
+ ✨ **`freezer` module** — VRAM manager. `OldFreezer` (8 – 10 GB,
144
+ batch=1, fp16, empty_cache each step), `NewFreezer` (11 GB+, batch=8,
145
+ fp32/bf16), `FlashFreezer` (OOM-safe retry wrapper with exponential
146
+ backoff, wait-for-free-GB, and optional slow-mode that halves
147
+ `current_batch_size` on each retry).
148
+
149
+ 📚 New `wiki/Freezer.md`.
150
+
151
+ ## 0.36.0
152
+
153
+ ✨ **`old_fridge` / `mediocre_fridge` / `new_fridge`** — memory
154
+ housekeeping (freeze/unfreeze/parameter_stats), judge-training dataset
155
+ synthesis, and training-curve plotting.
156
+
157
+ ✨ `examples/train_hypernix_0_1_5_evaluator.py` — end-to-end example
158
+ wiring ovens + all three fridges.
159
+
160
+ 📚 New `wiki/Fridges.md`.
161
+
162
+ ## 0.35.0
163
+
164
+ ✨ **Gemma 4, Qwen 3.5 & 3.6, GLM 5.x, Nix collection presets.** New
165
+ entries in both `ARCH_PRESETS` (for `new_oven`) and `KNOWN_MODELS`
166
+ (for short-name resolution). Config knobs verified against the actual
167
+ HuggingFace repos.
168
+
169
+ ## 0.34.0
170
+
171
+ ✨ **AutoModel fallback.** `load_snapshot` routes any non-HyperNix
172
+ `model_type` (Gemma, Phi, DeepSeek, GLM, GPT-OSS, …) through a thin
173
+ `transformers.AutoModelForCausalLM` wrapper. New ARCH_PRESETS covering
174
+ those families.
175
+
176
+ ## 0.33.0
177
+
178
+ ✨ **Windows + macOS support.** Cross-platform `doctor`, path
179
+ handling, `llama-quantize` resolution.
180
+
181
+ ✨ **Python 3.13** support (sentencepiece 0.2.1 floor).
182
+
183
+ ✨ **Runtime auto-install.** `HYPERNIX_AUTO_INSTALL` env var (default
184
+ on) lets missing runtime deps be installed lazily; `hypernix doctor
185
+ --fix` makes it explicit.
186
+
187
+ ## 0.32.1
188
+
189
+ 🐛 Fall back to the slow tokenizer when the `tokenizers` crate is too
190
+ old to decode a newer tokenizer.json.
191
+
192
+ ## 0.32.0
193
+
194
+ ✨ **torch 2.7+** (incl. CUDA 11.8 builds).
195
+
196
+ ✨ One-shot PyPI publish via GitHub Actions Trusted Publishing.
197
+
198
+ ## 0.31.0
199
+
200
+ ✨ **Chat REPL.** `hypernix chat --repo-id <short-name>` plus
201
+ `CodeOven.chat(turns, ...)`.
202
+
203
+ ✨ **Nano-nano / Nano-mini / nano-nano-927** family — new entries in
204
+ `KNOWN_MODELS`.
205
+
206
+ ## 0.30.0
207
+
208
+ ✨ **`old_oven` code-generation wrapper.** `preheat`, `CodeOven`,
209
+ `bake_code`, `fill_middle`, `save_pt` / `load_pt`. `--auto-oven`
210
+ top-level CLI shortcut.
211
+
212
+ ## 0.21.0
213
+
214
+ ✨ Download every file the model needs — not just weights — so the
215
+ output directory is a self-contained snapshot.
216
+
217
+ ## 0.2.0
218
+
219
+ ✨ First subcommand-based CLI. `train` module scaffold. Fixed
220
+ `tokenizer.ggml.merges` in GGUF output.
221
+
222
+ ---
223
+
224
+ ## Upgrading
225
+
226
+ `hypernix` follows no breaking-change policy yet. Patch releases
227
+ (`0.45.x`) are always safe to upgrade — they only fix bugs, UX
228
+ papercuts, or improve error messages.
229
+
230
+ Minor releases (`0.N.0`) add features. The usual gotcha is renamed
231
+ kwargs from the UX-polish patches above; when in doubt, check the
232
+ signature:
233
+
234
+ ```python
235
+ import inspect
236
+ from hypernix import smoke_alarm, pans
237
+
238
+ print(inspect.signature(smoke_alarm.GasAlarm))
239
+ print(inspect.signature(pans.FryingPan))
240
+ ```
241
+
242
+ ## Contributing changelog entries
243
+
244
+ New features should land with a one-paragraph entry at the top of
245
+ this file, grouped by emoji legend. Patch releases get a couple of
246
+ bullet points; minor releases get a section per subsystem touched.
247
+ Keep the tone utilitarian — what changed, how the caller notices,
248
+ what to do instead if an old call stopped working.
@@ -18,6 +18,7 @@ see the [top-level README](../README.md).
18
18
  | [Training](Training.md) | `init_from_scratch`, `expand_checkpoint`, `train`, AutoModel fallback. |
19
19
  | [Quantization](Quantization.md) | GGUF pipeline, k-quants, `llama-quantize` integration. |
20
20
  | [CLI](CLI.md) | Every subcommand, every flag, typical invocations. |
21
+ | [Changelog](Changelog.md) | Full per-release notes — features, fixes, UX papercuts. |
21
22
 
22
23
  ## The subsystem map
23
24
 
@@ -70,9 +71,12 @@ see the [top-level README](../README.md).
70
71
 
71
72
  ## Version history
72
73
 
73
- The project is semver-ish; minor bumps add features, patch bumps are
74
- bug fixes. Recent notable releases:
74
+ Recent releases (see [Changelog](Changelog.md) for the full per-release
75
+ notes going all the way back to 0.2.0):
75
76
 
77
+ - **0.45.3** — `smoke_alarm` accepts `preset=` one-string kwarg
78
+ - **0.45.2** — pans accept `context_length` / `max_chars` (kw-only)
79
+ - **0.45.1** — pans init fix: positional args no longer bind to `name`
76
80
  - **0.45.0** — espresso_maker, blender, toaster, food_processor, smoker; +3 microwave tiers; +2 coffee_maker tiers + cold_brew; CLI `brew`
77
81
  - **0.44.0** — pans / microwave / table / sink / instant_pot / coffee_maker / pressure_cooker
78
82
  - **0.43.0** — `smoke_alarm` (Rads / Gas / Modern / Auto) + 16 CPU + 20 GPU presets
@@ -86,3 +90,6 @@ bug fixes. Recent notable releases:
86
90
  - **0.32.x** — CUDA 11.8 torch, slow-tokenizer fallback
87
91
  - **0.31.x** — Chat REPL, Nano-nano / Nano-mini model family
88
92
  - **0.30.x** — Code-generation oven (`old_oven.preheat`)
93
+
94
+ See [Changelog.md](Changelog.md) for per-release details including
95
+ patch versions, UX fixes, and bug reports.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes