Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions axelrod/result_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import csv
import itertools
from multiprocessing import cpu_count
from typing import List
import warnings

import numpy as np
Expand Down Expand Up @@ -426,7 +427,9 @@ def _build_initial_cooperation_rate(self, interactions_series):
with warnings.catch_warnings():
warnings.simplefilter("ignore")
initial_cooperation_rate = list(
np.nan_to_num(np.array(self.initial_cooperation_count) / interactions_array)
np.nan_to_num(
np.array(self.initial_cooperation_count) / interactions_array
)
)
return initial_cooperation_rate

Expand Down Expand Up @@ -609,6 +612,18 @@ def __eq__(self, other):
other : axelrod.ResultSet
Another results set against which to check equality
"""

def list_equal_with_nans(v1: List[float], v2: List[float]) -> bool:
"""Matches lists, accounting for NaNs."""
if len(v1) != len(v2):
return False
for i1, i2 in zip(v1, v2):
if np.isnan(i1) and np.isnan(i2):
continue
if i1 != i2:
return False
return True

return all(
[
self.wins == other.wins,
Expand All @@ -628,8 +643,8 @@ def __eq__(self, other):
self.cooperating_rating == other.cooperating_rating,
self.good_partner_matrix == other.good_partner_matrix,
self.good_partner_rating == other.good_partner_rating,
self.eigenmoses_rating == other.eigenmoses_rating,
self.eigenjesus_rating == other.eigenjesus_rating,
list_equal_with_nans(self.eigenmoses_rating, other.eigenmoses_rating),
list_equal_with_nans(self.eigenjesus_rating, other.eigenjesus_rating),
]
)

Expand Down
7 changes: 7 additions & 0 deletions axelrod/tests/unit/test_eigen.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ def test_identity_matrices(self):
self.assertAlmostEqual(evalue, 1)
assert_array_almost_equal(evector, _normalise(numpy.ones(size)))

def test_zero_matrix(self):
mat = numpy.array([[0, 0], [0, 0]])
evector, evalue = principal_eigenvector(mat)
self.assertTrue(numpy.isnan(evalue))
self.assertTrue(numpy.isnan(evector[0]))
self.assertTrue(numpy.isnan(evector[1]))

def test_2x2_matrix(self):
mat = numpy.array([[2, 1], [1, 2]])
evector, evalue = principal_eigenvector(mat)
Expand Down
32 changes: 31 additions & 1 deletion axelrod/tests/unit/test_resultset.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import pandas as pd
from axelrod.result_set import create_counter_dict
from axelrod.tests.property import prob_end_tournaments, tournaments
from numpy import mean, nanmedian, std
from numpy import mean, nan, nanmedian, std

from dask.dataframe.core import DataFrame
from hypothesis import given, settings
Expand Down Expand Up @@ -190,6 +190,36 @@ def test_init(self):
self.assertEqual(rs.players, self.players)
self.assertEqual(rs.num_players, len(self.players))

def _clear_matrix(self, matrix):
for i, row in enumerate(matrix):
for j, _ in enumerate(row):
matrix[i][j] = 0

def test_ne_vectors(self):
rs_1 = axelrod.ResultSet(self.filename, self.players, self.repetitions)

rs_2 = axelrod.ResultSet(self.filename, self.players, self.repetitions)

# A different vector
rs_2.eigenmoses_rating = (-1, -1, -1)

self.assertNotEqual(rs_1, rs_2)

def test_nan_vectors(self):
rs_1 = axelrod.ResultSet(self.filename, self.players, self.repetitions)
# Force a broken eigenmoses, by replacing vengeful_cooperation with
# zeroes.
self._clear_matrix(rs_1.vengeful_cooperation)
rs_1.eigenmoses_rating = rs_1._build_eigenmoses_rating()

rs_2 = axelrod.ResultSet(self.filename, self.players, self.repetitions)
# Force a broken eigenmoses, by replacing vengeful_cooperation with
# zeroes.
self._clear_matrix(rs_2.vengeful_cooperation)
rs_2.eigenmoses_rating = rs_2._build_eigenmoses_rating()

self.assertEqual(rs_1, rs_2)

def test_init_multiprocessing(self):
rs = axelrod.ResultSet(
self.filename,
Expand Down