START_ERR_X = "0.1e-12" START_ERR_Y = "0.1e-19" def aptst_out(x,y,x_start_err,y_start_err,mapleop,apop,opname) # puts "x = c(#{x})" puts '$pgm.puts "local except_flg:"' puts 'xr = ap_in("'+ x.to_s + '+/-' + x_start_err.to_s + '")' puts 'yr = ap_in("'+ y.to_s + '+/-' + y_start_err.to_s + '")' puts '$pgm.puts "x_start_err := ' + x_start_err.to_s + ';" ' puts '$pgm.puts "y_start_err := ' + y_start_err.to_s + ';" ' puts "$pgm.puts \"fprintf(out_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Operator = #{opname} \\\\n\\\"):\"" puts '$pgm.puts "total_tests := total_tests + 1;"' puts "fxr = xr #{apop} yr" puts "$pgm.puts \"x := #{x};\"" puts "$pgm.puts \"y := #{y};\"" puts "$pgm.puts \"fxm := (#{x})#{mapleop}(#{y});\"" puts "$pgm.puts \"fffx := x -> x " + mapleop + "y;\"" puts "$pgm.puts \"fffy := y -> x " + mapleop + "y;\"" puts "$pgm.puts \"gggx := D(fffx);\"" puts "$pgm.puts \"gggy := D(fffy);\"" puts "$pgm.puts \"differentialm := abs(evalf(gggx(#{x})) * x_start_err) + abs(evalf(gggy(#{y})) * y_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(#{opname},#{x},#{y},fxm,fxr2,fxrerr,percent_error,abs_err,except_fd,differentialm,#{x_start_err},#{y_start_err}):\"" puts "$pgm.puts \"end:\"" puts "$pgm.puts \"fprintf(out_fd,\\\"x = #{x}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"y = #{y}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"error given in x = #{x_start_err}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(out_fd,\\\"error given in y = #{y_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 testop(mapleop,apop,startx,endx,starty,endy,incrx,incry,x_start_err,y_start_err,opname) x = startx.to_f xf = endx.to_f xinc = incrx.to_f yf = endy.to_f yinc = incry.to_f cnt = 0 puts "puts \"Operator = #{opname}\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Operator = #{opname}\\\\n\\\"):\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Operator = #{opname}\\\\n\\\"):\"" puts "# BEFORE 1st loop" while (x < xf && cnt < 100) do y = starty.to_f cnt2= 0 puts "# BEFORE 2nd loop" while (y < yf && cnt2< 100) do puts "# BEFORE TEST for " + mapleop aptst_out(x.to_s,y.to_s,x_start_err.to_s,y_start_err.to_s,mapleop,apop,opname) y += yinc puts 'putc ".."' cnt2 += 1 end x += xinc cnt += 1 end end def main puts "puts \"APFP OP Regression Test\"" x_start_err = START_ERR_X y_start_err = START_ERR_Y # 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("testpgmop.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(opname,x,y,fxm,fxr,fxrerr,percent_error,abs_error,except_fd,differentialm,x_start_err,_y_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: Operator = %s \\\\n\\\",opname);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"x = %40.34e\\\\n\\\",x);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"error given in x = %40.34e\\\\n\\\",x_start_err);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"y = %40.34e\\\\n\\\",y);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"error given in y = %40.34e\\\\n\\\",y_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(`apoptst.txt`,WRITE,TEXT):"' puts '$pgm.puts "except_fd := fopen(`apopexcept.txt`,WRITE,TEXT):"' puts "$pgm.puts \"fprintf(except_fd,\\\"___________________________________________________________________\\\\n\\\"):\"" puts '$pgm.puts "Digits := 34:"' testop("+","+","-6.0","6.5","-6.0","6.5","0.8","0.9",x_start_err,y_start_err,"addition") testop("-","-","-6.0","6.5","-6.0","6.5","0.8","0.9",x_start_err,y_start_err,"subtraction") testop("*","*","-6.0","6.5","-6.0","6.5","0.8","0.9",x_start_err,y_start_err,"multiplication") testop("/","/","-6.0","6.5","-6.0","6.5","0.8","0.9",x_start_err,y_start_err,"division") testop("^","**","1.0","6.5","1.0","6.5","0.8","0.9",x_start_err,y_start_err,"exponentiation") 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