@@ -662,7 +662,6 @@ def summarize_win():
662
662
info5 .metric (
663
663
"LLM Filter Calls" ,
664
664
llm_filter_call ,
665
- delta = - round (llm_filter_call / llm_call , 5 ),
666
665
help = timedelta_to_str (filter_call_duration ),
667
666
)
668
667
@@ -688,11 +687,9 @@ def summarize_win():
688
687
help = f"{ timeout_stats ['running' ]['timeout' ]} /{ timeout_stats ['running' ]['total' ]} " ,
689
688
)
690
689
690
+ final_trace = list (FileStorage (state .log_folder / state .log_path ).iter_msg (tag = "record.trace" ))[- 1 ].content
691
691
if show_trace_dag :
692
692
st .markdown ("### Trace DAG" )
693
- final_trace_loop_id = max_id
694
- while "record" not in state .data [final_trace_loop_id ]:
695
- final_trace_loop_id -= 1
696
693
merge_loops = []
697
694
for loop_id in state .llm_data .keys ():
698
695
if "direct_exp_gen" not in state .llm_data [loop_id ]:
@@ -701,15 +698,32 @@ def summarize_win():
701
698
i ["obj" ]["uri" ] for i in state .llm_data [loop_id ]["direct_exp_gen" ]["no_tag" ] if "uri" in i ["obj" ]
702
699
]:
703
700
merge_loops .append (loop_id )
704
- st .pyplot (trace_figure (state .data [final_trace_loop_id ]["record" ]["trace" ], merge_loops ))
701
+ st .pyplot (trace_figure (final_trace , merge_loops ))
702
+
703
+ # Find all root nodes (for grouping loops by trace)
704
+ root_nodes = {}
705
+ parent_nodes = {}
706
+ for node in range (len (final_trace .hist )):
707
+ parents = final_trace .get_parents (node )
708
+ root_nodes [node ] = parents [0 ]
709
+ parent_nodes [node ] = parents [- 2 ] if len (parents ) > 1 else None
710
+ root_nodes = {final_trace .idx2loop_id [n ]: final_trace .idx2loop_id [r ] for n , r in root_nodes .items ()}
711
+ parent_nodes = {
712
+ final_trace .idx2loop_id [n ]: final_trace .idx2loop_id [r ] if r is not None else r
713
+ for n , r in parent_nodes .items ()
714
+ }
715
+
716
+ # Generate Summary Table
705
717
df = pd .DataFrame (
706
718
columns = [
719
+ "Root N" ,
720
+ "Parent N" ,
707
721
"Component" ,
708
722
"Hypothesis" ,
709
723
"Reason" ,
710
724
"Others" ,
711
- "Running Score (valid)" ,
712
- "Running Score (test)" ,
725
+ "Run Score (valid)" ,
726
+ "Run Score (test)" ,
713
727
"Feedback" ,
714
728
"e-loops(c)" ,
715
729
"e-loops(r)" ,
@@ -726,6 +740,8 @@ def summarize_win():
726
740
sota_loop_id = state .sota_info [1 ] if state .sota_info else None
727
741
for loop in range (min_id , max_id + 1 ):
728
742
loop_data = state .data [loop ]
743
+ df .loc [loop , "Parent N" ] = parent_nodes .get (loop , None )
744
+ df .loc [loop , "Root N" ] = root_nodes .get (loop , None )
729
745
df .loc [loop , "Component" ] = loop_data ["direct_exp_gen" ]["no_tag" ].hypothesis .component
730
746
df .loc [loop , "Hypothesis" ] = loop_data ["direct_exp_gen" ]["no_tag" ].hypothesis .hypothesis
731
747
df .loc [loop , "Reason" ] = loop_data ["direct_exp_gen" ]["no_tag" ].hypothesis .reason
@@ -766,10 +782,10 @@ def summarize_win():
766
782
running_result = loop_data ["running" ]["no_tag" ].result
767
783
except AttributeError as e : # Compatible with old versions
768
784
running_result = loop_data ["running" ]["no_tag" ].__dict__ ["result" ]
769
- df .loc [loop , "Running Score (valid)" ] = str (round (running_result .loc ["ensemble" ].iloc [0 ], 5 ))
785
+ df .loc [loop , "Run Score (valid)" ] = str (round (running_result .loc ["ensemble" ].iloc [0 ], 5 ))
770
786
valid_results [loop ] = running_result
771
787
except :
772
- df .loc [loop , "Running Score (valid)" ] = "❌"
788
+ df .loc [loop , "Run Score (valid)" ] = "❌"
773
789
if "mle_score" not in state .data [loop ]:
774
790
if "mle_score" in loop_data ["running" ]:
775
791
mle_score_txt = loop_data ["running" ]["mle_score" ]
@@ -787,12 +803,10 @@ def summarize_win():
787
803
else "🥉" if state .data [loop ]["mle_score" ]["bronze_medal" ] else ""
788
804
)
789
805
)
790
- df .loc [loop , "Running Score (test)" ] = (
791
- f"{ medal_emoji } { state .data [loop ]['mle_score' ]['score' ]} "
792
- )
806
+ df .loc [loop , "Run Score (test)" ] = f"{ medal_emoji } { state .data [loop ]['mle_score' ]['score' ]} "
793
807
else :
794
808
state .data [loop ]["mle_score" ] = mle_score_txt
795
- df .loc [loop , "Running Score (test)" ] = "❌"
809
+ df .loc [loop , "Run Score (test)" ] = "❌"
796
810
else :
797
811
mle_score_path = (
798
812
replace_ep_path (loop_data ["running" ]["no_tag" ].experiment_workspace .workspace_path )
@@ -811,15 +825,15 @@ def summarize_win():
811
825
else "🥉" if state .data [loop ]["mle_score" ]["bronze_medal" ] else ""
812
826
)
813
827
)
814
- df .loc [loop , "Running Score (test)" ] = (
828
+ df .loc [loop , "Run Score (test)" ] = (
815
829
f"{ medal_emoji } { state .data [loop ]['mle_score' ]['score' ]} "
816
830
)
817
831
else :
818
832
state .data [loop ]["mle_score" ] = mle_score_txt
819
- df .loc [loop , "Running Score (test)" ] = "❌"
833
+ df .loc [loop , "Run Score (test)" ] = "❌"
820
834
except Exception as e :
821
835
state .data [loop ]["mle_score" ] = str (e )
822
- df .loc [loop , "Running Score (test)" ] = "❌"
836
+ df .loc [loop , "Run Score (test)" ] = "❌"
823
837
else :
824
838
if isinstance (state .data [loop ]["mle_score" ], dict ):
825
839
medal_emoji = (
@@ -831,13 +845,13 @@ def summarize_win():
831
845
else "🥉" if state .data [loop ]["mle_score" ]["bronze_medal" ] else ""
832
846
)
833
847
)
834
- df .loc [loop , "Running Score (test)" ] = f"{ medal_emoji } { state .data [loop ]['mle_score' ]['score' ]} "
848
+ df .loc [loop , "Run Score (test)" ] = f"{ medal_emoji } { state .data [loop ]['mle_score' ]['score' ]} "
835
849
else :
836
- df .loc [loop , "Running Score (test)" ] = "❌"
850
+ df .loc [loop , "Run Score (test)" ] = "❌"
837
851
838
852
else :
839
- df .loc [loop , "Running Score (valid)" ] = "N/A"
840
- df .loc [loop , "Running Score (test)" ] = "N/A"
853
+ df .loc [loop , "Run Score (valid)" ] = "N/A"
854
+ df .loc [loop , "Run Score (test)" ] = "N/A"
841
855
842
856
if "coding" in loop_data :
843
857
if len ([i for i in loop_data ["coding" ].keys () if isinstance (i , int )]) == 0 :
@@ -859,7 +873,38 @@ def summarize_win():
859
873
860
874
if only_success :
861
875
df = df [df ["Feedback" ] == "✅" ]
862
- st .dataframe (df [df .columns [~ df .columns .isin (["Hypothesis" , "Reason" , "Others" ])]])
876
+
877
+ # Add color styling based on root_nodes
878
+ def style_dataframe_by_root (df , root_nodes ):
879
+ # Create a color map for different root nodes - using colors that work well in both light and dark modes
880
+ unique_roots = list (set (root_nodes .values ()))
881
+ colors = [
882
+ "rgba(255, 99, 132, 0.3)" ,
883
+ "rgba(54, 162, 235, 0.3)" ,
884
+ "rgba(75, 192, 75, 0.3)" ,
885
+ "rgba(255, 159, 64, 0.3)" ,
886
+ "rgba(153, 102, 255, 0.2)" ,
887
+ "rgba(255, 205, 86, 0.2)" ,
888
+ "rgba(199, 199, 199, 0.2)" ,
889
+ "rgba(83, 102, 255, 0.2)" ,
890
+ ]
891
+ root_color_map = {root : colors [i % len (colors )] for i , root in enumerate (unique_roots )}
892
+
893
+ # Create styling function
894
+ def apply_color (row ):
895
+ loop_id = row .name
896
+ if loop_id in root_nodes :
897
+ root_id = root_nodes [loop_id ]
898
+ color = root_color_map .get (root_id , "rgba(128, 128, 128, 0.1)" )
899
+ return [f"background-color: { color } " ] * len (row )
900
+ return ["" ] * len (row )
901
+
902
+ return df .style .apply (apply_color , axis = 1 )
903
+
904
+ styled_df = style_dataframe_by_root (
905
+ df [df .columns [~ df .columns .isin (["Hypothesis" , "Reason" , "Others" ])]], root_nodes
906
+ )
907
+ st .dataframe (styled_df )
863
908
864
909
# timeline figure
865
910
if state .times :
@@ -882,7 +927,7 @@ def summarize_win():
882
927
ensemble_row = vscores .loc [["ensemble" ]]
883
928
vscores = pd .concat ([ensemble_row , vscores .drop ("ensemble" )])
884
929
vscores = vscores .T
885
- test_scores = df ["Running Score (test)" ].str .replace (r"[🥇🥈🥉]\s*" , "" , regex = True )
930
+ test_scores = df ["Run Score (test)" ].str .replace (r"[🥇🥈🥉]\s*" , "" , regex = True )
886
931
vscores ["test" ] = test_scores
887
932
vscores .index = [f"L{ i } " for i in vscores .index ]
888
933
vscores .columns .name = metric_name
@@ -902,7 +947,7 @@ def summarize_win():
902
947
903
948
def comp_stat_func (x : pd .DataFrame ):
904
949
total_num = x .shape [0 ]
905
- valid_num = x [x ["Running Score (test)" ] != "N/A" ].shape [0 ]
950
+ valid_num = x [x ["Run Score (test)" ] != "N/A" ].shape [0 ]
906
951
success_num = x [x ["Feedback" ] == "✅" ].shape [0 ]
907
952
avg_e_loops = x ["e-loops(c)" ].mean ()
908
953
return pd .Series (
@@ -920,7 +965,7 @@ def comp_stat_func(x: pd.DataFrame):
920
965
921
966
# component statistics
922
967
comp_df = (
923
- df .loc [:, ["Component" , "Running Score (test)" , "Feedback" , "e-loops(c)" ]]
968
+ df .loc [:, ["Component" , "Run Score (test)" , "Feedback" , "e-loops(c)" ]]
924
969
.groupby ("Component" )
925
970
.apply (comp_stat_func , include_groups = False )
926
971
)
0 commit comments