> I have no idea how to generate the isomorphism types of a functorial > composition, not even inefficiently...
Isomorphim types are equivalence classes. Each structure is a finite object. There are only finitely many objects of a given size. So a stupid algorithm is: isomorphismTypes(s: SetSpecies L): Generator % == generate { empty? s => ... labels: SetSpecies L := set([first s for x in s]$List(L)); -- (*) s: Set % := [structures labels]; for x in s repeat yield x; } Of course that algorithm needs lots and lots and lots of memory, but theoretically it's simple. You certainly see the dirty trick (*). I basically pretend that something like [1,1,1,1] is a SetSpecies. Which of course is a big lie and really makes me think of going back to the design of having a List as the argument type of "isomorphismTypes" and "structures". After reading Martin's mails several times, I think, he made a good point. There is not only "structures" and "isomorphismTypes". There are many things inbetween. So for the design of AC I would like to propose the following. structures: List L -> Generator % isomorphismTypes: List L -> Generator % with the following interpretation: Let F be a species and U be a list (all elements of the same type L), n=card(U). Then there is a bijection sigma: {1,...,n} -> U. Then structures(U) should return a generator g that generates the elements F[sigma](z) where z runs over all elements of F[{1,...,n}]. If all element of U are distinct, then g generates F[U] where U is considered as a set. If the list U is considered as a multiset then still structures(U) generates card(F[{1,...,n}]) elements. In turn isomorphismTypes(U) returns a generator y that generates only *distinct* elements of F[sigma](z) where z runs over all elements of F[{1,...,n}]. (So this might give fewer elements.) If all element of U are distinct, then y generates F[U] where U is considered as a set. However, contrary to "structures(U)" isomorphismTypes(U) returns isomorphism classes. For unlabelled generation, we apply S_n to form the cosets. So it is basically computing coset representatives of F[{1,...,n}] "modulo S_n". For the intermediate case that Martin is talking about, a multiset just corresponds to a subgroup of S_n. I somehow have the feeling that must have something to do with the cycle indicator series, no? You might now ask, since isomorphismTypes can also generate *all* structures, why would we need both "structures" and "isomorphismTypes"? I don't know exactly, but I somehow have the feeling that "structures" is often easier since there is no need to check for isomorphy/equality. So it would be a little more efficient if such a test need not be done. But maybe this approach also answers Martin's approach of wanting a different representation for the generated isomorphismTypes. I don't think that is necessary. I like more the approach to consider them as coset representatives. What is your opinion? Ralf ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Aldor-combinat-devel mailing list Aldor-combinat-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/aldor-combinat-devel