Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Jonas Plewinski
pystencils
Commits
0178dcc2
Commit
0178dcc2
authored
Jul 06, 2018
by
Martin Bauer
Browse files
CBackend: support for negative integer exponentials
parent
e41548b1
Changes
1
Hide whitespace changes
Inline
Side-by-side
backends/cbackend.py
View file @
0178dcc2
...
...
@@ -220,6 +220,8 @@ class CustomSympyPrinter(CCodePrinter):
"""Don't use std::pow function, for small integer exponents, write as multiplication"""
if
expr
.
exp
.
is_integer
and
expr
.
exp
.
is_number
and
0
<
expr
.
exp
<
8
:
return
"("
+
self
.
_print
(
sp
.
Mul
(
*
[
expr
.
base
]
*
expr
.
exp
,
evaluate
=
False
))
+
")"
elif
expr
.
exp
.
is_integer
and
expr
.
exp
.
is_number
and
-
8
<
expr
.
exp
<
0
:
return
"1 / ({})"
.
format
(
self
.
_print
(
sp
.
Mul
(
*
[
expr
.
base
]
*
(
-
expr
.
exp
),
evaluate
=
False
)))
else
:
return
super
(
CustomSympyPrinter
,
self
).
_print_Pow
(
expr
)
...
...
@@ -359,14 +361,17 @@ class VectorizedCustomSympyPrinter(CustomSympyPrinter):
if
expr
.
exp
.
is_integer
and
expr
.
exp
.
is_number
and
0
<
expr
.
exp
<
8
:
return
"("
+
self
.
_print
(
sp
.
Mul
(
*
[
expr
.
base
]
*
expr
.
exp
,
evaluate
=
False
))
+
")"
elif
expr
.
exp
==
-
1
:
one
=
self
.
instruction_set
[
'makeVec'
].
format
(
1.0
)
return
self
.
instruction_set
[
'/'
].
format
(
one
,
self
.
_print
(
expr
.
base
))
elif
expr
.
exp
==
0.5
:
return
self
.
instruction_set
[
'sqrt'
].
format
(
self
.
_print
(
expr
.
base
))
elif
expr
.
exp
.
is_integer
and
expr
.
exp
.
is_number
and
-
8
<
expr
.
exp
<
0
:
one
=
self
.
instruction_set
[
'makeVec'
].
format
(
1.0
)
return
self
.
instruction_set
[
'/'
].
format
(
one
,
self
.
_print
(
sp
.
Mul
(
*
[
expr
.
base
]
*
(
-
expr
.
exp
),
evaluate
=
False
)))
else
:
if
expr
.
exp
==
-
1
:
one
=
self
.
instruction_set
[
'makeVec'
].
format
(
1.0
)
return
self
.
instruction_set
[
'/'
].
format
(
one
,
self
.
_print
(
expr
.
base
))
elif
expr
.
exp
==
0.5
:
return
self
.
instruction_set
[
'sqrt'
].
format
(
self
.
_print
(
expr
.
base
))
else
:
raise
ValueError
(
"Generic exponential not supported"
)
raise
ValueError
(
"Generic exponential not supported: "
+
str
(
expr
))
def
_print_Mul
(
self
,
expr
,
inside_add
=
False
):
# noinspection PyProtectedMember
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment