This file is indexed.

/usr/share/axiom-20170501/src/algebra/D01TRNS.spad is in axiom-source 20170501-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
)abbrev domain D01TRNS d01TransformFunctionType
++ Author: Brian Dupee
++ Date Created: April 1994
++ Date Last Updated: December 1997
++ References:
++ Dupe95 Using Computer Algebra to Choose and Apply Numerical Routines
++ Dewa92 Using Computer Algebra to Select Numerical Algorithms
++ Description:
++ Since an infinite integral cannot be evaluated numerically
++ it is necessary to transform the integral onto finite ranges.
++ \axiomType{d01TransformFunctionType} uses the mapping \spad{x -> 1/x}
++ and contains the functions \axiomFun{measure} and
++ \axiomFun{numericalIntegration}.

d01TransformFunctionType() : SIG == CODE where

  EDF  ==> Expression DoubleFloat
  EEDF  ==> Equation Expression DoubleFloat
  FI  ==> Fraction Integer
  EFI  ==> Expression Fraction Integer
  EEFI  ==> Equation Expression Fraction Integer
  EF2  ==> ExpressionFunctions2
  DF  ==> DoubleFloat
  F  ==> Float
  SOCDF  ==> Segment OrderedCompletion DoubleFloat
  OCDF  ==> OrderedCompletion DoubleFloat
  NIA  ==> Record(var:Symbol,fn:EDF,range:SOCDF,abserr:DF,relerr:DF)
  INT     ==> Integer
  PI  ==> PositiveInteger
  HINT  ==> Record(str:String,fn:EDF,range:SOCDF,ext:Result)
  S  ==> Symbol
  ST  ==> String
  LST  ==> List String
  Measure  ==> Record(measure:F,explanations:ST,extra:Result)
  MS  ==> Record(measure:F,name:ST,explanations:LST,extra:Result)

  SIG ==> NumericalIntegrationCategory 

  CODE ==> Result add

    Rep:=Result
    import d01AgentsPackage,Rep

    rec2any(re:Record(str:ST,fn:EDF,range:SOCDF)):Any ==
      coerce(re)$AnyFunctions1(Record(str:ST,fn:EDF,range:SOCDF))

    changeName(ans:Result,name:ST):Result ==
      sy:S := coerce(name "Answer")$S
      anyAns:Any := coerce(ans)$AnyFunctions1(Result)
      construct([[sy,anyAns]])$Result

    getIntegral(args:NIA,hint:HINT) : Result ==
     Args := copy args
     Args.fn := hint.fn
     Args.range := hint.range
     integrate(Args::NumericalIntegrationProblem)_
        $AnnaNumericalIntegrationPackage

    transformFunction(args:NIA) : NIA ==
      Args := copy args    
      Var := Args.var :: EFI                 -- coerce Symbol to EFI
      NewVar:EFI := inv(Var)$EFI             -- invert it
      VarEqn:EEFI:=equation(Var,NewVar)$EEFI -- turn it into an equation
      Afn:EFI := edf2efi(Args.fn)$ExpertSystemToolsPackage
      Afn := subst(Afn,VarEqn)$EFI           -- substitute into function
      Var2:EFI := Var**2
      Afn:= simplify(Afn/Var2)$TranscendentalManipulations(FI,EFI)
      Args.fn:= map(x+->convert(x)$FI,Afn)$EF2(FI,DF)
      Args

    doit(seg:SOCDF,args:NIA):MS ==
      Args := copy args
      Args.range := seg
      measure(Args::NumericalIntegrationProblem)_
         $AnnaNumericalIntegrationPackage

    transform(c:Boolean,args:NIA):Measure ==
      if c then
        l := coerce(recip(lo(args.range)))@OCDF
        Seg:SOCDF := segment(0$OCDF,l)
      else
        h := coerce(recip(hi(args.range)))@OCDF
        Seg:SOCDF := segment(h,0$OCDF)
      Args := transformFunction(args)
      m:MS := doit(Seg,Args)
      out1:ST := 
         "The recommendation is to transform the function and use " m.name
      out2:List(HINT) := [[m.name,Args.fn,Seg,m.extra]]
      out2Any:Any := coerce(out2)$AnyFunctions1(List(HINT))
      ex:Record(key:S,entry:Any) := [d01transformextra@S,out2Any]
      extr:Result := construct([ex])$Result
      [m.measure,out1,extr]
      
    split(c:PI,args:NIA):Measure ==
      Args := copy args
      Args.relerr := Args.relerr/2
      Args.abserr := Args.abserr/2
      if (c = 1)@Boolean then 
        seg1:SOCDF := segment(-1$OCDF,1$OCDF)
      else if (c = 2)@Boolean then
        seg1 := segment(lo(Args.range),1$OCDF)
      else
        seg1 := segment(-1$OCDF,hi(Args.range))
      m1:MS := doit(seg1,Args)
      Args := transformFunction Args
      if (c = 2)@Boolean then
        seg2:SOCDF := segment(0$OCDF,1$OCDF)
      else if (c = 3)@Boolean then
        seg2 := segment(-1$OCDF,0$OCDF)
      else seg2 := seg1
      m2:MS := doit(seg2,Args)
      m1m:F := m1.measure
      m2m:F := m2.measure
      m:F := m1m*m2m/((m1m*m2m)+(1.0-m1m)*(1.0-m2m))
      out1:ST := "The recommendation is to transform the function and use "
                                 m1.name " and " m2.name
      out2:List(HINT) :=
              [[m1.name,args.fn,seg1,m1.extra],[m2.name,Args.fn,seg2,m2.extra]]
      out2Any:Any := coerce(out2)$AnyFunctions1(List(HINT))
      ex:Record(key:S,entry:Any) := [d01transformextra@S,out2Any]
      extr:Result := construct([ex])$Result
      [m,out1,extr]

    measure(R:RoutinesTable,args:NIA) ==
      Range:=rangeIsFinite(args)
      Range case bothInfinite => split(1,args)
      Range case upperInfinite =>
        positive?(lo(args.range))$OCDF =>
          transform(true,args)
        split(2,args)
      Range case lowerInfinite =>
        negative?(hi(args.range))$OCDF =>
          transform(false,args)
        split(3,args)

    numericalIntegration(args:NIA,hints:Result) ==
      mainResult:DF := mainAbserr:DF := 0$DF
      ans:Result := empty()$Result
      hla:Any := coerce(search((d01transformextra@S),hints)$Result)@Any
      hintList := retract(hla)$AnyFunctions1(List(HINT))
      methodName:ST := empty()$ST
      repeat
        if (empty?(hintList)$(List(HINT))) 
          then leave
        item := first(hintList)$List(HINT)
        a:Result := getIntegral(args,item)
        anyRes := coerce(search((result@S),a)$Result)@Any
        midResult := retract(anyRes)$AnyFunctions1(DF)
        anyErr := coerce(search((abserr pretend S),a)$Result)@Any
        midAbserr := retract(anyErr)$AnyFunctions1(DF)
        mainResult := mainResult+midResult
        mainAbserr := mainAbserr+midAbserr
        if (methodName = item.str)@Boolean then
          methodName := concat([item.str,"1"])$ST
        else
          methodName := item.str
        ans := concat(ans,changeName(a,methodName))$ExpertSystemToolsPackage
        hintList := rest(hintList)$(List(HINT))
      anyResult := coerce(mainResult)$AnyFunctions1(DF)
      anyAbserr := coerce(mainAbserr)$AnyFunctions1(DF)
      recResult:Record(key:S,entry:Any):=[result@S,anyResult]
      recAbserr:Record(key:S,entry:Any):=[abserr pretend S,anyAbserr]
      insert!(recAbserr,insert!(recResult,ans))$Result