package i5.las2peer.services.ocd.algorithms.utils; import java.util.Iterator; import java.util.LinkedList; import org.apache.commons.math3.analysis.function.Pow; import org.apache.commons.math3.linear.ArrayRealVector; import org.apache.commons.math3.linear.RealVector; public class CostFunction { public double value(LinkedList<Cluster> clust, int numbNode){ double res = 0; double tempRes = 0; Similarities sim = new Similarities(); for(Iterator<Cluster> it = clust.iterator(); it.hasNext();){ Cluster curr = it.next(); ArrayRealVector cent = curr.getCentroid(); for(Iterator<Point> iter = curr.getPoints().iterator(); iter.hasNext();){ Point p = iter.next(); tempRes = 1 - sim.cosineSim(cent, p.getCoordinates()); res = res + tempRes; } } res = res / numbNode; return res; } public double valueNode(LinkedList<Cluster> clust, int numbNode){ double res = 0; double tempRes = 0; Similarities sim = new Similarities(); for(Iterator<Cluster> it = clust.iterator(); it.hasNext();){ Cluster curr = it.next(); //ArrayRealVector cent = curr.getCentroid(); for(Iterator<Point> iter = curr.getPoints().iterator(); iter.hasNext();){ Point p1 = iter.next(); for(Iterator<Point> iter1 = curr.getPoints().iterator(); iter1.hasNext();){ Point p2 = iter1.next(); if(!p2.equals(p1)){ tempRes = 1 - sim.cosineSim(p2.getCoordinates(), p1.getCoordinates()); res = res + tempRes; } } } } res = res / numbNode; return res; } public ArrayRealVector derivativeValue(Cluster c){ Pow p = new Pow(); double alpha = 0.0001; ArrayRealVector cent = c.getCentroid(); RealVector tempRes = new ArrayRealVector(cent.getDimension()); RealVector res = new ArrayRealVector(cent.getDimension()); RealVector temp = new ArrayRealVector(cent.getDimension()); double normC = cent.getNorm(); RealVector cDiv = cent.mapDivide(normC); double normPow; for(Iterator<Point> it = c.getPoints().iterator(); it.hasNext();){ Point curr = it.next(); ArrayRealVector coord = curr.getCoordinates(); double normU = coord.getNorm(); normPow = p.value((normU * normC), 2); tempRes = coord.mapMultiply(normU).mapMultiply(normC); temp = coord.ebeMultiply(cent).ebeMultiply(cDiv); tempRes = tempRes.subtract(temp.mapMultiply(normU)); tempRes = tempRes.mapDivide(normPow); res = res.add(tempRes); } return (ArrayRealVector) res.mapMultiply(alpha); } }