START_ERR = "0.1e-12" def aptst_out(x,start_err,maplefunc,apfunc) # puts "x = c(#{x})" puts '$pgm.puts "local except_flg:"' puts 'xr = ap_in("'+ x.to_s + '+/-' + start_err.to_s + '")' puts '$pgm.puts "start_err := ' + start_err.to_s + ':" ' puts "$pgm.puts \"fprintf(out_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Maple function = #{maplefunc} Ruby APFP function = #{apfunc} \\\\n\\\"):\"" puts '$pgm.puts "total_tests := total_tests + 1:"' puts "fxr = xr.#{apfunc}" puts "$pgm.puts \"fxm := #{maplefunc}(#{x});\"" puts "$pgm.puts \"fff := w ->" + maplefunc + "(w);\"" puts "$pgm.puts \"ggg := D(fff);\"" puts "$pgm.puts \"differentialm := abs(evalf(ggg(#{x})) * start_err);\"" puts "$pgm.puts \"fxr2 := \#{fxr.to_s_main}:\"" puts "$pgm.puts \"fxrerr := \#{fxr.to_s_err}:\"" puts "$pgm.puts \"fxr := fxr2:\"" puts "$pgm.puts \"abs_err := abs(fxm - fxr):\"" puts "$pgm.puts \"except_flg := 0:\"" puts "$pgm.puts \"if fxm <> 0.0 then \"" puts "$pgm.puts \"percent_error := abs_err * 100.0 / abs(fxm): else percent_error := 0.0:\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"if (percent_error > 1.0e-10) then\"" puts "$pgm.puts \"except_flg := 1:\"" puts "$pgm.puts \"fprintf(except_fd,\\\"PERCENT ERROR > 1.0e-10\\\\n\\\"):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"if (abs_err > 1.5 * fxrerr and fxerr > 0.0) then\"" puts "$pgm.puts \"except_flg := 1:\"" puts "$pgm.puts \"fprintf(except_fd,\\\"ABS ERROR > 1.5 * ESTIMATE\\\\n\\\"):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"if (differentialm > 1.5 * fxrerr and fxerr > 0.0) then\"" puts "$pgm.puts \"except_flg := 1:\"" puts "$pgm.puts \"fprintf(except_fd,\\\"DIFFERENTIAL > 1.5 * ESTIMATE\\\\n\\\"):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"if (fxrerr > 1000.0 * differentialm and differentialm > 0.0) then\"" puts "$pgm.puts \"except_flg := 1:\"" puts "$pgm.puts \"fprintf(except_fd,\\\"ESTIMATE > 1000.0 * DIFFERENTIAL\\\\n\\\"):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"if (except_flg = 1) then\"" puts "$pgm.puts \"dump_except(#{maplefunc},#{apfunc},#{x},fxm,fxr2,fxrerr,percent_error,abs_err,except_fd,differentialm,#{start_err}):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"fprintf(out_fd,\\\"x = #{x}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"error given in x = #{start_err}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby APFP value = %40.34e\\\\n\\\",fxr):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Maple value = %40.34e\\\\n\\\",fxm):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Percent Difference = %40.34e\\\\n\\\",percent_error):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Absolute Difference = %40.34e\\\\n\\\",abs_err):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby APFP error estimate = %40.34e\\\\n\\\",fxrerr):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Maple Differential = %40.34e\\\\n\\\",differentialm):\"" end def testfunc(maplefunc,apfunc,startx,endx,incr,start_err) x = startx.to_f xf = endx.to_f xinc = incr.to_f cnt = 0 puts "puts \"maplefunc = #{maplefunc} apfunc = #{apfunc}\"" puts "$pgm.puts \"fprintf(out_fd,\\\"maplefunc = #{maplefunc} apfunc = #{apfunc}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"maplefunc = #{maplefunc} apfunc = #{apfunc}\\\\n\\\"):\"" while (x < xf && cnt < 100) aptst_out(x.to_s,start_err.to_s,maplefunc,apfunc) x += xinc puts 'putc ".."' cnt += 1 end end def main puts "puts \"APFP Regression Test\"" start_err = START_ERR # 3/1/2015 changed next 2 lines to require_relative from require puts 'require_relative "rapfp/ApConfig"' puts 'require_relative "rapfp/Ap"' puts 'require "time"' puts 'rconst = $ApConst.new' puts 'rconst.one.setrconst(rconst)' puts 'rconst.init2' puts 'rconst.one.setrconst(rconst)' puts '$RConst = rconst' puts 'cconst = ApcConst.new(rconst)' puts 'cconst.one.setcconst(cconst)' puts 'cconst.one.setrconst(rconst)' puts '$CConst = cconst' puts '$pgm = File.new("testpgm.mxt","w")' puts '$pgm.puts "global total_tests, total_exceptions:"' puts "$pgm.puts \"mstart := trunc(time()*1000.0):\"" puts "$pgm.puts \"rstart := \#{Time.now.to_i}*1000:\"" puts "t = Process.times" puts "$pgm.puts \"rcpuustart := \#{t.utime}*1000:\"" puts "$pgm.puts \"rcpusstart := \#{t.stime}*1000:\"" puts '$pgm.puts "total_tests := 0:"' puts '$pgm.puts "total_exceptions := 0:"' puts '$pgm.puts "hours_elapsed := proc(msec)"' puts '$pgm.puts "local hrs:"' puts '$pgm.puts "hrs := trunc(evalf(msec/3600000)):"' puts '$pgm.puts "hrs :"' puts '$pgm.puts "end:"' puts '$pgm.puts "min_elapsed := proc(hrs,msec)"' puts '$pgm.puts "local min2:"' puts '$pgm.puts "min2 := trunc(evalf((msec-hrs*3600000)/60000)):"' puts '$pgm.puts "min2:"' puts '$pgm.puts "end:"' puts '$pgm.puts "sec_elapsed := proc(hrs,min2,msec)"' puts '$pgm.puts "local sec2:"' puts '$pgm.puts "sec2 := trunc(evalf((msec - hrs*360000 - min2 * 60000)/1000)) :"' puts '$pgm.puts "sec2 :"' puts '$pgm.puts "end:"' puts '$pgm.puts "msec_elapsed := proc(hrs,min2,sec2,msec)"' puts '$pgm.puts "local msec2:"' puts '$pgm.puts "msec2 := msec - hrs*3600000 - min2 * 60000 - sec2 * 1000:"' puts '$pgm.puts "msec2 :"' puts '$pgm.puts "end:"' puts "$pgm.puts \"dump_except := proc(maplefunc,apfunc,x,fxm,fxr,fxrerr,percent_error,abs_error,except_fd,differentialm,start_err)\"" puts '$pgm.puts "global total_tests, total_exceptions:"' puts '$pgm.puts "total_exceptions := total_exceptions + 1:"' puts "$pgm.puts \"fprintf(except_fd,\\\"EXCEPTION: Maple func = %s APFP func = %s\\\\n\\\",maplefunc,apfunc):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"x = %40.34e\\\\n\\\",x):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"error given in x = %40.34e\\\\n\\\",start_err):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby APFP value = %40.34e\\\\n\\\",fxr):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Maple value = %40.34e\\\\n\\\",fxm):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Percent Difference = %40.34e\\\\n\\\",percent_error):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Absolute Difference = %40.34e\\\\n\\\",abs_err):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby APFP error estimate = %40.34e\\\\n\\\",fxrerr):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Maple Differential = %40.34e\\\\n\\\",differentialm):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" puts '$pgm.puts "end:"' puts '$pgm.puts "out_fd := fopen(`aptst.txt`,WRITE,TEXT):"' puts '$pgm.puts "except_fd := fopen(`apexcept.txt`,WRITE,TEXT):"' puts "$pgm.puts \"fprintf(except_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" # puts '$pgm.puts "out_fd := fopen(`c:\\\\\\\\cygwin\\\\\\\\home\\\\\\\\dennis\\\\\\\\src\\\\\\\\mine\\\\\\\\aptst\\\\\\\\aptst.txt`,WRITE,TEXT):"' # puts '$pgm.puts "except_fd := fopen(`c:\\\\\\\\cygwin\\\\\\\\home\\\\\\\\dennis\\\\\\\\src\\\\\\\\mine\\\\\\\\aptst\\\\\\\\apexcept.txt`,WRITE,TEXT):"' puts '$pgm.puts "Digits := 34:"' testfunc("sin","sin","-6.0","6.5","0.1",start_err) testfunc("cos","cos","-6.0","6.5","0.1",start_err) testfunc("tan","tan","-1.5","1.5","0.1",start_err) testfunc("exp","exp","-1.5","1.5","0.1",start_err) testfunc("exp","exp","-100.5","100.5","10.1",start_err) testfunc("arcsin","asin","-0.9","0.9","0.1",start_err) testfunc("arccos","acos","-0.9","0.9","0.1",start_err) testfunc("arctan","atan","-10.5","10.5","0.1",start_err) testfunc("ln","log","0.01","10.5","0.1",start_err) testfunc("ln","log","0.1","100.5","1.1",start_err) testfunc("log10","log10","0.01","10.5","0.1",start_err) testfunc("log10","log10","0.1","100.5","1.1",start_err) testfunc("sinh","sinh","-1.5","1.5","0.1",start_err) testfunc("cosh","cosh","-1.5","1.5","0.1",start_err) testfunc("tanh","tanh","-1.5","1.5","0.1",start_err) testfunc("sqrt","sqrt","0.0","1.5","0.1",start_err) testfunc("abs","abs","-1.5","1.5","0.1",start_err) testfunc("trunc","trunc","-19.5","19.5","0.12",start_err) testfunc("frac","frac","-19.5","19.5","0.11",start_err) testfunc("erf","erf","-1.5","1.5","0.1",start_err) puts "$pgm.puts \"fprintf(out_fd,\\\"total_tests = %d\\\\n\\\",total_tests):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"total_exceptions = %d\\\\n\\\",total_exceptions):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"total_tests = %d\\\\n\\\",total_tests):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"total_exceptions = %d\\\\n\\\",total_exceptions):\"" puts '$pgm.puts "mend := trunc(time()*1000.0):"' puts "$pgm.puts \"rend := \#{Time.now.to_i}*1000:\"" puts "t = Process.times" puts "$pgm.puts \"rcpuuend := \#{t.utime}*1000:\"" puts "$pgm.puts \"rcpusend := \#{t.stime}*1000:\"" puts '$pgm.puts "melapsed := trunc(evalf(mend - mstart)):"' puts '$pgm.puts "relapsed := trunc(evalf(rend - rstart)):"' puts '$pgm.puts "rcpuuelapsed := trunc(evalf(rcpuuend - rcpuustart)):"' puts '$pgm.puts "rcpuselapsed := trunc(evalf(rcpusend - rcpusstart)):"' puts '$pgm.puts "mhours := hours_elapsed(melapsed):"' puts '$pgm.puts "rhours := hours_elapsed(relapsed):"' puts '$pgm.puts "rcpuuhours := hours_elapsed(rcpuuelapsed):"' puts '$pgm.puts "rcpushours := hours_elapsed(rcpuselapsed):"' puts '$pgm.puts "mmin := min_elapsed(mhours,melapsed):"' puts '$pgm.puts "rmin := min_elapsed(rhours,relapsed):"' puts '$pgm.puts "rcpuumin := min_elapsed(rcpuuhours,rcpuuelapsed):"' puts '$pgm.puts "rcpusmin := min_elapsed(rhours,rcpuselapsed):"' puts '$pgm.puts "msec := sec_elapsed(mhours,mmin,melapsed):"' puts '$pgm.puts "rsec := sec_elapsed(rhours,rmin,relapsed):"' puts '$pgm.puts "rcpuusec := sec_elapsed(rcpuuhours,rcpuumin,rcpuuelapsed):"' puts '$pgm.puts "rcpussec := sec_elapsed(rcpushours,rcpusmin,rcpuselapsed):"' puts '$pgm.puts "mmsec := msec_elapsed(mhours,mmin,msec,melapsed):"' puts '$pgm.puts "rmsec := msec_elapsed(rhours,rmin,rsec,relapsed):"' puts '$pgm.puts "rcpuumsec := msec_elapsed(rcpuuhours,rcpuumin,rcpuusec,rcpuuelapsed):"' puts '$pgm.puts "rcpusmsec := msec_elapsed(rcpushours,rcpusmin,rcpussec,rcpuselapsed):"' puts "$pgm.puts \"fprintf(out_fd,\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec):\"" puts "$pgm.puts \"printf(\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec):\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec):\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec):\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" puts '$pgm.puts "fclose(out_fd):"' puts '$pgm.puts "fclose(except_fd):"' puts "puts \"End of APFP Regression Test\"" end main