@@ -697,12 +697,12 @@ unsigned StarComplexityGen::starUpperBound(const linkRep& x) const
697697 return min (ub, complementUb);
698698}
699699
700- unsigned StarComplexityGen:: starUpperBoundABC (linkRep x) const
700+ unsigned starUpperBoundABC (linkRep x, const ElemStars& elemStars)
701701{
702702 if (x.empty ()) return 3 ; // intersection of 3 stars is empty.
703703 // Firstly remove those nodes that are full stars
704704 vector<unsigned > fullStars;
705- const unsigned nodes=elemStars.size ();
705+ unsigned nodes=elemStars.size ();
706706 for (unsigned i=0 ; i<nodes; ++i)
707707 {
708708 bool fullStar=true ;
@@ -719,7 +719,7 @@ unsigned StarComplexityGen::starUpperBoundABC(linkRep x) const
719719
720720 AIG aig;
721721 // build the remaining edges into an AIG
722- aig.setInputs (elemStars. size () );
722+ aig.setInputs (nodes );
723723 vector<abc::Abc_Obj_t*> edges;
724724 for (unsigned i=0 ; i<nodes; ++i)
725725 for (unsigned j=0 ; j<i; ++j)
@@ -728,19 +728,40 @@ unsigned StarComplexityGen::starUpperBoundABC(linkRep x) const
728728 abc::Abc_Obj_t* graphRemainder=edges[0 ];
729729 for (size_t i=1 ; i<edges.size (); ++i)
730730 graphRemainder=&aig.addOr (*graphRemainder, *edges[i]);
731+ assert (aig.numGates ()==2 *edges.size ()-1 );
731732 aig.addOutputs (*graphRemainder);
733+ assert (aig.eval (elemStars)==x);
732734 aig.cleanup ();
733- for (unsigned i=0 ; i<3 ; ++i)
735+ assert (aig.eval (elemStars)==x);
736+ for (unsigned i=0 ; i<100 ; ++i)
734737 {
738+ auto prevNumGates=aig.numGates ();
739+ for (unsigned i=0 ; i<3 ; ++i)
740+ {
741+ aig.balance ();
742+ assert (aig.eval (elemStars)==x);
743+ aig.rewrite ();
744+ assert (aig.eval (elemStars)==x);
745+ aig.refactor ();
746+ assert (aig.eval (elemStars)==x);
747+ }
735748 aig.balance ();
736- aig.rewrite ();
737- aig.refactor ();
749+ assert (aig.eval (elemStars)==x);
750+ aig.rewrite (true ); // final zero-cost pass
751+ assert (aig.eval (elemStars)==x);
752+ if (aig.numGates ()==prevNumGates) break ; // terminate on no improvement
738753 }
739- aig.balance ();
740- aig.rewrite (true ); // final zero-cost pass
741754 return fullStars.size ()+aig.numGates ()+1 ;
742755}
743756
757+ unsigned StarComplexityGen::starUpperBoundABC (const linkRep& x) const
758+ {
759+ unsigned ub=::starUpperBoundABC (x, elemStars);
760+ unsigned complementUb=::starUpperBoundABC ((~x).maskOut (elemStars.size ()), elemStars);
761+ assert (ub>0 && complementUb>0 );
762+ return min (ub, complementUb);
763+ }
764+
744765GraphComplexity StarComplexityGen::randomERGraph (unsigned nodes, unsigned links)
745766{
746767 linkRep g=0 ;
0 commit comments