zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
U
P±dòÔã@sôdZdgZddlZddlZddlmZddlmZGdd„deƒZGdd    „d    eƒZ    Gd
d „d eƒZ
Gd d „d eƒZ Gdd„de ƒZ Gdd„deƒZefZeefZdd„ZGdd„deƒZdd„ZGdd„dƒZdd„Zdd„Zdd„Zd[d d!„Zd\d"d#„Zd]d$d%„Zd^d'd(„Zd)d*„Zd_d+d,„Z d-d.„Z!d/d0„Z"d1d2„Z#d3d4„Z$d5d6„Z%d7d8„Z&d9d:„Z'd;d<„Z(d=d>„Z)d?d@„Z*dAdB„Z+dCdD„Z,dEdF„Z-dGdH„Z.dIdJ„Z/e/ƒZ0dKdL„Z1dMdN„Z2dOdP„Z3dQdR„Z4dSdT„Z5ej6fdUdV„Z7GdWdX„dXƒZ8GdYdZ„dZƒZ9dS)`z{Fortran/C symbolic expressions
 
References:
- J3/21-007: Draft Fortran 202x. https://j3-fortran.org/doc/year/21/21-007.pdf
ÚExpréN)ÚEnum)Úgcdc@seZdZdZdZdZdZdS)ÚLanguagez2
    Used as Expr.tostring language argument.
    rééN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚPythonÚFortranÚC©rrúJd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\numpy/f2py/symbolic.pyrsrc@sLeZdZdZdZdZdZdZdZdZ    dZ
d    Z d
Z d Z d Zd ZdZdZdZdS)ÚOpz$
    Used as Expr op attribute.
    é
é éééé(édéÈéÒéÜi,ièiÐi¸ i¹ N)rr    r
r ÚINTEGERÚREALÚCOMPLEXÚSTRINGÚARRAYÚSYMBOLÚTERNARYÚAPPLYÚINDEXINGÚCONCATÚ
RELATIONALÚTERMSÚFACTORSÚREFÚDEREFrrrrr&s rc@sHeZdZdZdZdZdZdZdZdZ    e
e j fdd    „ƒZ e j fd
d „Zd S) ÚRelOpzH
    Used in Op.RELATIONAL expression to specify the function part.
    rréééécCsR|tjkr0tjtjtjtjtjtjdœ|     ¡Stjtjtjtjtjtjdœ|S)N)ú.eq.ú.ne.ú.lt.ú.le.ú.gt.ú.ge.)ú==ú!=ú<ú<=ú>ú>=)
rr r+ÚEQÚNEÚLTÚLEÚGTÚGEÚlower)ÚclsÚsÚlanguagerrrÚ
fromstringFs 
þþ ÿÿzRelOp.fromstringc Csb|tjkr6tjdtjdtjdtjdtjdtjdi|Stjdtjdtjd    tjd
tjd tjd i|S) Nr0r1r2r3r4r5r6r7r8r9r:r;)    rr r+r<r=r>r?r@rA©ÚselfrErrrÚtostringOs2
 þþ þþzRelOp.tostringN)rr    r
r r<r=r>r?r@rAÚ classmethodrrrFrIrrrrr+;sr+c@s,eZdZdZdZdZdZdZdZdZ    dZ
d    S)
ÚArithOpzC
    Used in Op.APPLY expression to specify the function part.
    rrr,r-r.r/éN) rr    r
r ÚPOSZNEGZADDZSUBZMULÚDIVÚPOWrrrrrKYsrKc@s eZdZdS)ÚOpErrorN©rr    r
rrrrrPfsrPc@sDeZdZdZdZdZdZdZdZdZ    dZ
d    Z d
Z d Z d Zd ZdZdS)Ú
Precedencez4
    Used as Expr.tostring precedence argument.
    rrrr,r-r/rLé ré érrN)rr    r
r ÚATOMÚPOWERÚUNARYÚPRODUCTÚSUMr>r<ZLANDZLORr"ZASSIGNÚTUPLEÚNONErrrrrRjsrRcCs<| |¡}|dkr|||<n||}|r2|||<n||=dS©N)Úget)ÚdÚkÚvÚcrrrÚ
_pairs_adds
 
 
rcc@s eZdZdS)Ú ExprWarningNrQrrrrrdŽsrdcCstj|tdddS)Nr)Ú
stacklevel)ÚwarningsÚwarnrd)ÚmessagerrrÚewarn’sric@s$eZdZdZeejfdd„ƒZdd„Zdd„Z    dd    „Z
d
d „Z d d „Z dd„Z dd„Zdd„Zdd„Zejejfdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Z d0d1„Z!d2d3„Z"d4d5„Z#d6d7„Z$d8d9„Z%d:d;„Z&d<d=„Z'd>d?„Z(d@dA„Z)dBS)CrzfRepresents a Fortran expression as a op-data pair.
 
    Expr instances are hashable and sortable.
    cCs t||dS)z.Parse a Fortran expression to a Expr.
        ©rE)rF)rDrErrrÚparseœsz
Expr.parsecCs0t|tƒst‚|tjkrbt|tƒr.t|ƒdks2t‚t|dtƒsDt‚t|dttfƒs^t|ƒ‚n¾|tjkr¶t|tƒr‚t|ƒdks†t‚t|dt    ƒs˜t‚t|dttfƒs²t|ƒ‚nj|tj
krÞt|tƒrÖt|ƒdksÚt‚nB|tj kr`t|tƒrt|ƒdkst‚t|dtƒr<|dddt|dƒd…dks@t‚t|dttfƒs t|ƒ‚nÀ|tj kr‚t |ƒdk    s t‚nž|tjtjfkrÄt|tƒs¤t‚tdd„|Dƒƒs t|ƒ‚n\|tjtjfkrêt|tƒs t‚n6|tjkrTt|tƒrt|ƒdkst‚t |dƒdk    s*t‚t|dtƒs>t‚t|dtƒs t‚nÌ|tjkr–t|tƒrzt|ƒdks~t‚t |dƒdk    s t‚nŠ|tjkrÂt|tƒr¼t|ƒdks t‚n^|tjtjfkræt|tƒs t‚n:|tjkrt|tƒr t|ƒdks t‚ntd|›ƒ‚||_||_dS)    Nrrr)z""z''z@@css|]}t|tƒVqdSr])Ú
isinstancer©Ú.0ÚitemrrrÚ    <genexpr>Âsz Expr.__init__.<locals>.<genexpr>r,z$unknown op or missing sanity check: )rlrÚAssertionErrorrÚtupleÚlenÚintÚstrrÚfloatrrr!Úhashr r%Úallr'r(Údictr#r$r"r)r*rr&ÚNotImplementedErrorÚopÚdata)rHr{r|rrrÚ__init__¢sV
 
 
  ÿ         ÿz Expr.__init__cCs"t|tƒo |j|jko |j|jkSr])rlrr{r|©rHÚotherrrrÚ__eq__äs
 
 
ÿ
þz Expr.__eq__cCsl|jtjtjfkr&tt|j ¡ƒƒ}n8|jtjkrX|jdd…tt|jd ¡ƒƒ}n|j}t    |j|fƒS©Nr)
r{rr'r(rrÚsortedr|Úitemsr#rw)rHr|rrrÚ__hash__és  &z Expr.__hash__cCsÜt|tƒrØ|j|jk    r&|jj|jjkS|jtjtjfkr\tt|j     
¡ƒƒtt|j     
¡ƒƒkS|jtj krÌ|j    dd…|j    dd…kr |j    dd…|j    dd…kStt|j    d 
¡ƒƒtt|j    d 
¡ƒƒkS|j    |j    kSt Sr) rlrr{Úvaluerr'r(rrr‚r|rƒr#ÚNotImplementedr~rrrÚ__lt__òs
 ÿ ÿ z Expr.__lt__cCs||kp||kSr]rr~rrrÚ__le__óz Expr.__le__cCs
||k Sr]rr~rrrÚ__gt__r‰z Expr.__gt__cCs
||k Sr]rr~rrrÚ__ge__r‰z Expr.__ge__cCs t|ƒj›d|j›d|j›dS©Nú(ú, ú))Útyperr{r|©rHrrrÚ__repr__sz Expr.__repr__cCs| ¡Sr])rIr‘rrrÚ__str__
sz Expr.__str__csv|jtjtjfkr`|jddkr&tjntj}t|jdƒ|jddkrVd|jd›nd}nø|jtj    krœd 
‡fdd„|jDƒ¡}d    |d
}tj}n¼|jtj kr¼tj}t|jƒ}nœ|jtj krü|jd}|jddkrò|jdd|}tj}n\|jtj kr:d 
‡fd d„|jDƒ¡}d |d }tj}n|jtjkr$g}t|j ¡ƒD]¢\}}|dkrxd}| }nd}|dkr˜|jtjˆd}n2|tdƒkr°t|ƒ}n|›d|jtjˆd}|rÜ| |¡n|dkrð| d¡| |¡qZd 
|¡p d}|rtjntj}n4|jtjkr’g}    g}
t|j ¡ƒD]ö\} } d}| dkrp| jtjˆd} n²ˆtjkr| tddƒkr®| jtjˆd} d 
| g| ¡} nX| tddƒkrä| jtjˆd} |
| g| 7}
qHn"| jtjˆd} d| ›d| ›d
} n| jtjˆdd| ›} |    r2|     |¡|     | ¡qH|
rl|    sV|    dg7}    |    dd    d 
|
¡d
g7}    d 
|    ¡pzd}|    rˆtjntj}nÆ|jtjkr8|j\}}}|tjkrðˆtjkrð‡fdd„|Dƒ\}}|›d|›}tj}nD‡fdd„|Dƒ}|dd„| ¡Dƒ7}|›d    d 
|¡›d
}tj}n |jtjkrŒ|jd}‡fd d„|jdd!…Dƒ}|›d d 
|¡›d }tj}nÌ|jtjkr‡fd"d„|jDƒ}d# 
|¡}tj}n–|jtj krz‡fd$d„|jDƒ\}}}ˆtjkrd    |›d%|›d&|›d
}nbˆtj!kr6d    |›d'|›d(|›d
}n<ˆtj"kr\d)|›d|›d|›d
}nt#d*|j›d+ˆ›ƒ‚tj}nÞ|jtj$kr¦d,|jjtj%ˆd}tj%}n²|jtj&krÒd-|jjtj%ˆd}tj%}n†|jtj'krH|j\}}}|t(j)t(j*fkrtj)ntj+}|j|ˆd}|j|ˆd}|jˆd}|›d.|›d.|›}nt#d/|j›ƒ‚|j,|j,krrd    |d
S|S)0z0Return a string representation of Expr.
        rrr-Ú_ÚrŽc3s|]}|jtjˆdVqdS©rjN©rIrRr[rmrjrrrpsÿz Expr.tostring.<locals>.<genexpr>rrc3s|]}|jtjˆdVqdSr–r—rmrjrrrp$sÿú[ú]z - ú + rjú * ú-Ú0rriöÿÿÿzpow(z ** Ú1ú/csg|]}|jtjˆd‘qS©rj©rIrRrY©rnÚargrjrrÚ
<listcomp>dsþÿz!Expr.tostring.<locals>.<listcomp>z / csg|]}|jtjˆd‘qSr r—r¢rjrrr¤jsÿcSs$g|]\}}|d| tj¡‘qS)ú=)rIrRr\©rnr`rarrrr¤lsÿcsg|]}|jtjˆd‘qSr r—r¢rjrrr¤rsÿNcsg|]}|jtjˆd‘qSr r¡r¢rjrrr¤wsÿz // csg|]}|jtjˆd‘qSr r—©rnÚarjrrr¤|sþÿú?ú:z if z else zmerge(z tostring for z and ú&Ú*ú ztostring for op )-r{rrrr|rRrZrVrurÚjoinr!rr r'r‚rƒrIÚ    as_numberrYÚappendr(rrÚranger[rWr#rKrNr$r%r"r r rzr)rXr*r&r+r<r=r>r…)rHZparent_precedencerEÚ
precedenceÚrZtermsÚtermÚcoeffr{ZfactorsÚtailÚbaseÚexpZfactorÚnameÚargsÚkwargsÚnumerÚdenomÚcondÚexpr1Úexpr2ÚropÚleftÚrightrrjrrI s0ÿ  ÿÿ ÿ 
 
 
ÿ 
 
 
 
 ÿ 
 
 
ÿ ÿÿÿÿÿ
 
 
þ
 
ÿÿ
 
 
 ÿ
 
ÿ
 
 
þ    ÿ ÿ  z Expr.tostringcCs|Sr]rr‘rrrÚ__pos__Ÿsz Expr.__pos__cCs|dS)Néÿÿÿÿrr‘rrrÚ__neg__¢sz Expr.__neg__c    Cs¬t|ƒ}t|tƒr¨|j|jkrØ|jtjtjfkr^t|jd|jdt    |jd|jdƒƒS|jtj
kr|j\}}|j\}}t ||||ƒS|jtj krØt|jt |jƒƒ}|j ¡D]\}}t|j||ƒq¸t|ƒS|jtj
kr|jtjtjfkr|t |ƒS|jtjtjfkr4|jtj
kr4t |ƒ|S|jtjkrf|jtjkrf|t||jddS|jtjkr˜|jtjkr˜t||jdd|St|ƒt|ƒStS©Nrr)Úkind)Úas_exprrlrr{rrrr¯r|ÚmaxrÚ
as_complexr'ryrƒrcÚ    normalizeÚas_realÚas_termsr†)    rHrÚr1Úi1Úr2Úi2r³r`rarrrÚ__add__¥s6  þ 
 
 " " z Expr.__add__cCst|tƒrt|ƒ|StSr]©rlÚ number_typesr¯r†r~rrrÚ__radd__Ás
 z Expr.__radd__cCs
|| Sr]rr~rrrÚ__sub__Æsz Expr.__sub__cCst|tƒrt|ƒ|StSr]rÔr~rrrÚ__rsub__És
 z Expr.__rsub__c CsVt|ƒ}t|tƒrR|j|jkrN|jtjtjfkr`t|jd|jdt    |jd|jdƒƒS|jtj
kr¢|j\}}|j\}}t ||||||||ƒS|jtj krêt|jt |jƒƒ}|j ¡D]\}}t|j||ƒqÊt|ƒS|jtjkrNt|jiƒ}|j ¡D]6\}    }
|j ¡D] \} } t|j|    | |
| ƒq qt|ƒS|jtj
kr||jtjtjfkr||t |ƒS|jtj
krª|jtjtjfkrªt |ƒ|S|jtjkrÜ|jtjkrÜ|t||jddS|jtjkr|jtjkrt||jdd|S|jtjkr(|t|ƒS|jtjkrBt|ƒ|St|ƒt|ƒStSrÇ)rÉrlrr{rrrr¯r|rÊrrËr(ryrƒrcrÌr'rÍrÎÚ
as_factorsr†) rHrrÏrÐrÑrÒr³r`raÚt1Úc1Út2Úc2rrrÚ__mul__ÎsH ÿ 
 
"  " "   z Expr.__mul__cCst|tƒrt|ƒ|StSr]rÔr~rrrÚ__rmul__÷s
 z Expr.__rmul__cCsÖt|ƒ}t|tƒrÒ|jtjkrÄ|jd}|dkr8tdƒS|dkrD|S|dkrž|jtjkrŽt|jiƒ}|j     ¡D]\}}|||j|<qnt
|ƒS|||dS|dkr´|| dSttj||iƒSt t j ||ƒStS)NrrrÅ)rÉrlrr{rrr|r¯r(rƒrÌÚas_applyrKrOr†)rHrÚexponentr³r`rarrrÚ__pow__üs(
 
  z Expr.__pow__cCs(t|ƒ}t|tƒr$tttj||ƒƒStSr])rÉrlrrÌràrKrNr†r~rrrÚ __truediv__s
zExpr.__truediv__cCst|ƒ}t|tƒr||StSr]©rÉrlrr†r~rrrÚ __rtruediv__s
zExpr.__rtruediv__cCs*t|ƒ}t|tƒr&tttj||fƒƒStSr])rÉrlrrÌrr%r†r~rrrÚ __floordiv__!s
zExpr.__floordiv__cCst|ƒ}t|tƒr||StSr]rär~rrrÚ __rfloordiv__)s
zExpr.__rfloordiv__cOs(t|ftt|ƒžtdd„| ¡DƒƒŽS)Ncss|]\}}|t|ƒfVqdSr]©rÉr¦rrrrp6sz Expr.__call__.<locals>.<genexpr>)ràÚmaprÉryrƒ)rHrºr»rrrÚ__call__/sÿz Expr.__call__cCsFt|ƒ}t|tƒs|f}t|ƒdkr4td|›dƒttj|f|ƒS)Nrz/C-index should be a single expression but got `ú`)rÉrlrrrsrirrr$)rHÚindexrrrÚ __getitem__8s 
 zExpr.__getitem__csb|jtjkrhˆ |¡}|dkr"|St d|j¡}|rd| ¡\}}|dkrPt|ƒS|dksdt    ||fƒ‚|S|jtj
tj tj fkr‚|S|jtj tjfkr´t|jt‡fdd„|jDƒƒƒS|jtjkrätt|jt‡fdd„|jDƒƒƒƒS|jtjkrVd}|j ¡D]6\}}|dkr"| ˆ¡|}n|| ˆ¡|7}q|dkrRtdƒtd    ƒS|S|jtjkrÈd}|j ¡D]6\}    }
|dkr”|     ˆ¡|
}n||     ˆ¡|
9}qr|dkrÄtd
ƒtd ƒS|S|jtjkr>|j\} } } t| tƒrø|  ˆ¡} t‡fd d„| Dƒƒ} t‡fd d„|  ¡Dƒƒ} tt|j| | | fƒƒS|jtjkr¢|jd    }t|tƒrl| ˆ¡}t‡fdd„|jd d…Dƒƒ} tt|j|f| ƒƒS|jtjkrØt‡fdd„|jDƒƒ}tt|j|ƒƒS|jtjtjfkrtt|j|j ˆ¡ƒƒS|jtj krH|j\}}}| ˆ¡}| ˆ¡}tt|j|||fƒƒSt!d|j›d|›ƒ‚dS)z„Recursively substitute symbols with values in symbols map.
 
        Symbols map is a dictionary of symbol-expression pairs.
        Nz$\A(@__f2py_PARENTHESIS_(\w+)_\d+@)\Z©ÚROUNDDIVÚSQUAREÚROUNDc3s|]}| ˆ¡VqdSr]©Ú
substituterm©Ú symbols_maprrrpVsÿz"Expr.substitute.<locals>.<genexpr>c3s|]}| ˆ¡VqdSr]ròrmrôrrrpYsÿz?substitute: empty TERMS expression interpreted as int-literal 0rzAsubstitute: empty FACTORS expression interpreted as int-literal 1rc3s|]}| ˆ¡VqdSr]ròr§rôrrrpwsc3s |]\}}|| ˆ¡fVqdSr]ròr¦rôrrrpxsÿc3s|]}| ˆ¡VqdSr]ròr§rôrrrpsc3s|]}| ˆ¡VqdSr]ròr§rôrrrp‚szsubstitute method for z: )"r{rr!r^ÚreÚmatchr|ÚgroupsÚas_arrayrqrrrr rrrrr%rÌr'rƒrórir¯r(r#rlryr$r"r)r*r&rz)rHrõr…ÚmrƒÚparenr³r´rµr·ráÚtargetrºr»ÚfuncÚoperandsrÁrÂrÃrrôrróBs† 
 ÿ
 ÿ 
 
 
 
 
 ÿ
 
  
 
zExpr.substitutecsªˆ|fˆžˆŽ}|dk    r|S|jtjtjtjtjfkr:|S|jtjtjtjtj    fkr|t
t |jt ‡‡‡fdd„|j DƒƒƒƒS|jtjtjfkri}|j  ¡D]V\}}|jˆfˆžˆŽ}t|t ƒrÔ|jˆfˆžˆŽn|}||krì|||}|||<qžt
t |j|ƒƒS|jtjkrš|j d}t|t ƒr<|jˆfˆžˆŽn|}    t ‡‡‡fdd„|j dDƒƒ}
t‡‡‡fdd„|j d ¡Dƒƒ} t
t |j|    |
| fƒƒS|jtjkr|j d}t|t ƒrÐ|jˆfˆžˆŽn|}t ‡‡‡fd    d„|j dd…Dƒƒ} t
t |j|f| ƒƒS|jtjtjfkrBt
t |j|j jˆfˆžˆŽƒƒS|jtjkr–|j \} }}|jˆfˆžˆŽ}|jˆfˆžˆŽ}t
t |j| ||fƒƒStd
|j›ƒ‚dS) aBTraverse expression tree with visit function.
 
        The visit function is applied to an expression with given args
        and kwargs.
 
        Traverse call returns an expression returned by visit when not
        None, otherwise return a new normalized expression with
        traverse-visit sub-expressions.
        Nc3s |]}|jˆfˆžˆŽVqdSr]©Útraverserm©rºr»Úvisitrrrpžsÿz Expr.traverse.<locals>.<genexpr>rc3s |]}|jˆfˆžˆŽVqdSr]rÿ©rnÚoperandrrrrp¯sÿrc3s(|] \}}||jˆfˆžˆŽfVqdSr]rÿr¦rrrrp±sÿrc3s |]}|jˆfˆžˆŽVqdSr]rÿ)rnrìrrrrp¸sÿztraverse method for )r{rrrrr!rr r%r"rÌrrrr|r'r(rƒrrlr#ryr$r)r*r&rz)rHrrºr»Úresultr|r`raÚobjrýrþZ
kwoperandsÚindicesrÁrÂrÃrrrrsl
þ ÿÿ 
 
ÿÿÿ ÿ
ÿÿ ÿÿ z Expr.traversecs*g}|f‡fdd„    }| |¡t|ƒdkS)z&Check if self contains other.
        cs"|r|S|ˆkr| d¡|SdS)Nr)r°©ÚexprÚfound©rrrrÊs
 
zExpr.contains.<locals>.visitr)rrs)rHrr
rrr rÚcontainsÅs
z Expr.containscCs tƒ}|fdd„}| |¡|S)z3Return a set of symbols contained in self.
        cSs|jtjkr| |¡dSr])r{rr!ÚaddrrrrrÚs zExpr.symbols.<locals>.visit©Úsetr)rHr
rrrrÚsymbolsÕs 
z Expr.symbolscs$tƒ}|f‡fdd„    ‰| ˆ¡|S)zFReturn a set of expressions used as atoms in polynomial self.
        cs¾|jtjkr&|jD]}| ˆ¡q|S|jtjtjfkr<dS|jtjkr„t|jdt    ƒr„|jdt    j
kr€|jdd ˆ¡|SdS|jtj tj fkrš|S|  |¡|jtjtjfkrº|SdS©Nrr)r{rr(r|rr'rr#rlrKrOrrr r$)r    r
Úb©rrrrçs  
 
z$Expr.polynomial_atoms.<locals>.visitr)rHr
rrrÚpolynomial_atomsâs
zExpr.polynomial_atomsc Csz| |tdƒi¡}||}| |tdƒi¡}t|||ƒ\}}|tdƒkrrtd|›d|›d|›d|›d|›
ƒ‚||fS)zReturn a, b such that a * symbol + b == self.
 
        If self is not linear with respect to symbol, raise RuntimeError.
        rrznot a z-linear equation: r›ršz == )rór¯Úas_numer_denomÚ RuntimeError)rHÚsymbolrZaxr¨Zzeror”rrrÚ linear_solveÿs &zExpr.linear_solveN)*rr    r
r Ú staticmethodrrrkr}r€r„r‡rˆrŠr‹r’r“rRr\r rIrÄrÆrÓrÖr×rØrÞrßrârãrårærçrêrírórr rrrrrrrr–sJB    ÿ
)    
K8 cCs"t|tƒs|S|jtjkrài}|j ¡D]p\}}|dkr:q(|jtjkrZ|dkrZ||}d}|jtjkrŒ|j ¡D]\}}t||||ƒqpq(t|||ƒq(t    |ƒdkr®t
dƒSt    |ƒdkrÔ| ¡\\}}|dkrÔ|Sttj|ƒS|jtj krÈd}i}|j ¡D]\}}|dkrq|jtjkrPt|t ƒrP|dkrP|||d}d}|jtj tjfkrª|dkr~||jd9}n*|dkrœ||jd|9}n t|||ƒnf|jtj kr|dkröt|t ƒrö|j ¡D]\}    }
t||    |
|ƒqØn t|||ƒn t|||ƒqt    |ƒdks,|dkrDt|tƒs<t‚t
|ƒSt    |ƒdkrš| ¡\\}}|dkrp|}n ttj |ƒ}|dkrŠ|Sttj||iƒS|dkr°ttj |ƒSttjttj |ƒ|iƒS|jtjkrÎ|jdtjkrÎ|jd\} } t| ƒ\}}t| ƒ\} }t|t ƒrDt|t ƒrDt||ƒ}||||}}n||d}}|jtjkr¨|jdtjkr¨|jdd|}|jdd| |}ttj||ƒS| jtjkrþ| jdtjkrþ| jdd||}| jdd|}ttj||ƒStt|ƒjƒ}t| ƒj ¡D]\}}t||| ƒqii}}| ¡D](\}}|dkrb|||<n
| ||<qFtttj |ƒƒ|}tttj |ƒƒ|}|jtj tjfkrÀ|jddkrÀ|Sttj||ƒS|jtjkrÊ|jdg}|jdd…D]¬}|d}|jtjkr–|jtjkr–|jdddkr–|jdd|jddkr–t|jddd…|jddd…t|jd|jdƒƒ}||d<n
| |¡qöt    |ƒdkrº|dSttjt|ƒƒS|jtj krt!t|jƒ\}}}|jtj kr |jdr|S|Sttj |||fƒS|S)z7Normalize Expr and apply basic evaluation methods.
    rrNrÅz"')"rlrr{rr'r|rƒrrcrsr¯r(Ú integer_typesrrrÕrqr#rKrNÚ as_term_coeffrràryrÙrÌr%rÚ    as_stringrÊr°rrr"ré)rr_ÚtrbrÚrÛrµrÚeZb1Úe1ZdividendZdivisorrÜrÝÚgr¼r½ÚlstrDÚlastZnew_lastr¾r¿rÀrrrrÌsÞ
 
$
 
 
 
 
    
  
 
 
$ 
ÿ
þýü$ÿ
rÌcCs\t|tƒrt|j|jƒSt|tƒr*t|ƒSt|tƒr@tt    |ƒƒSt|t
ƒrXt
t t |ƒƒS|S)z.Convert non-Expr objects to Expr objects.
    ) rlÚcomplexrËÚrealÚimagrÕr¯rurÚreprrrrérÉ©rrrrrəs
 
 
 
rÉcCs ttj|ƒS)zJReturn object as SYMBOL expression (variable or unparsed expression).
    )rrr!r'rrrÚ    as_symbol©sr(r-cCsht|tƒrttj||fƒSt|tƒr4ttj||fƒSt|tƒrT|jtjtjfkrT|Std|›dƒ‚dS)z/Return object as INTEGER or REAL constant.
    úcannot convert z to INTEGER or REAL constantN)    rlrtrrrrvrr{rP©rrÈrrrr¯¯s
 
 
r¯cCsHt|tƒrttj||fƒSt|tƒr4|jtjkr4|Std|›dƒ‚dS)z'Return object as INTEGER constant.
    r)z to INTEGER constantN)rlrtrrrr{rPr*rrrÚ
as_integer¼s 
 
 r+cCsŒt|tƒrttjt|ƒ|fƒSt|tƒr8ttj||fƒSt|tƒrx|jtjkrR|S|jtjkrxttjt|jdƒ|fƒSt    d|›dƒ‚dS)z$Return object as REAL constant.
    rr)z to REAL constantN)
rlrtrrrrvr{rr|rPr*rrrrÍÇs
 
 
  rÍrcCsttj||fƒS)zBReturn object as STRING expression (string literal constant).
    )rrrr*rrrrÖsrcCst|tƒr|f}ttj|ƒS)z8Return object as ARRAY expression (array constant).
    )rlrrr r'rrrrùÜs
rùcCsttjt|ƒt|ƒfƒS)zDReturn object as COMPLEX expression (complex literal constant).
    )rrrrÉ)r$r%rrrrËäsrËcOs.ttj|ttt|ƒƒtdd„| ¡DƒƒfƒS)zIReturn object as APPLY expression (function call, constructor, etc.)
    css|]\}}|t|ƒfVqdSr]rèr¦rrrrpïszas_apply.<locals>.<genexpr>)rrr#rrrérÉryrƒ)rýrºr»rrrràês
ÿÿràcCsttj|||fƒS)z<Return object as TERNARY expression (cond?expr1:expr2).
    )rrr")r¾r¿rÀrrrÚ
as_ternaryòsr,cCs ttj|ƒS)z-Return object as referencing expression.
    )rrr)©r    rrrÚas_reføsr.cCs ttj|ƒS)z/Return object as dereferencing expression.
    )rrr*r-rrrÚas_derefþsr/cCsttjtj||fƒSr])rrr&r+r<©rÂrÃrrrÚas_eqsr1cCsttjtj||fƒSr])rrr&r+r=r0rrrÚas_nesr2cCsttjtj||fƒSr])rrr&r+r>r0rrrÚas_lt sr3cCsttjtj||fƒSr])rrr&r+r?r0rrrÚas_lesr4cCsttjtj||fƒSr])rrr&r+r@r0rrrÚas_gtsr5cCsttjtj||fƒSr])rrr&r+rAr0rrrÚas_gesr6cCs¦t|tƒrŽt|ƒ}|jtjkr"|S|jtjkrPttjtd|jdƒ|jdiƒS|jtj    kr~ttjt
d|jdƒ|jdiƒSttj|diƒSt dt |ƒ›dƒ‚dS)z+Return expression as TERMS expression.
    rrr)ú to terms ExprN) rlrrÌr{rr'rr+r|rrÍrPrr'rrrrÎs
  " "rÎcCsôt|tƒrÜt|ƒ}|jtjkr"|S|jtjkr~t|jƒdkr~|j     ¡\\}}|dkrdttj|diƒSttj|dt 
|¡diƒS|jtj krÌ|jdt j krÌ|jdsÌttj|jddd|jdddiƒSttj|diƒStdt|ƒ›dƒ‚dS)z-Return expression as FACTORS expression.
    rrrrÅr)r7N)rlrrÌr{rr(r'rsr|rƒÚnumberr#rKrNrPr)rr´rµrrrrÙ+s$
   ÿþ(rÙcCsþt|tƒræt|ƒ}|jtjkr8td|jdƒ|jdfS|jtjkr^t    d|jdƒ|jdfS|jtj
krt |jƒdkr|j  ¡\\}}||fS|jtj krÞ|jdtjkrÞt|jddƒ\}}ttj||jddƒ|fS|dfStdt|ƒ›dƒ‚dS)z0Return expression as term-coefficient pair.
    rrr)z to term and coeffN)rlrrÌr{rrr+r|rrÍr'rsrƒr#rKrNrràrPr)rr´rµrrbrrrr@s
   rcCsNt|tƒr6t|ƒ}|jtjtjtjtjtj    tj
fkrB|t dƒfS|jtj kr¨|j dtjkrœ|j dsœtt|j dƒ\}}|d|d|d|dfS|t dƒfS|jtjkr¢gg}}|j  ¡D]0\}}t|ƒ\}}||}| |¡| |¡qÊt dƒt dƒ}}tt|ƒƒD]L}    ||    }tt|ƒƒD]}
|    |
kr2|||
9}q2||7}|||    9}q|jtjtjfkrš|j ddkrš| | }}||fS|jtjkr6t dƒt dƒ}}|j  ¡D]`\} } t| ƒ\} }| dkr|| | 9}||| 9}n&| dkrÌ||| 9}|| | 9}qÌ||fStdt|ƒ›dƒ‚dS)z+Return expression as numer-denom pair.
    rrrr)z to numer and denomN)rlrrÌr{rrrrr!r$r"r¯r#r|rKrNrérr'rƒr°r±rsr(rPr)rZnumersZdenomsr´rµÚnr_r¼r½ÚiÚjrrZbnumerZbdenomrrrrUsT ÿ    
 
 
$ 
 
rccsd}|d7}|VqdSrr)ÚcounterrrrÚ_counter‚sr=csJi‰‡fdd„}t djdddd||¡}d|ks6t‚d    |ksBt‚|ˆfS)
zgReplace quoted substrings of input string.
 
    Return a new string and a mapping of replacements.
    cs\| ¡dd…\}}|r$|dd…}dddœ|d}|›d|›dt ¡›d    }|ˆ|<|S)
NrrÅZSINGLEÚDOUBLE)ú'ú"rz@__f2py_QUOTES_r”ú@)røÚCOUNTERÚ__next__)rúrÈr…Úpr`©r_rrÚrepl”s zeliminate_quotes.<locals>.replz+({kind}_|)({single_quoted}|{double_quoted})z
\w[\w\d_]*z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))rÈÚ single_quotedZ double_quotedr@r?)röÚsubÚformatrq)rDrFZnew_srrErÚeliminate_quotess
ýü  rJcCsD| ¡D]6\}}|d| d¡…}|r.|d7}| |||¡}q|S)z!Inverse of eliminate_quotes.
    NrAr”)rƒÚfindÚreplace)rDr_r`rarÈrrrÚ insert_quotesªs rMc Cs6d\}}t|ƒ}dD]2\}}| |¡}|dkr0q||kr|}||}}q|dkrX|ifS|}| ||¡}| ||d|¡| ||d|¡kr¾| ||d¡}|dkrhtd||›d|›ƒ‚qhdd    d
d d œ|}d |›dt ¡›d}    ||t|ƒ|…}
t||t|ƒd…ƒ\} } |
| |    <|d|…|    | | fS)zzReplace substrings of input that are enclosed in parenthesis.
 
    Return a new string and a mapping of replacements.
    )NN))ú(/ú/)z()z{}z[]rÅNrz Mismatch of z parenthesis in rñrðÚCURLYrï)rr˜Ú{rNú@__f2py_PARENTHESIS_r”rA)rsrKÚcountÚ
ValueErrorrBrCÚreplace_parenthesis) rDrÂrÃZmn_iZleft_Zright_r:r;rDr`rar³r_rrrrUµs.
 
  $rUcCs | d¡st|ƒ‚| d¡dS)NrRr”r-)Ú
startswithrqÚsplit)rDrrrÚ_get_parenthesis_kindàsrXcCsZ| ¡D]L\}}t|ƒ}tddddd|}tdddd    d|}| ||||¡}q|S)
z$Inverse of replace_parenthesis.
    rr˜rQrN)rñrðrPrïrr™Ú}rO)rƒrXryrL)rDr_r`rarDrÂrÃrrrÚunreplace_parenthesisås rZcCs8t|d |¡}t|tƒr|Std|›d|›dƒ‚dS)z®Create an expression from a string.
 
    This is a "lazy" parser, that is, only arithmetic operations are
    resolved, non-arithmetic operations are treated as symbols.
    rjzfailed to parse `z` to Expr instance: got `rëN)Ú_FromStringWorkerrkrlrrT)rDrEr³rrrrFðs
rFc@s$eZdZdd„Zdd„Zdd„ZdS)Ú_PaircCs||_||_dSr]r0)rHrÂrÃrrrr}ÿsz_Pair.__init__cCs@|j|j}}t|tƒr"| |¡}t|tƒr6| |¡}t||ƒSr])rÂrÃrlrrór\)rHrõrÂrÃrrrrós 
 
 
 
z_Pair.substitutecCs t|ƒj›d|j›d|j›dSrŒ)rrrÂrÃr‘rrrr’ sz_Pair.__repr__N)rr    r
r}rór’rrrrr\üsr\c@s4eZdZejfdd„Zdd„Zdd„Zd dd    „Zd
S) r[cCsd|_d|_||_dSr])ÚoriginalÚ
quotes_maprErGrrrr}sz_FromStringWorker.__init__cCs t||jƒSr])rMr^)rHrDrrrÚfinalize_stringsz!_FromStringWorker.finalize_stringcCs||_t|ƒ\}|_| |¡Sr])r]rJr^Úprocess)rHÚinpZunquotedrrrrksz_FromStringWorker.parser    csÆt|ttfƒr*t|ƒ‡‡fdd„|DƒƒSt|tƒsDtt|ƒ|fƒ‚t|ƒ\}‰| ¡}‡‡fdd„‰d|krȈ| d¡ƒ}ˆdkr’tˆ     |¡ƒSˆdkr´t
|ƒdkr´t ˆ     |¡ŽSt d    ˆ›d
|›ƒ‚t  d |¡}|r&ˆdksêtˆƒ‚ˆ| ¡ƒ\}}}ˆ     |¡}ˆ     |¡}ˆ     |¡}t|||ƒSˆjtjkrFt  d |t j¡}n t  d |¡}|r¸| ¡\}    }
} ˆjtjkr€d|
d}
ˆ     ˆ|    | fƒ¡\}    } tj|
ˆjd}
ttj|
|    | fƒSt  d|¡}|rî| ¡\} } ˆ| ƒ} t| ˆ     | ¡ƒSt  d|¡}t
|ƒdkrŽˆ     ˆ|dpdƒ¡}t|ddd…|ddd…ƒD]J\}}ˆ     ˆ|ƒ¡}| ¡}|dkrp||7}n|dks~t‚||8}q>|SˆjtjkrÊd|krʈ| d¡ƒ}ttjtˆ     |¡ƒƒSt  dˆjtjkrâ|n
| dd¡¡}t
|ƒdkršˆ|ƒ}ˆjtjk    r"dd„|Dƒ}ˆ     |d¡}t|ddd…|ddd…ƒD]F\}}ˆ     |¡}| ¡}|dkr|||9}n|dksŠt‚||}qN|S| d¡s²| d ¡rètj tj!d!œ|d}ˆ     ˆ|dd…ƒ¡}t||ƒSˆjtjk    rNd|krNtt"ˆ| d¡ƒƒƒ}ˆ     |d¡}|dd…D]}ˆ     |¡}||}q0|St  d"j#d#d$d%|¡}|r¤| ¡\} }}|r| $¡rt%|ƒ}t&t%| ƒ|p d&ƒSt  d'j#d(d)d$d*|¡}|r,| ¡\} }}}|rê| $¡rêt%|ƒ}|  '¡} d+| krt(t)|  d+d,¡ƒ|pd-ƒSt(t)| ƒ|p(d&ƒS|ˆj*kr`|d| +d.¡…}t,ˆj*||p\dƒS|ˆkrÒt-|ƒ}ˆ     ˆˆ|ƒ|d/krŽdnd¡}|d/kr®t|tƒr®|S|d0krÒt|tƒrÊ|f}t.|ƒSt  d1|¡}|r~| ¡\}}}ˆ     ˆ|ƒ¡}ˆ     ˆ|ƒdd2…d¡}t|tƒs*|f}|d/krht/d3d„|Dƒƒ}td4d„|Dƒƒ}t0|f|ž|ŽS|d5ksvt‚||St  d6|¡}|r˜t1|ƒSˆ 2ˆ|ƒ¡}t3d7|›d8ˆj4›d9ƒt1|ƒS):a´Parse string within the given context.
 
        The context may define the result in case of ambiguous
        expressions. For instance, consider expressions `f(x, y)` and
        `(x, y) + (a, b)` where `f` is a function and pair `(x, y)`
        denotes complex number. Specifying context as "args" or
        "expr", the subexpression `(x, y)` will be parse to an
        argument list or to a complex number, respectively.
        c3s|]}ˆ |ˆ¡VqdSr])r`)rnZs_)ÚcontextrHrrrp)sz,_FromStringWorker.process.<locals>.<genexpr>cs*t|ttfƒr t|ƒtˆ|ƒƒSt|ˆƒSr])rlÚlistrrrrérZ)r³)Úraw_symbols_mapÚrestorerrre1sz*_FromStringWorker.process.<locals>.restoreú,rºr    rz&parsing comma-separated list (context=z): z\A([^?]+)[?]([^:]+)[:](.+)\Zz+\A(.+)\s*[.](eq|ne|lt|le|gt|ge)[.]\s*(.+)\Zz7\A(.+)\s*([=][=]|[!][=]|[<][=]|[<]|[>][=]|[>])\s*(.+)\ZÚ.rjz\A(\w[\w\d_]*)\s*[=](.*)\Zz((?<!\d[edED])[+-])rrrNú+rœz//z(?<=[@\w\d_])\s*([*]|/)ú**ú@__f2py_DOUBLE_STAR@cSsg|]}| dd¡‘qS)rjri)rLrrrrr¤~sÿz-_FromStringWorker.process.<locals>.<listcomp>r¬rŸr«)r¬r«z\A({digit_string})({kind}|)\Zz\d+z_(\d+|\w[\w\d_]*))Z digit_stringrÈr-z7\A({significant}({exponent}|)|\d+{exponent})({kind}|)\Zz[.]\d+|\d+[.]\d*z[edED][+-]?\d+)Z significantrárÈr_rérArñrîz4\A(.+)\s*(@__f2py_PARENTHESIS_(ROUND|SQUARE)_\d+@)\ZrÅcss$|]}t|tƒr|j|jfVqdSr])rlr\rÂrÃr§rrrrpÒs
ÿcss|]}t|tƒs|VqdSr])rlr\r§rrrrpÔs
rðz\A\w[\w\d_]*\Zzfromstring: treating z as symbol (original=r)5rlrcrrrrurqrUÚstriprWr`rsrËrzrör÷rør,rErr ÚIr+rFrrr&r\Úzipr%rrLrVr*r)ÚreversedrIÚisdigitrtr+rBrÍrvr^rKrrXrùryràr(r_rir])rHrDrbr³rþrúÚoperr¿rÀrÂrÁrÃÚkeynamer…rr{rr”rÈrûrƒrürºr»r)rbrdrerHrr`s8
  ÿ 
 
 
 ÿÿ    &
 
  ÿ
þÿ&
 
 
 
 
 þþüü
 
ÿ
 
 ÿ 
 ÿz_FromStringWorker.processN)r    )    rr    r
rrr}r_rkr`rrrrr[sr[)r-)r-)r-)r)r):r Ú__all__rörfÚenumrÚmathrrrr+rKÚ    ExceptionrPrRrtrrvrÕrcÚ UserWarningrdrirrÌrÉr(r¯r+rÍrrùrËràr,r.r/r1r2r3r4r5r6rÎrÙrrr=rBrJrMrUrXrZrrFr\r[rrrrÚ<module>sn        ~
 
 
 
 
 
- +