import java.util.*; public class MappingTester { // private static double getRhoMax(Operator op, MyArrayList operators) { // int genOpPos = operators.indexOf(op); // Operator genOp = operators.get(genOpPos); // double rhoMax = TopDownTest.rho[genOp.app]; // return rhoMax; // } private static Operator getGenOp(Operator actOp, MyArrayList operators) { int genOpPos = operators.indexOf(actOp); return operators.get(genOpPos); } private static double getRhoMaxOfOperators(Proc proc, MyArrayList operators) { double rhoMax = 0.0; for(Operator op : proc.assignedOperators) { Operator genOp = getGenOp(op, operators); if(CommonFunctions.rho[genOp.app] > rhoMax) rhoMax = CommonFunctions.rho[genOp.app]; } return rhoMax; } private static boolean checkCPUs(ArrayList procs, MyArrayList operators) { double sum, rhoMax; //System.out.println("\nCPU check:"); for(Proc actProc : procs) { sum = 0.0; rhoMax = getRhoMaxOfOperators(actProc, operators); // System.out.println(actProc+":"); for(Operator op : actProc.assignedOperators) { sum += rhoMax * (op.w / actProc.cpu); //System.out.println(op+" takes additional "+(rhoMax * (op.w / actProc.cpu)) // +": rho: "+rhoMax+", w: "+op.w+", cpu: "+actProc.cpu); } //System.out.println("sum: "+sum); if(sum > 1.0) return false; } return true; } public static boolean checkNetworkCards(ArrayList procs, MyArrayList operators) { //System.out.println("\nNetwork card check:"); for(Proc actProc : procs) { double usedBW = 0.0; // System.out.println(actProc+":"); //System.out.println("download of basic objects:"); for(DownloadObjectAssignment ass : actProc.downloads) { usedBW += ass.object.getRate(); //System.out.println("rate for "+ass.object+": "+ass.object.getRate()); } //System.out.println("downloads of objects take: "+usedBW); //System.out.println("downloads of other procs:"); for(Proc proc : procs) { //System.out.println(proc+":"); for(DownloadObjectAssignment ass : proc.downloads) { if(actProc.equals(ass.proc)) { usedBW += ass.object.getRate(); //System.out.println("rate for "+ass.object+": "+ass.object.getRate()); } } } //System.out.println("other procs download for: "+usedBW); //System.out.println("children comms:"); for(Proc proc : procs) { //System.out.println(proc+":"); for(Operator op : actProc.children) if(proc.assignedOperators.containsExactly(op)) { usedBW += op.delta; //System.out.println("delta of "+op+": "+op.delta); } } //System.out.println("children comms: "+usedBW); //System.out.println("parents comms:"); for(Proc proc : procs) { //System.out.println(proc+":"); for(Operator father : actProc.fathers) { if(proc.assignedOperators.containsExactly(father)) { for(Operator child : father.operators) { if(actProc.assignedOperators.containsExactly(child)) { int genOpPos = operators.indexOf(child); Operator genOp = operators.get(genOpPos); // System.out.println("rho[genOp.app]: "+CommonFunctions.rho[genOp.app] // +" ( child.delta: "+child.delta+", actProc.links[proc.id] " // +actProc.links[proc.id]+ "links[proc.id]: "+actProc.links[proc.id]); //System.out.println("actProc: "+actProc+", proc "+proc); usedBW += CommonFunctions.rho[genOp.app] * (child.delta/actProc.links[proc.id]); } } } } } //System.out.println("fathercomms: "+usedBW); if(actProc.bw < usedBW){ //System.out.println("check for "+actProc+" failed. bwUsage: "+ usedBW+", newtorkCard: "+actProc.bw); return false; } } return true; } public static boolean checkFatherCommThrough(ArrayList procs, MyArrayList operators){ double sum; //System.out.println("\ncheck father comm through:"); for(Proc actProc : procs) { sum = 0.0; // System.out.println(actProc+":"); for(Operator father : actProc.fathers) { //System.out.println("father "+father+":"); if(father.procs.size() > 0) { for(Operator op : father.operators) if(actProc.assignedOperators.containsExactly(op)) { int genOpPos = operators.indexOf(op); Operator genOp = operators.get(genOpPos); //System.out.println("father.procs.size() "+father.procs.size()); sum += CommonFunctions.rho[genOp.app] * (genOp.delta/actProc.links[father.procs.get(0).id]); //System.out.println(op+": rho: "+CommonFunctions.rho[genOp.app]+", delta: "+genOp.delta // +", bw: "+actProc.links[father.procs.get(0).id]); } } else { // System.out.println("father "+father+" is not assigned to a proc.\n"+ // "if your heuristic is RANDOM it s OK. this means "+ // "that an op higher in the tree has become a short cut "+ // "via a comm link and the affectations lower in the tree are not needed in this branch"); } } //System.out.println("sum: "+sum); if(sum > 1.0) return false; } return true; } public static boolean checkChildrenCommThrough(ArrayList procs, MyArrayList operators){ double sum; //System.out.println("\ncheck children comm through:"); for(Proc actProc : procs) { sum = 0.0; System.out.println(actProc+":"); for(Operator child : actProc.children) { int genOpPos = operators.indexOf(child); Operator genOp = operators.get(genOpPos); System.out.println(child+": rho: "+CommonFunctions.rho[genOp.app]); System.out.println(child+": delta "+child.delta +" number of procs for op: "+ child.procs.size()); System.out.println(child+": "+child.procs.get(0).id); System.out.println(child+": bw:"+actProc.links[child.procs.get(0).id]); sum += CommonFunctions.rho[genOp.app] * (child.delta / actProc.links[child.procs.get(0).id]); System.out.println(child+": rho: "+CommonFunctions.rho[genOp.app]+", delta "+child.delta+", bw:"+actProc.links[child.procs.get(0).id]); } System.out.println("sum: "+sum); if(sum > 1.0) return false; } return true; } public static boolean checkCommLinks(ArrayList procs, MyArrayList operators){ double usedBW; //System.out.println("\ncheck comm links:"); for(Proc actProc : procs) { for(Proc proc : procs) { //System.out.println(actProc+"-"+proc+":"); usedBW = 0.0; if(!proc.equals(actProc)){ // System.out.println("Comms between "+actProc+" and "+proc+":"); //System.out.println("downloads:"); for(DownloadObjectAssignment ass : actProc.downloads) { if(ass.proc.equals(proc)) { usedBW += ass.object.getRate(); // System.out.println(ass.object+" rate: "+ ass.object.getRate()); } //System.out.println("downloads of objects take: "+usedBW); } //System.out.println("downloads of other procs:"); for(DownloadObjectAssignment ass : proc.downloads) { if(actProc.equals(ass.proc)) { usedBW += ass.object.getRate(); // System.out.println(ass.object+" rate: "+ ass.object.getRate()); } } //System.out.println("other procs download for: "+usedBW); //System.out.println("children comms: "); for(Operator op : actProc.children) if(proc.assignedOperators.containsExactly(op)) { int genOpPos = operators.indexOf(op); Operator genOp = operators.get(genOpPos); usedBW += op.delta * CommonFunctions.rho[genOp.app]; // System.out.println(op+": delta: "+op.delta+", rho: "+CommonFunctions.rho[genOp.app]); } //System.out.println("children comms: "+usedBW); //System.out.println("parents comms:"); for(Operator child : proc.children){ //System.out.println("actOp: "+child); if(actProc.fathers.containsExactly(child)) { //for(Operator op : actProc.fathers) //System.out.println("father "+op); int genOpPos = operators.indexOf(child); Operator genOp = operators.get(genOpPos); //System.out.println("CommonFunctions.rho[genOp.app]: "+CommonFunctions.rho[genOp.app] // +" (child.delta/actProc.links[proc.id] " // +(child.delta/actProc.links[proc.id])+ "links[proc.id]: "+actProc.links[proc.id]); //System.out.println("actProc: "+actProc+", proc "+proc); usedBW += CommonFunctions.rho[genOp.app] * (child.delta/actProc.links[proc.id]); } } //System.out.println("fathercomms: "+usedBW); } if(actProc.links[proc.id] < usedBW){ System.out.println("check for "+actProc+" failed. bwUsage: "+ usedBW+", link to "+proc+": "+actProc.links[proc.id]); return false; } } } return true; } public static boolean verifyMapping(ArrayList procs, MyArrayList operators){ System.out.println("Checking the mapping ..."); boolean cpuCheck = checkCPUs(procs, operators); if(cpuCheck) { System.out.println("* cpu check passed"); boolean networkCardCheck = checkNetworkCards(procs, operators); if(networkCardCheck) { System.out.println("* network card check passed"); boolean fatherCommThroughCheck = checkFatherCommThrough(procs, operators); if(fatherCommThroughCheck) { System.out.println("* father comm through check passed"); boolean childrenCommThroughCheck = checkChildrenCommThrough(procs, operators); if(childrenCommThroughCheck) { System.out.println("* children comm through check passed"); boolean commLinksCheck = checkCommLinks(procs, operators); if(commLinksCheck){ System.out.println("all checks passed"); return true; } else { System.out.println("failed the comm links check"); return false; } } else { System.out.println("failed the children comm through check"); return false; } } else { System.out.println("failed the father comm through check"); return false; } } else { System.out.println("failed the network card check"); return false; } } else { System.out.println("failed the cpu check"); return false; } //return true; } }