139 lines
3.9 KiB
Python
139 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (C) 2004-2019 by
|
|
# Aric Hagberg <hagberg@lanl.gov>
|
|
# Dan Schult <dschult@colgate.edu>
|
|
# Pieter Swart <swart@lanl.gov>
|
|
# All rights reserved.
|
|
# BSD license.
|
|
#
|
|
# Authors:
|
|
# Aric Hagberg <hagberg@lanl.gov>
|
|
# Pieter Swart <swart@lanl.gov>
|
|
# Dan Schult <dschult@colgate.edu>
|
|
# Loïc Séguin-C. <loicseguin@gmail.com>
|
|
"""
|
|
**********
|
|
Exceptions
|
|
**********
|
|
|
|
Base exceptions and errors for NetworkX.
|
|
"""
|
|
|
|
__all__ = [
|
|
'HasACycle',
|
|
'NodeNotFound',
|
|
'PowerIterationFailedConvergence',
|
|
'ExceededMaxIterations',
|
|
'AmbiguousSolution',
|
|
'NetworkXAlgorithmError',
|
|
'NetworkXException',
|
|
'NetworkXError',
|
|
'NetworkXNoCycle',
|
|
'NetworkXNoPath',
|
|
'NetworkXNotImplemented',
|
|
'NetworkXPointlessConcept',
|
|
'NetworkXUnbounded',
|
|
'NetworkXUnfeasible',
|
|
]
|
|
|
|
|
|
class NetworkXException(Exception):
|
|
"""Base class for exceptions in NetworkX."""
|
|
|
|
|
|
class NetworkXError(NetworkXException):
|
|
"""Exception for a serious error in NetworkX"""
|
|
|
|
|
|
class NetworkXPointlessConcept(NetworkXException):
|
|
"""Raised when a null graph is provided as input to an algorithm
|
|
that cannot use it.
|
|
|
|
The null graph is sometimes considered a pointless concept [1]_,
|
|
thus the name of the exception.
|
|
|
|
References
|
|
----------
|
|
.. [1] Harary, F. and Read, R. "Is the Null Graph a Pointless
|
|
Concept?" In Graphs and Combinatorics Conference, George
|
|
Washington University. New York: Springer-Verlag, 1973.
|
|
|
|
"""
|
|
|
|
|
|
class NetworkXAlgorithmError(NetworkXException):
|
|
"""Exception for unexpected termination of algorithms."""
|
|
|
|
|
|
class NetworkXUnfeasible(NetworkXAlgorithmError):
|
|
"""Exception raised by algorithms trying to solve a problem
|
|
instance that has no feasible solution."""
|
|
|
|
|
|
class NetworkXNoPath(NetworkXUnfeasible):
|
|
"""Exception for algorithms that should return a path when running
|
|
on graphs where such a path does not exist."""
|
|
|
|
|
|
class NetworkXNoCycle(NetworkXUnfeasible):
|
|
"""Exception for algorithms that should return a cycle when running
|
|
on graphs where such a cycle does not exist."""
|
|
|
|
|
|
class HasACycle(NetworkXException):
|
|
"""Raised if a graph has a cycle when an algorithm expects that it
|
|
will have no cycles.
|
|
|
|
"""
|
|
|
|
|
|
class NetworkXUnbounded(NetworkXAlgorithmError):
|
|
"""Exception raised by algorithms trying to solve a maximization
|
|
or a minimization problem instance that is unbounded."""
|
|
|
|
|
|
class NetworkXNotImplemented(NetworkXException):
|
|
"""Exception raised by algorithms not implemented for a type of graph."""
|
|
|
|
|
|
class NodeNotFound(NetworkXException):
|
|
"""Exception raised if requested node is not present in the graph"""
|
|
|
|
|
|
class AmbiguousSolution(NetworkXException):
|
|
"""Raised if more than one valid solution exists for an intermediary step
|
|
of an algorithm.
|
|
|
|
In the face of ambiguity, refuse the temptation to guess.
|
|
This may occur, for example, when trying to determine the
|
|
bipartite node sets in a disconnected bipartite graph when
|
|
computing bipartite matchings.
|
|
|
|
"""
|
|
|
|
|
|
class ExceededMaxIterations(NetworkXException):
|
|
"""Raised if a loop iterates too many times without breaking.
|
|
|
|
This may occur, for example, in an algorithm that computes
|
|
progressively better approximations to a value but exceeds an
|
|
iteration bound specified by the user.
|
|
|
|
"""
|
|
|
|
|
|
class PowerIterationFailedConvergence(ExceededMaxIterations):
|
|
"""Raised when the power iteration method fails to converge within a
|
|
specified iteration limit.
|
|
|
|
`num_iterations` is the number of iterations that have been
|
|
completed when this exception was raised.
|
|
|
|
"""
|
|
|
|
def __init__(self, num_iterations, *args, **kw):
|
|
msg = 'power iteration failed to converge within {} iterations'
|
|
exception_message = msg.format(num_iterations)
|
|
superinit = super(PowerIterationFailedConvergence, self).__init__
|
|
superinit(self, exception_message, *args, **kw)
|