Guest User

matroid_union.py

a guest
Feb 15th, 2014
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.37 KB | None | 0 0
  1. r"""
  2. The Matroid Union takes matroids as arguments and returns their union.
  3.  
  4. Let Mi = (Si,Ii)
  5. Matroid Union M = M1 v M2 v M3 v ... v Mk is defined as (S1 U S2 U S3 U ... U Sk,I1 v I2 v I3 v ... v Ik )
  6. where I1 v I2 v I3 v ... v Ik = {i1 U i2 U i3 U ... U ik | ij \in Ij }
  7.  
  8. EXAMPLES::
  9.  
  10.     sage: M1 = matroids.Uniform(3,6)
  11.     sage: M2 = matroids.Uniform(2,4)
  12.     sage: M = MatroidUnion(M1,M2)
  13.     sage: M.is_valid()
  14.     True
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22. """
  23. from matroid import Matroid
  24. from itertools import combinations
  25. import sage.matrix.matrix_space as matrix_space
  26. from sage.matrix.constructor import Matrix
  27. from sage.graphs.all import Graph, graphs
  28. import sage.matrix.matrix
  29. from sage.rings.all import ZZ, QQ, FiniteField, GF
  30. import sage.matroids.matroid
  31. import sage.matroids.basis_exchange_matroid
  32. from minor_matroid import MinorMatroid
  33. from dual_matroid import DualMatroid
  34. from rank_matroid import RankMatroid
  35. from circuit_closures_matroid import CircuitClosuresMatroid
  36. from basis_matroid import BasisMatroid
  37. from linear_matroid import LinearMatroid, RegularMatroid, BinaryMatroid, TernaryMatroid, QuaternaryMatroid
  38. import sage.matroids.utilities
  39. from networkx import NetworkXError
  40.  
  41.  
  42. def MatroidUnion(*matroids):
  43.  
  44.     #Checking if the arguments given are valid
  45.     if len(matroids) < 2:
  46.         raise ValueError("Atleast two arguments expected")
  47.  
  48.     for i in range(len(matroids)):
  49.         if not (isinstance(matroids[i],Matroid) and matroids[i].is_valid()):
  50.             raise ValueError("Argument "+str(i+1)+" doesn't seem to be a matroid")
  51.         # if not (matroids[i].base_ring == ZZ or matroids[i].base_ring().is_field()):
  52.         #   raise NotImplementedError("MatroidUnion is only implemented for fields or integer ring")
  53.  
  54.     #Creating a matroid using the bases of each Matroid
  55.  
  56.     prev_ind_sets = set([])
  57.  
  58.     prev_matroid = matroids[0]
  59.     rank = prev_matroid.rank()
  60.    
  61.  
  62.     for it in prev_matroid.independent_r_sets(rank):
  63.         prev_ind_sets.add(it) #Adding bases of first matroid
  64.  
  65.  
  66.     temp_ind_sets = set([]) #Using set to eliminate duplicates
  67.    
  68.  
  69.     index=1
  70.    
  71.     while index < len(matroids):
  72.         curr_matroid = matroids[index]
  73.         rank = curr_matroid.rank()
  74.         for it in curr_matroid.independent_r_sets(rank):
  75.             for s in prev_ind_sets:
  76.                 n = frozenset(set(s).union(it))
  77.                 temp_ind_sets.add(n)
  78.  
  79.  
  80.         prev_ind_sets=prev_ind_sets.union(temp_ind_sets)
  81.  
  82.  
  83.         index = index + 1
  84.  
  85.     M = Matroid(independent_sets=prev_ind_sets)
  86.     return M
Advertisement
Add Comment
Please, Sign In to add comment