#include "StdAfx.h" #include "OlvTaskProcess.h" #include "olivia_def.h" #include #include #include "olv_task.h" #define MODULO "OlvTaskProcess" std::string to_string(double& d) { char dig[256]; dig[0]=0; return dig; } //******************************************************************************************************* OlvTaskProcess::OlvTaskProcess(void) { costes.clear(); va_mal=FALSE; angs=NULL; } OlvTaskProcess::~OlvTaskProcess( void ) { costes.clear(); if(angs) { for(int i=0;icalcula_cost_amb_sub(ini,fin,ithr)) mal=TRUE; } //******************************************************************************************************* BOOL OlvTaskProcess::calcula_cost_amb_sub(int amb_ini,int amb_fin, int ith) { int na,i,k; int seg; Djkt_nodo *costes_nodos; BOOL mal=FALSE; //---------------------------------------- //////////////// int na_desp = amb_fin-amb_ini; costes_nodos=NULL; //////////////// FlagsArray visto_ang;//buffer de flags C_log::log(MODULO,"Subthr %ld, Ambs %04d a %04d, numero ambitos totales %ld", ith,amb_ini, amb_fin, info.namb); seg = GetTickCount(); ///////////////////////////////////// //Bucle por cada ámbito de los que le tocan a este thread ///////////////////////////////////// //el coste de un ámbito a sí mismo es el de trabajar ese ámbito, //que es el coste de ir de su conj inicial a la final //na=na_ini; ///////////////////////////////////// for(na=amb_ini;naias[i].ic_ini está almacenado el índice de la conjunción del nodo inicial del ámbito //y en olv_limp->ias[i].ic_fin el del final. Se puede acceder con i directamente al array ias porque //la info asociada está añadida por orden, primero los ámbitos ///////////////////////////////////////////// //calcula el coste máximo del ámbito na a todos los demás //los añade a la fila na de la matriz de costes //es coste máximo porque hace el máximo de: //inicio(na)->inicio(ni), inicio(na)->final(ni), final(na)->inicio(ni), final(na)->final(ni) ///////////////////////////////////////////// //k==0, calcula las distancias del nodo inicial de ese ámbito a todas las demás conjunciones //k==1, calucla las distancias del nodo final for(k=0;kcostes_nodos[ia.get(i,0)].dis) cost_amb[i][na]=costes_nodos[ia.get(i,0)].dis; if(info.KK==OLV_AMB_LIN) { if(cost_amb[i][na]>costes_nodos[ia.get(i,1)].dis) cost_amb[i][na]=costes_nodos[ia.get(i,1)].dis; } } } if(!arch_dj.add_b(costes_nodos, na, k, TRUE)) { C_log::log(MODULO,"Subthr %ld,Error %ld no se ha podido guardar dj iref: %ld k: %ld", ith, GetLastError(),na,k); } } if(mal) break; //avisa de progreso if(((na-amb_ini)%20==0)) { C_log::log(MODULO,"Subthr %ld, Rellenando matriz de dist entre ambs %ld de %ld", ith, (na-amb_ini+1),na_desp); } } if(mal || pirate) { C_log::log(MODULO,"Subthr %ld, Error en cálculo de matriz de distancias entre ámbitos", ith); return FALSE; } C_log::log(MODULO,"Subthr %ld, Fin Matriz de dist entre ambs, %.3f seg", ith, 1.0*(GetTickCount()-seg)/1000); return TRUE; ///////////////////////////////////// } //******************************************************************************************************* BOOL OlvTaskProcess::lee_mats() { //lee archivos de costes, angulos e informacion asociada //si !usa_angs, angs=NULL; BOOL mal=FALSE; CoptiMemo oo(TRUE); C_log::log(MODULO,"Task %ld, Memo disp %I64d",ithr, oo.memo); int nvect=oo.calc_nvect_multi(info.n,info.nthr,sizeof(Djkt_elem_cola)); if(nvect<0) { C_log::log(MODULO,"Task %ld, Error sin memoria al calcular nvect",ithr); goto va_mal; } C_log::log(MODULO,"Task %ld, Calculando con nvect %ld de %ld",ithr, nvect,info.n); //inicializa los arrays costes.inicializa(info.n,info.nthr,nvect); C_log::log(MODULO,"Task %ld, Lee matriz de costes",ithr); if(!costes.leeThread(info.path_cconj,info.ext,info.nthr,FALSE)) //el false es para forzar a que todos sean vect, que no los haga igual que los archivos { C_log::log(MODULO,"Task %ld, Error al leer matriz de costes: %s",ithr, info.path_cconj ); goto va_mal; } C_log::log(MODULO,"Task %ld, Lee matriz de angulos",ithr); if(info.usa_angs) { angs = new Djkt_ang_ady[info.n]; if(!angs) { C_log::log(MODULO,"Task %ld, Error lee_mat sin memoria para %ld Djkt_ang_ady",ithr, info.n); mal=TRUE; } for(int ic=0; ic