|
""" |
|
|
|
Metrics on AttackSuccessRate |
|
--------------------------------------------------------------------- |
|
|
|
""" |
|
|
|
from textattack.attack_results import FailedAttackResult, SkippedAttackResult |
|
from textattack.metrics import Metric |
|
|
|
|
|
class AttackSuccessRate(Metric): |
|
def __init__(self): |
|
self.failed_attacks = 0 |
|
self.skipped_attacks = 0 |
|
self.successful_attacks = 0 |
|
|
|
self.all_metrics = {} |
|
|
|
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 |
|
|
|
|
|
self.all_metrics["successful_attacks"] = self.successful_attacks |
|
self.all_metrics["failed_attacks"] = self.failed_attacks |
|
self.all_metrics["skipped_attacks"] = self.skipped_attacks |
|
|
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|