@@ -106,7 +106,8 @@ def manage_pool(self) -> None:
106106 def select_contenders (self ) -> None :
107107 """Select contenders for next tournament/problem instance."""
108108
109- def process_tourn (self , rtac_data : RTACData , instance : str = None , tourn_nr : int = None ) -> str :
109+ def process_tourn (self , rtac_data : RTACData , instance : str = None ,
110+ tourn_nr : int = None ) -> str :
110111 """Manage result processing.
111112
112113 :param rtac_data: Object containing data and objects necessary
@@ -146,11 +147,12 @@ def get_contender_dict(self) -> dict[str: Configuration]:
146147 def result_summary_terminal (self , results , tourn_nr = None ):
147148 if tourn_nr :
148149 self .tourn_nr = tourn_nr
149- if self .scenario .verbosity == 2 :
150+ if self .scenario .verbosity == 2 and self . scenario . experimental :
150151 if not self .scenario .objective_min :
151152 unit = 'seconds'
152153 else :
153154 unit = 'objective value'
155+
154156 self .time_sum += round (min (results ), 3 )
155157 len_str = len ('Instance nr. ' + str (self .tourn_nr ) + ' : ' + str (
156158 round (self .time_sum , 3 )
@@ -233,7 +235,8 @@ def get_winner(self, times: list[float], res: list[float]) \
233235
234236 return winner , ranks
235237
236- def process_results (self , rtac_data : RTACData , instance : str = None , tourn_nr : int = None ) -> None :
238+ def process_results (self , rtac_data : RTACData , instance : str = None ,
239+ tourn_nr : int = None ) -> None :
237240 """Perform tournament result processing necessary to replace contenders
238241 in pool and select contenders for next tournament/problem instance
239242 according to ReACTR implementation.
@@ -248,10 +251,15 @@ def process_results(self, rtac_data: RTACData, instance: str = None, tourn_nr: i
248251 if self .rtac_data .ta_res [core ] == self .huge_float :
249252 self .rtac_data .ta_res_time [core ] = self .scenario .timeout
250253
254+ if not self .scenario .objective_min :
255+ results = list (self .rtac_data .ta_res_time [:])
256+ else :
257+ results = list (self .rtac_data .ta_res [:])
258+
259+ self .result_summary_terminal (results )
260+
251261 times = list (self .rtac_data .ta_res_time [:])
252262
253- self .result_summary_terminal (times )
254-
255263 self .rtac_data .newtime = min (times )
256264 res = list (self .rtac_data .ta_res [:])
257265 self .rtac_data .best_res = min (res )
@@ -457,57 +465,66 @@ def get_winner(self, times: list[float], res: list[float]) \
457465 else :
458466 winner = res .index (min (res ))
459467
460- interim_sorted = [[self .rtac_data .interim [j ][i ]
461- for j in range (self .scenario .number_cores )]
462- for i , _ in enumerate (self .rtac_data .interim [0 ])]
463-
464- interim_sorted = np .array (interim_sorted )
465- interim_sorted = interim_sorted .astype (float )
466-
467- for i , isort in enumerate (interim_sorted ):
468- if self .rtac_data .interim_meaning [i ] is \
469- InterimMeaning .decrease :
470- interim_sorted [i ] = rankdata (isort ,
471- method = 'dense' ,
472- nan_policy = "propagate" )
473- elif self .rtac_data .interim_meaning [i ] is \
474- InterimMeaning .increase :
475- interim_sorted [i ] = rankdata ([- 1 * i if i is not None
476- else None for i in isort ],
477- method = 'dense' ,
478- nan_policy = "propagate" )
479-
480- ranks = [0 for core in range (self .scenario .number_cores )]
481-
482- for _ , isort in enumerate (interim_sorted ):
483- for r , _ in enumerate (ranks ):
484- ranks [r ] += isort [r ]
485-
486- if self .scenario .objective_min :
487- res_ranks = rankdata (res , method = 'dense' , nan_policy = "propagate" )
488-
489- duplicates = []
490-
491- for rank in sorted (set (res_ranks )):
492- duplicates .append (self .duplicates (res_ranks , rank ))
493-
494- for duplicate in duplicates :
495- if len (duplicate ) > 1 :
496- interim_ranks = [ranks [dup ] for dup in duplicate ]
497- tie_winner = \
498- duplicate [interim_ranks .index (min (interim_ranks ))]
499- interim_ranks = rankdata (interim_ranks , method = 'dense' )
500- interim_ranks -= min (interim_ranks )
501- for d , ir in zip (duplicate , interim_ranks ):
502- for r , _ in enumerate (res_ranks ):
503- if d == r and r != winner and r != tie_winner :
504- res_ranks [r ] += interim_ranks [ir ]
505- else :
506- res_ranks [r ] += max (interim_ranks )
507-
508- ranks = res_ranks
509-
510- ranks = rankdata (ranks , method = 'dense' )
468+ if not any (elem is None for sublist in self .rtac_data .interim
469+ for elem in sublist ):
470+
471+ ranks = [0 for core in range (self .scenario .number_cores )]
472+
473+ interim_sorted = [[self .rtac_data .interim [j ][i ]
474+ for j in range (self .scenario .number_cores )]
475+ for i , _ in enumerate (self .rtac_data .interim [0 ])]
476+
477+ interim_sorted = np .array (interim_sorted )
478+ interim_sorted = interim_sorted .astype (float )
479+
480+ for i , isort in enumerate (interim_sorted ):
481+ if self .rtac_data .interim_meaning [i ] is \
482+ InterimMeaning .decrease :
483+ interim_sorted [i ] = rankdata (isort ,
484+ method = 'dense' ,
485+ nan_policy = "propagate" )
486+ elif self .rtac_data .interim_meaning [i ] is \
487+ InterimMeaning .increase :
488+ interim_sorted [i ] = rankdata ([- 1 * i if i is not None
489+ else None for i in isort ],
490+ method = 'dense' ,
491+ nan_policy = "propagate" )
492+
493+ for _ , isort in enumerate (interim_sorted ):
494+ for r , _ in enumerate (ranks ):
495+ ranks [r ] += isort [r ]
496+
497+ if self .scenario .objective_min :
498+ res_ranks = rankdata (res , method = 'dense' , nan_policy = "propagate" )
499+
500+ duplicates = []
501+
502+ for rank in sorted (set (res_ranks )):
503+ duplicates .append (self .duplicates (res_ranks , rank ))
504+
505+ for duplicate in duplicates :
506+ if len (duplicate ) > 1 :
507+ interim_ranks = [ranks [dup ] for dup in duplicate ]
508+ if not all (np .isnan (ir ) for ir in interim_ranks ):
509+ tie_winner = \
510+ duplicate [interim_ranks .index (min (interim_ranks ))]
511+ interim_ranks = rankdata (interim_ranks , method = 'dense' )
512+ interim_ranks -= min (interim_ranks )
513+ for d , ir in zip (duplicate , interim_ranks ):
514+ for r , _ in enumerate (res_ranks ):
515+ if d == r and r != winner and r != tie_winner :
516+ res_ranks [r ] += interim_ranks [ir ]
517+ elif np .isnan (max (interim_ranks )):
518+ res_ranks [r ] += self .scenario .number_cores
519+ else :
520+ res_ranks [r ] += max (interim_ranks )
521+
522+ ranks = res_ranks
523+
524+ ranks = rankdata (ranks , method = 'dense' )
525+
526+ else :
527+ ranks = [1 for core in range (self .scenario .number_cores )]
511528
512529 ranks [winner ] = 0
513530
@@ -560,7 +577,8 @@ def init_cppl(self, scenario, pool, random_config_gen, contender_dict,
560577
561578 queue .put ((bandit , bandit_models ))
562579
563- def process_tourn (self , rtac_data : RTACData , instance : str = None , tourn_nr : int = None ) -> str :
580+ def process_tourn (self , rtac_data : RTACData , instance : str = None ,
581+ tourn_nr : int = None ) -> str :
564582 """Manage result processing.
565583
566584 :param rtac_data: Object containing data and objects necessary
@@ -615,7 +633,8 @@ def cppl_process_results(self, contender_dict, scenario, rtac_data,
615633
616634 queue .put ((bandit , bandit_models , results , times ))
617635
618- def process_results (self , rtac_data : RTACData , instance : str = None , tourn_nr : int = None ) -> None :
636+ def process_results (self , rtac_data : RTACData , instance : str = None ,
637+ tourn_nr : int = None ) -> None :
619638 """Perform tournament result processing necessary to replace contenders
620639 in pool and select contenders for next tournament/problem instance.
621640
0 commit comments