1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/*******************************************************/
/* CUDF solver: cudf_reduction.c */
/* Implementation of problem reductions */
/* (c) Claude Michel I3S (UNSA-CNRS) 2009,2010,2011 */
/*******************************************************/
#include <cudf_reductions.h>
#include <list>
vector<CUDFPropertiesIterator> process_properties; // set of property to process
// Add the virtual package of a vpkglist to the reduced problem
void add_vpkgs_from_vpkglist(list<CUDFVirtualPackage *> &lvpkg, CUDFVpkgList *vpkglist) {
for (CUDFVpkgListIterator ivpkg = vpkglist->begin(); ivpkg != vpkglist->end(); ivpkg++) {
CUDFVirtualPackage *vpkg = (*ivpkg)->virtual_package;
if ((vpkg != (CUDFVirtualPackage *)NULL) && (! vpkg->in_reduced)) lvpkg.push_back(vpkg);
}
}
// Process a vpkgformula (from a depends) adding the related virtual packages to the new problem
void add_vpkgs_from_vpkgformula(list<CUDFVirtualPackage *> &lvpkg, CUDFVpkgFormula *vpkgf) {
for (CUDFVpkgFormulaIterator anddeps = vpkgf->begin(); anddeps != vpkgf->end(); anddeps++)
add_vpkgs_from_vpkglist(lvpkg, *anddeps);
}
// Add a package to the reduced problem
void process_package(CUDFproblem *new_pb, list<CUDFVirtualPackage *> &lvpkg, CUDFVersionedPackage *pkg) {
if (! pkg->in_reduced) {
pkg->in_reduced = true;
new_pb->all_packages->push_back(pkg);
if (pkg->installed)
new_pb->installed_packages->push_back(pkg);
else
new_pb->uninstalled_packages->push_back(pkg);
if (! pkg->virtual_package->in_reduced) lvpkg.push_back(pkg->virtual_package);
if (pkg->depends != (CUDFVpkgFormula *)NULL) add_vpkgs_from_vpkgformula(lvpkg, pkg->depends);
// process properties
for (vector<CUDFPropertiesIterator>::iterator prop = process_properties.begin(); prop != process_properties.end(); prop++)
for (CUDFPropertyValueListIterator propval = pkg->properties.begin(); propval != pkg->properties.end(); propval++)
if ((*propval)->property == (*prop)->second)
switch((*prop)->second->type_id) {
case pt_vpkg:
case pt_veqpkg:
{
CUDFVirtualPackage *vpkg = (*propval)->vpkg->virtual_package;
if (! vpkg->in_reduced) lvpkg.push_back(vpkg);
}
break;
case pt_vpkglist:
case pt_veqpkglist:
add_vpkgs_from_vpkglist(lvpkg, (*propval)->vpkglist);
break;
case pt_vpkgformula:
add_vpkgs_from_vpkgformula(lvpkg, (*propval)->vpkgformula);
break;
default:
break;
}
}
}
// process the virtual package vpkg adding its packages to the reduced problem
void process_vpackage(CUDFproblem *new_pb, list<CUDFVirtualPackage *> &lvpkg, CUDFVirtualPackage *vpkg) {
if (! vpkg->in_reduced) {
vpkg->in_reduced = true;
new_pb->all_virtual_packages->push_back(vpkg);
if (vpkg->all_versions.size() > 0) // all versions
for (CUDFVersionedPackageSetIterator ipkg = vpkg->all_versions.begin(); ipkg != vpkg->all_versions.end(); ipkg++)
process_package(new_pb, lvpkg, (*ipkg));
if (vpkg->providers.size() > 0) // providers
for (CUDFProviderListIterator ipkg = vpkg->providers.begin(); ipkg != vpkg->providers.end(); ipkg++)
process_package(new_pb, lvpkg, (*ipkg));
if (vpkg->versioned_providers.size() > 0) // versioned providers
for (CUDFVersionedProviderListIterator ipkg = vpkg->versioned_providers.begin(); ipkg != vpkg->versioned_providers.end(); ipkg++)
for (CUDFProviderListIterator kpkg = ipkg->second.begin(); kpkg != ipkg->second.end(); kpkg++)
process_package(new_pb, lvpkg, (*kpkg));
}
}
// Do compute a reduced version of the problem
CUDFproblem *compute_reduced_CUDF(CUDFproblem *problem) {
list<CUDFVirtualPackage *> lvpkg;
CUDFproblem *new_pb = new CUDFproblem();
if (verbosity > 0)
PRINT_OUT("Initial size: %" CUDFsizet"u packages (%" CUDFsizet"u installed, %" CUDFsizet"u uninstalled), %" CUDFsizet"u virtual packages\n",
problem->all_packages->size(), problem->installed_packages->size(), problem->uninstalled_packages->size(),
problem->all_virtual_packages->size());
new_pb->properties = problem->properties;
new_pb->all_packages = new CUDFVersionedPackageList();
new_pb->installed_packages = new CUDFVersionedPackageList();;
new_pb->uninstalled_packages = new CUDFVersionedPackageList();;
new_pb->all_virtual_packages = new CUDFVirtualPackageList();
new_pb->install = problem->install;
new_pb->remove = problem->remove;
new_pb->upgrade = problem->upgrade;
for (CUDFVersionedPackageListIterator ipkg = problem->all_packages->begin(); ipkg != problem->all_packages->end(); ipkg++)
(*ipkg)->in_reduced = false;
for (CUDFVirtualPackageListIterator ipkg = problem->all_virtual_packages->begin(); ipkg != problem->all_virtual_packages->end(); ipkg++)
(*ipkg)->in_reduced = false;
// process all virtual packages of installed versioned packages
for (CUDFVersionedPackageListIterator ipkg = problem->installed_packages->begin(); ipkg != problem->installed_packages->end(); ipkg++)
process_vpackage(new_pb, lvpkg, (*ipkg)->virtual_package);
// add virtual packages from install request
if (problem->install != (CUDFVpkgList *)NULL) add_vpkgs_from_vpkglist(lvpkg, problem->install);
// add virtual packages from upgrade request
if (problem->upgrade != (CUDFVpkgList *)NULL) add_vpkgs_from_vpkglist(lvpkg, problem->upgrade);
// add virtual packages from remove request (the remove might act only on a subset of the version ...)
// the problem only arise when the related packages are not installed in the initial configuration
if (problem->remove != (CUDFVpkgList *)NULL) add_vpkgs_from_vpkglist(lvpkg, problem->remove);
// process pending virtual packages
for (list<CUDFVirtualPackage *>::iterator ivpkg = lvpkg.begin(); ivpkg != lvpkg.end(); ivpkg++)
process_vpackage(new_pb, lvpkg, (*ivpkg));
if (verbosity > 0)
PRINT_OUT("Final size: %" CUDFsizet"u packages (%" CUDFsizet"u installed, %" CUDFsizet"u uninstalled), %" CUDFsizet"u virtual packages\n",
new_pb->all_packages->size(), new_pb->installed_packages->size(), new_pb->uninstalled_packages->size(),
new_pb->all_virtual_packages->size());
// Recompute ranks
{
int rank = 0;
for (CUDFVersionedPackageListIterator ipkg = new_pb->all_packages->begin(); ipkg != new_pb->all_packages->end(); ipkg++, rank++)
(*ipkg)->rank = rank;
rank = 0;
for (CUDFVirtualPackageListIterator ivpkg = new_pb->all_virtual_packages->begin();
ivpkg != new_pb->all_virtual_packages->end(); ivpkg++, rank++)
(*ivpkg)->rank = rank;
}
return new_pb;
}
|