/** Removes equalities involving only parameters, but starting from a * Polyhedron and its context. * @param P the polyhedron * @param C P's context * @param renderSpace: 0 for the parameter space, =1 for the combined space. * @maxRays Polylib's usual <i>workspace</i>. */ Polyhedron * Polyhedron_Remove_parm_eqs(Polyhedron ** P, Polyhedron ** C, int renderSpace, unsigned int ** elimParms, int maxRays) { Matrix * Eqs; Polyhedron * Peqs; Matrix * M = Polyhedron2Constraints((*P)); Matrix * Ct = Polyhedron2Constraints((*C)); /* if the Minkowski representation is not computed yet, do not compute it in Constraints2Polyhedron */ if (F_ISSET((*P), POL_VALID | POL_INEQUALITIES) && (F_ISSET((*C), POL_VALID | POL_INEQUALITIES))) { FL_INIT(maxRays, POL_NO_DUAL); } Eqs = Constraints_Remove_parm_eqs(&M, &Ct, renderSpace, elimParms); Peqs = Constraints2Polyhedron(Eqs, maxRays); Matrix_Free(Eqs); /* particular case: no equality involving only parms is found */ if (Eqs->NbRows==0) { Matrix_Free(M); Matrix_Free(Ct); return Peqs; } Polyhedron_Free(*P); Polyhedron_Free(*C); (*P) = Constraints2Polyhedron(M, maxRays); (*C) = Constraints2Polyhedron(Ct, maxRays); Matrix_Free(M); Matrix_Free(Ct); return Peqs; } /* Polyhedron_Remove_parm_eqs */
/** extracts the equalities involving the parameters only, try to introduce them back and compare the two polyhedra. Reads a polyhedron and a context. */ int test_Constraints_Remove_parm_eqs(Matrix * A, Matrix * B) { int isOk = 1; Matrix * M, *C, *Cp, * Eqs, *M1, *C1; Polyhedron *Pm, *Pc, *Pcp, *Peqs, *Pint; unsigned int * elimParms; printf("----- test_Constraints_Remove_parm_eqs() -----\n"); M1 = Matrix_Copy(A); C1 = Matrix_Copy(B); M = Matrix_Copy(M1); C = Matrix_Copy(C1); /* compute the combined polyhedron */ Pm = Constraints2Polyhedron(M, maxRays); Pc = Constraints2Polyhedron(C, maxRays); Pcp = align_context(Pc, Pm->Dimension, maxRays); Polyhedron_Free(Pc); Pc = DomainIntersection(Pm, Pcp, maxRays); Polyhedron_Free(Pm); Polyhedron_Free(Pcp); Matrix_Free(M); Matrix_Free(C); /* extract the parm-equalities, expressed in the combined space */ Eqs = Constraints_Remove_parm_eqs(&M1, &C1, 1, &elimParms); printf("Removed equalities: \n"); show_matrix(Eqs); printf("Polyhedron without equalities involving only parameters: \n"); show_matrix(M1); printf("Context without equalities: \n"); show_matrix(C1); /* compute the supposedly-same polyhedron, using the extracted equalities */ Pm = Constraints2Polyhedron(M1, maxRays); Pcp = Constraints2Polyhedron(C1, maxRays); Peqs = align_context(Pcp, Pm->Dimension, maxRays); Polyhedron_Free(Pcp); Pcp = DomainIntersection(Pm, Peqs, maxRays); Polyhedron_Free(Peqs); Polyhedron_Free(Pm); Peqs = Constraints2Polyhedron(Eqs, maxRays); Matrix_Free(Eqs); Matrix_Free(M1); Matrix_Free(C1); Pint = DomainIntersection(Pcp, Peqs, maxRays); Polyhedron_Free(Pcp); Polyhedron_Free(Peqs); /* test their equality */ if (!PolyhedronIncludes(Pint, Pc)) { isOk = 0; } else { if (!PolyhedronIncludes(Pc, Pint)) { isOk = 0; } } Polyhedron_Free(Pc); Polyhedron_Free(Pint); return isOk; } /* test_Constraints_Remove_parm_eqs() */