Sage: Ticket #22422: Laplace transform involving time-shifts
https://trac.sagemath.org/ticket/22422
<p>
Sage allows to compute the inverse Laplace transform through Maxima's <code>ilt</code> function,
</p>
<pre class="wiki"> sage: var('s t')
sage: inverse_laplace(1/s, s, t)
1
</pre><p>
An unevaluated expression is returned when no explicit inverse Laplace transform is computed, as in
</p>
<pre class="wiki"> sage: inverse_laplace(exp(-s)/s, s, t)
ilt(e^(-s)/s, s, t)
</pre><p>
The result in this case is h(t-1), where h is the Heaviside step function. In Sage it is available as <code>heaviside</code>.
</p>
<p>
The problem in this ticket is to extend the current behavior of <code>inverse_laplace</code> to provide explicit expressions for proper real-rational functions with any number of real exponentials linear in the transform variable s (time-shifts) in the numerator. For consistency, the direct Laplace transform with a heaviside should also work as well.
</p>
<p>
These are some approaches:
</p>
<p>
(1) Implement an in-house solution, possibly in the lines of <a class="ext-link" href="https://ask.sagemath.org/question/36656/how-to-find-inverse-laplace-transform/"><span class="icon"></span>this answer</a>.
</p>
<p>
(2) Add an <code>algorithm</code> flag that allows to choose <code>sympy</code> (similar to integration).
</p>
<p>
(3) Interface with Giac/XCAS. With this package installed, it is possible to do:
</p>
<pre class="wiki">sage: giac('invlaplace(exp(-s)/s, s, t)')
Heaviside(t-1)
</pre><p>
IMHO, a combination of (2)-(3) is the more robust approach. A small set of experiments show that (3) is, at the time of writing, more convenient than <code>inverse_laplace_transform</code> of <a class="missing wiki">SymPy?</a> in terms of quality of solution and execution time. Unfortunately, the <a class="ext-link" href="http://doc.sagemath.org/html/en/reference/interfaces/sage/interfaces/giac.html"><span class="icon"></span>giac interface</a> does not currently support automatic translation back to the symbolic ring, as it does with <a class="missing wiki">SymPy?</a> objects via SR(..).
</p>
<p>
Any recommendations?
</p>
<p>
See also:
</p>
<ul><li><a class="ext-link" href="https://ask.sagemath.org/question/36656/how-to-find-inverse-laplace-transform/"><span class="icon"></span>How to find inverse Laplace transform</a>
</li><li><a class="ext-link" href="https://ask.sagemath.org/question/33152/laplaceheavisidetts-doesnt-return-1s/"><span class="icon"></span>laplace(heaviside(t),t,s) doesn't return 1/s</a>
</li><li><a class="ext-link" href="https://ask.sagemath.org/question/9013/inverse-laplace-transforms-of-shifts/"><span class="icon"></span>Inverse Laplace transforms of shifts</a>
</li></ul>en-usSagehttps://trac.sagemath.org/chrome/site/logo_sagemath_trac.png
https://trac.sagemath.org/ticket/22422
Trac 1.1.6paulmassonThu, 23 Feb 2017 20:17:36 GMTcc changed
https://trac.sagemath.org/ticket/22422#comment:1
https://trac.sagemath.org/ticket/22422#comment:1
<ul>
<li><strong>cc</strong>
<em>rws</em> added
</li>
</ul>
TicketmforetsMon, 27 Feb 2017 05:18:13 GMTbranch set
https://trac.sagemath.org/ticket/22422#comment:2
https://trac.sagemath.org/ticket/22422#comment:2
<ul>
<li><strong>branch</strong>
set to <em>u/mforets/laplace_transform_involving_time_shifts</em>
</li>
</ul>
TicketmforetsMon, 27 Feb 2017 05:28:24 GMTstatus, description changed; commit, author set
https://trac.sagemath.org/ticket/22422#comment:3
https://trac.sagemath.org/ticket/22422#comment:3
<ul>
<li><strong>status</strong>
changed from <em>new</em> to <em>needs_info</em>
</li>
<li><strong>commit</strong>
set to <em>20963880dfbc18035cea6159eb13d5c71b0fda59</em>
</li>
<li><strong>description</strong>
modified (<a href="/ticket/22422?action=diff&version=3">diff</a>)
</li>
<li><strong>author</strong>
set to <em>Marcelo Forets</em>
</li>
</ul>
<p>
Needs info (please see commit message) to transform heaviside via <code>_giac_()</code>. Example:
</p>
<pre class="wiki"> sage: f = heaviside(x); f, type(f)
(heaviside(x), <type 'sage.symbolic.expression.Expression'>)
sage: fg = f._giac_(); fg, type(fg)
(heaviside(x), <class 'sage.interfaces.giac.GiacElement'>)
</pre><p>
But <code>heaviside(x)</code> doesn't seem to be understood by giac.
</p>
<hr />
<p>
New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit?id=20963880dfbc18035cea6159eb13d5c71b0fda59"><span class="icon"></span>2096388</a></td><td><code>Added algorithm='sympy' (needs work) and algorithm='giac' (needs info).</code>
</td></tr></table>
TicketrwsMon, 27 Feb 2017 06:17:00 GMT
https://trac.sagemath.org/ticket/22422#comment:4
https://trac.sagemath.org/ticket/22422#comment:4
<p>
Code looking good so far but needs doctests for all code branches. Minor: you seem to change spacing, there are empty hunks in the patch, check your editor configuration.
</p>
TicketfrederichanMon, 27 Feb 2017 11:37:08 GMT
https://trac.sagemath.org/ticket/22422#comment:5
https://trac.sagemath.org/ticket/22422#comment:5
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:3" title="Comment 3">mforets</a>:
</p>
<blockquote class="citation">
<p>
Needs info (please see commit message) to transform heaviside via <code>_giac_()</code>. Example:
</p>
<pre class="wiki"> sage: f = heaviside(x); f, type(f)
(heaviside(x), <type 'sage.symbolic.expression.Expression'>)
sage: fg = f._giac_(); fg, type(fg)
(heaviside(x), <class 'sage.interfaces.giac.GiacElement'>)
</pre><p>
But <code>heaviside(x)</code> doesn't seem to be understood by giac.
</p>
</blockquote>
<p>
in giac it looks to be Heaviside, so you need to either translate the string or define it in giac:
</p>
<pre class="wiki">giac("'heaviside:=Heaviside'")
sage: giac(f).integrate(x,-1,2)
2
sage: f
heaviside(x)
sage: type(f)
<type 'sage.symbolic.expression.Expression'>
</pre><p>
similar with giacpy_sage which have a raw conversion to sage:
</p>
<pre class="wiki">sage: from giacpy_sage import *
// Giac share root-directory:/home/fred-dev/sage/develop/sage.develop/local/share/giac/
// Giac share root-directory:/home/fred-dev/sage/develop/sage.develop/local/share/giac/
Help file /home/fred-dev/sage/develop/sage.develop/local/share/giac/doc/fr/aide_cas not found
Added 0 synonyms
sage: libgiac('heaviside:=Heaviside')
'Heaviside'
sage: f=heaviside(x)
sage: fg=libgiac(f)
sage: fg.integrate(x,-1,2)
2
sage: type(fg.integrate(x,-1,2))
<type 'giacpy_sage.Pygen'>
sage: SR(fg.integrate(x,-1,2))
2
sage: type(SR(fg.integrate(x,-1,2)))
<type 'sage.symbolic.expression.Expression'>
sage: (fg.integrate(x,-1,2)).sage()
2
sage: type((fg.integrate(x,-1,2)).sage())
<type 'sage.rings.integer.Integer'>
</pre><p>
but with Heaviside will be sent to SR as a raw string so you will need some translation back to heaviside also.
</p>
TicketmforetsWed, 08 Mar 2017 12:13:09 GMT
https://trac.sagemath.org/ticket/22422#comment:6
https://trac.sagemath.org/ticket/22422#comment:6
<p>
@rws: ok, I am learning such things as doctesting in days84. for the spacing issue good that you pointed this out, I'll be more careful. BTW I use Atom editor, and thanks for the prompt feedback.
</p>
<p>
@frederichan: thanks for the insight! I see that I could use the conversion at the script level. but then each new Sage function which for some reason needs it, would have to handle the conversion. does it make sense to define this at the level of the giac.py interface?
</p>
TicketgitFri, 10 Mar 2017 08:34:08 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:7
https://trac.sagemath.org/ticket/22422#comment:7
<ul>
<li><strong>commit</strong>
changed from <em>20963880dfbc18035cea6159eb13d5c71b0fda59</em> to <em>a3a43d2920a234bc300771dd313f3dcb4564d513</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=a3a43d2920a234bc300771dd313f3dcb4564d513"><span class="icon"></span>a3a43d2</a></td><td><code>A solution for heaviside <-> Heaviside.</code>
</td></tr></table>
TicketmforetsFri, 10 Mar 2017 08:41:03 GMTstatus changed
https://trac.sagemath.org/ticket/22422#comment:8
https://trac.sagemath.org/ticket/22422#comment:8
<ul>
<li><strong>status</strong>
changed from <em>needs_info</em> to <em>needs_work</em>
</li>
</ul>
<p>
this is a patch that seems to work :)
</p>
<ul><li>borrowed the <code>un_camel</code> method from the mathematica interface, hence conversion back to lowercase heaviside is not done in place
</li><li>extended the conversion dictionary at <code>functions/generalized.py</code>, it does the job when calling _giac_()
</li><li>to-do: add doctests
</li></ul>
TicketpaulmassonMon, 13 Mar 2017 00:13:21 GMT
https://trac.sagemath.org/ticket/22422#comment:9
https://trac.sagemath.org/ticket/22422#comment:9
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:8" title="Comment 8">mforets</a>:
</p>
<blockquote class="citation">
<p>
this is a patch that seems to work :)
</p>
<ul><li>borrowed the <code>un_camel</code> method from the mathematica interface, hence conversion back to lowercase heaviside is not done in place
</li></ul></blockquote>
<p>
This works for <code>heaviside</code> but wil create problems for Sage functions with capital letters like <code>bessel_J</code>.
</p>
TicketmforetsMon, 13 Mar 2017 20:34:15 GMT
https://trac.sagemath.org/ticket/22422#comment:10
https://trac.sagemath.org/ticket/22422#comment:10
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:9" title="Comment 9">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:8" title="Comment 8">mforets</a>:
</p>
<blockquote class="citation">
<p>
this is a patch that seems to work :)
</p>
<ul><li>borrowed the <code>un_camel</code> method from the mathematica interface, hence conversion back to lowercase heaviside is not done in place
</li></ul></blockquote>
<p>
This works for <code>heaviside</code> but wil create problems for Sage functions with capital letters like <code>bessel_J</code>.
</p>
</blockquote>
<p>
ok, good. so i suppose the correct way is to implement a basic parser, as suggested in giac.py interface (my comments in #):
</p>
<pre class="wiki"> def _sage_(self):
r"""
Convert a giac expression back to a Sage expression.
This currently does not implement a parser for the Giac output language,
therefore only very simple expressions will convert successfully.
Warning: List conversion is slow.
...
"""
result = repr(self) # this is a string representation
if str(self.type()) != 'DOM_LIST' :
try:
from sage.symbolic.all import SR
result = giac2sage(result) # pattern matching e.g. Heaviside -> heaviside
return SR(result)
except Exception:
raise NotImplementedError("Unable to parse Giac output: %s" % result)
else:
return [entry.sage() for entry in self]
</pre><p>
a first search for this kind of conversion in some other module didn't give me anything useful yet.
</p>
TicketmforetsTue, 14 Mar 2017 08:01:06 GMT
https://trac.sagemath.org/ticket/22422#comment:11
https://trac.sagemath.org/ticket/22422#comment:11
<p>
for the new keyword argument's name, i would vote for <code>engine</code> instead of <code>algorithm</code>.
the former is used for example in <a class="ext-link" href="https://github.com/sagemath/sage/blob/master/src/sage/geometry/polyhedron/base.py"><span class="icon"></span>base.py</a>. the keyword <code>algorithm</code> is misleading: a given computational engine may implement different algorithms.
</p>
TicketgitWed, 15 Mar 2017 09:29:03 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:12
https://trac.sagemath.org/ticket/22422#comment:12
<ul>
<li><strong>commit</strong>
changed from <em>a3a43d2920a234bc300771dd313f3dcb4564d513</em> to <em>3732a8cea8092e71d91b08aeb7cd7b8c46215aba</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=3732a8cea8092e71d91b08aeb7cd7b8c46215aba"><span class="icon"></span>3732a8c</a></td><td><code>add new doctests and a very basic parse function at giac.py</code>
</td></tr></table>
TicketmforetsWed, 15 Mar 2017 09:29:35 GMTstatus changed
https://trac.sagemath.org/ticket/22422#comment:13
https://trac.sagemath.org/ticket/22422#comment:13
<ul>
<li><strong>status</strong>
changed from <em>needs_work</em> to <em>needs_review</em>
</li>
</ul>
TicketpaulmassonSun, 19 Mar 2017 23:34:20 GMT
https://trac.sagemath.org/ticket/22422#comment:14
https://trac.sagemath.org/ticket/22422#comment:14
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:11" title="Comment 11">mforets</a>:
</p>
<blockquote class="citation">
<p>
for the new keyword argument's name, i would vote for <code>engine</code> instead of <code>algorithm</code>.
the former is used for example in <a class="ext-link" href="https://github.com/sagemath/sage/blob/master/src/sage/geometry/polyhedron/base.py"><span class="icon"></span>base.py</a>. the keyword <code>algorithm</code> is misleading: a given computational engine may implement different algorithms.
</p>
</blockquote>
<p>
While the term <code>engine</code> is more accurate, <code>algorithm</code> is already established for a variety of commands, such as <code>integrate</code> and <code>limit</code>. Isn't consistency in Sage more important? Unless you're proposing we change all such instances to <code>engine</code>.
</p>
TicketpaulmassonSun, 19 Mar 2017 23:45:38 GMT
https://trac.sagemath.org/ticket/22422#comment:15
https://trac.sagemath.org/ticket/22422#comment:15
<p>
In the function <code>_giac2sage</code>, rather than recreating the conversion dictionary why not use <code>symbol_table</code> from <code>sage.libs.pynac.pynac</code>? That dictionary already contains all the defined conversions.
</p>
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
<p>
If <code>_un_camel</code> is no longer used, please remove it.
</p>
TicketmforetsMon, 20 Mar 2017 06:15:56 GMTstatus changed
https://trac.sagemath.org/ticket/22422#comment:16
https://trac.sagemath.org/ticket/22422#comment:16
<ul>
<li><strong>status</strong>
changed from <em>needs_review</em> to <em>needs_work</em>
</li>
</ul>
TicketgitTue, 21 Mar 2017 05:45:33 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:17
https://trac.sagemath.org/ticket/22422#comment:17
<ul>
<li><strong>commit</strong>
changed from <em>3732a8cea8092e71d91b08aeb7cd7b8c46215aba</em> to <em>dc35047155862deac04cca42fdc2d48f47cd20e2</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=14546798127a8b4d5fce22f5f969187f6fe36b4a"><span class="icon"></span>1454679</a></td><td><code>delete unused un_camel function</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=dc35047155862deac04cca42fdc2d48f47cd20e2"><span class="icon"></span>dc35047</a></td><td><code>use keyword algorithm in calculus.py</code>
</td></tr></table>
TicketmforetsTue, 21 Mar 2017 06:17:42 GMT
https://trac.sagemath.org/ticket/22422#comment:18
https://trac.sagemath.org/ticket/22422#comment:18
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:14" title="Comment 14">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:11" title="Comment 11">mforets</a>:
</p>
<blockquote class="citation">
<p>
for the new keyword argument's name, i would vote for <code>engine</code> instead of <code>algorithm</code>.
the former is used for example in <a class="ext-link" href="https://github.com/sagemath/sage/blob/master/src/sage/geometry/polyhedron/base.py"><span class="icon"></span>base.py</a>. the keyword <code>algorithm</code> is misleading: a given computational engine may implement different algorithms.
</p>
</blockquote>
<p>
While the term <code>engine</code> is more accurate, <code>algorithm</code> is already established for a variety of commands, such as <code>integrate</code> and <code>limit</code>. Isn't consistency in Sage more important?
</p>
</blockquote>
<p>
Yes, good remark.
</p>
<blockquote class="citation">
<p>
Unless you're proposing we change all such instances to <code>engine</code>.
</p>
</blockquote>
<p>
Not now. Perhaps a better one is <code>interface</code>, since this name is used in the code and in the documentation.
</p>
TicketmforetsWed, 22 Mar 2017 08:46:03 GMT
https://trac.sagemath.org/ticket/22422#comment:19
https://trac.sagemath.org/ticket/22422#comment:19
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:15" title="Comment 15">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
In the function <code>_giac2sage</code>, rather than recreating the conversion dictionary why not use <code>symbol_table</code> from <code>sage.libs.pynac.pynac</code>? That dictionary already contains all the defined conversions.
</p>
</blockquote>
<p>
Interesting! After a first look, I don't quite understand how to use it. While in giac.py, it uses <code>SR(result)</code>, in the mathematica interface (which does use <code>symbol_table</code>), it calls a <code>_sage_repr()</code> and then <code>symbolic_expression_from_string</code> which receives a <code>locals</code> dictionary. For our use case, do we need to specifically pass a <code>locals</code> translation dictionary for heaviside, or it is automatically added from the definition of the function?
</p>
<blockquote class="citation">
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
</blockquote>
<p>
I suggest that we move on with this ticket for the basic functionality described above, and to create separate tickets to enhance the symbolics with the giac interface in separate ones (also add limit, integrate, solve). If you agree we can create a new subsection "Giac interface" under <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>https://trac.sagemath.org/wiki/symbolics</a>
</p>
<blockquote class="citation">
<p>
If <code>_un_camel</code> is no longer used, please remove it.
</p>
</blockquote>
<p>
Done.
</p>
TicketgitSat, 25 Mar 2017 20:59:39 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:20
https://trac.sagemath.org/ticket/22422#comment:20
<ul>
<li><strong>commit</strong>
changed from <em>dc35047155862deac04cca42fdc2d48f47cd20e2</em> to <em>4aae4f59ba9506ad05a4209b665fae27f58dc230</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=4aae4f59ba9506ad05a4209b665fae27f58dc230"><span class="icon"></span>4aae4f5</a></td><td><code>Use symbol_table for giac -> sage conversion.</code>
</td></tr></table>
TicketmforetsSat, 25 Mar 2017 22:33:01 GMT
https://trac.sagemath.org/ticket/22422#comment:21
https://trac.sagemath.org/ticket/22422#comment:21
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:19" title="Comment 19">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:15" title="Comment 15">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
In the function <code>_giac2sage</code>, rather than recreating the conversion dictionary why not use <code>symbol_table</code> from <code>sage.libs.pynac.pynac</code>? That dictionary already contains all the defined conversions.
</p>
</blockquote>
<p>
Interesting! After a first look, I don't quite understand how to use it. While in giac.py, it uses <code>SR(result)</code>, in the mathematica interface (which does use <code>symbol_table</code>), it calls a <code>_sage_repr()</code> and then <code>symbolic_expression_from_string</code> which receives a <code>locals</code> dictionary. For our use case, do we need to specifically pass a <code>locals</code> translation dictionary for heaviside, or it is automatically added from the definition of the function?
</p>
</blockquote>
<p>
Oh! it works out of the box!!
</p>
<pre class="wiki">sage: from sage.libs.pynac.pynac import symbol_table
sage: symbol_table['giac'].copy()
{'(1+sqrt(5))/2': golden_ratio,
'Dirac': dirac_delta,
'Heaviside': heaviside,
'pi': pi}
</pre><p>
How does the new commit look? In particular, do you suggest to add more functionality relevant for this ticket? Can you supply an example with the <code>Unable to parse Giac output</code> message? Thanks.
</p>
<blockquote class="citation">
<blockquote class="citation">
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
</blockquote>
<p>
I suggest that we move on with this ticket for the basic functionality described above, and to create separate tickets to enhance the symbolics with the giac interface in separate ones (also add limit, integrate, solve). If you agree we can create a new subsection "Giac interface" under <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>https://trac.sagemath.org/wiki/symbolics</a>
</p>
<blockquote class="citation">
<p>
If <code>_un_camel</code> is no longer used, please remove it.
</p>
</blockquote>
<p>
Done.
</p>
</blockquote>
TicketmforetsSun, 26 Mar 2017 20:07:11 GMT
https://trac.sagemath.org/ticket/22422#comment:22
https://trac.sagemath.org/ticket/22422#comment:22
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:5" title="Comment 5">frederichan</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:3" title="Comment 3">mforets</a>:
</p>
<blockquote class="citation">
<p>
Needs info (please see commit message) to transform heaviside via <code>_giac_()</code>. Example:
</p>
<pre class="wiki"> sage: f = heaviside(x); f, type(f)
(heaviside(x), <type 'sage.symbolic.expression.Expression'>)
sage: fg = f._giac_(); fg, type(fg)
(heaviside(x), <class 'sage.interfaces.giac.GiacElement'>)
</pre><p>
But <code>heaviside(x)</code> doesn't seem to be understood by giac.
</p>
</blockquote>
<p>
in giac it looks to be Heaviside, so you need to either translate the string or define it in giac:
</p>
<pre class="wiki">giac("'heaviside:=Heaviside'")
sage: giac(f).integrate(x,-1,2)
2
sage: f
heaviside(x)
sage: type(f)
<type 'sage.symbolic.expression.Expression'>
</pre><p>
similar with giacpy_sage which have a raw conversion to sage:
</p>
<pre class="wiki">sage: from giacpy_sage import *
// Giac share root-directory:/home/fred-dev/sage/develop/sage.develop/local/share/giac/
// Giac share root-directory:/home/fred-dev/sage/develop/sage.develop/local/share/giac/
Help file /home/fred-dev/sage/develop/sage.develop/local/share/giac/doc/fr/aide_cas not found
Added 0 synonyms
sage: libgiac('heaviside:=Heaviside')
'Heaviside'
sage: f=heaviside(x)
sage: fg=libgiac(f)
sage: fg.integrate(x,-1,2)
2
sage: type(fg.integrate(x,-1,2))
<type 'giacpy_sage.Pygen'>
sage: SR(fg.integrate(x,-1,2))
2
sage: type(SR(fg.integrate(x,-1,2)))
<type 'sage.symbolic.expression.Expression'>
sage: (fg.integrate(x,-1,2)).sage()
2
sage: type((fg.integrate(x,-1,2)).sage())
<type 'sage.rings.integer.Integer'>
</pre><p>
but with Heaviside will be sent to SR as a raw string so you will need some translation back to heaviside also.
</p>
</blockquote>
<p>
Hi Frederic,
</p>
<p>
i have a question in relation to this. In the 2nd line of <code>src/sage/giac.py</code>, there is <code>(You should prefer the cython interface: giacpy_sage and its libgiac command)</code>. Is this recommendation relevant to this ticket?
</p>
<p>
By the way, the 2nd option above (<code>giacpy_sage</code>) in my local sage install doesn't work, clearly some package is missing (is this expected for a 'standard package'?):
</p>
<pre class="wiki">sage: from giacpy_sage import *
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-c91665cb8326> in <module>()
----> 1 from giacpy_sage import *
ImportError: No module named giacpy_sage
</pre><p>
A couple more remarks: I've checked for further info <a class="ext-link" href="http://doc.sagemath.org/html/en/reference/libs/index.html"><span class="icon"></span>here</a> but we have no <code>libgiac</code>. In <code>libs/giac.py</code>, i didn't understand if this code is particular for Groebner basis computations, or it is meant to be used more generally. Thanks!
</p>
TicketfrederichanMon, 27 Mar 2017 08:33:14 GMT
https://trac.sagemath.org/ticket/22422#comment:23
https://trac.sagemath.org/ticket/22422#comment:23
<p>
giacpy_sage is an optional spkg, but you should be able to install it.
</p>
<p>
All the files in interfaces are pexpect interfaces for external programs. Among them some (ex: pari, gap, singular) also have a cython interface that works with the c or C++ library directly. There was a wish to prefer the cython interface when avaible.
</p>
<p>
But as giacpy_sage is optional while giac went standard recently, and as calculus have old entries with the pexepect interface of giac, I think that it is not a problem to do work like this.
But indeed it is not natural to work on the pexpect interface too much.
</p>
<p>
the cython interface to giac is giacpy_sage and it superseeds the pexpect one, but your translation table could be imported by both. So when things will be decided I will update giacpy_sage also if it doesn't slow down conversions of huge expressions.
</p>
TicketfrederichanMon, 27 Mar 2017 10:18:31 GMT
https://trac.sagemath.org/ticket/22422#comment:24
https://trac.sagemath.org/ticket/22422#comment:24
<p>
NB: is the local dictionnary usefull?
or is it better to keep conversions in one place. It seems one can always do this
</p>
<pre class="wiki">sage.libs.pynac.pynac.register_symbol(heaviside,{'giac':'Heaviside'})
</pre><p>
if some keyword is missing.
</p>
TicketpaulmassonWed, 29 Mar 2017 01:24:22 GMT
https://trac.sagemath.org/ticket/22422#comment:25
https://trac.sagemath.org/ticket/22422#comment:25
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:21" title="Comment 21">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:19" title="Comment 19">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:15" title="Comment 15">paulmasson</a>:
</p>
</blockquote>
<p>
How does the new commit look? In particular, do you suggest to add more functionality relevant for this ticket? Can you supply an example with the <code>Unable to parse Giac output</code> message? Thanks.
</p>
</blockquote>
<p>
Where I'm seeing this error often is when an expression has extra powers of the variable of integration, as for example
</p>
<pre class="wiki">inverse_laplace(s^2*exp(-s)/(s-1),s,t,algorithm='giac')
</pre><p>
which returns a derivative of the Dirac delta. At some point we'll want to be able to parse an indefinite number of such derivatives: do you want to do that on this ticket or another?
</p>
<blockquote class="citation">
<blockquote class="citation">
<blockquote class="citation">
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
</blockquote>
<p>
I suggest that we move on with this ticket for the basic functionality described above, and to create separate tickets to enhance the symbolics with the giac interface in separate ones (also add limit, integrate, solve). If you agree we can create a new subsection "Giac interface" under <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>https://trac.sagemath.org/wiki/symbolics</a>
</p>
</blockquote>
</blockquote>
<p>
Sounds fine. I'd be willing to include more Giac translations for special functions on a separate ticket, if you can point me to where the official list of Giac names is located. I'd also like to do some code cleanup on nearby lines pertaining to LaTeX representations in Sage, so if that doesn't bother you we can kill two birds with one stone.
</p>
TicketpaulmassonWed, 29 Mar 2017 01:30:39 GMT
https://trac.sagemath.org/ticket/22422#comment:26
https://trac.sagemath.org/ticket/22422#comment:26
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:24" title="Comment 24">frederichan</a>:
</p>
<blockquote class="citation">
<p>
NB: is the local dictionnary usefull?
or is it better to keep conversions in one place. It seems one can always do this
</p>
<pre class="wiki">sage.libs.pynac.pynac.register_symbol(heaviside,{'giac':'Heaviside'})
</pre><p>
if some keyword is missing.
</p>
</blockquote>
<p>
I agree with Frederic on this: if there is an existing method for extending the Pynac dictionary, then we should use that instead of introducing an additional dictionary. This method should probably be added to the documentation in <code>calculus.py</code>.
</p>
<p>
FYI your documentation doesn't build right now because of unbalanced double backticks. Also, single backticks are what we use for inline LaTeX rendering in ReST, not dollar signs.
</p>
TicketfrederichanWed, 29 Mar 2017 05:27:08 GMT
https://trac.sagemath.org/ticket/22422#comment:27
https://trac.sagemath.org/ticket/22422#comment:27
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:25" title="Comment 25">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:21" title="Comment 21">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:19" title="Comment 19">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:15" title="Comment 15">paulmasson</a>:
</p>
</blockquote>
<p>
How does the new commit look? In particular, do you suggest to add more functionality relevant for this ticket? Can you supply an example with the <code>Unable to parse Giac output</code> message? Thanks.
</p>
</blockquote>
<p>
Where I'm seeing this error often is when an expression has extra powers of the variable of integration, as for example
</p>
<pre class="wiki">inverse_laplace(s^2*exp(-s)/(s-1),s,t,algorithm='giac')
</pre><p>
which returns a derivative of the Dirac delta. At some point we'll want to be able to parse an indefinite number of such derivatives: do you want to do that on this ticket or another?
</p>
<blockquote class="citation">
<blockquote class="citation">
<blockquote class="citation">
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
</blockquote>
<p>
I suggest that we move on with this ticket for the basic functionality described above, and to create separate tickets to enhance the symbolics with the giac interface in separate ones (also add limit, integrate, solve). If you agree we can create a new subsection "Giac interface" under <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>https://trac.sagemath.org/wiki/symbolics</a>
</p>
</blockquote>
</blockquote>
<p>
Sounds fine. I'd be willing to include more Giac translations for special functions on a separate ticket, if you can point me to where the official list of Giac names is located.
</p>
</blockquote>
<p>
In the file:
<code>local/share/giac/doc/aide_cas</code>
lines starting by #
are keywords followed by synonyms, next lines are for small doc and see also.
for full doc it is there:
</p>
<p>
<a class="ext-link" href="http://www-fourier.ujf-grenoble.fr/~parisse/giac/doc/en/cascmd_en/cascmd_en.html"><span class="icon"></span>http://www-fourier.ujf-grenoble.fr/~parisse/giac/doc/en/cascmd_en/cascmd_en.html</a>
</p>
TicketmforetsWed, 29 Mar 2017 07:44:04 GMT
https://trac.sagemath.org/ticket/22422#comment:28
https://trac.sagemath.org/ticket/22422#comment:28
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:23" title="Comment 23">frederichan</a>:
</p>
<blockquote class="citation">
<p>
giacpy_sage is an optional spkg, but you should be able to install it.
</p>
<p>
All the files in interfaces are pexpect interfaces for external programs. Among them some (ex: pari, gap, singular) also have a cython interface that works with the c or C++ library directly. There was a wish to prefer the cython interface when avaible.
</p>
<p>
But as giacpy_sage is optional while giac went standard recently, and as calculus have old entries with the pexepect interface of giac, I think that it is not a problem to do work like this.
But indeed it is not natural to work on the pexpect interface too much.
</p>
<p>
the cython interface to giac is giacpy_sage and it superseeds the pexpect one, but your translation table could be imported by both. So when things will be decided I will update giacpy_sage also if it doesn't slow down conversions of huge expressions.
</p>
</blockquote>
<p>
great, thanks for the detailed answer!
</p>
<p>
i wasn't aware about <code>register_symbol</code>, yes we should use it.
</p>
<p>
on the other hand, i tried to see how <code>locals</code> dictionary is used in other interfaces. i have the impression that it may be handy in some use cases, in the interactive mode. this example is from <code>mathematica.py</code>:
</p>
<p>
compare
</p>
<pre class="wiki">sage: ex = giac('myFun(x)')
sage: ex._sage_({'myFun': sin})
sin(x)
</pre><p>
to
</p>
<pre class="wiki">sage: ex = giac('myFun(x)')
sage: sage.libs.pynac.pynac.register_symbol(sin, {'giac':'myFun'})
sage: ex._sage_()
sin(x)
</pre><p>
the long import list is.. complicated.
</p>
TicketmforetsWed, 29 Mar 2017 08:33:01 GMT
https://trac.sagemath.org/ticket/22422#comment:29
https://trac.sagemath.org/ticket/22422#comment:29
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:25" title="Comment 25">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:21" title="Comment 21">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:19" title="Comment 19">mforets</a>:
</p>
<blockquote class="citation">
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:15" title="Comment 15">paulmasson</a>:
</p>
</blockquote>
<p>
How does the new commit look? In particular, do you suggest to add more functionality relevant for this ticket? Can you supply an example with the <code>Unable to parse Giac output</code> message? Thanks.
</p>
</blockquote>
<p>
Where I'm seeing this error often is when an expression has extra powers of the variable of integration, as for example
</p>
<pre class="wiki">inverse_laplace(s^2*exp(-s)/(s-1),s,t,algorithm='giac')
</pre><p>
which returns a derivative of the Dirac delta. At some point we'll want to be able to parse an indefinite number of such derivatives: do you want to do that on this ticket or another?
</p>
<blockquote class="citation">
<blockquote class="citation">
<blockquote class="citation">
<p>
I'm also getting the <code>Unable to parse Giac output</code> error often. Partly that's because more Giac conversions need to be defined. Will that happen on this ticket or a separate one?
</p>
</blockquote>
<p>
I suggest that we move on with this ticket for the basic functionality described above, and to create separate tickets to enhance the symbolics with the giac interface in separate ones (also add limit, integrate, solve). If you agree we can create a new subsection "Giac interface" under <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>https://trac.sagemath.org/wiki/symbolics</a>
</p>
</blockquote>
</blockquote>
<p>
Sounds fine. I'd be willing to include more Giac translations for special functions on a separate ticket, if you can point me to where the official list of Giac names is located. I'd also like to do some code cleanup on nearby lines pertaining to LaTeX representations in Sage, so if that doesn't bother you we can kill two birds with one stone.
</p>
</blockquote>
<p>
OK. Please see the new ticket <a class="closed ticket" href="https://trac.sagemath.org/ticket/22706" title="enhancement: Add more conversions from giac (closed: fixed)">#22706</a>. I also created a new subsection at <a class="ext-link" href="https://trac.sagemath.org/wiki/symbolics"><span class="icon"></span>symbolics wiki</a> to group these tickets.
</p>
<p>
Good finding about the missing support for derivatives of dirac delta! In my opinion it is ok to solve it in a separate ticket, since originally we begun to discuss about transforming proper functions (in the jargon of control theory, meaning that deg numerator <= deg denominator).
</p>
TicketgitWed, 29 Mar 2017 21:30:59 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:30
https://trac.sagemath.org/ticket/22422#comment:30
<ul>
<li><strong>commit</strong>
changed from <em>4aae4f59ba9506ad05a4209b665fae27f58dc230</em> to <em>4f347e2b56c928faf9ba24ac8fb1efd533cfdca2</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=c1f20cb864ce4f63357d0698a9ae6ce30b8d1657"><span class="icon"></span>c1f20cb</a></td><td><code>docstring improvements</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=4f347e2b56c928faf9ba24ac8fb1efd533cfdca2"><span class="icon"></span>4f347e2</a></td><td><code>fix another typo in docstring</code>
</td></tr></table>
TicketmforetsThu, 30 Mar 2017 07:16:42 GMTstatus changed
https://trac.sagemath.org/ticket/22422#comment:31
https://trac.sagemath.org/ticket/22422#comment:31
<ul>
<li><strong>status</strong>
changed from <em>needs_work</em> to <em>needs_review</em>
</li>
</ul>
TicketmforetsThu, 30 Mar 2017 07:45:11 GMT
https://trac.sagemath.org/ticket/22422#comment:32
https://trac.sagemath.org/ticket/22422#comment:32
<p>
Oh, and we discussed previously on the <code>locals</code> dictionary at <code>giac.py</code> interface, and the consensus was to remove it. Could you please confirm? Thanks
</p>
TicketfrederichanThu, 30 Mar 2017 09:15:15 GMT
https://trac.sagemath.org/ticket/22422#comment:33
https://trac.sagemath.org/ticket/22422#comment:33
<p>
IF you like this locals then it is OK for me, but a comment in giac.py code to remind and recommend how to use the table would be nice.
</p>
<p>
by the way why not just:
<code>result = giac.laplace(ex, s, t)</code>
(it looks that the conversion is also done)
</p>
TicketgitThu, 30 Mar 2017 20:54:05 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:34
https://trac.sagemath.org/ticket/22422#comment:34
<ul>
<li><strong>commit</strong>
changed from <em>4f347e2b56c928faf9ba24ac8fb1efd533cfdca2</em> to <em>0577b5b29296ed8617f4d4b9a30b7f1353f4e694</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=59360134eac8e1fe9232be42a755e98e809774a2"><span class="icon"></span>5936013</a></td><td><code>simplify calls to giac</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=0577b5b29296ed8617f4d4b9a30b7f1353f4e694"><span class="icon"></span>0577b5b</a></td><td><code>add register_symbol explanation and example to giac.py</code>
</td></tr></table>
TicketgitThu, 30 Mar 2017 20:59:35 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:35
https://trac.sagemath.org/ticket/22422#comment:35
<ul>
<li><strong>commit</strong>
changed from <em>0577b5b29296ed8617f4d4b9a30b7f1353f4e694</em> to <em>f5979029e901554e094d0261134112b3624d618b</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=f5979029e901554e094d0261134112b3624d618b"><span class="icon"></span>f597902</a></td><td><code>minor docstring modif</code>
</td></tr></table>
TicketpaulmassonSat, 01 Apr 2017 20:58:43 GMTmilestone changed
https://trac.sagemath.org/ticket/22422#comment:36
https://trac.sagemath.org/ticket/22422#comment:36
<ul>
<li><strong>milestone</strong>
changed from <em>sage-7.6</em> to <em>sage-8.0</em>
</li>
</ul>
<p>
Doctests all pass and documentation builds.
</p>
<p>
Single backticks typeset math so they render regular words in italic. All of the code terms in <code>giac.py</code> should be inside double backticks. Similarly, in <code>calculus.py</code> the word "cond" should be inside double backticks and one instance of "F" needs single backticks.
</p>
<p>
The documentation added to <code>giac.py</code> doesn't appear in the built documents because <code>_sage_</code> is a private method. Is this a deliberate choice? How does one access the documentation for this method?
</p>
TicketrwsWed, 05 Apr 2017 15:20:57 GMT
https://trac.sagemath.org/ticket/22422#comment:37
https://trac.sagemath.org/ticket/22422#comment:37
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:36" title="Comment 36">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Doctests all pass and documentation builds.
</p>
<p>
Single backticks typeset math so they render regular words in italic. All of the code terms in <code>giac.py</code> should be inside double backticks. Similarly, in <code>calculus.py</code> the word "cond" should be inside double backticks and one instance of "F" needs single backticks.
</p>
</blockquote>
<p>
Apart from these cosmetics I think this ticket is fine.
</p>
<blockquote class="citation">
<p>
The documentation added to <code>giac.py</code> doesn't appear in the built documents because <code>_sage_</code> is a private method. Is this a deliberate choice? How does one access the documentation for this method?
</p>
</blockquote>
<p>
As far as I know there is no way to display such docstrings (I have struggled myself with this in the past). If something important is there it should be moved to the global documentation at the top of the file.
</p>
TicketgitThu, 06 Apr 2017 09:02:58 GMTcommit changed
https://trac.sagemath.org/ticket/22422#comment:38
https://trac.sagemath.org/ticket/22422#comment:38
<ul>
<li><strong>commit</strong>
changed from <em>f5979029e901554e094d0261134112b3624d618b</em> to <em>f845269bbd0cf1843286b0394fd9890fa0670ead</em>
</li>
</ul>
<p>
Branch pushed to git repo; I updated commit sha1. New commits:
</p>
<table class="wiki">
<tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=e4fc9e02086017b42364c0a61efa0e663060af05"><span class="icon"></span>e4fc9e0</a></td><td><code>fix some double backticks</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=8267dfd7af167b16c20e9965f578c0d18e9c188e"><span class="icon"></span>8267dfd</a></td><td><code>added conversions and cleanup to giac.py doc</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=caae8df8765105d3db1d6d4a153c5f651f0840c1"><span class="icon"></span>caae8df</a></td><td><code>add 2 seealso blocks</code>
</td></tr><tr><td><a class="ext-link" href="https://git.sagemath.org/sage.git/commit/?id=f845269bbd0cf1843286b0394fd9890fa0670ead"><span class="icon"></span>f845269</a></td><td><code>fix authors string</code>
</td></tr></table>
TicketmforetsThu, 06 Apr 2017 09:12:02 GMT
https://trac.sagemath.org/ticket/22422#comment:39
https://trac.sagemath.org/ticket/22422#comment:39
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:36" title="Comment 36">paulmasson</a>:
</p>
<blockquote class="citation">
<p>
Doctests all pass and documentation builds.
</p>
<p>
Single backticks typeset math so they render regular words in italic. All of the code terms in <code>giac.py</code> should be inside double backticks. Similarly, in <code>calculus.py</code> the word "cond" should be inside double backticks and one instance of "F" needs single backticks.
</p>
<p>
The documentation added to <code>giac.py</code> doesn't appear in the built documents because <code>_sage_</code> is a private method. Is this a deliberate choice? How does one access the documentation for this method?
</p>
</blockquote>
<p>
thanks for the feedback. for the proper string/latex formatting that's good to fix. the problem i have with ReST is that it is absurdly picky when whitespace messes up the proper format; i think it's too much for 2017 but that's way the way it is i guess..
</p>
<p>
anyway, in the new commits, both remarks have been addressed, taking into account the suggestion by rws, and improve a bit the tutorial.
</p>
TicketmforetsThu, 06 Apr 2017 15:35:16 GMT
https://trac.sagemath.org/ticket/22422#comment:40
https://trac.sagemath.org/ticket/22422#comment:40
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/22422#comment:37" title="Comment 37">rws</a>:
</p>
<blockquote class="citation">
<p>
As far as I know there is no way to display such docstrings (I have struggled myself with this in the past). If something important is there it should be moved to the global documentation at the top of the file.
</p>
</blockquote>
<p>
sorry for the noise but is there a ticket for this already? just discovered that the algorithm description of <a class="ext-link" href="http://doc.sagemath.org/html/en/reference/power_series/sage/rings/power_series_ring_element.html#sage.rings.power_series_ring_element.PowerSeries.solve_linear_de"><span class="icon"></span>solve_linear_de</a> is great, but it is hidden (!)
</p>
TicketrwsSat, 08 Apr 2017 05:47:59 GMTstatus changed; reviewer set
https://trac.sagemath.org/ticket/22422#comment:41
https://trac.sagemath.org/ticket/22422#comment:41
<ul>
<li><strong>status</strong>
changed from <em>needs_review</em> to <em>positive_review</em>
</li>
<li><strong>reviewer</strong>
set to <em>Paul Masson, Ralf Stephan</em>
</li>
</ul>
<p>
Patchbot has one error but I cannot confirm it, so we're good. Paul, I dared to add your name to reviewers---just change if you don't want that.
</p>
TicketvbraunMon, 10 Apr 2017 22:25:10 GMTstatus, branch changed; resolution set
https://trac.sagemath.org/ticket/22422#comment:42
https://trac.sagemath.org/ticket/22422#comment:42
<ul>
<li><strong>status</strong>
changed from <em>positive_review</em> to <em>closed</em>
</li>
<li><strong>resolution</strong>
set to <em>fixed</em>
</li>
<li><strong>branch</strong>
changed from <em>u/mforets/laplace_transform_involving_time_shifts</em> to <em>f845269bbd0cf1843286b0394fd9890fa0670ead</em>
</li>
</ul>
Ticket