Added new optimisation criteria versionchanged that represent the number
of installed packages that have been changed.
As such, we have now changed = removed + new + versionchanged
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
index 9abdeff..3d50796 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
@@ -12,9 +12,11 @@
import java.util.*;
import org.eclipse.equinox.p2.cudf.metadata.InstallableUnit;
import org.eclipse.equinox.p2.cudf.query.QueryableArray;
+import org.sat4j.core.Vec;
import org.sat4j.pb.tools.LexicoHelper;
import org.sat4j.pb.tools.WeightedObject;
import org.sat4j.specs.ContradictionException;
+import org.sat4j.specs.IVec;
public abstract class OptimizationFunction {
protected Map slice;
@@ -23,6 +25,7 @@
protected LexicoHelper dependencyHelper;
protected List removalVariables = new ArrayList();
protected List changeVariables = new ArrayList();
+ protected List versionChangeVariables = new ArrayList();
protected List nouptodateVariables = new ArrayList();
protected List newVariables = new ArrayList();
protected List unmetVariables = new ArrayList();
@@ -64,6 +67,39 @@
}
}
+ protected void versionChanged(List weightedObjects, BigInteger weight, InstallableUnit metaIu) {
+ Set s = slice.entrySet();
+ for (Iterator iterator = s.iterator(); iterator.hasNext();) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ if (entry.getKey() == metaIu.getId())
+ continue;
+ Collection versions = ((HashMap) entry.getValue()).values();
+ boolean installed = false;
+ IVec<InstallableUnit> changed = new Vec<InstallableUnit>(versions.size());
+ for (Iterator iterator2 = versions.iterator(); iterator2.hasNext();) {
+ InstallableUnit iu = (InstallableUnit) iterator2.next();
+ installed = installed || iu.isInstalled();
+ if (!iu.isInstalled()) {
+ changed.push(iu);
+ }
+ }
+ if (installed) {
+ Object[] changedarray = new Object[changed.size()];
+ changed.copyTo(changedarray);
+ try {
+ Projector.AbstractVariable abs = new Projector.AbstractVariable(entry.getKey().toString());
+ versionChangeVariables.add(abs);
+ // abs <=> iuv1 or not iuv2 or ... or not iuvn
+ dependencyHelper.or("OPT3", abs, changedarray);
+ weightedObjects.add(WeightedObject.newWO(abs, weight));
+ } catch (ContradictionException e) {
+ // should not happen
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
protected void changed(List weightedObjects, BigInteger weight, InstallableUnit metaIu) {
Set s = slice.entrySet();
for (Iterator iterator = s.iterator(); iterator.hasNext();) {
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
index a805c02..e7e4be6 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
@@ -42,6 +42,9 @@
weightedObjects.clear();
optional(weightedObjects, criteria[i].startsWith("+") ? currentWeight.negate() : currentWeight, metaIu);
currentWeight = currentWeight.divide(weight);
+ } else if (criteria[i].endsWith("versionchanged")) {
+ weightedObjects.clear();
+ versionChanged(weightedObjects, criteria[i].startsWith("+") ? currentWeight.negate() : currentWeight, metaIu);
} else if (criteria[i].endsWith("changed")) {
weightedObjects.clear();
changed(weightedObjects, criteria[i].startsWith("+") ? currentWeight.negate() : currentWeight, metaIu);
@@ -138,6 +141,20 @@
System.out.println("# Not installed recommended packages: " + proof);
continue;
}
+ if (criteria[i].endsWith("versionchanged")) {
+ proof.clear();
+ counter = 0;
+ for (int j = 0; j < versionChangeVariables.size(); j++) {
+ Object var = versionChangeVariables.get(j);
+ if (dependencyHelper.getBooleanValueFor(var)) {
+ counter++;
+ proof.add(var.toString().substring(18));
+ }
+ }
+ System.out.println("# " + criteria[i] + " criteria value: " + counter);
+ System.out.println("# Packages with version change: " + proof);
+ continue;
+ }
if (criteria[i].endsWith("changed")) {
proof.clear();
counter = 0;