@@ -340,7 +340,7 @@ impl PlottingEngine {
340340 }
341341
342342 // Color palette for different optimizers
343- let colors = [
343+ let colors: [ & RGBColor ; 24 ] = [
344344 & RED ,
345345 & BLUE ,
346346 & GREEN ,
@@ -372,13 +372,13 @@ impl PlottingEngine {
372372 for ( optimizer_idx, optimizer_name) in unique_optimizers. iter ( ) . enumerate ( ) {
373373 let color = colors[ optimizer_idx % colors. len ( ) ] ;
374374 let traces_for_optimizer = & optimizer_traces[ optimizer_name] ;
375- debug ! (
376- "Drawing {} traces for optimizer: {}" ,
375+ info ! (
376+ "Drawing {} traces/runs for optimizer: {}" ,
377377 traces_for_optimizer. len( ) ,
378378 optimizer_name
379379 ) ;
380380
381- for trace in traces_for_optimizer {
381+ for ( run_idx , trace) in traces_for_optimizer. iter ( ) . enumerate ( ) {
382382 let series_data: Vec < ( usize , f64 ) > = trace
383383 . evaluation_counts
384384 . iter ( )
@@ -390,15 +390,23 @@ impl PlottingEngine {
390390 debug ! ( "Skipping empty series for {}" , optimizer_name) ;
391391 continue ;
392392 }
393- debug ! (
394- "Drawing series with {} data points for {}" ,
393+ info ! (
394+ "Drawing series with {} data points for {} (run {}) " ,
395395 series_data. len( ) ,
396- optimizer_name
396+ optimizer_name,
397+ run_idx
397398 ) ;
399+ // Use slightly different line styles for multiple runs of the same optimizer
400+ let line_style = if run_idx == 0 {
401+ ( * color) . to_rgba ( )
402+ } else {
403+ // Make subsequent runs more transparent based on run index
404+ ( * color) . mix ( 0.8 - ( run_idx as f64 * 0.05 ) . min ( 0.3 ) ) . to_rgba ( )
405+ } ;
398406
399407 // Draw series
400408 chart
401- . draw_series ( LineSeries :: new ( series_data. clone ( ) , color ) )
409+ . draw_series ( LineSeries :: new ( series_data. clone ( ) , & line_style ) )
402410 . map_err ( |e| anyhow:: anyhow!( "Series drawing error: {}" , e) ) ?;
403411 // Add markers at regular intervals for better visibility
404412 let marker_interval = series_data. len ( ) . max ( 1 ) / 20 + 1 ;
@@ -408,7 +416,7 @@ impl PlottingEngine {
408416 series_data
409417 . iter ( )
410418 . step_by ( marker_interval)
411- . map ( |& ( x, y) | Circle :: new ( ( x, y) , 3 , color . filled ( ) ) ) ,
419+ . map ( |& ( x, y) | Circle :: new ( ( x, y) , 3 , line_style . filled ( ) ) ) ,
412420 )
413421 . map_err ( |e| anyhow:: anyhow!( "Marker drawing error: {}" , e) ) ?;
414422 }
@@ -606,7 +614,7 @@ impl PlottingEngine {
606614 optimizer_name
607615 ) ;
608616
609- for trace in traces_for_optimizer {
617+ for ( run_idx , trace) in traces_for_optimizer. iter ( ) . enumerate ( ) {
610618 let series_data: Vec < ( usize , f64 ) > = trace
611619 . evaluation_counts
612620 . iter ( )
@@ -622,11 +630,18 @@ impl PlottingEngine {
622630 // Only draw if we have valid data points
623631 if !series_data. is_empty ( ) {
624632 debug ! (
625- "Drawing log series with {} data points for {}" ,
633+ "Drawing log series with {} data points for {} (run {}) " ,
626634 series_data. len( ) ,
627- optimizer_name
635+ optimizer_name,
636+ run_idx
628637 ) ;
629- chart. draw_series ( LineSeries :: new ( series_data. clone ( ) , color) ) ?;
638+ // Use slightly different line styles for multiple runs of the same optimizer
639+ let line_style = if run_idx == 0 {
640+ ( * color) . to_rgba ( )
641+ } else {
642+ // Make subsequent runs slightly more transparent
643+ ( * color) . mix ( 0.7 ) . to_rgba ( )
644+ } ;
630645
631646 // Add markers for better visibility
632647 let marker_interval = series_data. len ( ) . max ( 1 ) / 20 + 1 ;
@@ -635,7 +650,7 @@ impl PlottingEngine {
635650 series_data
636651 . iter ( )
637652 . step_by ( marker_interval)
638- . map ( |& ( x, y) | Circle :: new ( ( x, y) , 3 , color . filled ( ) ) ) ,
653+ . map ( |& ( x, y) | Circle :: new ( ( x, y) , 3 , line_style . filled ( ) ) ) ,
639654 ) ?;
640655 } else {
641656 debug ! ( "Skipping empty log series for {}" , optimizer_name) ;
@@ -1487,4 +1502,4 @@ mod tests {
14871502 assert ! ( data. q1 < data. median) ;
14881503 assert ! ( data. median < data. q3) ;
14891504 }
1490- }
1505+ }
0 commit comments