axiom-developer
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Axiom-developer] 20080819.01.tpd.patch (overload.input added (Cyganski)


From: daly
Subject: [Axiom-developer] 20080819.01.tpd.patch (overload.input added (Cyganski))
Date: Tue, 19 Aug 2008 18:20:13 -0500

Add overload.input 
=======================================================================
diff --git a/changelog b/changelog
index 377aa85..fc15048 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,5 @@
+20080819 tpd src/input/Makefile overload.input added
+20080819 dxc src/input/overload.input added
 20080818 tpd src/input/Makefile biquat.input added
 20080818 dxc src/input/biquat.input added
 20080818 dxc "David Cyganski" (no known email)
diff --git a/src/input/Makefile.pamphlet b/src/input/Makefile.pamphlet
index 0d919d6..1c2fa8e 100644
--- a/src/input/Makefile.pamphlet
+++ b/src/input/Makefile.pamphlet
@@ -341,6 +341,7 @@ REGRES= algaggr.regress algbrbf.regress  algfacob.regress 
alist.regress  \
     nqip.regress      nsfip.regress    numbers.regress  octonion.regress \
     oct.regress       ode.regress      odpol.regress    op1.regress \
     opalg.regress     operator.regress op.regress       ovar.regress \
+    overload.regress  \
     padic.regress     parabola.regress pascal1.regress  pascal.regress \
     patch51.regress   page.regress \
     patmatch.regress  pat.regress      perman.regress   perm.regress \
@@ -613,10 +614,10 @@ FILES= ${OUT}/algaggr.input  ${OUT}/algbrbf.input    
${OUT}/algfacob.input \
        ${OUT}/nepip.input    ${OUT}/newton.input \
        ${OUT}/nlode.input    ${OUT}/none.input       ${OUT}/noonburg.input \
        ${OUT}/noptip.input   ${OUT}/nqip.input       ${OUT}/nsfip.input \
-       ${OUT}/ntube.input    ${OUT}/oct.input      ${OUT}/ode.input \
+       ${OUT}/ntube.input    ${OUT}/oct.input        ${OUT}/ode.input \
        ${OUT}/octonion.input ${OUT}/odpol.input \
        ${OUT}/opalg.input    ${OUT}/operator.input   ${OUT}/op.input \
-       ${OUT}/op1.input      ${OUT}/ovar.input \
+       ${OUT}/op1.input      ${OUT}/ovar.input       ${OUT}/overload.input \
        ${OUT}/padic.input    ${OUT}/palette.input \
        ${OUT}/parpcurv.input ${OUT}/parscurv.input   ${OUT}/parsurf.input \
        ${OUT}/pascal1.input \
@@ -927,6 +928,7 @@ DOCFILES= \
   ${DOC}/odpol.input.dvi       ${DOC}/op1.input.dvi        \
   ${DOC}/opalg.input.dvi       ${DOC}/operator.input.dvi   \
   ${DOC}/op.input.dvi          ${DOC}/ovar.input.dvi       \
+  ${DOC}/overload.input.dvi   \
   ${DOC}/padic.input.dvi       ${DOC}/palette.input.dvi    \
   ${DOC}/parabola.input.dvi    ${DOC}/parpcurv.input.dvi   \
   ${DOC}/parscurv.input.dvi    ${DOC}/parsurf.input.dvi    \
diff --git a/src/input/overload.input.pamphlet 
b/src/input/overload.input.pamphlet
new file mode 100644
index 0000000..2db85a7
--- /dev/null
+++ b/src/input/overload.input.pamphlet
@@ -0,0 +1,680 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/input overload.input}
+\author{David Cyganski}
+\maketitle
+\begin{abstract}
+Type conversion and overload problems
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+<<*>>=
+)spool overload.output
+)set message test on
+)set message auto off
+)clear all
+@
+\section{Type Conversion and Overload problems}
+Several non-intuitive problems with overloading and type conversions
+arose while developing the biquaternion (see biquat.input) support
+function collection. I have extracted the minimum code set to illustrate
+each of these problems.
+
+\section{Implicit and Explicit Type Conversions}
+We begin by illustrating function calling with variously typed 
+arguments and conversion which we will break in various ways, some
+understandable, some not(?), below.
+
+The cos function will produce float outcomes for float arguments
+<<*>>=
+
+--S 1 of 28
+cos(1.237)
+--R 
+--R
+--R   (1)  0.3276321705 9891498386
+--R                                                                  Type: 
Float
+--E 1
+
+@
+can handle expressions that mix floats and integers
+<<*>>=
+
+--S 2 of 28
+cos(1.237/2)
+--R 
+--R
+--R   (2)  0.8147490934 6341557739
+--R                                                                  Type: 
Float
+--E 2
+
+@
+but will respect an integer expression, as we would want it to,
+by not evaluating
+<<*>>=
+
+--S 3 of 28
+cos(2/3)
+--R 
+--R
+--R            2
+--R   (3)  cos(-)
+--R            3
+--R                                                     Type: Expression 
Integer
+--E 3
+
+@
+We can coerce the evaluation as a float by forcing the floating point
+evaluation of the division and typing of the outcome in a variety of
+ways. Each of the following forms is effective in some appropriate
+and understandable way. Some act explicitly on the ``/'' operator
+to force a polymorphic choice, others convert the type of the second
+constand in each expression which results in a proper implicit selection
+of which ``/'' definitition to use.
+<<*>>=
+
+--S 4 of 28
+cos(2/3::Float)
+--R 
+--R
+--R   (4)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 4
+
+--S 5 of 28
+cos((2/3)::Float)
+--R 
+--R
+--R   (5)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 5
+
+--S 6 of 28
+cos(2/3$Float)
+--R 
+--R
+--R   (6)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 6
+
+--S 7 of 28
+cos((2/3)$Float)
+--R 
+--R
+--R   (7)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 7
+
+--S 8 of 28
+cos(2/address@hidden)
+--R 
+--R
+--R   (8)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 8
+
+--S 9 of 28
+cos((2/3)@Float)
+--R 
+--R
+--R   (9)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 9
+
+@
+But, as we would expect, it is too late to attempt coercion after the
+fact. Coercion operates ``on the surface and not deeply'' as illustrated
+here.
+<<*>>=
+
+--S 10 of 28
+cos(2/3)::Float
+--R 
+--R 
+--RDaly Bug
+--R   Cannot convert from type Expression Integer to Float for value
+--R       2
+--R   cos(-)
+--R       3
+--R
+--E 10
+
+@
+However, there is a real need for a deep coercion operator that operates
+on the innermost atomic constants. Suppose we define
+<<*>>=
+
+--S 11 of 28
+cosf(x:Expression Integer):Expression Integer == 1+cos(x/2)
+--R 
+--R   Function declaration cosf : Expression Integer -> Expression Integer
+--R      has been added to workspace.
+--R                                                                   Type: 
Void
+--E 11
+
+@
+which is an example of a simple function that might be defined in the
+course of typical work. We wish to declare functions as having integer
+based fractions, rather than forming approximate decimal expansions, which
+is preferred for purposes of analytic examination and simplification for
+both the human and the Axiom system. The Axiom book and online resources
+are full of examples in which this choice has been made by the authors
+thanks to the power of this form of expression -- even though it amounts
+to lying to Axiom in many cases as to the ultimate destiny of the function
+being defined. But woe to us if we wish later to evaluate it in a more
+general way because it is a tangled web we weave when we practice to
+decieve.
+<<*>>=
+
+--S 12 of 28
+cosf(2/3)
+--R 
+--R   Compiling function cosf with type Expression Integer -> Expression 
+--R      Integer 
+--R
+--R             1
+--R   (11)  cos(-) + 1
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 12
+
+--S 13 of 28
+cosf((2/3)::Float)
+--R 
+--R   Conversion failed in the compiled user function cosf .
+--R 
+--RDaly Bug
+--R   Cannot convert from type Float to Expression Integer for value
+--R   0.6666666666 6666666667
+--R
+--E 13
+
+@
+Thus in effect once we wrap a function around an integer base definition,
+we are stuck and unable to evaluate it as a float later, unlike the core
+basic functions that can be used either way. This forces us to choose the
+Float type throughout at a loss of comprehensibility and analyzability,
+unless we seek to more than double our development type by supplying an
+overloaded integer base and Float base version of {\bf every} step of a
+sequential development of a formula.
+
+Bizarrely, the draw function seems to have the power to override the
+type problem as shown here
+<<*>>=
+
+--S 14 of 28
+--draw(cosf(x),x=0..15)
+--E 14
+
+@
+Why can't we grant this deep coercion power to some new form of floating
+point conversion operation which can be applied at will? If draw has
+this power, why not put it in the hands of the user?
+
+Alternatively, it would be best to have a {\bf mixed} type -- mixed 
+= Integer/Float. Like Maple expressions it would leave integers as
+integers and floats as floats, unmolested and treated as generic
+constant quantities with distinguishable parts until an {\bf evalf}
+like function that would force them entirely into the Float type. For
+example, in Maple ``cos(2/3)+1.2323'' remains as is, while in Axiom
+we get
+<<*>>=
+
+--S 15 of 28
+cos(2/3)+1.2323
+--R 
+--R
+--R   (12)  2.0181872607 769480007
+--R                                                       Type: Expression 
Float
+--E 15
+
+@
+In a way, Axiom already has a quantity treated like this -- the constant
+%pi is treated as a special float which remains unevaluated and does not
+force combination of itself with an Integer. It simply results in a new
+kind of Integer evaluation of type Pi
+<<*>>=
+
+--S 16 of 28
+3/4+%pi
+--R 
+--R
+--R         4%pi + 3
+--R   (13)  --------
+--R             4
+--R                                                                     Type: 
Pi
+--E 16
+
+@
+\section{Overloading problems}
+Now let's examine properties and problems with overloading.
+
+Define the type $Q$ of Hamiltonian biquaternions
+<<*>>=
+
+--S 17 of 28
+C:=Complex Expression Integer
+--R 
+--R
+--R   (14)  Complex Expression Integer
+--R                                                                 Type: 
Domain
+--E 17
+
+--S 18 of 28
+Q:=Quaternion C
+--R 
+--R
+--R   (15)  Quaternion Complex Expression Integer
+--R                                                                 Type: 
Domain
+--E 18
+
+@
+While developing the support functions, this definition of biquat
+division was introduced to simplify the format of the formulae
+<<*>>=
+
+--S 19 of 28
+((x:Q)/(y:Q)):Q == x*inv(y)
+--R 
+--R   Function declaration ?/? : (Quaternion Complex Expression Integer,
+--R      Quaternion Complex Expression Integer) -> Quaternion Complex 
+--R      Expression Integer has been added to workspace.
+--R                                                                   Type: 
Void
+--E 19
+
+@
+But is this typed function in any way actually restricted to quaternions?
+On the face, it would appear all is normal, here's an example of 
+integer division
+<<*>>=
+
+--S 20 of 28
+x:=15/6
+--R 
+--R   Compiling function / with type (Quaternion Complex Expression 
+--R      Integer,Quaternion Complex Expression Integer) -> Quaternion 
+--R      Complex Expression Integer 
+--R
+--R         5
+--R   (17)  -
+--R         2
+--R                                  Type: Quaternion Complex Expression 
Integer
+--E 20
+
+@
+But though the answer was right, the type is now a biquat. If we don't
+notice this, and proceed, some things seem still to act normally,
+for example, no complaint from Axiom with
+<<*>>=
+
+--S 21 of 28
+cos(x)
+--R 
+--R
+--R             5
+--R   (18)  cos(-)
+--R             2
+--R                                                     Type: Expression 
Integer
+--E 21
+
+@
+Of course, we still get a correct answer with
+<<*>>=
+
+--S 22 of 28
+cos(1.237)
+--R 
+--R
+--R   (19)  0.3276321705 9891498386
+--R                                                                  Type: 
Float
+--E 22
+
+@
+But let's try to apply this as a simple mixed float/integer function
+<<*>>=
+
+--S 23 of 28
+cos(15.457/6)
+--R 
+--R   Conversion failed in the compiled user function / .
+--R 
+--RDaly Bug
+--R   Cannot convert from type Float to Quaternion Complex Expression 
+--R      Integer for value
+--R   15.457
+--R
+--E 23
+
+@
+Obviously the quaternion version of ``/'' is being invoked despite
+mismatches of the arguments and the supposed overloading in effect.
+Well, what if we built a new cosine function that forced the form of
+the arguments into certain types to avoid mismatch?
+<<*>>=
+
+--S 24 of 28
+c(y:Float):Float == cos(y)
+--R 
+--R   Function declaration c : Float -> Float has been added to workspace.
+--R                                                                   Type: 
Void
+--E 24
+
+@
+At first this seems to work, we can still evaluate a float
+<<*>>=
+
+--S 25 of 28
+c(1.237)
+--R 
+--R   Compiling function c with type Float -> Float 
+--R
+--R   (21)  0.3276321705 9891498386
+--R                                                                  Type: 
Float
+--E 25
+
+@
+and we can even get a float answer when we introduce the integer coercible
+biquat variable value generated from the above.
+<<*>>=
+
+--S 26 of 28
+c(x)
+--R 
+--R
+--R   (22)  - 0.8011436155 4693371483
+--R                                                                  Type: 
Float
+--E 26
+
+@
+But that was only misdirection, because this breaks down for reasonable
+expressions because of the ``/'' operation still not being resolved
+correctly.
+<<*>>=
+
+--S 27 of 28
+c(1.237/2)
+--R 
+--R   Conversion failed in the compiled user function / .
+--R 
+--RDaly Bug
+--R   Cannot convert from type Float to Quaternion Complex Expression 
+--R      Integer for value
+--R   1.237
+--R
+--E 27
+
+@
+Rather than complaining about it, what if we tried the various coercions
+that served to solve the similar type conversion problem we had when 
+just dealing with Integer Fraction versus Floats at the top of the page.
+Our results are mixed. Recall that each of the following worked in the
+previous case, producing the correct floating result in each case.
+<<*>>=
+
+--S 28 of 28
+cos(2/3::Float)
+--R 
+--R
+--R             2
+--R   (23)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 28
+
+--S 29 of 28
+cos((2/3)::Float)
+--R 
+--R
+--R   (24)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 29
+
+--S 30 of 28
+cos(2/3$Float)
+--R 
+--R
+--R             2
+--R   (25)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 30
+
+--S 31 of 28
+cos((2/3)$Float)
+--R 
+--R
+--R   (26)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 31
+
+--S 32 of 28
+cos(2/address@hidden)
+--R 
+--R
+--R             2
+--R   (27)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 32
+
+--S 33 of 28
+cos((2/3)@Float)
+--R 
+--R 
+--RDaly Bug
+--R   An expression involving @ Float actually evaluated to one of type 
+--R      Quaternion Complex Expression Integer . Perhaps you should use ::
+--R      Float .
+--E 33
+
+@
+Try these examples with our type constrained function, which has better
+luck now
+<<*>>=
+
+--S 34 of 28
+c(2/3::Float)
+--R 
+--R
+--R   (28)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 34
+
+--S 35 of 28
+c((2/3)::Float)
+--R 
+--R
+--R   (29)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 35
+
+--S 36 of 28
+c(2/3$Float)
+--R 
+--R
+--R   (30)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 36
+
+--S 37 of 28
+c((2/3)$Float)
+--R 
+--R
+--R   (31)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 37
+
+--S 38 of 28
+c(2/address@hidden)
+--R 
+--R
+--R   (32)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 38
+
+--S 39 of 28
+c((2/3)@Float)
+--R 
+--R 
+--RDaly Bug
+--R   An expression involving @ Float actually evaluated to one of type 
+--R      Quaternion Complex Expression Integer . Perhaps you should use ::
+--R      Float .
+--E 39
+
+@
+Could the above problems have been avoided by not assigning types
+to the function we defined? Let's repeat the entire example with
+this single change for the function c2
+<<*>>=
+
+--S 40 of 28
+c2(y) == cos(y)
+--R 
+--R                                                                   Type: 
Void
+--E 40
+
+--S 41 of 28
+c2(1.237)
+--R 
+--R   Compiling function c2 with type Float -> Float 
+--R
+--R   (34)  0.3276321705 9891498386
+--R                                                                  Type: 
Float
+--E 41
+
+--S 42 of 28
+c2(x)
+--R 
+--R   There are 2 exposed and 6 unexposed library operations named cos 
+--R      having 1 argument(s) but none was determined to be applicable. 
+--R      Use HyperDoc Browse, or issue
+--R                               )display op cos
+--R      to learn more about the available operations. Perhaps 
+--R      package-calling the operation or using coercions on the arguments
+--R      will allow you to apply the operation.
+--R   Cannot find a definition or applicable library operation named cos 
+--R      with argument type(s) 
+--R                    Quaternion Complex Expression Integer
+--R      
+--R      Perhaps you should use "@" to indicate the required return type, 
+--R      or "$" to specify which version of the function you need.
+--R   AXIOM will attempt to step through and interpret the code.
+--R
+--R             5
+--R   (35)  cos(-)
+--R             2
+--R                                                     Type: Expression 
Integer
+--E 42
+
+@
+But that was only misdirection, because this breaks down for
+reasonable expressions
+<<*>>=
+
+--S 43 of 28
+c2(1.237/2)
+--R 
+--R   Conversion failed in the compiled user function / .
+--R 
+--RDaly Bug
+--R   Cannot convert from type Float to Quaternion Complex Expression 
+--R      Integer for value
+--R   1.237
+--R
+--E 43
+
+@
+and various attempts at coercion also fail -- compare these results
+to the previous ones
+<<*>>=
+
+--S 44 of 28
+c2(2/3::Float)
+--R 
+--R
+--R             2
+--R   (36)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 44
+
+--S 45 of 28
+c2((2/3)::Float)
+--R 
+--R
+--R   (37)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 45
+
+--S 46 of 28
+c2(2/3$Float)
+--R 
+--R
+--R             2
+--R   (38)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 46
+
+--S 47 of 28
+c2((2/3)$Float)
+--R 
+--R
+--R   (39)  0.7858872607 7694800072
+--R                                                                  Type: 
Float
+--E 47
+
+--S 48 of 28
+c2(2/address@hidden)
+--R 
+--R
+--R             2
+--R   (40)  cos(-)
+--R             3
+--R                                                     Type: Expression 
Integer
+--E 48
+
+--S 49 of 28
+c2((2/3)@Float)
+--R 
+--R 
+--RDaly Bug
+--R   An expression involving @ Float actually evaluated to one of type 
+--R      Quaternion Complex Expression Integer . Perhaps you should use ::
+--R      Float .
+--E 49
+
+@
+Lastly, we cannot now use the graph function, draw, on such a function 
+since the wrong ``/'' function is used, contrary to the bypassing of
+internal types we saw take place with draw in the example prior to the
+introduction of operator overloading.
+<<*>>=
+
+--S 50 of 28
+--draw(c(x),x=0..15)
+--E 50
+
+@
+{\sl Not safe at any speed}. Most oddly, the ordinary cos() function which
+exposes no ``/'' division Now fails to work with draw despite the fact
+that we just saw it above still working with Integer and Float arguments
+applied directly.
+<<*>>=
+
+--S 51 of 28
+--draw(cos(x),x=0..15)
+--E 51
+
+)spool 
+)lisp (bye)
+ 
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]