| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- using Test
- using CSV
- using DataFrames
- function test_trace_equivalence(jl_trace_path::String, py_trace_path::String; atol=1e-5)
- jl_df = CSV.read(jl_trace_path, DataFrame)
- py_df = CSV.read(py_trace_path, DataFrame)
- jl_df.model_path = lowercase.(string.(jl_df.model_path))
- py_df.model_path = lowercase.(string.(py_df.model_path))
- jl_df.transition_type = uppercase.(string.(jl_df.transition_type))
- py_df.transition_type = uppercase.(string.(py_df.transition_type))
- sort!(jl_df, [:time, :model_path, :transition_type])
- sort!(py_df, [:time, :model_path, :transition_type])
- # Check Row Count First
- if nrow(jl_df) != nrow(py_df)
- println("\nROW COUNT MISMATCH!")
- println("Julia generated $(nrow(jl_df)) events, Python generated $(nrow(py_df)) events.")
- @test nrow(jl_df) == nrow(py_df)
- return
- end
- # Check Line by Line
- for i in 1:nrow(jl_df)
- jl_row = jl_df[i, :]
- py_row = py_df[i, :]
- step_info = "Row $i | Model: $(jl_row.model_path) | Trans: $(jl_row.transition_type)"
- # Mathematical Time Equivalence
- if !isapprox(jl_row.time, py_row.time, atol=atol)
- println("\nTIME MISMATCH at $step_info")
- println("\tJulia: $(jl_row.time) != Python: $(py_row.time)")
- end
- @test isapprox(jl_row.time, py_row.time, atol=atol)
- # Next Time Advance
- if py_row.next_ta != "inf" && jl_row.next_ta != "inf"
- jl_ta = parse(Float64, string(jl_row.next_ta))
- py_ta = parse(Float64, string(py_row.next_ta))
- if !isapprox(jl_ta, py_ta, atol=atol)
- println("\nTIME ADVANCE MISMATCH at $step_info")
- println("\tJulia: $jl_ta != Python: $py_ta")
- end
- @test isapprox(jl_ta, py_ta, atol=atol)
- else
- @test string(jl_row.next_ta) == string(py_row.next_ta)
- end
- # Routing & Logic Equivalence
- @test jl_row.model_path == py_row.model_path
- @test string(jl_row.transition_type) == string(py_row.transition_type)
- # Bag Equivalence
- if jl_row.inputs != py_row.inputs
- println("\nINPUT MISMATCH at $step_info")
- println("\tJulia: $(jl_row.inputs) != Python: $(py_row.inputs)")
- end
- @test jl_row.inputs == py_row.inputs
- if jl_row.outputs != py_row.outputs
- println("\nOUTPUT MISMATCH at $step_info")
- println("\tJulia: $(jl_row.outputs) != Python: $(py_row.outputs)")
- end
- @test jl_row.outputs == py_row.outputs
- end
- end
|