//-----------------------------------------------------

Anuncio
//-----------------------------------------------------#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);
}
}
}
Descargar