Only kidding.
From: Richard Hennessy
Sent: Monday, April 05, 2010 7:16 PM
To: Richard Hennessy ; macrakis at alum.mit.edu
Cc: Maxima List
Subject: Re: [Maxima] How do you write this in lisp
According to my program it isn't. between(inf,2,inf,'open) = 0. So that means inf > inf.
From: Richard Hennessy
Sent: Monday, April 05, 2010 6:22 PM
To: macrakis at alum.mit.edu
Cc: Maxima List
Subject: Re: [Maxima] How do you write this in lisp
Thanks. I will try it. Is infinity in the open interval (2,inf)? I don't know. Good question.
Rich
From: Stavros Macrakis
Sent: Monday, April 05, 2010 5:36 PM
To: Richard Hennessy
Cc: Maxima List
Subject: Re: [Maxima] How do you write this in lisp
BTW, instead of sign(x-a) etc. you can use compare(x,a). You may or may not still want to handle infinities explicitly
as well, depending on the exact semantics you want (is inf in the open interval (2,inf) ?)
-s
On Mon, Apr 5, 2010 at 17:22, Stavros Macrakis <macrakis at gmail.com> wrote:
Richard,
The slowest thing in this code is surely the comparisons, which will be about as expensive whether called from Lisp or
from Maxima.
If you use sign instead of is(>), you can roughly halve the number of comparisons. This also gets rid of the 'unknown'
problem which forces you to write stuff like "if is(a>0)=true then...".
Beyond that, rewriting in Lisp won't speed things up much.
Something like this:
simpbetween(x,a,b,[option]) :=
block([prederror:false,leftopen,rightopen,compxa,compxb],
if option=[] then leftopen:rightopen:false
else ( leftopen: member(option[1],[lopen,open]),
rightopen: member(option[1],[ropen,open])),
compxa: sign(x-a),
compxb: sign(x-b),
if
(a=minf or x=inf or member(compxa,if leftopen then '[pos] else '[pos,pz,zero]))
and
(b=inf or x=minf or member(compxb,if rightopen then '[neg] else '[neg,nz,zero]))
then 1
elseif
(((x # inf) and (a=inf))
or member(compxa,if leftopen then '[neg,nz,zero] else '[neg]))
or
(((x # minf) and (b=minf))
or member(compxb,if rightopen then '[pos,pz,zero] else '[pos]))
then 0
else apply('simpfuncall,append(['between,x,a,b],option))
)$
(this doesn't include all your options, and might not handle infinities exactly as you do, but should see the general
idea)
Of course, every time you resimplify the expression, Maxima must reevaluate the conditionals, which may have changed
value in the meantime.
Does this help?
-s
On Sun, Apr 4, 2010 at 22:29, Richard Hennessy <rich.hennessy at verizon.net> wrote:
I have a simplifying function called between() which is pretty slow. Could anyone be kind enough to show me how to
write the same function in Lisp so it is faster and still works in Maxima. Compiling this does not produce significant
improvement.
load("simplifying.lisp");
simpbetween(__x,__a,__b, [__option]):=
block(
[prederror:false],
if emptyp(__option) or first(__option) = 'fourier then
if is(__x > __a) = true and is(__x < __b)=true then
1
elseif is(__x < __a)=true or is(__x > __b)=true then
0
elseif is(equal(__x,__a))=true or is(equal(__x,__b))=true then
1/2
elseif __b = 'inf then
(
(1 + signum(__x - __a))/2
)
elseif __a = 'minf then
(
(1 - signum(__x - __b))/2
)
elseif __a = 'minf and __b = 'inf then
1
elseif __a = 'minf and __b = 'minf then
0
elseif __a = 'inf and __b = 'inf then
0
else
if emptyp(__option) then
simpfuncall('between, __x, __a, __b)
else
simpfuncall('between, __x, __a, __b, first(__option))
elseif first(__option) = 'closed then
if is(__x >= __a) = true and is(__x <= __b)=true then
1
elseif is(__x < __a)=true or is(__x > __b)=true then
0
elseif __a = 'minf and __b = 'inf then
1
elseif __a = 'minf and __b = 'minf then
0
elseif __a = 'inf and __b = 'inf then
0
else
simpfuncall('between, __x, __a, __b, first(__option))
elseif first(__option) = 'open then
if is(__x > __a) = true and is(__x < __b)=true then
1
elseif is(__x <= __a)=true or is(__x >= __b)=true then
0
elseif __a = 'minf and __b = 'inf then
1
elseif __a = 'minf and __b = 'minf then
0
elseif __a = 'inf and __b = 'inf then
0
else
simpfuncall('between, __x, __a, __b, first(__option))
elseif first(__option) = 'rclosed then
if is(__x > __a) = true and is(__x <= __b)=true then
1
elseif is(__x <= __a)=true or is(__x > __b)=true then
0
elseif __a = 'minf and __b = 'inf then
1
elseif __a = 'minf and __b = 'minf then
0
elseif __a = 'inf and __b = 'inf then
0
else
simpfuncall('between, __x, __a, __b, first(__option))
elseif first(__option) = 'lclosed then
if is(__x >= __a) = true and is(__x < __b)=true then
1
elseif is(__x < __a)=true or is(__x >= __b)=true then
0
elseif __a = 'minf and __b = 'inf then
1
elseif __a = 'minf and __b = 'minf then
0
elseif __a = 'inf and __b = 'inf then
0
else
simpfuncall('between, __x, __a, __b, first(__option))
else
simpfuncall('between, __x, __a, __b, first(__option))
)$
simplifying(between, simpbetween)$
_______________________________________________
Maxima mailing list
Maxima at math.utexas.edu
http://www.math.utexas.edu/mailman/listinfo/maxima
--------------------------------------------------------------------------------
_______________________________________________
Maxima mailing list
Maxima at math.utexas.edu
http://www.math.utexas.edu/mailman/listinfo/maxima