aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/routines.spad.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/routines.spad.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/algebra/routines.spad.pamphlet')
-rw-r--r--src/algebra/routines.spad.pamphlet648
1 files changed, 648 insertions, 0 deletions
diff --git a/src/algebra/routines.spad.pamphlet b/src/algebra/routines.spad.pamphlet
new file mode 100644
index 00000000..c491b23d
--- /dev/null
+++ b/src/algebra/routines.spad.pamphlet
@@ -0,0 +1,648 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra routines.spad}
+\author{Brian Dupee}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain ROUTINE RoutinesTable}
+<<domain ROUTINE RoutinesTable>>=
+)abbrev domain ROUTINE RoutinesTable
+++ Author: Brian Dupee
+++ Date Created: August 1994
+++ Date Last Updated: December 1997
+++ Basic Operations: routines, getMeasure
+++ Related Constructors: TableAggregate(Symbol,Any)
+++ Description:
+++ \axiomType{RoutinesTable} implements a database and associated tuning
+++ mechanisms for a set of known NAG routines
+RoutinesTable(): E == I where
+ F ==> Float
+ ST ==> String
+ LST ==> List String
+ Rec ==> Record(key:Symbol,entry:Any)
+ RList ==> List(Record(key:Symbol,entry:Any))
+ IFL ==> List(Record(ifail:Integer,instruction:ST))
+ Entry ==> Record(chapter:ST, type:ST, domainName: ST,
+ defaultMin:F, measure:F, failList:IFL, explList:LST)
+
+ E ==> TableAggregate(Symbol,Any) with
+
+ concat:(%,%) -> %
+ ++ concat(x,y) merges two tables x and y
+ routines:() -> %
+ ++ routines() initialises a database of known NAG routines
+ selectIntegrationRoutines:% -> %
+ ++ selectIntegrationRoutines(R) chooses only those routines from
+ ++ the database which are for integration
+ selectOptimizationRoutines:% -> %
+ ++ selectOptimizationRoutines(R) chooses only those routines from
+ ++ the database which are for integration
+ selectPDERoutines:% -> %
+ ++ selectPDERoutines(R) chooses only those routines from the
+ ++ database which are for the solution of PDE's
+ selectODEIVPRoutines:% -> %
+ ++ selectODEIVPRoutines(R) chooses only those routines from the
+ ++ database which are for the solution of ODE's
+ selectFiniteRoutines:% -> %
+ ++ selectFiniteRoutines(R) chooses only those routines from the
+ ++ database which are designed for use with finite expressions
+ selectSumOfSquaresRoutines:% -> %
+ ++ selectSumOfSquaresRoutines(R) chooses only those routines from the
+ ++ database which are designed for use with sums of squares
+ selectNonFiniteRoutines:% -> %
+ ++ selectNonFiniteRoutines(R) chooses only those routines from the
+ ++ database which are designed for use with non-finite expressions.
+ selectMultiDimensionalRoutines:% -> %
+ ++ selectMultiDimensionalRoutines(R) chooses only those routines from
+ ++ the database which are designed for use with multi-dimensional
+ ++ expressions
+ changeThreshhold:(%,Symbol,F) -> %
+ ++ changeThreshhold(R,s,newValue) changes the value below which,
+ ++ given a NAG routine generating a higher measure, the routines will
+ ++ make no attempt to generate a measure.
+ changeMeasure:(%,Symbol,F) -> %
+ ++ changeMeasure(R,s,newValue) changes the maximum value for a
+ ++ measure of the given NAG routine.
+ getMeasure:(%,Symbol) -> F
+ ++ getMeasure(R,s) gets the current value of the maximum measure for
+ ++ the given NAG routine.
+ getExplanations:(%,ST) -> LST
+ ++ getExplanations(R,s) gets the explanations of the output parameters for
+ ++ the given NAG routine.
+ deleteRoutine!:(%,Symbol) -> %
+ ++ deleteRoutine!(R,s) destructively deletes the given routine from
+ ++ the current database of NAG routines
+ showTheRoutinesTable:() -> %
+ ++ showTheRoutinesTable() returns the current table of NAG routines.
+ recoverAfterFail:(%,ST,Integer) -> Union(ST,"failed")
+ ++ recoverAfterFail(routs,routineName,ifailValue) acts on the
+ ++ instructions given by the ifail list
+ finiteAggregate
+
+ I ==> Result add
+
+ Rep := Result
+ import Rep
+
+ theRoutinesTable:% := routines()
+
+ showTheRoutinesTable():% == theRoutinesTable
+
+ integrationRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,chapter) = "Integration"
+ false
+
+ selectIntegrationRoutines(R:%):% == select(integrationRoutine?,R)
+
+ optimizationRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,chapter) = "Optimization"
+ false
+
+ selectOptimizationRoutines(R:%):% == select(optimizationRoutine?,R)
+
+ PDERoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,chapter) = "PDE"
+ false
+
+ selectPDERoutines(R:%):% == select(PDERoutine?,R)
+
+ ODERoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,chapter) = "ODE"
+ false
+
+ selectODEIVPRoutines(R:%):% == select(ODERoutine?,R)
+
+ sumOfSquaresRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,type) = "SS"
+ false
+
+ selectSumOfSquaresRoutines(R:%):% == select(sumOfSquaresRoutine?,R)
+
+ finiteRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,type) = "One-dimensional finite"
+ false
+
+ selectFiniteRoutines(R:%):% == select(finiteRoutine?,R)
+
+ infiniteRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,type) = "One-dimensional infinite"
+ false
+
+ semiInfiniteRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,type) = "One-dimensional semi-infinite"
+ false
+
+ nonFiniteRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (semiInfiniteRoutine?(r) or infiniteRoutine?(r))
+
+ selectNonFiniteRoutines(R:%):% == select(nonFiniteRoutine?,R)
+
+ multiDimensionalRoutine?(r:Record(key:Symbol,entry:Any)):Boolean ==
+ (a := retractIfCan(r.entry)$AnyFunctions1(Entry)) case Entry =>
+ elt(a,type) = "Multi-dimensional"
+ false
+
+ selectMultiDimensionalRoutines(R:%):% == select(multiDimensionalRoutine?,R)
+
+ concat(a:%,b:%):% ==
+ membersOfa := (members(a)@List(Record(key:Symbol,entry:Any)))
+ membersOfb := (members(b)@List(Record(key:Symbol,entry:Any)))
+ allMembers:=
+ concat(membersOfa,membersOfb)$List(Record(key:Symbol,entry:Any))
+ construct(allMembers)
+
+ changeThreshhold(R:%,s:Symbol,newValue:F):% ==
+ (a := search(s,R)) case Any =>
+ e := retract(a)$AnyFunctions1(Entry)
+ e.defaultMin := newValue
+ a := coerce(e)$AnyFunctions1(Entry)
+ insert!([s,a],R)
+ error("changeThreshhold","Cannot find routine of that name")$ErrorFunctions
+
+ changeMeasure(R:%,s:Symbol,newValue:F):% ==
+ (a := search(s,R)) case Any =>
+ e := retract(a)$AnyFunctions1(Entry)
+ e.measure := newValue
+ a := coerce(e)$AnyFunctions1(Entry)
+ insert!([s,a],R)
+ error("changeMeasure","Cannot find routine of that name")$ErrorFunctions
+
+ getMeasure(R:%,s:Symbol):F ==
+ (a := search(s,R)) case Any =>
+ e := retract(a)$AnyFunctions1(Entry)
+ e.measure
+ error("getMeasure","Cannot find routine of that name")$ErrorFunctions
+
+ deleteRoutine!(R:%,s:Symbol):% ==
+ (a := search(s,R)) case Any =>
+ e:Record(key:Symbol,entry:Any) := [s,a]
+ remove!(e,R)
+ error("deleteRoutine!","Cannot find routine of that name")$ErrorFunctions
+
+ routines():% ==
+ f := "One-dimensional finite"
+ s := "One-dimensional semi-infinite"
+ i := "One-dimensional infinite"
+ m := "Multi-dimensional"
+ int := "Integration"
+ ode := "ODE"
+ pde := "PDE"
+ opt := "Optimization"
+ d01ajfExplList:LST := ["result: Calculated value of the integral",
+ "iw: iw(1) contains the actual number of sub-intervals used, the rest is workspace",
+ "w: contains the end-points of the sub-intervals used along with the integral contributions and error estimates over the sub-intervals",
+ "abserr: the estimate of the absolute error of the result",
+ "ifail: the error warning parameter",
+ "method: details of the method used and measures of all methods",
+ "attributes: a list of the attributes pertaining to the integrand which had some bearing on the choice of method"]
+ d01asfExplList:LST := ["result: Calculated value of the integral",
+ "iw: iw(1) contains the actual number of sub-intervals used, the rest is workspace",
+ "lst: contains the actual number of sub-intervals used",
+ "erlst: contains the error estimates over the sub-intervals",
+ "rslst: contains the integral contributions of the sub-intervals",
+ "ierlst: contains the error flags corresponding to the values in rslst",
+ "abserr: the estimate of the absolute error of the result",
+ "ifail: the error warning parameter",
+ "method: details of the method used and measures of all methods",
+ "attributes: a list of the attributes pertaining to the integrand which had some bearing on the choice of method"]
+ d01fcfExplList:LST := ["result: Calculated value of the integral",
+ "acc: the estimate of the relative error of the result",
+ "minpts: the number of integrand evaluations",
+ "ifail: the error warning parameter",
+ "method: details of the method used and measures of all methods",
+ "attributes: a list of the attributes pertaining to the integrand which had some bearing on the choice of method"]
+ d01transExplList:LST := ["result: Calculated value of the integral",
+ "abserr: the estimate of the absolute error of the result",
+ "method: details of the method and transformation used and measures of all methods",
+ "d01***AnnaTypeAnswer: the individual results from the routines",
+ "attributes: a list of the attributes pertaining to the integrand which had some bearing on the choice of method"]
+ d02bhfExplList:LST := ["x: the value of x at the end of the calculation",
+ "y: the computed values of Y\[1\]..Y\[n\] at x",
+ "tol: the (possible) estimate of the error; this is not guarunteed",
+ "ifail: the error warning parameter",
+ "method: details of the method used and measures of all methods",
+ "intensityFunctions: a list of the attributes and values pertaining to the ODE which had some bearing on the choice of method"]
+ d02bbfExplList:LST := concat(["result: the computed values of the solution at the required points"],d02bhfExplList)$LST
+ d03eefExplList:LST := ["See the NAG On-line Documentation for D03EEF/D03EDF",
+ "u: the computed solution u[i][j] is returned in u(i+(j-1)*ngx),for i = 1,2,..ngx; j = 1,2,..ngy"]
+ e04fdfExplList:LST := ["x: the position of the minimum",
+ "objf: the value of the objective function at x",
+ "ifail: the error warning parameter",
+ "method: details of the method used and measures of all methods",
+ "attributes: a list of the attributes pertaining to the function or functions which had some bearing on the choice of method"]
+ e04dgfExplList:LST := concat(e04fdfExplList,
+ ["objgrd: the values of the derivatives at x",
+ "iter: the number of iterations performed"])$LST
+ e04jafExplList:LST := concat(e04fdfExplList,
+ ["bu: the values of the upper bounds used",
+ "bl: the values of the lower bounds used"])$LST
+ e04ucfExplList:LST := concat(e04dgfExplList,
+ ["istate: the status of every constraint at x",
+ "clamda: the QP multipliers for the last QP sub-problem",
+ "For other output parameters see the NAG On-line Documentation for E04UCF"])$LST
+ e04mbfExplList:LST := concat(e04fdfExplList,
+ ["istate: the status of every constraint at x",
+ "clamda: the Lagrange multipliers for each constraint"])$LST
+ d01ajfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"]]
+ d01akfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"]]
+ d01alfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"], [7,"delete"]]
+ d01amfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"]]
+ d01anfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"], [7,"delete"]]
+ d01apfIfail:IFL :=
+ [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"], [5,"delete"]]
+ d01aqfIfail:IFL :=
+ [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"], [5,"delete"]]
+ d01asfIfail:IFL := [[1,"incrFunEvals"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"], [7,"delete"], [8,"delete"], [9,"delete"]]
+ d01fcfIfail:IFL := [[1,"delete"], [2,"incrFunEvals"], [3,"delete"]]
+ d01gbfIfail:IFL := [[1,"delete"], [2,"incrFunEvals"]]
+ d02bbfIfail:IFL :=
+ [[1,"delete"], [2,"decrease tolerance"], [3,"increase tolerance"],
+ [4,"delete"], [5,"delete"], [6,"delete"], [7,"delete"]]
+ d02bhfIfail:IFL :=
+ [[1,"delete"], [2,"decrease tolerance"], [3,"increase tolerance"],
+ [4,"no action"], [5,"delete"], [6,"delete"], [7,"delete"]]
+ d02cjfIfail:IFL :=
+ [[1,"delete"], [2,"decrease tolerance"], [3,"increase tolerance"],
+ [4,"delete"], [5,"delete"], [6,"no action"], [7,"delete"]]
+ d02ejfIfail:IFL :=
+ [[1,"delete"], [2,"decrease tolerance"], [3,"increase tolerance"],
+ [4,"delete"], [5,"delete"], [6,"no action"], [7,"delete"], [8,"delete"],
+ [9,"delete"]]
+ e04dgfIfail:IFL := [[3,"delete"], [4,"no action"], [6,"delete"],
+ [7,"delete"], [8,"delete"], [9,"delete"]]
+ e04fdfIfail:IFL :=
+ [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"no action"], [6,"no action"], [7,"delete"], [8,"delete"]]
+ e04gcfIfail:IFL := [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"no action"], [6,"no action"], [7,"delete"], [8,"delete"], [9,"delete"]]
+ e04jafIfail:IFL := [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"no action"], [6,"no action"], [7,"delete"], [8,"delete"], [9,"delete"]]
+ e04mbfIfail:IFL :=
+ [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"], [5,"delete"]]
+ e04nafIfail:IFL :=
+ [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"], [5,"delete"],
+ [6,"delete"], [7,"delete"], [8,"delete"], [9,"delete"]]
+ e04ucfIfail:IFL := [[1,"delete"], [2,"delete"], [3,"delete"], [4,"delete"],
+ [5,"delete"], [6,"delete"], [7,"delete"], [8,"delete"], [9,"delete"]]
+ d01ajfEntry:Entry := [int, f, "d01ajfAnnaType",0.4,0.4,d01ajfIfail,d01ajfExplList]
+ d01akfEntry:Entry := [int, f, "d01akfAnnaType",0.6,1.0,d01akfIfail,d01ajfExplList]
+ d01alfEntry:Entry := [int, f, "d01alfAnnaType",0.6,0.6,d01alfIfail,d01ajfExplList]
+ d01amfEntry:Entry := [int, i, "d01amfAnnaType",0.5,0.5,d01amfIfail,d01ajfExplList]
+ d01anfEntry:Entry := [int, f, "d01anfAnnaType",0.6,0.9,d01anfIfail,d01ajfExplList]
+ d01apfEntry:Entry := [int, f, "d01apfAnnaType",0.7,0.7,d01apfIfail,d01ajfExplList]
+ d01aqfEntry:Entry := [int, f, "d01aqfAnnaType",0.6,0.7,d01aqfIfail,d01ajfExplList]
+ d01asfEntry:Entry := [int, s, "d01asfAnnaType",0.6,0.9,d01asfIfail,d01asfExplList]
+ d01transEntry:Entry:=[int, i, "d01TransformFunctionType",0.6,0.9,[],d01transExplList]
+ d01gbfEntry:Entry := [int, m, "d01gbfAnnaType",0.6,0.6,d01gbfIfail,d01fcfExplList]
+ d01fcfEntry:Entry := [int, m, "d01fcfAnnaType",0.5,0.5,d01fcfIfail,d01fcfExplList]
+ d02bbfEntry:Entry := [ode, "IVP", "d02bbfAnnaType",0.7,0.5,d02bbfIfail,d02bbfExplList]
+ d02bhfEntry:Entry := [ode, "IVP", "d02bhfAnnaType",0.7,0.49,d02bhfIfail,d02bhfExplList]
+ d02cjfEntry:Entry := [ode, "IVP", "d02cjfAnnaType",0.7,0.5,d02cjfIfail,d02bbfExplList]
+ d02ejfEntry:Entry := [ode, "IVP", "d02ejfAnnaType",0.7,0.5,d02ejfIfail,d02bbfExplList]
+ d03eefEntry:Entry := [pde, "2", "d03eefAnnaType",0.6,0.5,[],d03eefExplList]
+ --d03fafEntry:Entry := [pde, "3", "d03fafAnnaType",0.6,0.5,[],[]]
+ e04dgfEntry:Entry := [opt, "CGA", "e04dgfAnnaType",0.4,0.4,e04dgfIfail,e04dgfExplList]
+ e04fdfEntry:Entry := [opt, "SS", "e04fdfAnnaType",0.7,0.7,e04fdfIfail,e04fdfExplList]
+ e04gcfEntry:Entry := [opt, "SS", "e04gcfAnnaType",0.8,0.8,e04gcfIfail,e04fdfExplList]
+ e04jafEntry:Entry := [opt, "QNA", "e04jafAnnaType",0.5,0.5,e04jafIfail,e04jafExplList]
+ e04mbfEntry:Entry := [opt, "LP", "e04mbfAnnaType",0.7,0.7,e04mbfIfail,e04mbfExplList]
+ e04nafEntry:Entry := [opt, "QP", "e04nafAnnaType",0.7,0.7,e04nafIfail,e04mbfExplList]
+ e04ucfEntry:Entry := [opt, "SQP", "e04ucfAnnaType",0.6,0.6,e04ucfIfail,e04ucfExplList]
+ rl:RList :=
+ [["d01apf" :: Symbol, coerce(d01apfEntry)$AnyFunctions1(Entry)],_
+ ["d01aqf" :: Symbol, coerce(d01aqfEntry)$AnyFunctions1(Entry)],_
+ ["d01alf" :: Symbol, coerce(d01alfEntry)$AnyFunctions1(Entry)],_
+ ["d01anf" :: Symbol, coerce(d01anfEntry)$AnyFunctions1(Entry)],_
+ ["d01akf" :: Symbol, coerce(d01akfEntry)$AnyFunctions1(Entry)],_
+ ["d01ajf" :: Symbol, coerce(d01ajfEntry)$AnyFunctions1(Entry)],_
+ ["d01asf" :: Symbol, coerce(d01asfEntry)$AnyFunctions1(Entry)],_
+ ["d01amf" :: Symbol, coerce(d01amfEntry)$AnyFunctions1(Entry)],_
+ ["d01transform" :: Symbol, coerce(d01transEntry)$AnyFunctions1(Entry)],_
+ ["d01gbf" :: Symbol, coerce(d01gbfEntry)$AnyFunctions1(Entry)],_
+ ["d01fcf" :: Symbol, coerce(d01fcfEntry)$AnyFunctions1(Entry)],_
+ ["d02bbf" :: Symbol, coerce(d02bbfEntry)$AnyFunctions1(Entry)],_
+ ["d02bhf" :: Symbol, coerce(d02bhfEntry)$AnyFunctions1(Entry)],_
+ ["d02cjf" :: Symbol, coerce(d02cjfEntry)$AnyFunctions1(Entry)],_
+ ["d02ejf" :: Symbol, coerce(d02ejfEntry)$AnyFunctions1(Entry)],_
+ ["d03eef" :: Symbol, coerce(d03eefEntry)$AnyFunctions1(Entry)],_
+ --["d03faf" :: Symbol, coerce(d03fafEntry)$AnyFunctions1(Entry)],
+ ["e04dgf" :: Symbol, coerce(e04dgfEntry)$AnyFunctions1(Entry)],_
+ ["e04fdf" :: Symbol, coerce(e04fdfEntry)$AnyFunctions1(Entry)],_
+ ["e04gcf" :: Symbol, coerce(e04gcfEntry)$AnyFunctions1(Entry)],_
+ ["e04jaf" :: Symbol, coerce(e04jafEntry)$AnyFunctions1(Entry)],_
+ ["e04mbf" :: Symbol, coerce(e04mbfEntry)$AnyFunctions1(Entry)],_
+ ["e04naf" :: Symbol, coerce(e04nafEntry)$AnyFunctions1(Entry)],_
+ ["e04ucf" :: Symbol, coerce(e04ucfEntry)$AnyFunctions1(Entry)]]
+ construct(rl)
+
+ getIFL(s:Symbol,l:%):Union(IFL,"failed") ==
+ o := search(s,l)$%
+ o case "failed" => "failed"
+ e := retractIfCan(o)$AnyFunctions1(Entry)
+ e case "failed" => "failed"
+ e.failList
+
+ getInstruction(l:IFL,ifailValue:Integer):Union(ST,"failed") ==
+ output := empty()$ST
+ for i in 1..#l repeat
+ if ((l.i).ifail=ifailValue)@Boolean then
+ output := (l.i).instruction
+ empty?(output)$ST => "failed"
+ output
+
+ recoverAfterFail(routs:%,routineName:ST,
+ ifailValue:Integer):Union(ST,"failed") ==
+ name := routineName :: Symbol
+ failedList := getIFL(name,routs)
+ failedList case "failed" => "failed"
+ empty? failedList => "failed"
+ instr := getInstruction(failedList,ifailValue)
+ instr case "failed" => concat(routineName," failed")$ST
+ (instr = "delete")@Boolean =>
+ deleteRoutine!(routs,name)
+ concat(routineName," failed - trying alternatives")$ST
+ instr
+
+ getExplanations(R:%,routineName:ST):LST ==
+ name := routineName :: Symbol
+ (a := search(name,R)) case Any =>
+ e := retract(a)$AnyFunctions1(Entry)
+ e.explList
+ empty()$LST
+
+@
+\section{domain ATTRBUT AttributeButtons}
+<<domain ATTRBUT AttributeButtons>>=
+)abbrev domain ATTRBUT AttributeButtons
+++ Author: Brian Dupee
+++ Date Created: April 1996
+++ Date Last Updated: December 1997
+++ Basic Operations: increase, decrease, getButtonValue, setButtonValue
+++ Related Constructors: Table(String,Float)
+++ Description:
+++ \axiomType{AttributeButtons} implements a database and associated
+++ adjustment mechanisms for a set of attributes.
+++
+++ For ODEs these attributes are "stiffness", "stability" (i.e. how much
+++ affect the cosine or sine component of the solution has on the stability of
+++ the result), "accuracy" and "expense" (i.e. how expensive is the evaluation
+++ of the ODE). All these have bearing on the cost of calculating the
+++ solution given that reducing the step-length to achieve greater accuracy
+++ requires considerable number of evaluations and calculations.
+++
+++ The effect of each of these attributes can be altered by increasing or
+++ decreasing the button value.
+++
+++ For Integration there is a button for increasing and decreasing the preset
+++ number of function evaluations for each method. This is automatically used
+++ by ANNA when a method fails due to insufficient workspace or where the
+++ limit of function evaluations has been reached before the required
+++ accuracy is achieved.
+++
+AttributeButtons(): E == I where
+ F ==> Float
+ ST ==> String
+ LST ==> List String
+ Rec ==> Record(key:Symbol,entry:Any)
+ RList ==> List(Record(key:Symbol,entry:Any))
+ IFL ==> List(Record(ifail:Integer,instruction:ST))
+ Entry ==> Record(chapter:ST, type:ST, domainName: ST,
+ defaultMin:F, measure:F, failList:IFL, explList:LST)
+
+
+ E ==> SetCategory with
+
+ increase:(ST,ST) -> F
+ ++ \axiom{increase(routineName,attributeName)} increases the value
+ ++ for the effect of the attribute \axiom{attributeName} with routine
+ ++ \axiom{routineName}.
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ increase:(ST) -> F
+ ++ \axiom{increase(attributeName)} increases the value for the
+ ++ effect of the attribute \axiom{attributeName} with all routines.
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ decrease:(ST,ST) -> F
+ ++ \axiom{decrease(routineName,attributeName)} decreases the value
+ ++ for the effect of the attribute \axiom{attributeName} with routine
+ ++ \axiom{routineName}.
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ decrease:(ST) -> F
+ ++ \axiom{decrease(attributeName)} decreases the value for the
+ ++ effect of the attribute \axiom{attributeName} with all routines.
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ getButtonValue:(ST,ST) -> F
+ ++ \axiom{getButtonValue(routineName,attributeName)} returns the
+ ++ current value for the effect of the attribute \axiom{attributeName}
+ ++ with routine \axiom{routineName}.
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ resetAttributeButtons:() -> Void
+ ++ \axiom{resetAttributeButtons()} resets the Attribute buttons to a
+ ++ neutral level.
+ setAttributeButtonStep:(F) -> F
+ ++ \axiom{setAttributeButtonStep(n)} sets the value of the steps for
+ ++ increasing and decreasing the button values. \axiom{n} must be
+ ++ greater than 0 and less than 1. The preset value is 0.5.
+ setButtonValue:(ST,F) -> F
+ ++ \axiom{setButtonValue(attributeName,n)} sets the
+ ++ value of all buttons of attribute \spad{attributeName}
+ ++ to \spad{n}. \spad{n} must be in the range [0..1].
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ setButtonValue:(ST,ST,F) -> F
+ ++ \axiom{setButtonValue(attributeName,routineName,n)} sets the
+ ++ value of the button of attribute \spad{attributeName} to routine
+ ++ \spad{routineName} to \spad{n}. \spad{n} must be in the range [0..1].
+ ++
+ ++ \axiom{attributeName} should be one of the values
+ ++ "stiffness", "stability", "accuracy", "expense" or
+ ++ "functionEvaluations".
+ finiteAggregate
+
+ I ==> add
+
+ Rep := StringTable(F)
+ import Rep
+
+ buttons:() -> $
+
+ buttons():$ ==
+ eList := empty()$List(Record(key:ST,entry:F))
+ l1:List String := ["stability","stiffness","accuracy","expense"]
+ l2:List String := ["functionEvaluations"]
+ ro1 := selectODEIVPRoutines(r := routines()$RoutinesTable)$RoutinesTable
+ ro2 := selectIntegrationRoutines(r)$RoutinesTable
+ k1:List String := [string(i)$Symbol for i in keys(ro1)$RoutinesTable]
+ k2:List String := [string(i)$Symbol for i in keys(ro2)$RoutinesTable]
+ for i in k1 repeat
+ for j in l1 repeat
+ e:Record(key:ST,entry:F) := [i j,0.5]
+ eList := cons(e,eList)$List(Record(key:ST,entry:F))
+ for i in k2 repeat
+ for j in l2 repeat
+ e:Record(key:ST,entry:F) := [i j,0.5]
+ eList := cons(e,eList)$List(Record(key:ST,entry:F))
+ construct(eList)$Rep
+
+ attributeButtons:$ := buttons()
+
+ attributeStep:F := 0.5
+
+ setAttributeButtonStep(n:F):F ==
+ positive?(n)$F and (n<1$F) => attributeStep:F := n
+ error("setAttributeButtonStep","New value must be in (0..1)")$ErrorFunctions
+
+ resetAttributeButtons():Void ==
+ attributeButtons := buttons()
+ void()$Void
+
+ setButtonValue(routineName:ST,attributeName:ST,n:F):F ==
+ f := search(routineName attributeName,attributeButtons)$Rep
+ f case Float =>
+ n>=0$F and n<=1$F =>
+ setelt(attributeButtons,routineName attributeName,n)$Rep
+ error("setAttributeButtonStep","New value must be in [0..1]")$ErrorFunctions
+ error("setButtonValue","attribute name " attributeName
+ " not found for routine " routineName)$ErrorFunctions
+
+ setButtonValue(attributeName:ST,n:F):F ==
+ ro1 := selectODEIVPRoutines(r := routines()$RoutinesTable)$RoutinesTable
+ ro2 := selectIntegrationRoutines(r)$RoutinesTable
+ l1:List String := ["stability","stiffness","accuracy","expense"]
+ l2:List String := ["functionEvaluations"]
+ if attributeName="functionEvaluations" then
+ for i in keys(ro2)$RoutinesTable repeat
+ setButtonValue(string(i)$Symbol,attributeName,n)
+ else
+ for i in keys(ro1)$RoutinesTable repeat
+ setButtonValue(string(i)$Symbol,attributeName,n)
+ n
+
+ increase(routineName:ST,attributeName:ST):F ==
+ f := search(routineName attributeName,attributeButtons)$Rep
+ f case Float =>
+ newValue:F := (1$F-attributeStep)*f+attributeStep
+ setButtonValue(routineName,attributeName,newValue)
+ error("increase","attribute name " attributeName
+ " not found for routine " routineName)$ErrorFunctions
+
+ increase(attributeName:ST):F ==
+ ro1 := selectODEIVPRoutines(r := routines()$RoutinesTable)$RoutinesTable
+ ro2 := selectIntegrationRoutines(r)$RoutinesTable
+ l1:List String := ["stability","stiffness","accuracy","expense"]
+ l2:List String := ["functionEvaluations"]
+ if attributeName="functionEvaluations" then
+ for i in keys(ro2)$RoutinesTable repeat
+ increase(string(i)$Symbol,attributeName)
+ else
+ for i in keys(ro1)$RoutinesTable repeat
+ increase(string(i)$Symbol,attributeName)
+ getButtonValue(string(i)$Symbol,attributeName)
+
+ decrease(routineName:ST,attributeName:ST):F ==
+ f := search(routineName attributeName,attributeButtons)$Rep
+ f case Float =>
+ newValue:F := (1$F-attributeStep)*f
+ setButtonValue(routineName,attributeName,newValue)
+ error("increase","attribute name " attributeName
+ " not found for routine " routineName)$ErrorFunctions
+
+ decrease(attributeName:ST):F ==
+ ro1 := selectODEIVPRoutines(r := routines()$RoutinesTable)$RoutinesTable
+ ro2 := selectIntegrationRoutines(r)$RoutinesTable
+ l1:List String := ["stability","stiffness","accuracy","expense"]
+ l2:List String := ["functionEvaluations"]
+ if attributeName="functionEvaluations" then
+ for i in keys(ro2)$RoutinesTable repeat
+ decrease(string(i)$Symbol,attributeName)
+ else
+ for i in keys(ro1)$RoutinesTable repeat
+ decrease(string(i)$Symbol,attributeName)
+ getButtonValue(string(i)$Symbol,attributeName)
+
+
+ getButtonValue(routineName:ST,attributeName:ST):F ==
+ f := search(routineName attributeName,attributeButtons)$Rep
+ f case Float => f
+ error("getButtonValue","attribute name " attributeName
+ " not found for routine " routineName)$ErrorFunctions
+
+@
+\section{License}
+<<license>>=
+--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+--All rights reserved.
+--
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are
+--met:
+--
+-- - Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+--
+-- - Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in
+-- the documentation and/or other materials provided with the
+-- distribution.
+--
+-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@
+<<*>>=
+<<license>>
+
+<<domain ROUTINE RoutinesTable>>
+<<domain ATTRBUT AttributeButtons>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}