//-----------------------------------------------------#include <stdio.h> #include <stdlib.h> #include <map> #include <list> #include <vector> #include <string> #include <set> #include <algorithm> #include <sstream> using namespace std; extern "C" { #include <bsp.h> } #define Total_Consultas 100 #define BROADCAST 500 void crea_consultas_indice(int n, int largo_max, map<string,list<string> > *indice, vector<string> *consultas ); int TAG=0; class Mensaje { public: int tipo; int id_query; int remitente; int nchars; char buffer[20000]; Mensaje(int _tipo, int _id_query, int _remitente, const char *_str) { tipo = _tipo; id_query = _id_query; remitente = _remitente; nchars = strlen(_str); strcpy(buffer,_str); } Mensaje(){;} }; void bsp_main() { /* set_intersection(indice["casa"].begin(),indice["casa"].end(), indice["auto"].begin(),indice["auto"].end(), iter ); */ bsp_begin( bsp_nprocs() ); int nprocs = bsp_nprocs(); int pid = bsp_pid(); map<string,list<string> > indice; vector<string> consultas; //Carga consultas e indice crea_consultas_indice(Total_Consultas, 256, &indice, &consultas); bsp_sync(); int actual=0; int ssteps=10; int id_query=0; while( ssteps-- > 0 ) { // obtiene consulta nueva. string terminos = consultas[actual%Total_Consultas]; actual++; // prepara el bnroadcast Mensaje *m = new Mensaje(BROADCAST, id_query++, pid, terminos.c_str() ); for(int p=0; p<nprocs; p++) // broadcast bsp_send(p,&TAG,m,sizeof(Mensaje)); delete m; bsp_sync(); // recibe mensajes del broadcast y calcular respuestas locales. int num_mensajes, bytes_mensajes; bsp_qsize( &num_mensajes, &bytes_mensajes) ; Mensaje msg; for(int i=0; i<num_mensajes; i++) { bsp_move( &msg, sizeof(Mensaje) ); // procesa la consulta. // paso 1: recupera cada lista invertida de los terminos de la consulta. char termino[128]; istringstream ist(msg.buffer); set<string> resultado; insert_iterator< set<string, less<string> > > iter(resultado,resultado.begin()); set<string> A,B; if (ist.good()) { ist.getline(termino,128,' '); // recupera lista invertida del "termino" for (list<string> :: iterator it =indice[termino].begin();it!=indice[termino].end();it++) A.insert(*it); if (!ist.good()) continue; ist.getline(termino,128,' '); for (list<string> :: iterator it =indice[termino].begin();it!=indice[termino].end();it++) B.insert(*it); set_intersection(A.begin(),A.end(), B.begin(),B.end(), iter ); } if (resultado.size()==0 ) printf("q=%d resultados= {}\n",msg.id_query); else { printf("q= %d",msg.id_query); for (set<string>:: iterator it=resultado.begin();it!=resultado.end();it++) printf(" %s",(*it).c_str()); printf("\n"); } } } printf("PID TERMINA =%d\n",pid); fflush(stdout); bsp_sync(); bsp_end(); } int main(int argc, char *argv[]) { void bsp_main(); bsp_init(bsp_main,argc,argv); bsp_main(); return 0; } void crea_consultas_indice(int n, int largo_max, map<string,list<string> > *indice, vector<string> *consultas ) { /*Construye consulats y el indice*/ vector<string> palabras; palabras.push_back("casa"); palabras.push_back("arbol"); palabras.push_back("auto"); palabras.push_back("gato"); palabras.push_back("plaza"); palabras.push_back("colegio"); palabras.push_back("persona"); int m=palabras.size(); srand(111); for(int i=0; i<n; i++) { consultas->push_back( palabras[rand()%m]+" " +palabras[rand()%m] ); //printf(" Consultas=%s\n",(*consultas)[i].c_str()); } set <int> insertado; for(int i=0; i<m; i++) { int l = rand()%largo_max+1; insertado.clear(); for(int k=0; k<l; k++) { char str[256]; int id = rand()%1000; sprintf(str,"Doc%d",id); if (insertado.count(id)!=0) continue; insertado.insert(id); (*indice)[palabras[i]].push_back(str); } } }