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;