Journal des modifications

Tous les changements notables de Ketu sont documentés ici.

Le format est basé sur Keep a Changelog, et ce projet adhère au Semantic Versioning.

[1.6.0] - 2026-06-04

Added 1.6.0

  • ketu.declination subpackage — declination aspects (parallels & contra-parallels): a NEW additive subpackage detecting parallel (P) and contra-parallel (CP) aspects on the equatorial declination axis (δ), independent of ecliptic longitude. (Phase 36)

  • find_declination_aspects(body_decl): scalar/single-chart detector. Takes the (14,) signed-δ chart["body_decl"] array; returns a DECLA_ASPECT_DTYPE structured array (upper-triangle pairs, sorted, deduplicated); np.empty(0, …) when none detected (never None).

  • declination_aspect_masks(body_decl): vectorized batch path. Accepts (S, 14) or (14,) (promoted via np.atleast_2d); returns a DeclinationAspectMasks NamedTuple of (S, 91) masks + (91,) index/orb vectors. Pure broadcasting, no Python body loop.

  • DeclinationAspectMasks NamedTuple (6 fields: parallel, contra, gap, idx_i, idx_j, orb_pairs).

  • DECLA_ASPECT_DTYPE (5 fields: body1, body2, kind ∈ {“P”,“CP”}, gap, orb).

  • DECLA_COEF = 1/12 and MIN_DECL_ORB = 0.5°: the body-derived orb formula max((orb_b1 + orb_b2)/2 × DECLA_COEF, MIN_DECL_ORB) → Sun/Moon = 1.0°, zero-orb bodies (Rahu/Ketu/Lilith) floored to 0.5°.

Notes 1.6.0

  • CHART_DTYPE unchanged — additive subpackage: ketu.declination is a purely additive companion to the v1.5 declination δ infrastructure. The body_decl field (shape (14,)) shipped in v1.5 is the sole input; CHART_DTYPE is byte-identical to v1.5 (no ratchet break). The new names are reachable via ketu.declination.* only — ketu.__all__ is unchanged.

  • Parallel ≠ longitude conjunction: declination aspects are independent of ecliptic-longitude aspects. The frozen 14-row core.aspects table is byte-identical to v1.5.

[1.5.0] - 2026-06-04

Ajouté 1.5.0

  • declination(jdate, body) — déclinaison équatoriale δ : retourne δ en degrés [−90, +90] (nord positif, sud négatif). Scalaire et vectorisée (tableau jdate via calc_planet_position_batch, sans boucle). Calculée via la chaîne écliptique-vers-équatoriale (spherical_to_rectangular ecliptic_to_equatorial rectangular_to_spherical), numériquement équivalente à l’éq. 13.4 de Meeus à la précision machine.

  • declination_velocity(jdate, body) : dδ/dt en degrés/jour (positif = vers le nord). Différence finie vers l’avant, pas de 0,01 jour — miroir de l’idiome DF de lat_velocity.

  • is_ascending_declination(jdate, body) : True quand dδ/dt > 0 (Lune montante). Fonction biodynamique montant/descendant. Distincte de is_ascending (trajectoire β) — les deux peuvent diverger pour le même corps à la même date.

  • is_out_of_bounds(jdate, body) : True quand |δ| > ε(jd). Le seuil hors limites utilise l’obliquité vraie instantanée (pas l’obliquité moyenne). La Lune peut dépasser ε lors du grand arrêt lunaire (~18,6 ans de cycle nodal ; pic ~2024–2025).

  • CHART_DTYPE — champ body_decl (additif) : nouveau champ float64[14] contenant la déclinaison équatoriale δ pour les 14 corps. compute_chart et calculate_composite le renseignent tous deux via la chaîne de coordonnées. Le nombre de corps reste 14 ; c’est un changement de dtype additif.

  • --harmonics h<N> CLI surface for dynamic harmonics: the aspects command accepts --harmonics h7 (and any h2h64) to detect dynamic harmonic aspects alongside the static set, via the dynamic_specs= engine path.

Changed 1.5.0

  • H{h}-{k} dynamic-aspect naming promoted to a public API contract: dynamic harmonic rows are named H{h}-{k} (harmonic h, multiple k), pinned by tests and documented as stable.

  • find_aspect_timing gains a dyn_coef= parameter: the orb for a dynamic aspect is derived from (orb[b1] + orb[b2]) / 2 × dyn_coef, matching the detection path.

Fixed 1.5.0

  • Lunar node mean speed corrected (−0.013 → −0.052954 °/day): core.bodies['speed'] for Rahu and Ketu held a value ~4× too slow. The true nodal regression is 360° over ~18.6 years (≈ −0.052991 °/day); the engine already produced −0.052954 °/day for the nodes, so the table is now consistent with the computed motion. calculate_speed_ratio now sources its average speeds from core.bodies['speed'] (single source of truth).

  • calculate_aspects_batch duplicate-pair rows eliminated: with overlapping orbs (e.g. the EXTENDED set) the batch path could emit more than one row for the same (body1, body2) pair on a single date. Both calculate_aspects_vectorized and calculate_aspects_batch now share a single detection core, enforcing “exactly one row per pair” (static-first / dynamic-second, first-match-wins) identically.

Notes 1.5.0

  • is_ascending (β) inchangée : la fonction is_ascending basée sur la latitude écliptique est byte-pour-byte identique à v1.4. La nouvelle is_ascending_declination est une fonction indépendante et parallèle.

  • Kala impact (additive, not breaking for named access): CHART_DTYPE gains body_decl as an additive field. Code using named field access (chart["body_lons"]) is unaffected. Code using positional access or .view() on the raw dtype must adapt. The node-speed fix changes core.bodies['speed'][10] / [11].

[1.4.0] - 2026-06-03

Ajouté 1.4.0

  • generate_harmonic_aspects(h) — générateur d’harmoniques dynamiques : construit des spécifications d’aspects à la volée pour N’IMPORTE QUEL harmonique entier h (2 ≤ h ≤ 64), en utilisant la convention plein-cercle 360° repliée sur 0–180° (coef = k/h). Retourne un tableau structuré substitut direct de core.aspects ; passe-le comme argument dynamic_specs= à calculate_aspects, find_aspects_between_dates et calculate_synastry. La table core.aspects figée à 14 lignes et les empreintes de presets sont byte-identiques (chemin de code parallèle).

  • Plage de Chiron étendue à 1900–2100 : ketu/data/chiron_coeffs.npz régénéré (2283 segments de Chebyshev, jd_start=2415020.5, jd_end=2488069.5), erreur maximale 0,001214° sur la nouvelle plage. Runtime Pure-NumPy préservé.

Modifié 1.4.0

  • Orbe de Chiron 0° → 4° (parité avec Pluton) : core.bodies['orb'] pour Chiron est désormais 4°, Chiron forme donc maintenant des aspects notés.

  • Comportement hors plage de Chiron : les entrées hors de 1900–2100 sont désormais silencieusement clampées à la limite de segment la plus proche (levait précédemment une ValueError).

  • Documentation recentrée sur le défaut de division 180° : les tableaux d’aspects de concepts.md n’affichent désormais que CLASSICAL (5) et TRADITIONAL (7) ; les harmoniques mineurs plein-cercle (H5/H9/H10 / EXTENDED) restent disponibles dans le code mais sont hors des tableaux de synthèse.

[1.3.0] - 2026-06-01

Ajouté 1.3.0

  • Chiron (14e corps, body_id=13) : Corps centaure entre Saturne et Uranus. Calculé via des coefficients polynomiaux de Chebyshev embarqués (.npz), plage valide 1950–2050, erreur maximale 0.005695° (sous l’arcminute). Accessible via les fonctions de calcul standard : long(jd, 13), lat(jd, 13), etc.

  • ketu/data/chiron_coeffs.npz : Fichier de coefficients embarqué (1142 segments, seg=32 jours, degré=10, trois quantités : longitude, latitude, distance). Généré hors ligne depuis pyswisseph — pas une dépendance d’exécution.

  • ketu/ephemeris/chiron.py : Évaluateur de Chebyshev Pure NumPy pour les positions de Chiron.

Changements incompatibles 1.3.0

  • Axe corps de CHART_DTYPE étendu de 13 à 14 corps (D-08) : Les tableaux body_lons, body_lats, body_speeds ont désormais la forme (14,) au lieu de (13,). Les matrices d’aspects sont maintenant (14, 14). Le code qui code en dur le nombre de corps ou utilise l’index 12 comme dernier corps doit être mis à jour. Index 13 = Chiron.

  • SYNASTRY_BODY_COUNT modifié de 15 à 16 : Reflète le corps Chiron supplémentaire (14 corps + ASC + MC).

Voir le Guide de migration pour les instructions de mise à niveau.

[1.2.0] - 2026-04-XX

Ajouté 1.2.0

  • ketu.charts — Thème natal complet (compute_chart) : Retourne un unique tableau structuré CHART_DTYPE combinant les positions des corps (13 corps), les cuspides de maisons, les angles (ASC, MC, ARMC, Vertex) et une matrice d’aspects 13×13. is_day_chart(jd, lat, lon) aide à la détection de sect.

  • ketu.synastry — Analyse d’aspects inter-thèmes : calculate_synastry(chart_a, chart_b, aspects, orbs, mode) retourne un tableau structuré SYNASTRY_DTYPE avec indicateur d’application/séparation et limites d’orbe.

  • ketu.composite — Thèmes composites par point médian : calculate_composite(chart_a, chart_b, system) retourne un CHART_DTYPE où chaque position de corps est le point médian circulaire à arc le plus court. Utilitaire circular_midpoint(lon_a, lon_b).

  • ketu.returns — Retours solaires et lunaires : solar_return(natal_jd, …, target_year) et lunar_return(natal_jd, …, target_jd) retournent tous deux CHART_DTYPE pour le thème de retour. Support de délocalisation via return_lat/return_lon.

  • ketu.parts — Parties arabes / Lots hermétiques : Système à base de registre avec les parties intégrées fortune, spirit (Fortune/Esprit sensibles à la sect) et marriage (formule fixe). calculate_part, calculate_all_parts, register, get_part, PartSpec.

  • Systèmes de maisons supplémentaires : Maisons entières (whole_sign), Égales (equal), Regiomontanus (regiomontanus) ajoutés aux systèmes existants Placidus, Koch, Porphyre (v1.1).

  • Refactorisation des éphémérides : ORBITAL_ELEMENTS extrait vers _elements.py ; apply_perturbations vers _perturbations.py ; orbital.py est maintenant un hub de ré-export de 70 lignes.

  • Dispatch BODY_STRATEGIES : planets.py utilise un dictionnaire de stratégies au lieu de chaînes if-elif, rendant l’extension de corps (ex. Chiron en v1.3) propre.

  • conftest.py racine : Fixtures partagées de portée session consolidées dans tests/conftest.py.

[1.1.0] - 2026-03-XX

Ajouté 1.1.0

  • ketu.aspects — Ensembles d’aspects configurables : CLASSICAL (5 aspects), TRADITIONAL (7), EXTENDED (14 — défaut à v1.1, changé en TRADITIONAL à partir de v1.3). AspectSetSpec = Union[str, list, ndarray, None], resolve_aspect_set. calculate_aspects(jdate, l_bodies, aspects=None) accepte désormais une spécification d’ensemble d’aspects.

  • ketu.houses — Calculs de systèmes de maisons : calculate_houses(jd, lat, lon, system, polar_fallback), house_of(planet_lon, cusps), HOUSES_DTYPE, SYSTEMS, HighLatitudeError, register. Systèmes initiaux : placidus, koch, porphyry.

  • HOUSES_DTYPE : Tableau structuré avec les champs jd, lat, lon, system, cusps[12], asc, mc, armc, vertex.

[1.0.0] - 2026-02-12

Changements incompatibles 1.0.0

  • Modules d’export supprimés : ketu.export.chart, ketu.export.icalendar — Ketu est désormais une bibliothèque de calcul pure

  • Dépendance pandas supprimée : generate_aspect_timeline() retourne un tableau structuré NumPy ; utilisez pd.DataFrame(timeline) pour une conversion manuelle

  • Fonctions de vélocité renommées : vlong()long_velocity(), vlat()lat_velocity(), vdist_au()dist_velocity_au()

  • Surface de l’API publique : ketu.__init__.py exporte uniquement les métadonnées + constantes de base ; fonctions accessibles via des imports de sous-modules

Corrigé 1.0.0

  • Bug de précédence d’opérateur du cache : use_cache=False était ignoré en raison de parenthèses manquantes

  • Non-déterminisme de la vectorisation des aspects : calculate_aspects_vectorized() retourne maintenant des résultats cohérents

  • Enroulement de la vélocité lunaire : Vélocité correcte à la frontière 360°/0° (affichait auparavant des pics de ±360°)

Ajouté 1.0.0

  • Annotations de type partout : conformité au mode strict de mypy

  • Docstrings au style NumPy : section Exemples dans toutes les fonctions publiques

  • Messages d’erreur standardisés : Tous les messages ValueError incluent la valeur reçue et les options valides

  • Garanties de précision numérique : ±1e-6° pour la séparation angulaire (documenté)

  • 98% de couverture de tests : 408 tests sur tous les modules

[0.4.0] - 2026-01-14

Ajouts 0.4.0

  • Moteur complexe : Nouveau module ketu.complex utilisant la représentation \(e^{i\theta}\) pour les cycles.

  • Aspects étendus : Support de 14 aspects (Harmoniques H1-H6, H9, H10).

  • Cache d’éphémérides : Cache persistant pour des recherches de positions en O(1).

  • Cycles vectorisés : Refonte de ketu.cycles pour utiliser des opérations vectorielles complexes.

  • Fonctionnalités ML : Génération directe de features pour le Machine Learning (cos_phase, sin_phase).

[0.3.0] - 2025-12-XX

Ajouts 0.3.0

  • Pure NumPy : Suppression de la dépendance au binaire pyswisseph.

  • Nouveaux modules : ketu.ephemeris, ketu.cycles.

  • Performance : Accélérations significatives dans la génération de séries temporelles.

[0.2.1] - 2025-10-27

  • Correction mineure

[0.2.0] - 2025-10-27

Ajouts 0.2.0

  • Configuration complète du packaging pour une publication PyPI

  • Métadonnées et dépendances dans pyproject.toml

  • requirements.txt pour une installation minimale

  • Exports publics dans ketu/__init__.py

  • README enrichi avec des exemples d’utilisation

  • Badges PyPI, versions Python et licence

  • MANIFEST.in pour distribuer les fichiers de données

  • Workflow GitHub Actions pour les tests automatisés

  • Workflow GitHub Actions pour la publication PyPI

  • Couverture CI pour Python 3.9 à 3.13

  • Point d’entrée CLI ketu

  • Support de 13 corps célestes (ajout du Nœud Nord vrai)

  • Documentation en anglais et en français

Modifié 0.2.0

  • Correction et renforcement des tests unitaires

  • Renommage de timea.py en _timea.py (module privé)

  • Optimisation de la structure du package pour la distribution

  • Alignement de la documentation avec la nouvelle organisation

Déploiement technique PyPI 0.2.0

  • Support officiel de Python 3.10–3.13

  • Configuration Pytest intégrée dans pyproject.toml

  • Configuration de la couverture pour l’analyse CI

  • Package installable via pip install ketu

  • Fonctionne parfaitement dans les environnements virtuels

[0.1.0] - 2024-01-XX

Ajouts 0.1.0

  • CLI interactif pour calculer les positions et les aspects

  • Calculs de positions planétaires via pyswisseph

  • Détection des aspects majeurs avec orbes

  • Conversions entre systèmes de temps (UTC, Julien)

  • Détection de la rétrogradation

  • Documentation complète avec Sphinx et MyST

  • Package PyPI installable

  • Tests unitaires initiaux

Fonctionnalités 0.1.0

  • Support de 10 planètes + Rahu + Lilith

  • 7 aspects majeurs (de la conjonction à l’opposition)

  • Calculs des signes du zodiaque

  • Système d’orbes basé sur Abu Ma’shar

  • Cache LRU pour améliorer les performances

Technique 0.1.0

  • Nécessite Python 3.9+

  • Dépendances : numpy, pyswisseph

  • Architecture modulaire

  • Code documenté et typé

[0.0.1] - 2023-01-XX

Initial

  • Prototype

  • Calculs de positions basiques

  • Interface en ligne de commande


Convention de versioning

  • MAJOR : Changements incompatibles de l’API

  • MINOR : Ajouts de fonctionnalités rétrocompatibles

  • PATCH : Corrections de bugs rétrocompatibles