set partition question
Arnaud Delobelle
arnodel at googlemail.com
Tue May 27 03:00:54 EDT 2008
pball.benetech at gmail.com writes:
> I used Arnaud's suggestion with a few minor tweaks, as follows:
>
> #-----
> fset = frozenset
> s0 = fset([1])
> s1 = fset([1,2])
> s2 = fset([2])
>
> # let S be the set of all your sets except s0 (i.e. s1, s2, s3, ...)
> S = set([s1,s2])
>
> # X is the "domain", C is the set of complements in X of elements of
> S
> X = set()
> for s in S:
> X |= s
> print "s0 is ", s0
> print "S is ", S
> print "X is ", X
>
> C = set(fset(X - s) for s in S if fset(X-s))
> print "C is ", C
>
> # Find the "fibers" at each element x of s0.
> # A fiber at x is the set of all s in S or C that contain x
> from collections import defaultdict
> fibers = defaultdict(list)
> for s in S | C:
> for x in s & s0:
> fibers[x].append(s)
> print "fibers are ", fibers
>
> # Find the "seeds" at each x in s0.
> # A seed at x is the set of all elements contained in all s in the
> fiber at x.
> # Intutively, a seed at x is the smallest set containing x that can
> be
> # built from S
> seeds = set()
> for F in fibers.itervalues():
> seeds &= set(F)
Change this to:
seeds = []
for F in fibers.itervalues():
seed = X
for f in F:
seed &= f
seeds.append(seed)
And the whole thing should work
HTH
> print 'seeds are ', seeds
>
> # Now we know if there is a solution:
> sol = set()
> for s in seeds:
> sol |= s
> if sol != s0:
> print "No solution"
> else:
> print "Solution: union(intersection(fibers[x]) for x in s0)"
> #-----
>
> yields this:
>
> s0 is frozenset([1])
> S is set([frozenset([1, 2]), frozenset([2])])
> X is set([1, 2])
> C is set([frozenset([1])])
> fibers are defaultdict(<type 'list'>, {1: [frozenset([1, 2]),
> frozenset([1])]})
> seeds are set([])
> No solution
>
>
> I follow your logic up to the point of the "seeds," where I get a bit
> confused. Thanks much! for the idea, I'm going to keep thinking about
> it. Any other ideas are *most* welcome. -- PB.
--
Arnaud
More information about the Python-list
mailing list