(self)
| 91 | self.log_summary_rows(attack_detail_rows, "Attack Details", "attack_details") |
| 92 | |
| 93 | def log_summary(self): |
| 94 | total_attacks = len(self.results) |
| 95 | if total_attacks == 0: |
| 96 | return |
| 97 | |
| 98 | # Default metrics - calculated on every attack |
| 99 | attack_success_stats = AttackSuccessRate().calculate(self.results) |
| 100 | words_perturbed_stats = WordsPerturbed().calculate(self.results) |
| 101 | attack_query_stats = AttackQueries().calculate(self.results) |
| 102 | |
| 103 | # @TODO generate this table based on user input - each column in specific class |
| 104 | # Example to demonstrate: |
| 105 | # summary_table_rows = attack_success_stats.display_row() + words_perturbed_stats.display_row() + ... |
| 106 | summary_table_rows = [ |
| 107 | [ |
| 108 | "Number of successful attacks:", |
| 109 | attack_success_stats["successful_attacks"], |
| 110 | ], |
| 111 | ["Number of failed attacks:", attack_success_stats["failed_attacks"]], |
| 112 | ["Number of skipped attacks:", attack_success_stats["skipped_attacks"]], |
| 113 | [ |
| 114 | "Original accuracy:", |
| 115 | str(attack_success_stats["original_accuracy"]) + "%", |
| 116 | ], |
| 117 | [ |
| 118 | "Accuracy under attack:", |
| 119 | str(attack_success_stats["attack_accuracy_perc"]) + "%", |
| 120 | ], |
| 121 | [ |
| 122 | "Attack success rate:", |
| 123 | str(attack_success_stats["attack_success_rate"]) + "%", |
| 124 | ], |
| 125 | [ |
| 126 | "Average perturbed word %:", |
| 127 | str(words_perturbed_stats["avg_word_perturbed_perc"]) + "%", |
| 128 | ], |
| 129 | [ |
| 130 | "Average num. words per input:", |
| 131 | words_perturbed_stats["avg_word_perturbed"], |
| 132 | ], |
| 133 | ] |
| 134 | |
| 135 | summary_table_rows.append( |
| 136 | ["Avg num queries:", attack_query_stats["avg_num_queries"]] |
| 137 | ) |
| 138 | |
| 139 | for metric_name, metric in self.metrics.items(): |
| 140 | summary_table_rows.append([metric_name, metric.calculate(self.results)]) |
| 141 | |
| 142 | if self.enable_advance_metrics: |
| 143 | perplexity_stats = Perplexity().calculate(self.results) |
| 144 | use_stats = USEMetric().calculate(self.results) |
| 145 | |
| 146 | summary_table_rows.append( |
| 147 | [ |
| 148 | "Average Original Perplexity:", |
| 149 | perplexity_stats["avg_original_perplexity"], |
| 150 | ] |
no test coverage detected