package problema.datos;
import com.google.gson.Gson;
import com.sun.javaws.exceptions.InvalidArgumentException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
/**
* Created by Cristiano on 20/07/2015.
*/
public class Datos {
public DatoBasico datosBasicos;
public Punto[] puntos;
public Velocidad[] velocidades;
public LlenadoInicial[] llenados = null;
public float[][] distancias;
public int[][] tiempos;
public int[][] puntosOrdenados = null; //tiene para cada punto, el indice de los puntos, ordenados por distancia
/**
* Carga datos estaticos, los datos de llenado se cargan a parte ya que deben ser cargados por cada instancia.
*
* ** Agregue un booleano para decir si ordenar o no sino al ejecutar 30 veces se hace infinito mas lento!
*/
public static Datos cargarDatos(String pathDatosBasicos, String pathPuntos, String pathVelocidades, String pathDistancias, String pathTiempos) throws FileNotFoundException {
Datos res = new Datos();
try {
res.datosBasicos = DatoBasico.cargar(pathDatosBasicos);
} catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de datos basicos no encontrado.");
}
try{
res.puntos = Punto.cargar(pathPuntos);
}
catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de puntos no encontrado.");
}
try{
res.velocidades = Velocidad.cargar(pathVelocidades);
}
catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de velocidades no encontrado.");
}
try{
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new FileReader(pathDistancias));
res.distancias = gson.fromJson(br, float[][].class);
}
catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de distancias no encontrado.");
}
try{
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new FileReader(pathTiempos));
res.tiempos = gson.fromJson(br, int[][].class);
}
catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de tiempos no encontrado.");
}
return res;
}
public void cargarLlenados(String pathLlenados) throws FileNotFoundException {
try{
this.llenados = LlenadoInicial.cargar(pathLlenados);
}
catch (FileNotFoundException e) {
throw new FileNotFoundException("Archivo de llenados no encontrado.");
}
}
/**
* Helper para cargar datos a partir de argumentos del main
* @return
*/
public static Datos cargarDatosDeArgs(String[] args) throws FileNotFoundException {
if(args.length < 6){
System.out.println("Se necesitan al menos 6 argumentos para datos.");
System.out.println("Path datosBasicos.json");
System.out.println("Path puntos.json");
System.out.println("Path velocidades.json");
System.out.println("Path distancias.json");
System.out.println("Path tiempos.json");
System.out.println("Path instancia.json");
throw new IllegalArgumentException("ERROR: Faltan argumentos");
}
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
System.out.println(args[3]);
System.out.println(args[4]);
System.out.println(args[5]);
Datos datos = Datos.cargarDatos(args[0],args[1],args[2],args[3],args[4]);
datos.cargarLlenados(args[5]);
System.out.println("Total puntos: " + datos.puntos.length);
//*************************
//PARA PROBAR-----------
//ROMPO LOS DATOS, REDUZCO LA CANTIDAD DE DATOS A ALGO CHICO
/**
Datos datos2 = new Datos();
datos2.datosBasicos = new DatoBasico();
int puntosPrueba =100;
datos2.datosBasicos.cantidadCamiones = 8;
datos2.datosBasicos.capacidadCamiones = 10;
datos2.datosBasicos.tiempoRecoleccionContenedor = datos.datosBasicos.tiempoRecoleccionContenedor;
datos2.puntos = new Punto[puntosPrueba];
datos2.velocidades = new Velocidad[puntosPrueba];
datos2.llenados = new LlenadoInicial[puntosPrueba];
datos2.distancias = new float[puntosPrueba][puntosPrueba];
datos2.tiempos = new int[puntosPrueba][puntosPrueba];
for(int i=0; i < puntosPrueba; i++){
datos2.puntos[i] = datos.puntos[i];
datos2.velocidades[i] = datos.velocidades[i];
datos2.llenados[i] = datos.llenados[i];
for(int j = 0; j < puntosPrueba; j++){
datos2.distancias[i][j] = datos.distancias[i][j];
datos2.tiempos[i][j] = datos.tiempos[i][j];
}
}
datos = datos2;
System.out.println("Total puntos prueba: " + datos.puntos.length);
**/
//*************************
return datos;
}
public static int[][] cargarPuntosOrdenados(float[][] distancias){
int[][] res = new int[distancias.length][distancias.length];
for (int i = 0; i < distancias.length ; i++){
res[i] = countingSort(distancias[i]);
}
return res;
}
static int[] countingSort(float[] distancias) {
int[] res = new int[distancias.length];
float max = distancias[0];
for (int i = 0; i < distancias.length; i++) {
res[i] = i; //inicializo el arrray
}
for (int i = 1; i < distancias.length; i++) {
float val = distancias[i];
float temp = res[i];
for (int j = i- 1; j >= 0 && val < distancias[res[j]]; j--) {
int aux = res[j];
res[j] = res[j + 1];
res[j+1]= aux;
}
}
return res;
}
}