package es.tid.pce.computingEngine.algorithms;
public class CPLEXOptimizedPathComputing{}
//FIXME: Class not working, uncomment to fix it
//package tid.pce.computingEngine.algorithms;
//
//import java.net.Inet4Address;
//import java.util.Hashtable;
//import java.util.Iterator;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import org.jgrapht.graph.SimpleDirectedWeightedGraph;
//
//import tid.pce.computingEngine.ComputingRequest;
//import tid.pce.computingEngine.ComputingResponse;
//import tid.pce.pcep.constructs.Request;
//import tid.pce.pcep.constructs.Response;
//import tid.pce.pcep.objects.EndPointsIPv4;
//import tid.pce.pcep.objects.NoPath;
//import tid.pce.pcep.objects.ObjectParameters;
//import tid.pce.pcep.objects.RequestParameters;
//import tid.pce.pcep.objects.tlvs.NoPathTLV;
//import tid.pce.tedb.IntraDomainEdge;
//import tid.pce.tedb.SimpleTEDB;
//import tid.pce.tedb.TEDB;
//
//public class CPLEXOptimizedPathComputing implements ComputingAlgorithm{
//
// private SimpleDirectedWeightedGraph<O,IntraDomainEdge> networkGraph;
// private Logger log=LoggerFactory.getLogger("PCEServer");
// private ComputingRequest pathReq;
//
// public CPLEXOptimizedPathComputing(ComputingRequest pathReq,TEDB ted ){
// this.networkGraph=((SimpleTEDB)ted).getDuplicatedNetworkGraph();
// this.pathReq=pathReq;
// }
//
//
//
// public ComputingResponse call(){
// ComputingResponse m_resp=new ComputingResponse();
//
// log.info("CPLEX OPTIMIZED Processing SVEC Path Computing Request: "+pathReq.getSvec().toString());
// Iterator<IntraDomainEdge> iteIDE=networkGraph.edgeSet().iterator();
// Hashtable<IntraDomainEdge,Integer> htIDE=new Hashtable<IntraDomainEdge,Integer>();
// Hashtable<Integer,IntraDomainEdge> htIDE2=new Hashtable<Integer,IntraDomainEdge>();
// int kk=0;
// while (iteIDE.hasNext()){
// IntraDomainEdge ie=iteIDE.next();
// System.out.println("El link "+ie.getSource()+" a "+ie.getTarget()+" es el "+kk);
// htIDE.put(ie,new Integer(kk));
// htIDE2.put(new Integer(kk), ie);
// kk=kk+1;
// }
//
// try {
// IloCplex model = new IloCplex();
// int numEdges=networkGraph.edgeSet().size();
// log.info("tama�o de edgeset es "+networkGraph.edgeSet().size());
// IloNumVar[] flowVars;
// int numRequests=pathReq.getSvec().getSvec().getRequestIDlist().size();
// int numVars=numRequests*numEdges;
// System.out.println("Hay "+numVars+" vars");
// flowVars=model.boolVarArray(numVars);
// log.info("Hay "+numRequests+" requests");
// for (int i=0;i<numRequests;++i){
// Request req=pathReq.getRequestList().get(i);
// long reqId=req.getRequestParameters().getRequestID();
// RequestParameters rp = new RequestParameters();
// rp.setRequestID(reqId);
// Response response=new Response();
// response.setRequestParameters(rp);
//
// EndPointsIPv4 ep=(EndPointsIPv4) req.getEndPoints();
// Inet4Address source_router_id_addr=ep.getSourceIP();
// System.out.println("Source: "+source_router_id_addr);
// Inet4Address dest_router_id_addr=ep.getDestIP();
// System.out.println("Destination: "+dest_router_id_addr);
// //flowVars[i]=model.boolVarArray(networkGraph.edgeSet().size());
// Iterator<Inet4Address> ite=networkGraph.vertexSet().iterator();
// while (ite.hasNext()){
// Inet4Address add=ite.next();
// int num_edges_inc=networkGraph.incomingEdgesOf(add).size() ;
// int num_edges_out=networkGraph.outgoingEdgesOf(add).size() ;
// IloNumVar[] xx1=new IloNumVar[num_edges_inc+num_edges_out];
// Iterator<IntraDomainEdge> iteIDE2 =networkGraph.outgoingEdgesOf(add).iterator();
// int jj=0;
// while (iteIDE2.hasNext()){
// int linkindex=htIDE.get(iteIDE2.next()).intValue();
// System.out.println("El "+linkindex+" sale, y es la "+jj);
// xx1[jj]=flowVars[i*numEdges+linkindex];
// jj=jj+1;
// }
// iteIDE2 =networkGraph.incomingEdgesOf(add).iterator();
// while (iteIDE2.hasNext()){
// int pp=htIDE.get(iteIDE2.next()).intValue();
// System.out.println("El "+pp+" entray es la "+jj);
// xx1[jj]=flowVars[i*numEdges+pp];
// jj=jj+1;
// }
// double[] vals1=new double[num_edges_inc+num_edges_out];
// for (int j=0;j<num_edges_out;++j){
// vals1[j]=1;
// }
// for (int j=0;j<num_edges_inc;++j){
// vals1[j+num_edges_out]=-1;
// }
//
// if (add.equals(source_router_id_addr)){
// System.out.println(add+ " es el origen");
// model.addEq(model.scalProd(xx1,vals1),1);
// }
// else if (add.equals(dest_router_id_addr)){
// System.out.println(add+ " es el destino");
// model.addEq(model.scalProd(xx1,vals1),-1);
// }
// else {
// System.out.println(add+ " es intermedio");
// model.addEq(model.scalProd(xx1,vals1),0);
// }
// }
//
//
//
//
// }
// int vals3[]=new int[numEdges*numRequests];
// for (int j=0;j<vals3.length;++j){
// vals3[j]=1;
// }
// model.addMinimize(model.scalProd(flowVars,vals3));
//
// if ( model.solve() ) {
// double xx[] = model.getValues(flowVars);
// for (int hhh=0;hhh<xx.length;++hhh){
// log.info("xx["+hhh+"] vale "+xx[hhh]);
// }
//
// }
// for (int i=0;i<pathReq.getSvec().getSvec().getRequestIDlist().size();++i){
// Request req=pathReq.getRequestList().get(i);
// long reqId=req.getRequestParameters().getRequestID();
// RequestParameters rp = new RequestParameters();
// rp.setRequestID(reqId);
// Response response=new Response();
// response.setRequestParameters(rp);
// NoPath noPath= new NoPath();
// noPath.setNatureOfIssue(ObjectParameters.NOPATH_NOPATH_SAT_CONSTRAINTS);
// NoPathTLV noPathTLV=new NoPathTLV();
// noPath.setNoPathTLV(noPathTLV);
// response.setNoPath(noPath);
// m_resp.addResponse(response);
// }
//
// } catch (IloException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//
//// if (pathReq.getSvec().islDiverseBit()|pathReq.getSvec().isnDiverseBit()| pathReq.getSvec().issRLGDiverseBit()){
//// log.info("Diverse Path Computation");
//// for (int i=0;i<pathReq.getSvec().getRequestIDlist().size();++i){
//// Request req=pathReq.getRequestList().get(i);
//// long reqId=req.getRequestParameters().getRequestID();
//// RequestParameters rp = new RequestParameters();
//// rp.setRequestID(reqId);
//// Response response=new Response();
//// response.setRequestParameters(rp);
////
//// EndPointsIPv4 ep=(EndPointsIPv4) req.getEndPoints();
//// Inet4Address source_router_id_addr=ep.getSourceIP();
//// log.info("Source: "+source_router_id_addr);
//// Inet4Address dest_router_id_addr=ep.getDestIP();
//// log.info("Destination: "+dest_router_id_addr);
//// if (!((networkGraph.containsVertex(source_router_id_addr))&&(networkGraph.containsVertex(dest_router_id_addr)))){
//// log.warn("Source or destination are NOT in the TED");
//// NoPath noPath= new NoPath();
//// noPath.setNatureOfIssue(ObjectParameters.NOPATH_NOPATH_SAT_CONSTRAINTS);
//// NoPathTLV noPathTLV=new NoPathTLV();
//// if (!((networkGraph.containsVertex(source_router_id_addr)))){
//// log.finest("Unknown source");
//// noPathTLV.setUnknownSource(true);
//// }
//// if (!((networkGraph.containsVertex(dest_router_id_addr)))){
//// log.finest("Unknown destination");
//// noPathTLV.setUnknownDestination(true);
//// }
////
//// noPath.setNoPathTLV(noPathTLV);
//// response.setNoPath(noPath);
//// m_resp.addResponse(response);
//// }
//// else {
//// log.info("Computing path");
//// long tiempoini =System.currentTimeMillis();
//// DijkstraShortestPath<Inet4Address,IntraDomainEdge> dsp=new DijkstraShortestPath<Inet4Address,IntraDomainEdge> (networkGraph, source_router_id_addr, dest_router_id_addr);
//// GraphPath<Inet4Address,IntraDomainEdge> gp=dsp.getPath();
//// long tiempofin =System.currentTimeMillis();
//// long tiempotot=tiempofin-tiempoini;
//// log.info("Ha tardado "+tiempotot+" milisegundos");
//// m_resp.addResponse(response);
//// if (gp==null){
//// log.info("NO PATH FOUND!!!!");
//// NoPath noPath= new NoPath();
//// noPath.setNatureOfIssue(ObjectParameters.NOPATH_NOPATH_SAT_CONSTRAINTS);
//// response.setNoPath(noPath);
////
//// }
//// else {
//// log.info("PATH FOUND!!!!");
//// Path path=new Path();
//// ExplicitRouteObject ero= new ExplicitRouteObject();
//// List<IntraDomainEdge> edge_list=gp.getEdgeList();
//// int j;
//// for (j=0;j<edge_list.size();j++){
//// UnnumberIfIDEROSubobject eroso= new UnnumberIfIDEROSubobject();
//// eroso.setRouterID(edge_list.get(j).getSource());
//// eroso.setInterfaceID(edge_list.get(j).getSrc_if_id());
//// eroso.setLoosehop(false);
//// ero.addEROSubobject(eroso);
//// }
//// IPv4prefixEROSubobject eroso= new IPv4prefixEROSubobject();
//// eroso.setIpv4address(edge_list.get(edge_list.size()-1).getTarget());
//// eroso.setPrefix(32);
//// ero.addEROSubobject(eroso);
//// path.seteRO(ero);
//// response.addPath(path);
//// if (pathReq.getSvec().islDiverseBit()){
//// log.info("Removing edges from graph!");
//// for (j=0;j<edge_list.size();j++){
//// networkGraph.removeEdge(edge_list.get(j));
//// }
////
//// }
//// else if (pathReq.getSvec().issRLGDiverseBit()){
//// log.info("Removing edges (NOW SRLGs are the links) from graph!");
//// for (j=0;j<edge_list.size();j++){
//// networkGraph.removeEdge(edge_list.get(j));
//// }
//// }
//// else {
//// log.info("Removing nodes from graph!");
//// for (j=1;j<edge_list.size();j++){
//// networkGraph.removeVertex(edge_list.get(j).getSource());
//// }
//// }
////
//// }
////
////
//// }
////
////
//// }
//// }else {
//// log.info("Sincronized Path Computation");
//// for (int i=0;i<pathReq.getSvec().getRequestIDlist().size();++i){
//// Request req=pathReq.getRequestList().get(i);
//// long reqId=req.getRequestParameters().getRequestID();
//// RequestParameters rp = new RequestParameters();
//// rp.setRequestID(reqId);
//// Response response=new Response();
//// response.setRequestParameters(rp);
//// EndPointsIPv4 ep=(EndPointsIPv4) req.getEndPoints();
//// Inet4Address source_router_id_addr=ep.getSourceIP();
//// log.info("Source: "+source_router_id_addr);
//// Inet4Address dest_router_id_addr=ep.getDestIP();
//// log.info("Destination: "+dest_router_id_addr);
//// if (!((networkGraph.containsVertex(source_router_id_addr))&&(networkGraph.containsVertex(dest_router_id_addr)))){
//// log.warn("Source or destination are NOT in the TED");
//// NoPath noPath= new NoPath();
//// noPath.setNatureOfIssue(ObjectParameters.NOPATH_NOPATH_SAT_CONSTRAINTS);
//// NoPathTLV noPathTLV=new NoPathTLV();
//// if (!((networkGraph.containsVertex(source_router_id_addr)))){
//// log.finest("Unknown source");
//// noPathTLV.setUnknownSource(true);
//// }
//// if (!((networkGraph.containsVertex(dest_router_id_addr)))){
//// log.finest("Unknown destination");
//// noPathTLV.setUnknownDestination(true);
//// }
////
//// noPath.setNoPathTLV(noPathTLV);
//// response.setNoPath(noPath);
//// m_resp.addResponse(response);
//// }
//// else {
//// log.info("Computing path");
//// long tiempoini =System.currentTimeMillis();
//// DijkstraShortestPath<Inet4Address,IntraDomainEdge> dsp=new DijkstraShortestPath<Inet4Address,IntraDomainEdge> (networkGraph, source_router_id_addr, dest_router_id_addr);
//// GraphPath<Inet4Address,IntraDomainEdge> gp=dsp.getPath();
//// long tiempofin =System.currentTimeMillis();
//// long tiempotot=tiempofin-tiempoini;
//// log.info("Ha tardado "+tiempotot+" milisegundos");
//// m_resp.addResponse(response);
//// if (gp==null){
//// log.info("NO PATH FOUND!!!!");
//// NoPath noPath= new NoPath();
//// noPath.setNatureOfIssue(ObjectParameters.NOPATH_NOPATH_SAT_CONSTRAINTS);
//// response.setNoPath(noPath);
//// }
//// else {
//// log.info("PATH FOUND!!!!");
//// Path path=new Path();
//// ExplicitRouteObject ero= new ExplicitRouteObject();
//// List<IntraDomainEdge> edge_list=gp.getEdgeList();
//// int j;
//// for (j=0;j<edge_list.size();j++){
//// System.out.println("edge "+j);
//// System.out.println("size es "+edge_list.size());
//// System.out.println("src es "+edge_list.get(j));
//// UnnumberIfIDEROSubobject eroso= new UnnumberIfIDEROSubobject();
//// eroso.setRouterID(edge_list.get(j).getSource());
//// eroso.setInterfaceID(edge_list.get(j).getSrc_if_id());
//// eroso.setLoosehop(false);
//// ero.addEROSubobject(eroso);
//// }
//// IPv4prefixEROSubobject eroso= new IPv4prefixEROSubobject();
//// eroso.setIpv4address(edge_list.get(edge_list.size()-1).getTarget());
//// eroso.setPrefix(32);
//// ero.addEROSubobject(eroso);
//// path.seteRO(ero);
//// response.addPath(path);
////
//// }
//// }
//// }
//// }
// return m_resp;
// }
//
//
//
// @Override
// public AlgorithmReservation getReserv() {
// // TODO Auto-generated method stub
// return null;
// }
//
//
//
//}