Commit 305b4904 authored by Alexandre Peres Arias's avatar Alexandre Peres Arias
Browse files

headers e outros


Signed-off-by: Alexandre Peres Arias's avatarAlexandre Peres Arias <apa13@inf.ufpr.br>
parent 925f04ca
Pipeline #6994 failed with stage
in 1 minute and 57 seconds
all:
gcc -o ham knn_hamming.c -std=c99 -lm -Wall -Wno-unused-result -g -O3 -lpthread
gcc knn_hamming.c recomenda.c hamming.c -o ham -std=c99 -lm -Wall -Wno-unused-result -g -O3 -lpthread
#TODO: ajeitar o makefile
#include "hamming.h"
extern inline int *hamming(int **M, int *user ){
//retorna somente o viznho mais parecido
//tentar mesclar mais
/*
extern inline int vizinhos(hamming_str *ham){
int maior=0, sum_i=0, sum_a=1;
for(int i=0; i<K; ++i){
for(int j=i+1;j<K;++j)
if(ham[j].ind == ham[i].ind)
++sum_i;
if(sum_a < sum_i){
sum_a=sum_i;
maior=i;
}
}
return ham[maior].ind;
}
*/
extern int *hamming(int **M, int *user ){
int aval=0, dist=0;
int viz_mais;
int aval=0, dist=0, indx, min;
int *buf;
hamming_str *tmp_hamm;
//qntos items avaliados para esse usuario
......@@ -9,15 +30,31 @@ extern inline int *hamming(int **M, int *user ){
for(int i=0; i<LIN; ++i){
buf = M[i];
dist=0;
for(int j=0; j<COL; ++j) //fazer unroll desse laco
dist += user[j] & buf[j];
tmp_hamm = hamm[i];
for(int k=0; k<K; ++k)
if(dist > tmp_hamm[k].dis){
tmp_hamm[k].dis = dist;
tmp_hamm[k].ind = i;
}
}
min=INT_MAX; indx=0;
for(int k=0; k<K; ++k){
///pega a menor distancia
if(min > tmp_hamm[k].dis){
min = tmp_hamm[k].dis;
indx = k;
}
}
if(dist > min){
tmp_hamm[indx].dis = dist;
tmp_hamm[indx].ind = i;
}
}
return(recomenda(user, tmp_hamm));
}
//criar func q pega os melhores vizinhos
......@@ -11,12 +11,20 @@ typedef struct hamm{
float dis;
} hamming_str;
typedef struct n_it{
int sum;
int ind;
}n_itens;
int N_THREADS,K,DOM;
int LIN,COL;
int LIN,COL,N;
int **dados, **recom;
hamming_str **hamm;
extern inline int **alloc_data(FILE *f, int h);
extern inline void *calc_dist(void *in);
extern inline int* hamming(int **M, int *user);
//extern inline int **alloc_data(FILE *f, int h);
//extern inline void *calc_dist(void *in);
//extern inline int* recomenda(int *user, hamming_str *ham);
#include "hamming.h"
#include "recomenda.h"
// MUDAR DE DIST EUCL PARA DIST COM COSSENOS OU MAHALANOBIS, MELHOR AINDA É DISTANCIA DE HAMMING!!!
// ESQUECER A BASE DE TREINO
......@@ -8,6 +8,8 @@
/*-----------------------------------------------------------------------------
* Aloca as matrizes de teste e treino já guardando seus labels */
extern inline int **alloc_data(FILE *f, int h){
//retirei leitura do label e mudei float para int
//
......@@ -44,11 +46,12 @@ extern inline void *calc_dist(void *in){
int main(int argc, char *argv[]){
if(argc < 3){puts("ERRO ENTRADA");exit(1);}
if(argc < 4){puts("ERRO ENTRADA");exit(1);}
FILE *f1 = fopen(argv[1],"r");
K = atoi(argv[2]); //num de vizinhos para comparação
N_THREADS = atoi(argv[3]);
N = atoi(argv[4]); //# de recomendacoes
if( fscanf(f1,"%d",&LIN) == EOF ) {puts("ERRO DE LEITURA 1"); exit(1);}
if( fscanf(f1,"%d",&COL) == EOF ) {puts("ERRO DE LEITURA 2"); exit(1);}
......@@ -59,7 +62,7 @@ int main(int argc, char *argv[]){
for(int i=0;i<K;++i) hamm[i]=(hamming_str*)malloc(sizeof(hamming_str)*K);
recom = (int**) malloc(sizeof(int*)*LIN);
for(int i=0;i<LIN;++i) recom[i]=(int*)malloc(sizeof(int)*COL);
for(int i=0;i<LIN;++i) recom[i]=(int*)malloc(sizeof(int)*N);
for(int i=0; i<LIN; ++i)
for(int j=0; j<K; ++j) hamm[i][j].dis = 0;
......
#include "recomenda.h"
//dentre os vizinhos similares, seleciona os itens ainda nao avaliados pelo
//usuario que mais aparecem entre os K vizinhos
//futuramente deve ser feita uma análise mais interessante dos itens, talvez
//comarando similaridade entre itens
//
extern int *recomenda( int *user, hamming_str *ham){
int tot;
n_itens *nit; //num de interseccoes entre os likes, botar o min na prim posicao
nit = (n_itens*)malloc(sizeof(n_itens)*N); //N o num de recomendacoes
for(int j=0; j<COL; ++j){
if(user[j]){
tot=0;
for(int k=0; k<K; ++k) tot+=dados[ham[k].ind][j];
if(tot > nit[0].sum){
nit[0].sum = tot; nit[0].ind = j;
//bota min na primeira
ordena_min(nit);
}
}
}
return ordena(nit);
}
inline void ordena_min(n_itens *nit){
int min=nit[0].sum, id = 0;
for(int i=1; i<K;++i)
if(min > nit[i].sum){
min = nit[i].sum;
id=i;
}
//troca min
if(id){
int tmp = nit[id].ind;
nit[id].sum = nit[0].sum;
nit[id].ind = nit[0].ind;
nit[0].sum=min;
nit[0].ind = tmp;
}
}
inline int *ordena(n_itens *nit){
int maior_ind;
int *nit_n;
nit_n = (int*) malloc(sizeof(int)*N);
for(int n=0; n<N; ++n){
maior_ind = nit[0].ind;
for(int i=1; i<K; ++i)
if(nit[maior_ind].sum > nit[i].sum)
maior_ind = i;
nit_n[n] = nit[maior_ind].ind;
nit[maior_ind].sum = 0;
}
free(nit);
return nit_n;
}
extern inline int* recomenda(int *user, hamming_str *ham);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment