libaditya 0.3.4__py2.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.
- libaditya/__init__.py +46 -0
- libaditya/_version.py +29 -0
- libaditya/calc/__init__.py +9 -0
- libaditya/calc/api.py +30 -0
- libaditya/calc/avasthas.py +346 -0
- libaditya/calc/docs/jaimini-get-arch.md +95 -0
- libaditya/calc/hellenistic.py +37 -0
- libaditya/calc/jaimini.py +335 -0
- libaditya/calc/jaimini_get.py +240 -0
- libaditya/calc/kala.py +73 -0
- libaditya/calc/panchanga.py +422 -0
- libaditya/calc/rashi.py +612 -0
- libaditya/calc/returns.py +50 -0
- libaditya/calc/swe_functions.py +118 -0
- libaditya/calc/varga.py +287 -0
- libaditya/calc/vimshottari.py +431 -0
- libaditya/cards/__init__.py +5 -0
- libaditya/cards/card.py +90 -0
- libaditya/cards/cards_constants.py +115 -0
- libaditya/cards/cards_of_truth.py +323 -0
- libaditya/cards/cot.py +142 -0
- libaditya/cards/deck.py +52 -0
- libaditya/charts/__init__.py +6 -0
- libaditya/charts/api.py +36 -0
- libaditya/charts/bodygraph.py +80 -0
- libaditya/charts/chart.py +286 -0
- libaditya/charts/jaimini.py +83 -0
- libaditya/charts/tajika.py +36 -0
- libaditya/constants.py +1776 -0
- libaditya/draw/__init__.py +20 -0
- libaditya/draw/draw_bodygraph.py +489 -0
- libaditya/draw/draw_sbc.py +712 -0
- libaditya/draw/themes/default-theme.hd +53 -0
- libaditya/ephe/ast0/se00010s.se1 +0 -0
- libaditya/ephe/seas_00.se1 +0 -0
- libaditya/ephe/seas_06.se1 +0 -0
- libaditya/ephe/seas_12.se1 +0 -0
- libaditya/ephe/seas_18.se1 +0 -0
- libaditya/ephe/seas_24.se1 +0 -0
- libaditya/ephe/seas_30.se1 +0 -0
- libaditya/ephe/seas_36.se1 +0 -0
- libaditya/ephe/seas_42.se1 +0 -0
- libaditya/ephe/seas_48.se1 +0 -0
- libaditya/ephe/seasm06.se1 +0 -0
- libaditya/ephe/seasm12.se1 +0 -0
- libaditya/ephe/seasm18.se1 +0 -0
- libaditya/ephe/seasm24.se1 +0 -0
- libaditya/ephe/seasm30.se1 +0 -0
- libaditya/ephe/seasm36.se1 +0 -0
- libaditya/ephe/seasm42.se1 +0 -0
- libaditya/ephe/seasm48.se1 +0 -0
- libaditya/ephe/seasm54.se1 +0 -0
- libaditya/ephe/sefstars.txt +4245 -0
- libaditya/ephe/semo_00.se1 +0 -0
- libaditya/ephe/semo_06.se1 +0 -0
- libaditya/ephe/semo_12.se1 +0 -0
- libaditya/ephe/semo_18.se1 +0 -0
- libaditya/ephe/semo_24.se1 +0 -0
- libaditya/ephe/semo_30.se1 +0 -0
- libaditya/ephe/semo_36.se1 +0 -0
- libaditya/ephe/semo_42.se1 +0 -0
- libaditya/ephe/semo_48.se1 +0 -0
- libaditya/ephe/semom06.se1 +0 -0
- libaditya/ephe/semom12.se1 +0 -0
- libaditya/ephe/semom18.se1 +0 -0
- libaditya/ephe/semom24.se1 +0 -0
- libaditya/ephe/semom30.se1 +0 -0
- libaditya/ephe/semom36.se1 +0 -0
- libaditya/ephe/semom42.se1 +0 -0
- libaditya/ephe/semom48.se1 +0 -0
- libaditya/ephe/semom54.se1 +0 -0
- libaditya/ephe/sepl_00.se1 +0 -0
- libaditya/ephe/sepl_06.se1 +0 -0
- libaditya/ephe/sepl_12.se1 +0 -0
- libaditya/ephe/sepl_18.se1 +0 -0
- libaditya/ephe/sepl_24.se1 +0 -0
- libaditya/ephe/sepl_30.se1 +0 -0
- libaditya/ephe/sepl_36.se1 +0 -0
- libaditya/ephe/sepl_42.se1 +0 -0
- libaditya/ephe/sepl_48.se1 +0 -0
- libaditya/ephe/seplm06.se1 +0 -0
- libaditya/ephe/seplm12.se1 +0 -0
- libaditya/ephe/seplm18.se1 +0 -0
- libaditya/ephe/seplm24.se1 +0 -0
- libaditya/ephe/seplm30.se1 +0 -0
- libaditya/ephe/seplm36.se1 +0 -0
- libaditya/ephe/seplm42.se1 +0 -0
- libaditya/ephe/seplm48.se1 +0 -0
- libaditya/ephe/seplm54.se1 +0 -0
- libaditya/hd/__init__.py +8 -0
- libaditya/hd/calc.py +55 -0
- libaditya/hd/constants.py +127 -0
- libaditya/hd/longitude.py +271 -0
- libaditya/objects/__init__.py +19 -0
- libaditya/objects/celestial_object.py +206 -0
- libaditya/objects/context.py +133 -0
- libaditya/objects/cusps.py +259 -0
- libaditya/objects/julian_day.py +265 -0
- libaditya/objects/location.py +167 -0
- libaditya/objects/longitude.py +987 -0
- libaditya/objects/nakshatras.py +285 -0
- libaditya/objects/planets.py +2059 -0
- libaditya/objects/shadbala.py +398 -0
- libaditya/objects/signs.py +690 -0
- libaditya/objects/swe_functions.py +75 -0
- libaditya/print_functions.py +548 -0
- libaditya/read.py +665 -0
- libaditya/stars/__init__.py +4 -0
- libaditya/stars/fixed_star.py +216 -0
- libaditya/stars/make_swe_stars.py +407 -0
- libaditya/stars/star-sign-boundaries +44 -0
- libaditya/stars/stellarium/__init__.py +6 -0
- libaditya/stars/stellarium/remote_control/__init__.py +22 -0
- libaditya/stars/stellarium/remote_control/location.py +82 -0
- libaditya/stars/stellarium/remote_control/locationsearch.py +35 -0
- libaditya/stars/stellarium/remote_control/main.py +165 -0
- libaditya/stars/stellarium/remote_control/objects.py +63 -0
- libaditya/stars/stellarium/remote_control/scripts.py +81 -0
- libaditya/stars/stellarium/remote_control/simbad.py +20 -0
- libaditya/stars/stellarium/remote_control/stelaction.py +31 -0
- libaditya/stars/stellarium/remote_control/stelproperty.py +30 -0
- libaditya/stars/stellarium/remote_control/view.py +85 -0
- libaditya/stars/stellarium/stellarium.py +92 -0
- libaditya/stars/the_stars.py +522 -0
- libaditya/stars/utilities.py +539 -0
- libaditya/utils.py +431 -0
- libaditya/write.py +67 -0
- libaditya-0.3.4.dist-info/METADATA +588 -0
- libaditya-0.3.4.dist-info/RECORD +131 -0
- libaditya-0.3.4.dist-info/WHEEL +5 -0
- libaditya-0.3.4.dist-info/licenses/LICENSE +661 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# This file is part of libaditya.
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
|
|
4
|
+
#
|
|
5
|
+
# libaditya is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# libaditya is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Affero General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
# along with libaditya. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import pathlib
|
|
20
|
+
from dataclasses import replace
|
|
21
|
+
import swisseph as swe
|
|
22
|
+
|
|
23
|
+
from libaditya import constants as const
|
|
24
|
+
|
|
25
|
+
from libaditya.objects import EphContext, Circle, JulianDay
|
|
26
|
+
from libaditya.calc import Varga, Rashi
|
|
27
|
+
from libaditya.cards import CardsOfTruth
|
|
28
|
+
import libaditya.stars as stars
|
|
29
|
+
|
|
30
|
+
from .api import API
|
|
31
|
+
from .bodygraph import Bodygraph
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Chart(API):
|
|
35
|
+
"""
|
|
36
|
+
the primary interface into libaditya is the Chart
|
|
37
|
+
Chart is a collection of vargas
|
|
38
|
+
|
|
39
|
+
it explicity includes a Rashi chart Chart.rashi()
|
|
40
|
+
any implemented varga can gotten by Chart.varga(varga_code)
|
|
41
|
+
|
|
42
|
+
can return a new Chart that has different options set
|
|
43
|
+
aditya(),tropical(),sidereal() all have certain options they set, any others can be passed as keyword arguments, e.g., ayanamsa=27
|
|
44
|
+
defaults are documented in those functions
|
|
45
|
+
|
|
46
|
+
Jaimini and Tajika inherit from Chart, and they are here to give syntactic functionality to this
|
|
47
|
+
simply for ease of use; explained more in a code comment
|
|
48
|
+
|
|
49
|
+
the actually functionality is provided through Varga and on down.
|
|
50
|
+
|
|
51
|
+
where the syntax for chart=Chart() is chart.jaimini().first_strength()
|
|
52
|
+
.first_strength() actually belongs to Varga...so on any varga you can call
|
|
53
|
+
Varga.jaimini_first_strength()
|
|
54
|
+
|
|
55
|
+
not sure this syntax is really worth it? leaving it for now
|
|
56
|
+
"""
|
|
57
|
+
libaditya_path = os.path.dirname(pathlib.Path(__file__).parent)
|
|
58
|
+
ephe_path = libaditya_path + "/ephe/"
|
|
59
|
+
|
|
60
|
+
_initializing_ecliptic = False
|
|
61
|
+
|
|
62
|
+
def __init__(self, context=EphContext()):
|
|
63
|
+
swe.set_ephe_path(self.ephe_path)
|
|
64
|
+
self.context = context
|
|
65
|
+
self._Rashi = Rashi(self.context,self)
|
|
66
|
+
if not Chart._initializing_ecliptic:
|
|
67
|
+
Chart._initializing_ecliptic = True
|
|
68
|
+
try:
|
|
69
|
+
self._Ecliptic = self.ecliptic()
|
|
70
|
+
finally:
|
|
71
|
+
Chart._initializing_ecliptic = False
|
|
72
|
+
|
|
73
|
+
def __repr__(self):
|
|
74
|
+
return self.rashi().__str__()
|
|
75
|
+
|
|
76
|
+
def __str__(self):
|
|
77
|
+
return self.__repr__()
|
|
78
|
+
|
|
79
|
+
def chart(self):
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
def rashi(self, n=None):
|
|
83
|
+
# pass an integer to Chart().rashi(), get the varga...just to make it easier for me sometimes
|
|
84
|
+
if n is not None:
|
|
85
|
+
return self.varga(n)
|
|
86
|
+
return self._Rashi
|
|
87
|
+
|
|
88
|
+
# natal() is meant to be an api feature for western/hellenistic/other astrologers
|
|
89
|
+
# who may feel more comfortable with that
|
|
90
|
+
# the same features are accessible using both names
|
|
91
|
+
def natal(self):
|
|
92
|
+
return self.rashi()
|
|
93
|
+
|
|
94
|
+
def bodygraph(self):
|
|
95
|
+
return Bodygraph(self.context)
|
|
96
|
+
|
|
97
|
+
def varga(self, amsha: int):
|
|
98
|
+
"""
|
|
99
|
+
use Chart.rashi() for the rashi() chart
|
|
100
|
+
|
|
101
|
+
you must pass an integer to varga
|
|
102
|
+
|
|
103
|
+
1-N for positive integers make a parivritti varga of that amsha
|
|
104
|
+
|
|
105
|
+
special vargas have negative integer codes
|
|
106
|
+
these vargas all have deities associated with the amsha in various ways
|
|
107
|
+
these can be accessed by Planet/Cusp.deity() (really, it is Longitude.deity()...
|
|
108
|
+
Longitude is where basically all of the Aditya/Zodiac and varga calculations are managed)
|
|
109
|
+
|
|
110
|
+
-2 Hora; Sun and Moon, same stays, opposite goes opposite
|
|
111
|
+
-3 Drekkana;
|
|
112
|
+
-4 Chaturthamsha
|
|
113
|
+
-10 Dashamsha
|
|
114
|
+
-100 Dashamsha with Even Rashis going in reverse
|
|
115
|
+
-12 Dvadashamsha
|
|
116
|
+
-16 Shodashamsha
|
|
117
|
+
-20 Vimshamsha
|
|
118
|
+
-24 Parashara Chaturvimshamsha
|
|
119
|
+
-240 Siddhamsha
|
|
120
|
+
-27 Bhamsha
|
|
121
|
+
-40 Khdavedamsha
|
|
122
|
+
-45 Akshavedamsha
|
|
123
|
+
-60 Shashtyamsha
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
return Varga(self.context,amsha)
|
|
127
|
+
|
|
128
|
+
def saptavargas(self):
|
|
129
|
+
"""
|
|
130
|
+
return a list of of the saptaVargas
|
|
131
|
+
i.e., 1, -2, -3, 7, 9, -12, 30
|
|
132
|
+
"""
|
|
133
|
+
saptavargas = [1,-2,-3,7,9,-12,30]
|
|
134
|
+
return [Varga(self.context,amsha) for amsha in saptavargas]
|
|
135
|
+
|
|
136
|
+
# do the other groups of vargas, dasha, etc.
|
|
137
|
+
|
|
138
|
+
# jaimini and tajika
|
|
139
|
+
# these inherit from Chart, then Chart calls them here, which is why there is a local import statement
|
|
140
|
+
# the reason is that i like to have the syntax, e.g., chart.jaimini().pada()
|
|
141
|
+
# i could make a Mixin like with Varga and calc.Jaimini, then the syntax would be
|
|
142
|
+
# chart.jaimini_pada(), chart.tajika_vargas(); but for some reason, i want to be able to write, chart.tajika()
|
|
143
|
+
# really, if you want to really use that chart, then do tajika_chart = chart.tajika()
|
|
144
|
+
# jaimini and tajika really just contain wrappers and syntax for that functionality
|
|
145
|
+
# the calculation is also done lower, e.g., in Varga
|
|
146
|
+
|
|
147
|
+
def jaimini(self):
|
|
148
|
+
from libaditya.charts import Jaimini
|
|
149
|
+
return Jaimini(context=self.context)
|
|
150
|
+
|
|
151
|
+
def tajika(self):
|
|
152
|
+
from libaditya.charts import Tajika
|
|
153
|
+
return Tajika(context=self.context)
|
|
154
|
+
|
|
155
|
+
def aditya(self, **kwargs):
|
|
156
|
+
"""
|
|
157
|
+
take the current EphContext and change what is needed to make it a tropical Aditya chart
|
|
158
|
+
|
|
159
|
+
sysflg=const.TROP
|
|
160
|
+
circle=Circle.ADITYA
|
|
161
|
+
names=replace(self.context.names,sign_names=const.adityas)
|
|
162
|
+
|
|
163
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
164
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
165
|
+
"""
|
|
166
|
+
return Chart(context=replace(self.context,sysflg=const.TROP,circle=Circle.ADITYA,sign_names="adityas",**kwargs))
|
|
167
|
+
|
|
168
|
+
def tropical(self, **kwargs):
|
|
169
|
+
"""
|
|
170
|
+
take the current EphContext and change what is needed to make it a tropical zodiac chart
|
|
171
|
+
|
|
172
|
+
sysflg=const.TROP
|
|
173
|
+
circle=Circle.ZODIAC
|
|
174
|
+
names=replace(self.context.names,sign_names=const.zodiac)
|
|
175
|
+
|
|
176
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
177
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
178
|
+
"""
|
|
179
|
+
return Chart(context=replace(self.context,sysflg=const.TROP,circle=Circle.ZODIAC,sign_names="zodiac",**kwargs))
|
|
180
|
+
|
|
181
|
+
def sidereal(self, ayanamsa=27, **kwargs):
|
|
182
|
+
"""
|
|
183
|
+
take the current EphContext and change what is needed to make it a sidereal zodiac chart
|
|
184
|
+
|
|
185
|
+
sysflg=const.SID
|
|
186
|
+
circle=Circle.ZODIAC
|
|
187
|
+
sign_names=sign_names=const.zodiac
|
|
188
|
+
ayanamsa=27, True Citra ayanamsa by default; use Chart.sidereal(ayanamsa=n) to set the ayanamsa
|
|
189
|
+
|
|
190
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
191
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
192
|
+
"""
|
|
193
|
+
return Chart(context=replace(self.context,sysflg=const.SID,ayanamsa=ayanamsa,circle=Circle.ZODIAC,sign_names="zodiac",**kwargs))
|
|
194
|
+
|
|
195
|
+
def heliocentric(self, **kwargs):
|
|
196
|
+
"""
|
|
197
|
+
take the current EphContext and change what is needed to make it a heliocentric chart
|
|
198
|
+
|
|
199
|
+
sysflg=const.HELIO
|
|
200
|
+
|
|
201
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
202
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
203
|
+
"""
|
|
204
|
+
return Chart(context=replace(self.context,sysflg=const.HELIO,**kwargs))
|
|
205
|
+
|
|
206
|
+
def barycentric(self, **kwargs):
|
|
207
|
+
"""
|
|
208
|
+
take the current EphContext and change what is needed to make it a barycentric chart
|
|
209
|
+
|
|
210
|
+
sysflg=const.BARY
|
|
211
|
+
|
|
212
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
213
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
214
|
+
"""
|
|
215
|
+
return Chart(context=replace(self.context,sysflg=const.BARY,**kwargs))
|
|
216
|
+
|
|
217
|
+
def cot(self, **kwargs):
|
|
218
|
+
"""
|
|
219
|
+
create a CardsOfTruth instantce for this context
|
|
220
|
+
"""
|
|
221
|
+
return CardsOfTruth(context=replace(self.context,**kwargs),master=self.rashi())
|
|
222
|
+
|
|
223
|
+
def draconic(self, **kwargs):
|
|
224
|
+
"""
|
|
225
|
+
take the current EphContext and change what is needed to make it a draconic chart
|
|
226
|
+
|
|
227
|
+
sysflg=const.DRAC
|
|
228
|
+
|
|
229
|
+
**kwargs can take any keyword argument that can be used for EphContext
|
|
230
|
+
so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
|
|
231
|
+
"""
|
|
232
|
+
return Chart(context=replace(self.context,sysflg=const.DRAC,**kwargs))
|
|
233
|
+
|
|
234
|
+
def shift(self, dir, unit, number, **kwargs):
|
|
235
|
+
"""
|
|
236
|
+
calls self.JulianDay effectively and return a Chart with shifted JulianDay
|
|
237
|
+
"""
|
|
238
|
+
return Chart(context=replace(self.context,timeJD=self.context.timeJD.shift(dir,unit,number),**kwargs))
|
|
239
|
+
|
|
240
|
+
def timejd(self, next_time):
|
|
241
|
+
"""
|
|
242
|
+
shift the time only
|
|
243
|
+
current next_time only accepts a julianday number
|
|
244
|
+
carries along the timezone from this context
|
|
245
|
+
"""
|
|
246
|
+
if isinstance(next_time, float):
|
|
247
|
+
return Chart(context=replace(self.context,timeJD=JulianDay(next_time,self.context.timeJD.utcoffset)))
|
|
248
|
+
|
|
249
|
+
def now(self):
|
|
250
|
+
"""
|
|
251
|
+
return a chart like this one but for right now
|
|
252
|
+
"""
|
|
253
|
+
return Chart(context=replace(self.context,timeJD=JulianDay("now",self.context.timeJD.utcoffset)))
|
|
254
|
+
|
|
255
|
+
def _new_chart(self, **kwargs):
|
|
256
|
+
"""
|
|
257
|
+
return a Chart replacing anything in this EphContext by **kwargs
|
|
258
|
+
e.g., Chart.new_chart(hsys='R', ayanamsa=27) will return this Chart but using Regiomontanus house system
|
|
259
|
+
and True Citra ayanamsa, all the other options staying the same
|
|
260
|
+
|
|
261
|
+
be very careful with this as there are no protections on the option combinations and you could
|
|
262
|
+
easily choose a combination of options that doesnt really make sense
|
|
263
|
+
"""
|
|
264
|
+
return Chart(context=replace(self.context,**kwargs))
|
|
265
|
+
|
|
266
|
+
def _new_context(self, context):
|
|
267
|
+
"""
|
|
268
|
+
return a Chart replacing anything in this EphContext by **kwargs
|
|
269
|
+
e.g., Chart.new_chart(hsys='R', ayanamsa=27) will return this Chart but using Regiomontanus house system
|
|
270
|
+
and True Citra ayanamsa, all the other options staying the same
|
|
271
|
+
|
|
272
|
+
be very careful with this as there are no protections on the option combinations and you could
|
|
273
|
+
easily choose a combination of options that doesnt really make sense
|
|
274
|
+
"""
|
|
275
|
+
return Chart(context)
|
|
276
|
+
|
|
277
|
+
def stars(self,stellarium=False):
|
|
278
|
+
"""
|
|
279
|
+
this is TheStars, used when you know the nomenclature name of the star, the (,)noMen name, because they all look a bit like that
|
|
280
|
+
this is implemented so that you can choose or not to put the ","
|
|
281
|
+
"""
|
|
282
|
+
return stars.TheStars(self.context,stellarium)
|
|
283
|
+
|
|
284
|
+
def ecliptic(self):
|
|
285
|
+
self_true_sidereal = self.sidereal(ayanamsa=97,signize=False)
|
|
286
|
+
return stars.the_stars.Ecliptic(self_true_sidereal.context,master=self)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# This file is part of libaditya.
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
|
|
4
|
+
#
|
|
5
|
+
# libaditya is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# libaditya is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Affero General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
# along with libaditya. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
from libaditya.objects import EphContext
|
|
19
|
+
from libaditya.charts import Chart
|
|
20
|
+
|
|
21
|
+
class Jaimini(Chart):
|
|
22
|
+
|
|
23
|
+
def __init__(self, context=EphContext()):
|
|
24
|
+
super().__init__(context)
|
|
25
|
+
self.ak = self.atmakaraka # so you can call chart.jaimini().ak()
|
|
26
|
+
|
|
27
|
+
def pada(self, amsha=1):
|
|
28
|
+
if amsha == 1:
|
|
29
|
+
return self.rashi().pada()
|
|
30
|
+
return self.varga(amsha).pada()
|
|
31
|
+
|
|
32
|
+
def upapada(self, amsha=1):
|
|
33
|
+
if amsha == 1:
|
|
34
|
+
return self.rashi().upapada()
|
|
35
|
+
return self.varga(amsha).upapada()
|
|
36
|
+
|
|
37
|
+
def padas(self, amsha=1):
|
|
38
|
+
if amsha == 1:
|
|
39
|
+
return self.rashi().padas()
|
|
40
|
+
return self.varga(amsha).padas()
|
|
41
|
+
|
|
42
|
+
def karakas(self):
|
|
43
|
+
"""
|
|
44
|
+
get the Jaimini karakas for this Chart/Jaimini
|
|
45
|
+
"""
|
|
46
|
+
return self.rashi().planets().jaimini_karakas()
|
|
47
|
+
|
|
48
|
+
def atmakaraka(self):
|
|
49
|
+
return self.karakas()[0]
|
|
50
|
+
|
|
51
|
+
def svamsha(self):
|
|
52
|
+
"""
|
|
53
|
+
returns the Sign that the AK is in in the navamsha
|
|
54
|
+
"""
|
|
55
|
+
return self.varga(9).signs()[self.varga(9).where_is(self.atmakaraka()).sign()]
|
|
56
|
+
|
|
57
|
+
def karakamsha(self):
|
|
58
|
+
return self.rashi().signs()[self.atmakaraka().sign()]
|
|
59
|
+
|
|
60
|
+
def darakaraka(self):
|
|
61
|
+
# there are 7 karakas, python is 0-indexed, so 6 is the 7th starting from 0
|
|
62
|
+
return self.karakas()[6]
|
|
63
|
+
|
|
64
|
+
def first_strength(self, amsha=1):
|
|
65
|
+
if amsha == 1:
|
|
66
|
+
return self.rashi().jaimini_first_strength()
|
|
67
|
+
else:
|
|
68
|
+
return self.varga(amsha).jaimini_first_strength()
|
|
69
|
+
|
|
70
|
+
def second_strength(self, amsha=1):
|
|
71
|
+
if amsha == 1:
|
|
72
|
+
return self.rashi().jaimini_second_strength()
|
|
73
|
+
else:
|
|
74
|
+
return self.varga(amsha).jaimini_second_strength()
|
|
75
|
+
|
|
76
|
+
def argala(self):
|
|
77
|
+
"""
|
|
78
|
+
determine the argala in this chart
|
|
79
|
+
this means combined argala to 1st and 7th houses in the Rashi chart
|
|
80
|
+
|
|
81
|
+
the deepest python function for argala will be able to do it to any sign in any varga
|
|
82
|
+
"""
|
|
83
|
+
return self.rashi().rashi_argala()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# This file is part of libaditya.
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
|
|
4
|
+
#
|
|
5
|
+
# libaditya is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# libaditya is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Affero General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
# along with libaditya. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
from libaditya.objects import EphContext
|
|
19
|
+
from libaditya.charts import Chart
|
|
20
|
+
|
|
21
|
+
class Tajika(Chart):
|
|
22
|
+
|
|
23
|
+
def __init__(self, context=EphContext()):
|
|
24
|
+
super().__init__(context)
|
|
25
|
+
|
|
26
|
+
def vargas(self) -> {int: "varga"}:
|
|
27
|
+
"""
|
|
28
|
+
return a dictionary of tajika parivritti vargas
|
|
29
|
+
1-12 in a dictionary {int: Sign}
|
|
30
|
+
also 30, since it is sometimes used
|
|
31
|
+
"""
|
|
32
|
+
vargas = {}
|
|
33
|
+
for n in range(1,13):
|
|
34
|
+
vargas[n] = self.varga(n)
|
|
35
|
+
vargas[30] = self.varga(30)
|
|
36
|
+
return vargas
|