--- /dev/null
+"""
+Errors that can occur when solving a linear game.
+"""
+
+from cvxopt import matrix
+
+
+def _pretty_print_dict(dictionary):
+ """
+ Return a pretty-printed string representation of a dictionary
+ containing CVXOPT matrices.
+ """
+ result = ''
+ for (key, value) in dictionary.items():
+ if isinstance(value, matrix):
+ # Display matrices on their own lines, indented.
+ result += ' {:s}:'.format(key)
+ colvec = '\n{!s}'.format(value)
+ result += '\n '.join(colvec.splitlines())
+ result += '\n'
+ else:
+ result += ' {:s}: {!s}\n'.format(key, value)
+
+ return result
+
+
+class GameUnsolvableException(Exception):
+ """
+ Every linear game has a solution (this follows from a general
+ min-max theorem). If we can't solve the conic program associated
+ with a linear game, then something is wrong with either the model of
+ the input.
+ """
+ def __init__(self, solution_dict):
+ """
+ Create a new GameUnsolvableException object.
+
+ INPUT:
+
+ - ``solution_dict`` -- the solution dictionary returned from the
+ cone program.
+
+ """
+ super().__init__()
+ self._solution_dict = solution_dict
+
+
+ def __str__(self):
+ tpl = 'Solution failed with result "{:s}."\n' \
+ 'CVXOPT returned:\n{!s}'
+ return tpl.format(self._solution_dict['status'],
+ _pretty_print_dict(self._solution_dict))