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.declinationsubpackage — 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 aDECLA_ASPECT_DTYPEstructured array (upper-triangle pairs, sorted, deduplicated);np.empty(0, …)when none detected (neverNone).declination_aspect_masks(body_decl): vectorized batch path. Accepts(S, 14)or(14,)(promoted vianp.atleast_2d); returns aDeclinationAspectMasksNamedTuple of(S, 91)masks +(91,)index/orb vectors. Pure broadcasting, no Python body loop.DeclinationAspectMasksNamedTuple (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/12andMIN_DECL_ORB = 0.5°: the body-derived orb formulamax((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_DTYPEunchanged — additive subpackage:ketu.declinationis a purely additive companion to the v1.5 declination δ infrastructure. Thebody_declfield (shape(14,)) shipped in v1.5 is the sole input;CHART_DTYPEis byte-identical to v1.5 (no ratchet break). The new names are reachable viaketu.declination.*only —ketu.__all__is unchanged.Parallel ≠ longitude conjunction: declination aspects are independent of ecliptic-longitude aspects. The frozen 14-row
core.aspectstable 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 (tableaujdateviacalc_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 delat_velocity.is_ascending_declination(jdate, body):Truequand dδ/dt > 0 (Lune montante). Fonction biodynamique montant/descendant. Distincte deis_ascending(trajectoire β) — les deux peuvent diverger pour le même corps à la même date.is_out_of_bounds(jdate, body):Truequand |δ| > ε(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— champbody_decl(additif) : nouveau champfloat64[14]contenant la déclinaison équatoriale δ pour les 14 corps.compute_chartetcalculate_compositele 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: theaspectscommand accepts--harmonics h7(and anyh2–h64) to detect dynamic harmonic aspects alongside the static set, via thedynamic_specs=engine path.
Changed 1.5.0
H{h}-{k}dynamic-aspect naming promoted to a public API contract: dynamic harmonic rows are namedH{h}-{k}(harmonich, multiplek), pinned by tests and documented as stable.find_aspect_timinggains adyn_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_rationow sources its average speeds fromcore.bodies['speed'](single source of truth).calculate_aspects_batchduplicate-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. Bothcalculate_aspects_vectorizedandcalculate_aspects_batchnow 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 fonctionis_ascendingbasée sur la latitude écliptique est byte-pour-byte identique à v1.4. La nouvelleis_ascending_declinationest une fonction indépendante et parallèle.Kala impact (additive, not breaking for named access):
CHART_DTYPEgainsbody_declas 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 changescore.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 entierh(2 ≤ h ≤ 64), en utilisant la convention plein-cercle 360° repliée sur 0–180° (coef = k/h). Retourne un tableau structuré substitut direct decore.aspects; passe-le comme argumentdynamic_specs=àcalculate_aspects,find_aspects_between_datesetcalculate_synastry. La tablecore.aspectsfigé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.npzré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.mdn’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 tableauxbody_lons,body_lats,body_speedsont 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_COUNTmodifié 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_DTYPEcombinant 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_DTYPEavec 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 unCHART_DTYPEoù chaque position de corps est le point médian circulaire à arc le plus court. Utilitairecircular_midpoint(lon_a, lon_b).ketu.returns— Retours solaires et lunaires :solar_return(natal_jd, …, target_year)etlunar_return(natal_jd, …, target_jd)retournent tous deuxCHART_DTYPEpour le thème de retour. Support de délocalisation viareturn_lat/return_lon.ketu.parts— Parties arabes / Lots hermétiques : Système à base de registre avec les parties intégréesfortune,spirit(Fortune/Esprit sensibles à la sect) etmarriage(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_ELEMENTSextrait vers_elements.py;apply_perturbationsvers_perturbations.py;orbital.pyest maintenant un hub de ré-export de 70 lignes.Dispatch BODY_STRATEGIES :
planets.pyutilise un dictionnaire de stratégies au lieu de chaînes if-elif, rendant l’extension de corps (ex. Chiron en v1.3) propre.conftest.pyracine : Fixtures partagées de portée session consolidées danstests/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é enTRADITIONALà 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 champsjd,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 pureDépendance pandas supprimée :
generate_aspect_timeline()retourne un tableau structuré NumPy ; utilisezpd.DataFrame(timeline)pour une conversion manuelleFonctions de vélocité renommées :
vlong()→long_velocity(),vlat()→lat_velocity(),vdist_au()→dist_velocity_au()Surface de l’API publique :
ketu.__init__.pyexporte 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 manquantesNon-déterminisme de la vectorisation des aspects :
calculate_aspects_vectorized()retourne maintenant des résultats cohérentsEnroulement 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
ValueErrorincluent la valeur reçue et les options validesGaranties 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.complexutilisant 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.cyclespour 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.tomlrequirements.txtpour une installation minimaleExports publics dans
ketu/__init__.pyREADME enrichi avec des exemples d’utilisation
Badges PyPI, versions Python et licence
MANIFEST.inpour distribuer les fichiers de donnéesWorkflow 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
ketuSupport 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.pyen_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.tomlConfiguration de la couverture pour l’analyse CI
Package installable via
pip install ketuFonctionne 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