Source code for textattack.metrics.attack_metrics.attack_success_rate

"""

Metrics on AttackSuccessRate
---------------------------------------------------------------------

"""

from textattack.attack_results import FailedAttackResult, SkippedAttackResult
from textattack.metrics import Metric


[docs]class AttackSuccessRate(Metric): def __init__(self): self.failed_attacks = 0 self.skipped_attacks = 0 self.successful_attacks = 0 self.all_metrics = {}
[docs] def calculate(self, results): """Calculates all metrics related to number of succesful, failed and skipped results in an attack. Args: results (``AttackResult`` objects): Attack results for each instance in dataset """ self.results = results self.total_attacks = len(self.results) for i, result in enumerate(self.results): if isinstance(result, FailedAttackResult): self.failed_attacks += 1 continue elif isinstance(result, SkippedAttackResult): self.skipped_attacks += 1 continue else: self.successful_attacks += 1 # Calculated numbers self.all_metrics["successful_attacks"] = self.successful_attacks self.all_metrics["failed_attacks"] = self.failed_attacks self.all_metrics["skipped_attacks"] = self.skipped_attacks # Percentages wrt the calculations self.all_metrics["original_accuracy"] = self.original_accuracy_perc() self.all_metrics["attack_accuracy_perc"] = self.attack_accuracy_perc() self.all_metrics["attack_success_rate"] = self.attack_success_rate_perc() return self.all_metrics
[docs] def original_accuracy_perc(self): original_accuracy = ( (self.total_attacks - self.skipped_attacks) * 100.0 / (self.total_attacks) ) original_accuracy = round(original_accuracy, 2) return original_accuracy
[docs] def attack_accuracy_perc(self): accuracy_under_attack = (self.failed_attacks) * 100.0 / (self.total_attacks) accuracy_under_attack = round(accuracy_under_attack, 2) return accuracy_under_attack
[docs] def attack_success_rate_perc(self): if self.successful_attacks + self.failed_attacks == 0: attack_success_rate = 0 else: attack_success_rate = ( self.successful_attacks * 100.0 / (self.successful_attacks + self.failed_attacks) ) attack_success_rate = round(attack_success_rate, 2) return attack_success_rate