setiastrosuitepro 1.8.0__py3-none-any.whl → 1.8.0.post3__py3-none-any.whl

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.

Potentially problematic release.


This version of setiastrosuitepro might be problematic. Click here for more details.

@@ -1,3 +1,3 @@
1
1
  # Auto-generated at build time. Do not edit.
2
- BUILD_TIMESTAMP = "2026-01-26T16:03:43Z"
3
- APP_VERSION = "1.8.0"
2
+ BUILD_TIMESTAMP = "2026-01-26T19:14:34Z"
3
+ APP_VERSION = "1.8.0.post3"
@@ -424,8 +424,8 @@ def onnx_benchmark_stellar(
424
424
  provider = "DmlExecutionProvider"
425
425
  else:
426
426
  import onnxruntime as ort
427
- R = get_resources()
428
- onnx_path = R.CC_STELLAR_SHARP_ONNX
427
+ from setiastro.saspro.model_manager import require_model
428
+ onnx_path = require_model("deep_sharp_stellar_cnn_AI3_5s.onnx")
429
429
 
430
430
  providers_avail = ort.get_available_providers()
431
431
 
@@ -647,6 +647,10 @@ def _legacy_results_schema(results: Dict[str, Any]) -> Dict[str, Any]:
647
647
 
648
648
  return out
649
649
 
650
+ def _picked_backend(use_gpu: bool, status_cb=None) -> str:
651
+ models, tag = _get_stellar_model_for_benchmark(use_gpu=use_gpu, status_cb=status_cb)
652
+ return "ONNX" if models.is_onnx else "TORCH"
653
+
650
654
  # -----------------------------
651
655
  # One-stop runner
652
656
  # -----------------------------
@@ -690,26 +694,39 @@ def run_benchmark(
690
694
  if mode in ("GPU", "Both"):
691
695
  if status_cb: status_cb("Running Stellar model benchmark…")
692
696
 
693
- # Torch (or CPU fallback if torch path)
694
- avg_ms, total_ms, backend = torch_benchmark_stellar(
695
- patches,
696
- use_gpu=use_gpu,
697
- progress_cb=progress_cb,
698
- status_cb=status_cb,
699
- )
700
- results[f"Stellar Torch ({backend})"] = {"avg_ms": float(avg_ms), "total_ms": float(total_ms)}
701
-
702
- # ONNX benchmark (DirectML when available; otherwise CPU/CUDA if present)
703
- if platform.system() == "Windows":
704
- avg_o, total_o, provider = onnx_benchmark_stellar(
697
+ picked = _picked_backend(use_gpu=use_gpu, status_cb=status_cb)
698
+
699
+ if picked == "TORCH":
700
+ avg_ms, total_ms, backend = torch_benchmark_stellar(
705
701
  patches,
706
702
  use_gpu=use_gpu,
707
703
  progress_cb=progress_cb,
708
704
  status_cb=status_cb,
709
705
  )
710
- results[f"Stellar ONNX ({provider})"] = {"avg_ms": float(avg_o), "total_ms": float(total_o)}
706
+ results[f"Stellar Torch ({backend})"] = {"avg_ms": float(avg_ms), "total_ms": float(total_ms)}
707
+
708
+ # Optional: also run ONNX on Windows for comparison
709
+ if platform.system() == "Windows":
710
+ avg_o, total_o, provider = onnx_benchmark_stellar(
711
+ patches,
712
+ use_gpu=use_gpu,
713
+ progress_cb=progress_cb,
714
+ status_cb=status_cb,
715
+ )
716
+ results[f"Stellar ONNX ({provider})"] = {"avg_ms": float(avg_o), "total_ms": float(total_o)}
717
+
711
718
  else:
712
- results["Stellar ONNX"] = "ONNX benchmark only available on Windows."
719
+ # Picked ONNX (DirectML). Run ONNX benchmark as the “GPU benchmark”.
720
+ if platform.system() == "Windows":
721
+ avg_o, total_o, provider = onnx_benchmark_stellar(
722
+ patches,
723
+ use_gpu=use_gpu,
724
+ progress_cb=progress_cb,
725
+ status_cb=status_cb,
726
+ )
727
+ results[f"Stellar ONNX ({provider})"] = {"avg_ms": float(avg_o), "total_ms": float(total_o)}
728
+ else:
729
+ results["Stellar ONNX"] = "ONNX benchmark only available on Windows."
713
730
 
714
731
  results = _legacy_results_schema(results)
715
732
  return results
@@ -17,6 +17,24 @@ APP_FOLDER_NAME = "SetiAstroSuitePro" # keep stable
17
17
  ProgressCB = Optional[Callable[[str], None]]
18
18
 
19
19
 
20
+ def model_path(filename: str) -> Path:
21
+ p = Path(models_root()) / filename
22
+ return p
23
+
24
+ def require_model(filename: str) -> Path:
25
+ """
26
+ Return full path to a runtime-managed model file.
27
+ Raises FileNotFoundError with a helpful message if missing.
28
+ """
29
+ p = model_path(filename)
30
+ if not p.exists():
31
+ raise FileNotFoundError(
32
+ f"Model not found: {p}\n"
33
+ f"Expected models in: {models_root()}\n"
34
+ f"Please install/download the Cosmic Clarity models."
35
+ )
36
+ return p
37
+
20
38
  def app_data_root() -> str:
21
39
  """
22
40
  Frozen-safe persistent data root.
@@ -13,6 +13,43 @@ from setiastro.saspro.model_manager import (
13
13
  sha256_file,
14
14
  )
15
15
 
16
+ class ModelsInstallZipWorker(QObject):
17
+ progress = pyqtSignal(str)
18
+ finished = pyqtSignal(bool, str)
19
+
20
+ def __init__(self, zip_path: str, should_cancel=None):
21
+ super().__init__()
22
+ self.zip_path = zip_path
23
+ self.should_cancel = should_cancel # optional callable
24
+
25
+ def run(self):
26
+ try:
27
+ from setiastro.saspro.model_manager import install_models_zip, sha256_file
28
+
29
+ if not self.zip_path or not os.path.exists(self.zip_path):
30
+ raise RuntimeError("ZIP file not found.")
31
+
32
+ self.progress.emit("Verifying ZIP…")
33
+ # quick hash (optional but helpful for support logs)
34
+ zhash = sha256_file(self.zip_path)
35
+
36
+ manifest = {
37
+ "source": "manual_zip",
38
+ "file": os.path.basename(self.zip_path),
39
+ "sha256": zhash,
40
+ }
41
+
42
+ install_models_zip(
43
+ self.zip_path,
44
+ progress_cb=lambda s: self.progress.emit(s),
45
+ manifest=manifest,
46
+ )
47
+
48
+ self.finished.emit(True, "Models installed successfully from ZIP.")
49
+ except Exception as e:
50
+ self.finished.emit(False, str(e))
51
+
52
+
16
53
  class ModelsDownloadWorker(QObject):
17
54
  progress = pyqtSignal(str)
18
55
  finished = pyqtSignal(bool, str)
@@ -1,8 +1,9 @@
1
1
  # ops.settings.py
2
2
  from PyQt6.QtWidgets import (
3
- QLineEdit, QDialogButtonBox, QFileDialog, QDialog, QPushButton, QFormLayout,QApplication,
3
+ QLineEdit, QDialogButtonBox, QFileDialog, QDialog, QPushButton, QFormLayout,QApplication, QMenu,
4
4
  QHBoxLayout, QVBoxLayout, QWidget, QCheckBox, QComboBox, QSpinBox, QDoubleSpinBox, QLabel, QColorDialog, QFontDialog, QSlider)
5
5
  from PyQt6.QtCore import QSettings, Qt
6
+ from PyQt6.QtGui import QAction
6
7
  import pytz # for timezone list
7
8
  from setiastro.saspro.accel_installer import current_backend
8
9
  import sys, platform
@@ -12,6 +13,7 @@ from PyQt6.QtCore import QThread
12
13
  from setiastro.saspro.i18n import get_available_languages, get_saved_language, save_language
13
14
  import importlib.util
14
15
  import importlib.metadata
16
+ import webbrowser
15
17
 
16
18
  class SettingsDialog(QDialog):
17
19
  """
@@ -240,7 +242,23 @@ class SettingsDialog(QDialog):
240
242
 
241
243
  self.btn_models_update = QPushButton(self.tr("Download/Update Models…"))
242
244
  self.btn_models_update.clicked.connect(self._models_update_clicked)
243
- right_col.addRow(self.btn_models_update)
245
+
246
+ self.btn_models_install_zip = QPushButton(self.tr("Install from ZIP…"))
247
+ self.btn_models_install_zip.setToolTip(self.tr("Use a manually downloaded models .zip file"))
248
+ self.btn_models_install_zip.clicked.connect(self._models_install_from_zip_clicked)
249
+
250
+ self.btn_models_open_drive = QPushButton(self.tr("Open Drive…"))
251
+ self.btn_models_open_drive.setToolTip(self.tr("Open the models folder in your browser (Primary/Backup)"))
252
+ self.btn_models_open_drive.clicked.connect(self._models_open_drive_clicked)
253
+
254
+ row_models = QHBoxLayout()
255
+ row_models.addWidget(self.btn_models_update, 1)
256
+ row_models.addWidget(self.btn_models_install_zip)
257
+ row_models.addWidget(self.btn_models_open_drive)
258
+
259
+ w_models = QWidget()
260
+ w_models.setLayout(row_models)
261
+ right_col.addRow(w_models)
244
262
 
245
263
  # ---- Right column: WIMS + RA/Dec + Updates + Display ----
246
264
  right_col.addRow(QLabel(self.tr("<b>What's In My Sky — Defaults</b>")))
@@ -298,6 +316,86 @@ class SettingsDialog(QDialog):
298
316
  # Initial Load:
299
317
  self.refresh_ui()
300
318
 
319
+ def _models_open_drive_clicked(self):
320
+ PRIMARY_FOLDER = "https://drive.google.com/drive/folders/1-fktZb3I9l-mQimJX2fZAmJCBj_t0yAF?usp=drive_link"
321
+ BACKUP_FOLDER = "https://drive.google.com/drive/folders/1j46RV6touQtOmtxkhdFWGm_LQKwEpTl9?usp=drive_link"
322
+
323
+ menu = QMenu(self)
324
+ act_primary = menu.addAction(self.tr("Primary"))
325
+ act_backup = menu.addAction(self.tr("Backup"))
326
+
327
+ chosen = menu.exec(self.btn_models_open_drive.mapToGlobal(self.btn_models_open_drive.rect().bottomLeft()))
328
+ if chosen == act_primary:
329
+ webbrowser.open(PRIMARY_FOLDER)
330
+ elif chosen == act_backup:
331
+ webbrowser.open(BACKUP_FOLDER)
332
+
333
+
334
+ def _models_install_from_zip_clicked(self):
335
+ from PyQt6.QtWidgets import QFileDialog, QMessageBox, QProgressDialog
336
+ from PyQt6.QtCore import Qt, QThread
337
+ import os
338
+
339
+ zip_path, _ = QFileDialog.getOpenFileName(
340
+ self,
341
+ self.tr("Select models ZIP"),
342
+ "",
343
+ self.tr("ZIP files (*.zip);;All files (*)")
344
+ )
345
+ if not zip_path:
346
+ return
347
+
348
+ if not os.path.exists(zip_path):
349
+ QMessageBox.warning(self, self.tr("Models"), self.tr("File not found."))
350
+ return
351
+
352
+ self.btn_models_update.setEnabled(False)
353
+ self.btn_models_install_zip.setEnabled(False)
354
+
355
+ pd = QProgressDialog(self.tr("Preparing…"), self.tr("Cancel"), 0, 0, self)
356
+ pd.setWindowTitle(self.tr("Installing Models"))
357
+ pd.setWindowModality(Qt.WindowModality.ApplicationModal)
358
+ pd.setAutoClose(True)
359
+ pd.setMinimumDuration(0)
360
+ pd.show()
361
+
362
+ from setiastro.saspro.model_workers import ModelsInstallZipWorker
363
+
364
+ self._models_thread = QThread(self)
365
+ self._models_worker = ModelsInstallZipWorker(zip_path)
366
+ self._models_worker.moveToThread(self._models_thread)
367
+
368
+ self._models_thread.started.connect(self._models_worker.run, Qt.ConnectionType.QueuedConnection)
369
+ self._models_worker.progress.connect(pd.setLabelText, Qt.ConnectionType.QueuedConnection)
370
+
371
+ def _cancel():
372
+ if self._models_thread.isRunning():
373
+ self._models_thread.requestInterruption()
374
+ pd.canceled.connect(_cancel, Qt.ConnectionType.QueuedConnection)
375
+
376
+ def _done(ok: bool, msg: str):
377
+ pd.reset()
378
+ pd.deleteLater()
379
+
380
+ self._models_thread.quit()
381
+ self._models_thread.wait()
382
+
383
+ self.btn_models_update.setEnabled(True)
384
+ self.btn_models_install_zip.setEnabled(True)
385
+ self._refresh_models_status()
386
+
387
+ if ok:
388
+ QMessageBox.information(self, self.tr("Models"), self.tr("✅ {0}").format(msg))
389
+ else:
390
+ QMessageBox.warning(self, self.tr("Models"), self.tr("❌ {0}").format(msg))
391
+
392
+ self._models_worker.finished.connect(_done, Qt.ConnectionType.QueuedConnection)
393
+ self._models_thread.finished.connect(self._models_worker.deleteLater, Qt.ConnectionType.QueuedConnection)
394
+ self._models_thread.finished.connect(self._models_thread.deleteLater, Qt.ConnectionType.QueuedConnection)
395
+
396
+ self._models_thread.start()
397
+
398
+
301
399
  def _models_update_clicked(self):
302
400
  from PyQt6.QtWidgets import QMessageBox, QProgressDialog
303
401
  from PyQt6.QtCore import Qt, QThread
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setiastrosuitepro
3
- Version: 1.8.0
3
+ Version: 1.8.0.post3
4
4
  Summary: Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization
5
5
  License: GPL-3.0
6
6
  License-File: LICENSE
@@ -183,7 +183,7 @@ setiastro/qml/ResourceMonitor.qml,sha256=k9_qXKAZLi8vj-5BffJTJu_UkRnxunZKn53Hthd
183
183
  setiastro/saspro/__init__.py,sha256=6o8orhytzBWyJWBdG37xPcT6IVPZOG8d22FBVzn0Kac,902
184
184
  setiastro/saspro/__main__.py,sha256=_zAHsw4SNWYzMXlswBuiMGgTUGYrU5p5-dsxhQ3_GWk,40789
185
185
  setiastro/saspro/_generated/__init__.py,sha256=HbruQfKNbbVL4kh_t4oVG3UeUieaW8MUaqIcDCmnTvA,197
186
- setiastro/saspro/_generated/build_info.py,sha256=mFPmnKHJWtvKAw11r4GKWUACVB9m0Qh6jUKcikPiBoA,111
186
+ setiastro/saspro/_generated/build_info.py,sha256=Ea9A6Yep3gVopO0qLFUmZn_oycwXYxuHkWFtp77YMsA,117
187
187
  setiastro/saspro/abe.py,sha256=l6o0klT-TqJppzEjCBb9isyIvtuf_UsuMZV8JvqbgPI,59779
188
188
  setiastro/saspro/abe_preset.py,sha256=u9t16yTb9v98tLjhvh496Fsp3Z-dNiBSs5itnAaJwh8,7750
189
189
  setiastro/saspro/aberration_ai.py,sha256=8LtDu_KuqvL-W0MTUIJq9KguMjJPiUEQjMUibY16H-4,41673
@@ -216,7 +216,7 @@ setiastro/saspro/convo.py,sha256=pAczsoS7g596mk1eI4XmVvd1EAoTZVdj12qRzFIISjg,677
216
216
  setiastro/saspro/convo_preset.py,sha256=31Fzk6ssA3lHuM5vehYOpFNVdIyRNNpL78Ts69ivWKk,20013
217
217
  setiastro/saspro/copyastro.py,sha256=ImDMrus4_LqdEXozMQMiM6SjpF0Yd3D-TzMJ2ggFrNc,7322
218
218
  setiastro/saspro/cosmicclarity.py,sha256=f-puwADkEdONV0-7KyC9wg43i3lbEXR3ZVHRxBkBYEE,60814
219
- setiastro/saspro/cosmicclarity_engines/benchmark_engine.py,sha256=jc7DVt26ppBeGmNBkAOHFSN526nytjigLmz1HRLLA1c,26284
219
+ setiastro/saspro/cosmicclarity_engines/benchmark_engine.py,sha256=NgGefkc6tGO_6eOgG6yDZyrgj4el8fYyNKulu4UAS_U,27161
220
220
  setiastro/saspro/cosmicclarity_engines/darkstar_engine.py,sha256=ZstBHr8sA1p2WHg3kZyacjCi0m-agPHzIDIG8gGqT_U,21221
221
221
  setiastro/saspro/cosmicclarity_engines/denoise_engine.py,sha256=KAYyhFbFd4iiwiR5lTvmi6xc9j6YTQnwJe-xD-r9n7s,22081
222
222
  setiastro/saspro/cosmicclarity_engines/satellite_engine.py,sha256=900oiGhlgtjXMXjLpM9RUVPTLZI7Ov7IJvSzVh1mcOU,22787
@@ -296,8 +296,8 @@ setiastro/saspro/mfdeconv_earlystop.py,sha256=JCY9RV6jMtwcOxUnb9HzJHem5ygYXXiRr2
296
296
  setiastro/saspro/mfdeconvcudnn.py,sha256=Y8ThkwOs-CZdF_53N6Wu2naDQ1VIa055oGtlgo129Qk,129008
297
297
  setiastro/saspro/mfdeconvsport.py,sha256=UcDV3FP5wDIhFsOnDlLVywtk_RDrpKVOjWbJNOL-Cdk,95323
298
298
  setiastro/saspro/minorbodycatalog.py,sha256=PaOwy1T_ApEfPyGZFUD4qB1n7jyK6kuw1FjBhP2HCTw,19662
299
- setiastro/saspro/model_manager.py,sha256=4H6qkIFimM4M0ae1FU2aji1TMZXNvSX-pA37vWlifcY,9696
300
- setiastro/saspro/model_workers.py,sha256=FRomuPSqwi6VT8oMxD9iz-R0YePc01HneIcdkszUNww,2755
299
+ setiastro/saspro/model_manager.py,sha256=s9tOUNeinsAaGiADEspkwENsrPhQ6u2K0mjhTPkXMeE,10248
300
+ setiastro/saspro/model_workers.py,sha256=G8xKC9L5pdc_L75_4S9us0fRVjeAAZbmQqXorFwtcSs,4001
301
301
  setiastro/saspro/morphology.py,sha256=WdxA3yLdMCLsAQoRY6qmP3LB5jjZNzliFBhuNkGN_o8,16695
302
302
  setiastro/saspro/multiscale_decomp.py,sha256=GQ6iTFcTDxj0WvnO0bQjTz8G4Wli9Dl9bQNeEcBpxBw,66724
303
303
  setiastro/saspro/narrowband_normalization.py,sha256=mVzf8JJVZREbsai63GspR41iH3WnwGrYu0pywczfIi0,64036
@@ -311,7 +311,7 @@ setiastro/saspro/ops/command_runner.py,sha256=teyrnOVJcd2IVxIPhh-ud4Q8MrBMxzSNR3
311
311
  setiastro/saspro/ops/commands.py,sha256=RoB99R3wN9j-K25QoJf5ir-CU35lL_d2veLFmfIXRMQ,54246
312
312
  setiastro/saspro/ops/script_editor.py,sha256=ygWNzPJ3LxsQyTMgfvAHC9MuGnE8IXsRNKu19mLPYKY,40986
313
313
  setiastro/saspro/ops/scripts.py,sha256=5BOnirSUia0NDg-keBy0HgfrElqcRIUNV-89FfYks8o,55817
314
- setiastro/saspro/ops/settings.py,sha256=tfWWZky3LTGw8Bd2VNf-n9-hbLl9G2zek9SdHNXHCi4,42651
314
+ setiastro/saspro/ops/settings.py,sha256=5fsKFoOy-x9gC8LMN7Pa5SAsg9RLSRp1RzUQzEyKCmU,46829
315
315
  setiastro/saspro/parallel_utils.py,sha256=GoPhypMsp3k8dffv4129CjLU-xDqpu9wnhHI463RR6U,15931
316
316
  setiastro/saspro/pedestal.py,sha256=WkwNaY0Qp1XP6KFtb6tnnKMhg71R5WEhVOdwWwJFmJ8,4014
317
317
  setiastro/saspro/perfect_palette_picker.py,sha256=wJSTQQZgFm-baEBRopfF4Aw6vtvTmfL4_FZcd1q31vs,46937
@@ -418,9 +418,9 @@ setiastro/saspro/wimi.py,sha256=CNo833Pur9P-A1DUSntlAaQWekf6gzWIvetOMvLDrOw,3146
418
418
  setiastro/saspro/wims.py,sha256=HDfVI3Ckf5OJEJLH8NI36pFc2USZnETpb4UDIvweNX4,27450
419
419
  setiastro/saspro/window_shelf.py,sha256=hpId8uRPq7-UZ3dWW5YzH_v4TchQokGFoPGM8dyaIZA,9448
420
420
  setiastro/saspro/xisf.py,sha256=Ah1CXDAohN__ej1Lq7LPU8vGLnDz8fluLQTGE71aUoc,52669
421
- setiastrosuitepro-1.8.0.dist-info/entry_points.txt,sha256=g7cHWhUSiIP7mkyByG9JXGWWlHKeVC2vL7zvB9U-vEU,236
422
- setiastrosuitepro-1.8.0.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
423
- setiastrosuitepro-1.8.0.dist-info/licenses/license.txt,sha256=KCwYZ9VpVwmzjelDq1BzzWqpBvt9nbbapa-woz47hfQ,123930
424
- setiastrosuitepro-1.8.0.dist-info/METADATA,sha256=cyYMDuiXoheRcbSSp2m18sljM4jNXReZLVRuISTA3RY,9945
425
- setiastrosuitepro-1.8.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
426
- setiastrosuitepro-1.8.0.dist-info/RECORD,,
421
+ setiastrosuitepro-1.8.0.post3.dist-info/entry_points.txt,sha256=g7cHWhUSiIP7mkyByG9JXGWWlHKeVC2vL7zvB9U-vEU,236
422
+ setiastrosuitepro-1.8.0.post3.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
423
+ setiastrosuitepro-1.8.0.post3.dist-info/licenses/license.txt,sha256=KCwYZ9VpVwmzjelDq1BzzWqpBvt9nbbapa-woz47hfQ,123930
424
+ setiastrosuitepro-1.8.0.post3.dist-info/METADATA,sha256=nFMXeZwcWAhjm7tIq5a7CuhyoAVcO9GFkTyFtoPaEbY,9951
425
+ setiastrosuitepro-1.8.0.post3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
426
+ setiastrosuitepro-1.8.0.post3.dist-info/RECORD,,