5 views

Skip to first unread message

Aug 5, 2021, 10:01:07 AM8/5/21

to fricas...@googlegroups.com

I have the following package:

)abbrev package GGLC GeographicLibCoefficients

GeographicLibCoefficients() : Exports == Implementation where

L ==> List

I ==> Integer

P ==> PositiveInteger

EXPR ==> Expression(I)

RAT ==> Fraction(I)

PLY ==> Polynomial(RAT)

UPLY(var) ==> UnivariatePolynomial(var, RAT)

RATFUNC ==> Fraction(PLY)

TAY(var) ==> UnivariateTaylorSeries(EXPR, var, 0)

Exports ==> with

tau1_m_sigma: () -> EXPR

Implementation ==> add

maxpow(): P ==

8

tau1_m_sigma(): EXPR ==

integrand: EXPR := sqrt(1 + 'k2 * sin('sigma)^2)

I1: TAY('eps) := integrate(taylor(

subst(integrand,

'k2 = 4 * 'eps

/ (1 - 'eps)^2) *

(1 - 'eps),

'eps = 0),

'sigma)

I1_truncated: EXPR := reduce(_+,

[coefficient(I1, n) *

'eps^n for

n in 0..maxpow()])

A1: UPLY('eps) := simplify(subst(I1_truncated,

'sigma = 2*%pi) /

(2*%pi))

tau1: EXPR := I1_truncated / A1

tau1 - sigma

This is me trying to compile the package:

(1) -> )compile test.spad

Compiling FriCAS source code from file /tmp/spad_test/test.spad

using old system compiler.

GGLC abbreviates package GeographicLibCoefficients

------------------------------------------------------------------------

initializing NRLIB GGLC for GeographicLibCoefficients

compiling into NRLIB GGLC

compiling local maxpow : () -> PositiveInteger

GGLC;maxpow is replaced by 8

Time: 0.00 SEC.

compiling exported tau1_m_sigma : () -> Expression Integer

****** comp fails at level 7 with expression: ******

error in function tau1_m_sigma

(SEQ

(|:=| (|:| |integrand| (|Expression| (|Integer|)))

(|sqrt| (+ 1 (* '|k2| (^ | << | (|sin| '|sigma|) | >> | 2)))))

(|:=| (|:| I1 (|UnivariateTaylorSeries| (|Expression| (|Integer|)) '|eps| 0))

(|integrate|

(|taylor|

(* (|subst| |integrand| (= '|k2| (/ (* 4 '|eps|) (^ (- 1 '|eps|) 2))))

(- 1 '|eps|))

(= '|eps| 0))

'|sigma|))

(|:=| (|:| |I1_truncated| (|Expression| (|Integer|)))

(|reduce| +

(COLLECT (IN |n| (SEGMENT 0 (|maxpow|)))

(* (|coefficient| I1 |n|) (^ '|eps| |n|)))))

(|:=| (|:| A1 (|UnivariatePolynomial| '|eps| (|Fraction| (|Integer|))))

(|simplify|

(/ (|subst| |I1_truncated| (= '|sigma| (* 2 |%pi|))) (* 2 |%pi|))))

(|:=| (|:| |tau1| (|Expression| (|Integer|))) (/ |I1_truncated| A1))

(|exit| 1 (- |tau1| |sigma|)))

****** level 7 ******

$x:= (sin (QUOTE sigma))

$m:= $EmptyMode

$f:=

((((|integrand| #) (|maxpow| #) (* #) (+ #) ...)))

>> Apparent user error:

Cannot coerce (QUOTE sigma)

of mode (Symbol)

to mode (Expression (Integer))

I notice that Fricas says that it can't coerce a Symbol to an

Expression. Is that a bug, or do I really have to convert symbols into

expressions explicitly?

Thanks,

Neven

)abbrev package GGLC GeographicLibCoefficients

GeographicLibCoefficients() : Exports == Implementation where

L ==> List

I ==> Integer

P ==> PositiveInteger

EXPR ==> Expression(I)

RAT ==> Fraction(I)

PLY ==> Polynomial(RAT)

UPLY(var) ==> UnivariatePolynomial(var, RAT)

RATFUNC ==> Fraction(PLY)

TAY(var) ==> UnivariateTaylorSeries(EXPR, var, 0)

Exports ==> with

tau1_m_sigma: () -> EXPR

Implementation ==> add

maxpow(): P ==

8

tau1_m_sigma(): EXPR ==

integrand: EXPR := sqrt(1 + 'k2 * sin('sigma)^2)

I1: TAY('eps) := integrate(taylor(

subst(integrand,

'k2 = 4 * 'eps

/ (1 - 'eps)^2) *

(1 - 'eps),

'eps = 0),

'sigma)

I1_truncated: EXPR := reduce(_+,

[coefficient(I1, n) *

'eps^n for

n in 0..maxpow()])

A1: UPLY('eps) := simplify(subst(I1_truncated,

'sigma = 2*%pi) /

(2*%pi))

tau1: EXPR := I1_truncated / A1

tau1 - sigma

This is me trying to compile the package:

(1) -> )compile test.spad

Compiling FriCAS source code from file /tmp/spad_test/test.spad

using old system compiler.

GGLC abbreviates package GeographicLibCoefficients

------------------------------------------------------------------------

initializing NRLIB GGLC for GeographicLibCoefficients

compiling into NRLIB GGLC

compiling local maxpow : () -> PositiveInteger

GGLC;maxpow is replaced by 8

Time: 0.00 SEC.

compiling exported tau1_m_sigma : () -> Expression Integer

****** comp fails at level 7 with expression: ******

error in function tau1_m_sigma

(SEQ

(|:=| (|:| |integrand| (|Expression| (|Integer|)))

(|sqrt| (+ 1 (* '|k2| (^ | << | (|sin| '|sigma|) | >> | 2)))))

(|:=| (|:| I1 (|UnivariateTaylorSeries| (|Expression| (|Integer|)) '|eps| 0))

(|integrate|

(|taylor|

(* (|subst| |integrand| (= '|k2| (/ (* 4 '|eps|) (^ (- 1 '|eps|) 2))))

(- 1 '|eps|))

(= '|eps| 0))

'|sigma|))

(|:=| (|:| |I1_truncated| (|Expression| (|Integer|)))

(|reduce| +

(COLLECT (IN |n| (SEGMENT 0 (|maxpow|)))

(* (|coefficient| I1 |n|) (^ '|eps| |n|)))))

(|:=| (|:| A1 (|UnivariatePolynomial| '|eps| (|Fraction| (|Integer|))))

(|simplify|

(/ (|subst| |I1_truncated| (= '|sigma| (* 2 |%pi|))) (* 2 |%pi|))))

(|:=| (|:| |tau1| (|Expression| (|Integer|))) (/ |I1_truncated| A1))

(|exit| 1 (- |tau1| |sigma|)))

****** level 7 ******

$x:= (sin (QUOTE sigma))

$m:= $EmptyMode

$f:=

((((|integrand| #) (|maxpow| #) (* #) (+ #) ...)))

>> Apparent user error:

Cannot coerce (QUOTE sigma)

of mode (Symbol)

to mode (Expression (Integer))

I notice that Fricas says that it can't coerce a Symbol to an

Expression. Is that a bug, or do I really have to convert symbols into

expressions explicitly?

Thanks,

Neven

Aug 5, 2021, 10:39:14 AM8/5/21

to Neven Sajko, fricas-devel

> I notice that Fricas says that it can't coerce a Symbol to an

> Expression. Is that a bug, or do I really have to convert symbols into

> expressions explicitly?

A difference between interpreter and compiler is that the interpreter
> Expression. Is that a bug, or do I really have to convert symbols into

> expressions explicitly?

tries to find some coercion or retraction function and applies them

implicitly. That makes the life of the user usually easier, but the

interpreter can make wrong guesses of your intentions.

The compiler does such an coercion only in very simple cases otherwise

YOU must provide the right conversion of the object into the respective

type. And this is a good thing to require programmers to be explicit.

Suppose in the future there would be a little change in the FriCAS

library so that (if you were not explicit) the compiler would choose

another coercion function. That shouldn't actually matter much since

coercions are supposed to be injections, but being an injection is just

a convention and is not forced by the compiler.

My suggestion is that you should always be as explicit as possible. You

will appreciate it when you read you program after 5 years.

Ralf

Aug 5, 2021, 11:17:58 AM8/5/21

to Ralf Hemmecke, fricas-devel

(That last sigma in my code should be 'sigma, instead. But that seems

unrelated to the issue I'm currently facing.)

Well, I can't seem to solve this. I tried replacing sin('sigma) with both

sin(('sigma)@EXPR)

and

sin(('sigma)::EXPR)

but nothing seems to help, I still get about the same diagnostic error.

Any pointers, please?

Thanks,

Neven

unrelated to the issue I'm currently facing.)

Well, I can't seem to solve this. I tried replacing sin('sigma) with both

sin(('sigma)@EXPR)

and

sin(('sigma)::EXPR)

but nothing seems to help, I still get about the same diagnostic error.

Any pointers, please?

Thanks,

Neven

Aug 5, 2021, 1:52:03 PM8/5/21

to Neven Sajko, fricas-devel

Hi Neven,

as a general remark, I suggest to you that you make simpler expressions.

Then you have better chances to find the problem, see attachment.

Maybe the two lines

error "ENDE"

)fin

in that file may help you in the future to nail down where exactly the

error is.

As you have seen, I have split up the expressions into simpler pieces

and added the respective type information.

But when it comes to

I1: TAY(eps) := integrate(t, sigma)

I must stop, because I have also other things to do and do not know an

easy solution for it. Maybe, since t is a Taylor series over EXPR, you

can simply first truncate and after that integrate wrt. sigma.

I hope, with that bit of code you may be able to continue yourself.

Good luck.

Ralf

as a general remark, I suggest to you that you make simpler expressions.

Then you have better chances to find the problem, see attachment.

Maybe the two lines

error "ENDE"

)fin

in that file may help you in the future to nail down where exactly the

error is.

As you have seen, I have split up the expressions into simpler pieces

and added the respective type information.

But when it comes to

I1: TAY(eps) := integrate(t, sigma)

I must stop, because I have also other things to do and do not know an

easy solution for it. Maybe, since t is a Taylor series over EXPR, you

can simply first truncate and after that integrate wrt. sigma.

I hope, with that bit of code you may be able to continue yourself.

Good luck.

Ralf

Aug 5, 2021, 2:10:14 PM8/5/21

to fricas...@googlegroups.com

kernel(s)::F

where s is symbol (in library it is variable) and F is appropriate

expression domain (usually Expression(Integer)).

--

Waldek Hebisch

Reply all

Reply to author

Forward

0 new messages

Search

Clear search

Close search

Google apps

Main menu