compare.jl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Test
  2. using CSV
  3. using DataFrames
  4. function test_trace_equivalence(jl_trace_path::String, py_trace_path::String; atol=1e-5)
  5. jl_df = CSV.read(jl_trace_path, DataFrame)
  6. py_df = CSV.read(py_trace_path, DataFrame)
  7. jl_df.model_path = lowercase.(string.(jl_df.model_path))
  8. py_df.model_path = lowercase.(string.(py_df.model_path))
  9. jl_df.transition_type = uppercase.(string.(jl_df.transition_type))
  10. py_df.transition_type = uppercase.(string.(py_df.transition_type))
  11. sort!(jl_df, [:time, :model_path, :transition_type])
  12. sort!(py_df, [:time, :model_path, :transition_type])
  13. # Check Row Count First
  14. if nrow(jl_df) != nrow(py_df)
  15. println("\nROW COUNT MISMATCH!")
  16. println("Julia generated $(nrow(jl_df)) events, Python generated $(nrow(py_df)) events.")
  17. @test nrow(jl_df) == nrow(py_df)
  18. return
  19. end
  20. # Check Line by Line
  21. for i in 1:nrow(jl_df)
  22. jl_row = jl_df[i, :]
  23. py_row = py_df[i, :]
  24. step_info = "Row $i | Model: $(jl_row.model_path) | Trans: $(jl_row.transition_type)"
  25. # Mathematical Time Equivalence
  26. if !isapprox(jl_row.time, py_row.time, atol=atol)
  27. println("\nTIME MISMATCH at $step_info")
  28. println("\tJulia: $(jl_row.time) != Python: $(py_row.time)")
  29. end
  30. @test isapprox(jl_row.time, py_row.time, atol=atol)
  31. # Next Time Advance
  32. if py_row.next_ta != "inf" && jl_row.next_ta != "inf"
  33. jl_ta = parse(Float64, string(jl_row.next_ta))
  34. py_ta = parse(Float64, string(py_row.next_ta))
  35. if !isapprox(jl_ta, py_ta, atol=atol)
  36. println("\nTIME ADVANCE MISMATCH at $step_info")
  37. println("\tJulia: $jl_ta != Python: $py_ta")
  38. end
  39. @test isapprox(jl_ta, py_ta, atol=atol)
  40. else
  41. @test string(jl_row.next_ta) == string(py_row.next_ta)
  42. end
  43. # Routing & Logic Equivalence
  44. @test jl_row.model_path == py_row.model_path
  45. @test string(jl_row.transition_type) == string(py_row.transition_type)
  46. # Bag Equivalence
  47. if jl_row.inputs != py_row.inputs
  48. println("\nINPUT MISMATCH at $step_info")
  49. println("\tJulia: $(jl_row.inputs) != Python: $(py_row.inputs)")
  50. end
  51. @test jl_row.inputs == py_row.inputs
  52. if jl_row.outputs != py_row.outputs
  53. println("\nOUTPUT MISMATCH at $step_info")
  54. println("\tJulia: $(jl_row.outputs) != Python: $(py_row.outputs)")
  55. end
  56. @test jl_row.outputs == py_row.outputs
  57. end
  58. end