package ch.epfl.data.squall.thetajoin.matrix_assignment;
import java.io.Serializable;
import java.util.Comparator;
/**
* The cost model to compare two different partitioning results. In this case, we consider both computation cost and communication cost
*/
class CombineCost implements Comparator<Assignment>, Serializable {
private CommCost c1 = new CommCost();
private CompCost c2 = new CompCost();
@Override
public int compare(Assignment o1, Assignment o2) {
if (c1.compare(o1, o2) >= 0 && c2.compare(o1, o2) >= 0) return 1;
else return 0;
}
}
/**
* Computation cost: the number of joins each machine has to process
*/
class CompCost implements Comparator<Assignment>, Serializable {
private double computationCost(long[] sizes, int[] rd) {
double cost = 1;
for (int i = 0; i < sizes.length; i++) {
cost *= ((double) sizes[i] / rd[i]);
}
return cost;
}
@Override
public int compare(Assignment o1, Assignment o2) {
return -Double.compare(computationCost(o1.sizes, o1.rd), computationCost(o2.sizes, o2.rd));
}
}
/**
* Communication cost: the number of tuples each machine receives
*/
class CommCost implements Comparator<Assignment>, Serializable {
private double communicationCost(long[] sizes, int[] rd) {
double cost = 0;
for (int i = 0; i < sizes.length; i++) {
cost += ((double) sizes[i] / rd[i]);
}
return cost;
}
@Override
public int compare(Assignment o1, Assignment o2) {
return -Double.compare(communicationCost(o1.sizes, o1.rd), communicationCost(o2.sizes, o2.rd));
}
}
/**
* A partitioning solution
*/
class Assignment implements Serializable{
int[] rd;
long[] sizes;
public Assignment (long[] _sizes, int[] _rd){
rd = _rd;
sizes = _sizes;
}
}