Source code for eqc_models.graph.base
- from typing import List, Set
- import networkx as nx
- from ..base import QuadraticModel
- [docs]
- class GraphModel(QuadraticModel):
-     """ """
-     def __init__(self, G : nx.Graph):
-         self.G = G
-         super(GraphModel, self).__init__(*self.costFunction())
-     @property
-     def linear_objective(self):
-         """Return linear terms as a vector."""
-         return self._H[0]
-     @property
-     def quad_objective(self):
-         """Return quadratic terms as a matrix."""
-         return self._H[1]
- [docs]
-     def costFunction(self):
-         """
-         Parameters
-         -------------
-         None
-         Returns
-         --------------
-         :C: linear operator (vector array of coefficients) for cost function
-         :J: quadratic operator (N by N matrix array of coefficients ) for cost function
-         """
-         raise NotImplementedError("GraphModel does not implement costFunction")
- [docs]
- class NodeModel(GraphModel):
-     """ 
-     Base class for a model where the decision variables correspond to
-     the graph nodes. 
-     
-     """
-     @property
-     def variables(self) -> List[str]:
-         """ Provide a variable name to index lookup; order enforced by sorting the list before returning """
-         names = [node for node in self.G.nodes]
-         names.sort()
-         return names
- [docs]
-     def modularity(self, partition : Set[Set]) -> float:
-         """ Calculate modularity from a partition (set of communities) """
-         
-         return nx.community.modularity(self.G, partition)
- class TwoPartitionModel(NodeModel):
-     """ 
-     Base class for a generic graph paritioning model. Override the
-     cost function and evaluation methods to implement a two-partition
-     algorithm.
-     
-     """
- [docs]
- class EdgeMixin:
-     @property
-     def variables(self) -> List[str]:
-         """ Provide a variable name to index lookup; order enforced by sorting the list before returning """
-         names = [(u, v) for u, v in self.G.edges]
-         names.sort()
-         return names
- [docs]
- class EdgeModel(EdgeMixin, GraphModel):
-     """ Create a model where the variables are edge-based """