Results 1 to 4 of 4
I have this code for parallel implement an Apriori algorithm. This code is written in VC++. I want to change it to C code. Could you please please someone help ...
- 11-29-2011 #1Just Joined!
- Join Date
- Nov 2011
- Posts
- 1
MPI code urgent
I have this code for parallel implement an Apriori algorithm. This code is written in VC++. I want to change it to C code. Could you please please someone help me with this. I tried many times, and I am frustrated.
Code:#include "stdio.h" #include <fstream> #include <iostream> #include "stdlib.h" #include "string.h" #include <iomanip> #include <time.h> #include "mpi.h" struct tItem { int tag; char itemset[15]; int count; struct tItem *next; }; #define LEN sizeof(struct tItem); int GetColNum(char fileName1[]); //¶ÁȡԴÊý¾ÝµÄÁÐÊý int GetRecordNum(char fileName2[]); //¶ÁȡԴÊý¾ÝµÄÐÐÊý int Index(char *List, char c, int ListLength); void GetSourceFile(char fileName[],int recordNum,int colNum); //»ñȡԴÊý¾Ý void FindFrequence1itemsets(char **fullSet1,double sup); void Gen_association_rules(tItem *kf, tItem *p, double minCon); //Éú³É¹ØÁª¹æÔò void SetminSup(); //ÉèÖÃ×îСֵ֧³Ö¶È void SetminCon(); //ÉèÖÃ×îСÖÃÐÅ¶È struct tItem *Find_candidate_1itemsets(char **fullSet2, double sup2,int recordNum,int colNum); //Éú³ÉƵ·±1Ï struct tItem *apriori_gen(tItem *freq); //Éú³ÉºòÑ¡Ï struct tItem *Gen_candidate_itemset(tItem *cp,tItem *cp1,tItem *cp2); //Éú³ÉºóÑ¡Ïî struct tItem *Gen_frequence(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet); //Éú³ÉƵ·±Ï struct tItem *Gen_frequence1(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet); struct tItem *Compute_candidateItem_Num(tItem *c,int recordNum, int colNum, char **fullSet); //¼ÆËãºòÑ¡ÏÖÐÿһÏîµÄ×îС֧³ÖÊý struct tItem *Gen_kFrequence_subsets(tItem *f); //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ struct tItem *SubSet(char *List, int m, char *Buffer, int flag, tItem *fis, int ListLength); //Éú³ÉƵ·±¼¯ÖÐÿһÏîµÄ×Ó¼¯ struct tItem *AddToSubset(char *Buffer, int flag, tItem *fis); //½«Ò»¸ö×Ó¼¯¼ÓÈëÁ´±í struct tItem *Combine_candidate_itemsets(tItem *lc, char rItemset, int rCount); //ºÏ²¢¾Ö²¿ºòÑ¡1Ï³ÉΪ×ܵĺòÑ¡1Ï struct tItem *Combine_candidate_k_itemsets(tItem *lc,tItem *r); bool Has_infrequence_subset(tItem *pp, tItem *f); //ÅжϺòÑ¡kÏµÄ×Ó¼¯ÊÇ·ñÔÚÆµ·±k-1ÏÖÐ bool Is_before_equal(tItem *pp1, tItem *pp2); //ÅжÏÁ½¸öÏîÄ¿¼¯µÄǰk-1ÏîÊÇ·ñÏàͬ static void masterprocess(int rankNum); static void slaveprocess(int rankNum); char **fullSet; int colNum=0; int recordNum=0; double minSup=0.37; double minCon=0.50; int main(int argc,char *argv[]) { int rank,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { //printf("#%d#\n",size); masterprocess(size); } else { slaveprocess(size); } MPI_Finalize(); return(0); } void SetminSup() { cout<<"Please input the minSup: "; cin>>minSup; } void SetminCon() { cout<<"Please input the minCon: "; cin>>minCon; } int GetColNum(char fileName1[]) //¶ÁȡԴÊý¾ÝµÄÁÐÊý { ifstream file(fileName1); char ch; //int colNum=0; while(ch!='\n') { if(ch==',') { colNum++; ch=file.get(); } ch=file.get(); } //colNum++; file.close(); return colNum; } int GetRecordNum(char fileName2[]) //¶ÁȡԴÊý¾ÝµÄÐÐÊý { ifstream file(fileName2); char ch=NULL; //int recordNum=0; while(!file.eof()) { if(ch=='\n') { recordNum++; ch=file.get(); } ch=file.get(); } file.close(); return recordNum; } void GetSourceFile(char fileName[],int rNum,int cNum) //»ñȡԴÊý¾Ý¶ÁÈëÊý×éfullSet[][]ÖÐ { ifstream file(fileName); char ch; //char **fullSet; int item=0; int i=0,j=0; int temp1='A'; int temp2='a'; /*b=(int**)malloc(row*sizeof(int*)); for(i=0;i<row;i++) { b[i]=(int*)malloc(col*sizeof(int)); }*/ fullSet=(char**)malloc(rNum*sizeof(char*)); for(int m=0;m<rNum;m++) { fullSet[m]=(char*)malloc(cNum*sizeof(char)); } while(i<rNum) { while(j<colNum) { if(ch==',') { item++; ch=file.get(); if(ch=='T') { fullSet[i][j]=(char)(item+temp1); //printf("%c",fullSet[i][j]); } if(ch=='F') { fullSet[i][j]=(char)(item+temp2); //printf("%c",fullSet[i][j]); } j++; } ch=file.get(); } //printf("\n"); j=0; ch=file.get(); item=0; i++; } file.close(); } static void masterprocess(int rankNum) { char inputFileName[]="c:\\shujuku.txt"; char *buffer; int colNum,recordNum,blockNum,bound,i,j,m,k; int rank,destRank,tag; double starttime,endtime; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); starttime=MPI_Wtime(); //SetminSup(); //SetminCon(); //printf("#%d#\n",rankNum); colNum=GetColNum(inputFileName); recordNum=GetRecordNum(inputFileName); //system("pause"); printf("recordNum= %d", recordNum); printf("\n"); printf("colNum= %d",colNum); printf("\n"); GetSourceFile(inputFileName,recordNum,colNum); //system("pause"); /*for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c ",fullSet[i][j]); } printf("\n"); }*/ blockNum=recordNum/(rankNum-1); bound=blockNum*(rankNum-1); //printf("%d\n",blockNum); m=0; k=1; destRank=1; tag=1; buffer=(char*)malloc(colNum*sizeof(char*)); while(m!=recordNum) { if(m==(k*blockNum-1)&&(m!=bound-1)) { MPI_Send(&colNum,1,MPI_INT,destRank,100,MPI_COMM_WORLD); MPI_Send(&recordNum,1,MPI_INT,destRank,101,MPI_COMM_WORLD); MPI_Send(&blockNum,1,MPI_INT,destRank,tag,MPI_COMM_WORLD); //printf("%d\n",blockNum); for(i=((k-1)*blockNum);i<k*blockNum;i++) { for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; printf("%c ",buffer[j]); } MPI_Send(buffer,colNum,MPI_CHAR,destRank,tag,MPI_COMM_WORLD); printf("\n"); } printf("\n"); destRank++; tag++; k++; } else if(m==bound-1) { blockNum=recordNum-m-1+blockNum; MPI_Send(&colNum,1,MPI_INT,destRank,100,MPI_COMM_WORLD); MPI_Send(&recordNum,1,MPI_INT,destRank,101,MPI_COMM_WORLD); MPI_Send(&blockNum,1,MPI_INT,destRank,tag,MPI_COMM_WORLD); //MPI_Send(&flag,1,MPI_INT,destRank,102,MPI_COMM_WORLD); //printf("%d\n",blockNum); for(i=bound-blockNum;i<recordNum;i++) { for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; printf("%c ",buffer[j]); } MPI_Send(buffer,colNum,MPI_CHAR,destRank,tag,MPI_COMM_WORLD); printf("\n"); } printf("\n"); } m++; } /*int s,rItemNum; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); s=0; MPI_Recv(&rItemNum,1,MPI_INT,1,1000,MPI_COMM_WORLD,&status); while(s<rItemNum) { for(j=0;j<=5;j++) { MPI_Recv(&r->itemset[j],1,MPI_CHAR,1,1001,MPI_COMM_WORLD,&status); } MPI_Recv(&r->count,1,MPI_INT,1,1002,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,0,1003,MPI_COMM_WORLD,&status); s++; }*/ endtime=MPI_Wtime(); printf("The master process tooks %f seconds.\n",endtime-starttime); printf("\n"); } static void slaveprocess(int rankNum) { int rowNum,recordNum,colNum,tag,stag,rank,destRank,m,i,j; char **fSet,*buffer; double minSup=0.45; double minCon=0.50; double starttime,endtime; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); starttime=MPI_Wtime(); MPI_Recv(&colNum,1,MPI_INT,0,100,MPI_COMM_WORLD,&status); MPI_Recv(&recordNum,1,MPI_INT,0,101,MPI_COMM_WORLD,&status); //printf("%d\n",recordNum); //printf("%d\n",colNum); tag=rank; MPI_Recv(&rowNum,1,MPI_INT,0,tag,MPI_COMM_WORLD,&status); printf("\n"); printf("\n"); printf("The block in rank %d has %d records.\n",rank,rowNum); //MPI_Recv(&flag,1,MPI_INT,0,102,MPI_COMM_WORLD,&status); buffer=(char*)malloc(colNum*sizeof(char*)); fSet=(char**)malloc(rowNum*sizeof(char*)); for(m=0;m<rowNum;m++) { fSet[m]=(char*)malloc(colNum*sizeof(char)); } //½ÓÊÕ½ø³Ì0·¢ËÍÀ´µÄ³õʼ¾ØÕóµÄÒ»¿é for(i=0;i<rowNum;i++) { MPI_Recv(buffer,colNum,MPI_CHAR,0,tag,MPI_COMM_WORLD,&status); for(j=0;j<colNum;j++) { fSet[i][j]=buffer[j]; } } printf("\n"); printf("Rank %d receives part of the matrix is as follow:\n",rank); printf("\n"); for(i=0;i<rowNum;i++) { for(j=0;j<colNum;j++) { printf("%c ",fSet[i][j]); } printf("\n"); } printf("\n"); tItem *c; //¶¨Òå¾Ö²¿ºòÑ¡Ï tItem *cr; //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡¼¯ tItem *p; int count=0,s,rCount,rTag; char rItemset; c=(struct tItem*)malloc(sizeof(struct tItem)); c=Find_candidate_1itemsets(fSet,minSup,rowNum,colNum); destRank=1; stag=1; p=c; while(p!=NULL) { count++; p=p->next; } for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡1Ï { p=c; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,14,MPI_COMM_WORLD); while(p!=NULL) { MPI_Send(&p->itemset[p->tag],1,MPI_CHAR,destRank,15,MPI_COMM_WORLD); MPI_Send(&p->count,1,MPI_INT,destRank,16,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,17,MPI_COMM_WORLD); p=p->next; } } destRank++; stag++; } int reRank=1,reTag=1,itemNum; for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡1Ï { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,14,MPI_COMM_WORLD,&status); while(s<itemNum) { MPI_Recv(&rItemset,1,MPI_CHAR,reRank,15,MPI_COMM_WORLD,&status); MPI_Recv(&rCount,1,MPI_INT,reRank,16,MPI_COMM_WORLD,&status); MPI_Recv(&rTag,1,MPI_INT,reRank,17,MPI_COMM_WORLD,&status); c=Combine_candidate_itemsets(c,rItemset,rCount); //printf(" %c",rItemset); //printf(" %d",rCount); //printf(" %d",rTag); //printf("\n"); s++; } printf("\n"); } reRank++; reTag++; } //Êä³öºÏ²¢ºóµÃµ½µÄÈ«²¿ºòÑ¡1Ï p=c; printf("Now every rank get the whole candidate itemsets as follow:\n\n"); while(p!=NULL) { printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } //ÓɺòÑ¡1ÏÉú³ÉƵ·±1Ï tItem *pp,*fHead,*fp,*temp; int minNum; fp=fHead=(struct tItem*)malloc(sizeof(struct tItem)); minNum=(int)((recordNum*minSup)+1); //printf("%d",minNum); pp=c; while(pp!=NULL) { if(pp->count>minNum) { fHead->count=pp->count; fHead->tag=pp->tag; fHead->itemset[fHead->tag]=pp->itemset[pp->tag]; fHead->next=NULL; break; } pp=pp->next; } fp=fHead; pp=pp->next; while(pp!=NULL) { if(pp->count>minNum) { temp=(struct tItem*)malloc(sizeof(struct tItem)); temp->count=pp->count; temp->next=NULL; temp->tag=pp->tag; temp->itemset[temp->tag]=pp->itemset[pp->tag]; fp->next=temp; fp=temp; //printf("%c",pp->itemset[pp->tag]); } pp=pp->next; } /*printf("\n"); printf("--------The local frequence 1_itemsets--------\n"); fp=fHead; while(fp!=NULL) { printf(" %c",fp->itemset[fp->tag]); printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); fp=fp->next; }*/ tItem *f1,*kFrequence,*kf,*fis,*kfTemp; //kFrequence=(struct tItem*)malloc(sizeof(struct tItem)); f1=(struct tItem*)malloc(sizeof(struct tItem)); //f1=Find_frequence_1itemsets(fullSet,minSup); f1=fHead; //system("pause"); //printf(" %d",rowNum); //printf(" %d*&*&*&\n",colNum); kFrequence=Gen_frequence(f1,rowNum,colNum,minNum,fSet);//¾*¹ýÁ¬½ÓºÍ¼ôÖ¦Éú³É×îÖյįµ·±kÏ i=2; while(i<=5) { kfTemp=Gen_frequence(kFrequence,rowNum,colNum,minNum,fSet); if(kfTemp==NULL) { break; } kFrequence=kfTemp; i++; } //MPI_Barrier(MPI_COMM_WORLD); /*printf("^^^^^^^^^^^^^^^\n"); kf=kFrequence; while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { printf(" %c",kf->itemset[j]); } printf(" %d",kf->count); printf(" %d",kf->tag); printf("\n"); kf=kf->next; } printf("^^^^^^^^^^^^^^^\n");*/ printf("\n"); kf=kFrequence; printf("--------The frequence %d_itemsets--------\n",kf->tag+1); while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { printf(" %c",kf->itemset[j]); } printf(" %d",kf->count); printf(" %d",kf->tag); printf("\n"); kf=kf->next; } printf("\n"); /*kf=kFrequence; int kItemNum=0; while(kf!=NULL) { kItemNum++; kf=kf->next; } kf=kFrequence; if(rank==1) { MPI_Send(&kItemNum,1,MPI_INT,0,1000,MPI_COMM_WORLD); while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { MPI_Send(&kf->itemset[j],1,MPI_CHAR,0,1001,MPI_COMM_WORLD); } MPI_Send(&kf->count,1,MPI_INT,0,1002,MPI_COMM_WORLD); MPI_Send(&kf->tag,1,MPI_INT,0,1003,MPI_COMM_WORLD); kf=kf->next; } }*/ kf=kFrequence; printf("\n\nThe subset of the frequence is:\n\n"); while(kf!=NULL) { fis=Gen_kFrequence_subsets(kf); //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ fis=Compute_candidateItem_Num(fis,rowNum,colNum,fSet); //¼ÆËãÿһ¸ö×Ó¼¯µÄÖ§³Ö¶È /*p=fis; p=p->next; while(p!=NULL) { for(i=0;i<=p->tag;i++) { printf(" %c",p->itemset[i]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ printf("\n\nNow we get the association rules:\n\n"); p=fis; p=p->next; while(p!=NULL) { //printf("\n"); Gen_association_rules(kf,p,minCon); printf("\n"); p=p->next; } kf=kf->next; } endtime=MPI_Wtime(); printf("The slave process %d tooks %f seconds.\n",rank,endtime-starttime); printf("\n"); } struct tItem *Gen_frequence(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet) //Éú³ÉƵ·±Ï { tItem *candidate,*cp,*fp,*fpb,*p,*p1; int i,j,k,m,count=0,rank,rankNum,destRank,stag; //int i,m,n; //char *buffer; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&rankNum); /*printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("##### %d\n",recordNum); printf("##### %d\n",colNum); printf("##### %d\n",minNum); for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c",fullSet[i][j]); } printf("\n"); } p=(struct tItem*)malloc(sizeof(struct tItem)); p=frequence; while(p!=NULL) { printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");*/ //for(k=2;frequence!=NULL;k++) //while(candidate!=NULL) //{ //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); candidate=apriori_gen(frequence); if(candidate!=NULL) { candidate=Compute_candidateItem_Num(candidate,recordNum,colNum,fullSet); destRank=1; stag=1; p=candidate; p1=candidate; while(p!=NULL) { count++; p=p->next; } //printf(" #%d#\n",count); //MPI_Barrier(MPI_COMM_WORLD); for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡kÏ { p=candidate; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,24,MPI_COMM_WORLD); while(p!=NULL) { for(j=0;j<=p->tag;j++) { MPI_Send(&p->itemset[j],1,MPI_CHAR,destRank,25,MPI_COMM_WORLD); } MPI_Send(&p->count,1,MPI_INT,destRank,26,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,27,MPI_COMM_WORLD); p=p->next; } } destRank++; stag++; } //MPI_Barrier(MPI_COMM_WORLD); int reRank=1,reTag=1,itemNum; int rCount,rTag,s; char rItemset; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡kÏ { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,24,MPI_COMM_WORLD,&status); while(s<itemNum) { for(m=0;m<=p1->tag;m++) { MPI_Recv(&r->itemset[m],1,MPI_CHAR,reRank,25,MPI_COMM_WORLD,&status); //printf(" %c",r->itemset[m]); } MPI_Recv(&r->count,1,MPI_INT,reRank,26,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,reRank,27,MPI_COMM_WORLD,&status); candidate=Combine_candidate_k_itemsets(candidate,r); //printf(" %c",rItemset); //printf(" %d",r->count); //printf(" %d",r->tag); //printf("\n"); s++; } //printf("\n"); //printf("&&&&&&&&&&&&&&&&&&&&&\n"); } reRank++; reTag++; } //MPI_Barrier(MPI_COMM_WORLD); /*cp=candidate; count=0; printf("--------The candidate %d_itemsets--------\n",cp->tag+1); while(cp!=NULL) { for(j=0;j<=cp->tag;j++) { printf(" %c",cp->itemset[j]); } printf(" %d",cp->count); printf(" %d",cp->tag); printf("\n"); count++; cp=cp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ //MPI_Barrier(MPI_COMM_WORLD); frequence=candidate; fpb=(struct tItem*)malloc(sizeof(struct tItem)); fp=(struct tItem*)malloc(sizeof(struct tItem)); fpb=frequence; fp=fpb->next; //int minNum=(int)((recordNum*minSup)+1); //printf("########## %d\n",minNum); while(fp!=NULL) //ɾ³ýºóÑ¡ÏÖÐÖ§³Ö¶ÈСÓÚ×îС֧³Ö¶ÈµÄÏîÄ¿£¬Éú³ÉƵ·±Ï { if(fpb->count<minNum) { frequence=fp; fpb=fp; fp=fp->next; } if(fp->count<minNum) { fp=fp->next; fpb->next=fp; } else { fp=fp->next; fpb=fpb->next; } } /*fp=frequence; count=0; printf("--------The frequence %d_itemsets--------\n",fp->tag+1); while(fp!=NULL) { //MPI_Barrier(MPI_COMM_WORLD); for(j=0;j<=fp->tag;j++) { printf(" %c",fp->itemset[j]); } printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); count++; fp=fp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ //MPI_Barrier(MPI_COMM_WORLD); } else { //return (NULL); //break; frequence=NULL; } //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); //MPI_Barrier(MPI_COMM_WORLD); //} return (frequence); } struct tItem *Gen_frequence1(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet) //Éú³ÉƵ·±Ï { tItem *candidate,*cp,*fp,*fpb,*p,*p1; int i,j,k,m,count=0,rank,rankNum,destRank,stag; //int i,m,n; //char *buffer; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&rankNum); //printf("*******************************************\n"); /*printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("##### %d\n",recordNum); printf("##### %d\n",colNum); printf("##### %d\n",minNum); printf("##### %d\n",rank); for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c",fullSet[i][j]); } printf("\n"); } p=(struct tItem*)malloc(sizeof(struct tItem)); p=frequence; while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");*/ //for(k=2;frequence!=NULL;k++) //while(candidate!=NULL) //{ printf("++++++++++++++++++++++++++++++++++++++++++++\n"); candidate=apriori_gen(frequence); /*p=candidate; int t=0; printf("²âÊÔ½á¹û\n"); while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); t++; p=p->next; } printf("Ò»¹²ÓÐ %d\n",t); printf("½áÊø²âÊÔ\n");*/ /*if(rank==2) { printf("!!!!!!\n"); p=candidate; while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } } printf("!!!!!!\n");*/ if(candidate!=NULL) { //printf("!!!!!!\n"); candidate=Compute_candidateItem_Num(candidate,recordNum,colNum,fullSet); destRank=1; stag=1; p=candidate; p1=candidate; while(p!=NULL) { count++; p=p->next; } //printf(" #%d#\n",count); //printf("½øÐе½ÕâÀï\n"); //MPI_Barrier(MPI_COMM_WORLD); for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡kÏ { p=candidate; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,54,MPI_COMM_WORLD); //printf("### %d ###\n",count); while(p!=NULL) { for(j=0;j<=p->tag;j++) { MPI_Send(&p->itemset[j],1,MPI_CHAR,destRank,55,MPI_COMM_WORLD); //printf(" %c",p->itemset[j]); } MPI_Send(&p->count,1,MPI_INT,destRank,56,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,57,MPI_COMM_WORLD); //printf(" %d",p->count); //printf(" %d",p->tag); //printf("\n"); p=p->next; } } destRank++; stag++; } //MPI_Barrier(MPI_COMM_WORLD); int reRank=1,reTag=1,itemNum; int rCount,rTag,s; char rItemset; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡kÏ { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,54,MPI_COMM_WORLD,&status); while(s<itemNum) { for(m=0;m<=p1->tag;m++) { MPI_Recv(&r->itemset[m],1,MPI_CHAR,reRank,55,MPI_COMM_WORLD,&status); //printf(" %c",r->itemset[m]); } MPI_Recv(&r->count,1,MPI_INT,reRank,56,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,reRank,57,MPI_COMM_WORLD,&status); candidate=Combine_candidate_k_itemsets(candidate,r); //printf(" %c",rItemset); //printf(" %d",r->count); //printf(" %d",r->tag); //printf("\n"); s++; } //printf("\n"); printf("&&&&&&&&&&&&&&&&&&&&&\n"); } reRank++; reTag++; } //MPI_Barrier(MPI_COMM_WORLD); cp=candidate; count=0; printf("--------The candidate %d_itemsets--------\n",cp->tag+1); while(cp!=NULL) { for(j=0;j<=cp->tag;j++) { printf(" %c",cp->itemset[j]); } printf(" %d",cp->count); printf(" %d",cp->tag); printf("\n"); count++; cp=cp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n"); //MPI_Barrier(MPI_COMM_WORLD); frequence=candidate; fpb=(struct tItem*)malloc(sizeof(struct tItem)); fp=(struct tItem*)malloc(sizeof(struct tItem)); fpb=frequence; fp=fpb->next; //int minNum=(int)((recordNum*minSup)+1); //printf("########## %d\n",minNum); while(fp!=NULL) //ɾ³ýºóÑ¡ÏÖÐÖ§³Ö¶ÈСÓÚ×îС֧³Ö¶ÈµÄÏîÄ¿£¬Éú³ÉƵ·±Ï { if(fpb->count<minNum) { frequence=fp; fpb=fp; fp=fp->next; } if(fp->count<minNum) { fp=fp->next; fpb->next=fp; } else { fp=fp->next; fpb=fpb->next; } } fp=frequence; count=0; printf("--------The frequence %d_itemsets--------\n",fp->tag+1); while(fp!=NULL) { //MPI_Barrier(MPI_COMM_WORLD); for(j=0;j<=fp->tag;j++) { printf(" %c",fp->itemset[j]); } printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); count++; fp=fp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n"); //MPI_Barrier(MPI_COMM_WORLD); } else { //return (NULL); //break; //frequence=NULL; } //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); //MPI_Barrier(MPI_COMM_WORLD); //} return (frequence); } bool Has_infrequence_subset(tItem *pp, tItem *f) //ÅжϺòÑ¡kÏµÄ×Ó¼¯ÊÇ·ñÔÚÆµ·±k-1ÏÖÐ { tItem *p,*fp; //´¢´æ*ppÖеÄk-1Ïî×Ó¼¯ int i=0,j,m=0; bool flag; while(i<=pp->tag) { p=(struct tItem*)malloc(sizeof(struct tItem)); for(j=0;j<pp->tag;j++) { if(j==i) { j++; } else { p->itemset[j]=pp->itemset[j]; } } fp=f; while(fp!=NULL) { while(m<=fp->tag) { if(p->itemset[m]==fp->itemset[m]) { m++; } else { flag=false; m++; } } flag=true; fp=fp->next; } i++; } return (flag); } struct tItem *Gen_candidate_itemset(tItem *cp,tItem *cp1,tItem *cp2) //Éú³ÉºóÑ¡Ïî { int i=0; while(i<=cp1->tag) { cp->itemset[i]=cp1->itemset[i]; //cp->tag=cp1->tag+1; i++; } cp->tag=cp1->tag+1; cp->itemset[i]=cp2->itemset[i-1]; cp->count=0; cp->next=NULL; return (cp); } bool Is_before_equal(tItem *pp1, tItem *pp2) //ÅжÏÁ½¸öÏîÄ¿¼¯µÄǰk-1ÏîÊÇ·ñÏàͬ { int i=0; bool flag; while(i<pp1->tag) { if(pp1->itemset[i]==pp2->itemset[i]) { flag=true; } else { flag=false; break; } i++; } return (flag); } struct tItem *Compute_candidateItem_Num(tItem *c,int recordNum, int colNum, char **fullSet) //¼ÆËãºòÑ¡ÏÖÐÿһÏîµÄ×îС֧³ÖÊý { tItem *cp; int i,j,m,n; char *buffer; cp=c; while(cp!=NULL) //ͳ¼ÆÃ¿¸öºòÑ¡ÏµÄ¼ÆÊý { for(i=0;i<recordNum;i++) { bool flag=true; buffer=(char*)malloc(colNum*sizeof(char*)); for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; } m=0; while(m<=cp->tag) { bool flag1=false; for(n=0;n<colNum;n++) { if(cp->itemset[m]==buffer[n]) { flag1=true; break; } flag1=false; } if(flag1==false) { flag=false; } m++; } if(flag==true) { cp->count++; } } cp=cp->next; } return (c); } struct tItem *apriori_gen(tItem *freq) //Éú³ÉºòÑ¡Ï { tItem *p1,*p2,*head,*cHead,*p,*pTail; int tag,i=0; //bool flag; if(freq->next!=NULL) { head=freq; p1=head; p2=head; p2=p2->next; p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; if(tag==1)//Éú³ÉºòÑ¡2Ï { //printf("############\n"); while(i<=tag) { if(i<=tag-1) { //p->count=p1->count; p->itemset[i]=p1->itemset[i]; p->tag=tag; } else { //p->count=p2->count; p->itemset[i]=p2->itemset[i-1]; p->tag=tag; } i++; } p->count=0; p->next=NULL; /*printf(" %c",p->itemset[0]); printf(" %c",p->itemset[1]); printf(" %d",p->tag);*/ pTail=p; cHead=p; p2=p2->next; //printf("#%c#",p1->itemset[p1->tag]); while(p1!=NULL) { while(p2!=NULL) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; i=0; while(i<=tag) { if(i<=tag-1) { //p->count=p1->count; p->itemset[i]=p1->itemset[i]; //printf("%c",p->itemset[i]); p->tag=tag; } else { //p->count=p2->count; p->itemset[i]=p2->itemset[i-1]; //printf("%c",p->itemset[i]); p->tag=tag; } i++; } p->count=0; p->next=NULL; //flag=Has_infrequence_subset(cHead,freq); //if(flag==true) //{ pTail->next=p; pTail=p; //} p2=p2->next; } p1=p1->next; p2=p1->next; if(p2==NULL) { break; } } } /*else if(p1->tag==3) { if(Is_before_equal(p1,p2)) { //printf("½øÐе½ÕâÀï\n"); //p=(struct tItem*)malloc(sizeof(struct tItem)); //cHead=(struct tItem*)malloc(sizeof(struct tItem)); //pTail=(struct tItem*)malloc(sizeof(struct tItem)); p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { //while(Is_before_equal(p1,p2)) while(p2!=NULL) { if(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } } //printf("½øÐе½ÕâÀï\n"); p2=p2->next; } p1=p1->next; p2=p1->next; } } //printf("½øÐе½ÕâÀï\n"); }*/ else//Éú³ÉºîÑ¡2ÏÒÔÉϵĺòÑ¡¼¯(±ê¼ÇcHeadʱºòÓÐÎÊÌâ) { /*while(p2!=NULL) { if(Is_before_equal(p1,p2)) { break; } p2=p2->next; }*/ if(Is_before_equal(p1,p2)) { //p=(struct tItem*)malloc(sizeof(struct tItem)); //cHead=(struct tItem*)malloc(sizeof(struct tItem)); //pTail=(struct tItem*)malloc(sizeof(struct tItem)); p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { //while(Is_before_equal(p1,p2)) while(p2!=NULL) { if(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } } p2=p2->next; } p1=p1->next; p2=p1->next; } } else { p1=p1->next; p2=p2->next; p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { while(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } p2=p2->next; } p1=p1->next; p2=p1->next; } //cHead=NULL; } } } else { cHead=NULL; } /*tItem *pp; int j,count=0; pp=cHead; printf("--------The candidate %d_itemsets--------\n",pp->tag+1); while(pp!=NULL) { for(j=0;j<=tag;j++) { printf(" %c",pp->itemset[j]); } printf(" %d",pp->count); printf(" %d",pp->tag); printf("\n"); count++; pp=pp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ return (cHead); } struct tItem *Combine_candidate_k_itemsets(tItem *lc,tItem *r) { tItem *p; int i,j; bool flag,flagj; //printf("**************************\n"); p=lc; while(p!=NULL) { //flag=true; for(i=0;i<=r->tag;i++) { flagj=false; for(j=0;j<=p->tag;j++) { if(p->itemset[j]==r->itemset[i]) { flagj=true; break; } } if(flagj==false) { flag=false; break; } else { flag=true; } } if(flag==true) { p->count=p->count+r->count; break; } p=p->next; } return (lc); } struct tItem *Combine_candidate_itemsets(tItem *lc, char rItemset, int rCount) { tItem *p; p=lc; while(p!=NULL) { if(p->itemset[p->tag]==rItemset) { p->count=p->count+rCount; } p=p->next; } return (lc); } struct tItem *Find_candidate_1itemsets(char **fullSet2, double sup2,int recordNum,int colNum) //Éú³ÉƵ·±1Ï { tItem *cHead,*fHead; tItem *p1,*pHead,*pTail,*p; tItem *fp,*temp,*pp; fp=fHead=(struct tItem*)malloc(sizeof(struct tItem)); int i,j,count=0; bool flag; p=pHead=pTail=(struct tItem*)malloc(sizeof(struct tItem)); cHead=NULL; pHead->tag=0; pHead->itemset[pHead->tag]=fullSet2[0][0]; pHead->count=0; pHead->next=NULL; int minNum=(int)((recordNum*sup2)+1); //printf("%d",minNum); cHead=pHead; for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { p=cHead; while(p!=NULL) { if(p->itemset[p->tag]==fullSet2[i][j]) { p->count++; flag=false; break; } else { pTail=p; p=p->next; flag=true; } } if(flag==true) { p1=(struct tItem*)malloc(sizeof(struct tItem)); p1->tag=0; p1->itemset[p1->tag]=fullSet2[i][j]; p1->count=1; pTail->next=p1; p1->next=NULL; } } } printf("\n"); printf("--------The local candidate 1_itemsets--------\n"); p=cHead; while(p!=NULL) { count++; printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("\n"); printf("In all, there are %d candidate 1_itemsets.\n",count); /*pp=cHead; while(pp!=NULL) { if(pp->count>minNum) { fHead->count=cHead->count; fHead->tag=cHead->tag; fHead->itemset[fHead->tag]=cHead->itemset[cHead->tag]; fHead->next=NULL; break; } pp=pp->next; } fp=fHead; pp=pp->next; while(pp!=NULL) { if(pp->count>minNum) { temp=(struct tItem*)malloc(sizeof(struct tItem)); temp->count=pp->count; temp->next=NULL; temp->tag=pp->tag; temp->itemset[temp->tag]=pp->itemset[pp->tag]; fp->next=temp; fp=temp; //printf("%c",pp->itemset[pp->tag]); } pp=pp->next; } printf("\n"); printf("--------The frequence 1_itemsets--------\n"); fp=fHead; while(fp!=NULL) { printf(" %c",fp->itemset[fp->tag]); printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); fp=fp->next; } return (fHead);*/ return (cHead); } struct tItem *Gen_kFrequence_subsets(tItem *f) //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ { tItem *FreItemSubset; //tItem *p; int ListLength=f->tag+1; int i; //buffer=(int*)malloc(col*sizeof(int*)) char *List,*Buffer; List=(char*)malloc(ListLength*sizeof(char*)); Buffer=(char*)malloc(ListLength*sizeof(char*)); for(i=0;i<f->tag+1;i++) { List[i]=f->itemset[i]; //printf(" %c",List[i]); } FreItemSubset=(struct tItem*)malloc(sizeof(struct tItem)); FreItemSubset->next=NULL; FreItemSubset=SubSet(List,0,Buffer,0,FreItemSubset,ListLength); /*p=FreItemSubset; p=p->next; while(p!=NULL) { for(i=0;i<=p->tag;i++) { printf(" %c",p->itemset[i]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ return (FreItemSubset); } int Index(char *List, char c, int ListLength) { for(int i=0; i<=ListLength-1; i++) { if(c==List[i]) { return i; break; } } return -1; } struct tItem *SubSet(char *List, int m, char *Buffer, int flag, tItem *fis,int ListLength) { //fis->next=NULL; //printf("###\n"); if(m <= ListLength-1) { /*if(m==0) { Buffer[0]=List[0]; }*/ //Buffer[flag]=List[m]; /*if(flag==0) { Buffer[flag]=List[m]; }*/ for(int i=(flag==0) ? 0 : Index(List,Buffer[flag-1],ListLength)+1; i<=ListLength-1; i++) //µ±flag==0ʱ£¬BufferÖÐûÓÐÈκÎÔªËØ£¬´Ëʱi=[0...ListLength-1] //µ±flag>0ʱ£¬ÕÒµ½BufferÖеÄ×îºóÒ»¸öÔªËØÔÚ¼¯ºÏListÖеÄλÖÃi£¬°Ñ[i....ListLength-1] //´¦µÄÔªËØ£¬¼Óµ½BufferÔªËØµÄ×îºóÃæ { Buffer[flag]=List[i]; fis=AddToSubset(Buffer,flag,fis); //Output(Buffer,flag); SubSet(List, m+1, Buffer,flag+1,fis,ListLength); } } /*tItem *p; p=fis; while(p!=NULL) { for(int j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ return (fis); } struct tItem *AddToSubset(char *Buffer, int flag, tItem *fis) //½«×Ó¼¯Ìí¼Óµ½Á´±íÖÐ { tItem *p; int i=0; p=(struct tItem*)malloc(sizeof(struct tItem)); p->count=0; p->tag=flag; while(i<=flag) { p->itemset[i]=Buffer[i]; i++; } p->next=fis->next; fis->next=p; return (fis); } void Gen_association_rules(tItem *kf, tItem *p, double minCon) //Éú³É¹ØÁª¹æÔò { int i=0; int j=0; double m; bool flag; //printf("@@@@ %f\n",minCon); m=(double)(kf->count)/(double)(p->count); if(m>=minCon) { printf("\n"); while(i<=p->tag) { if(i!=p->tag) { printf("%c ",p->itemset[i]); } else { printf("%c ",p->itemset[i]); } i++; } printf("=====> "); while(j<=kf->tag) { if(j!=kf->tag) { for(i=0;i<=p->tag;i++) { if(kf->itemset[j]==p->itemset[i]) { flag=false; break; } else { flag=true; } } if(flag==true) { printf("%c ",kf->itemset[j]); } } else { for(i=0;i<=p->tag;i++) { if(kf->itemset[j]==p->itemset[i]) { flag=false; break; } else { flag=true; } } if(flag==true) { printf("%c ",kf->itemset[j]); } } j++; } //cout << setprecision<< m <<endl; m=(double)(p->count)/(double)(kf->count); printf(" Confidence : %f",m); printf("\n"); } }Last edited by Cabhan; 12-01-2011 at 06:48 AM. Reason: Enclosing in [code] tags
- 12-01-2011 #2Linux Guru
- Join Date
- Apr 2009
- Location
- I can be found either 40 miles west of Chicago, or in a galaxy far, far away.
- Posts
- 8,974
Please enclose your code inside code blocks, like this:
That will preserve the indentations and keep from interpreting character sequences such as smileys.Code:#include "stdio.h" #include <fstream> #include <iostream> #include "stdlib.h" #include "string.h" #include <iomanip> #include <time.h> #include "mpi.h" struct tItem { int tag; char itemset[15]; int count; struct tItem *next; }; #define LEN sizeof(struct tItem); int GetColNum(char fileName1[]); //¶ÁȡԴÊý¾ÝµÄÁÐÊý int GetRecordNum(char fileName2[]); //¶ÁȡԴÊý¾ÝµÄÐÐÊý int Index(char *List, char c, int ListLength); void GetSourceFile(char fileName[],int recordNum,int colNum); //»ñȡԴÊý¾Ý void FindFrequence1itemsets(char **fullSet1,double sup); void Gen_association_rules(tItem *kf, tItem *p, double minCon); //Éú³É¹ØÁª¹æÔò void SetminSup(); //ÉèÖÃ×îСֵ֧³Ö¶È void SetminCon(); //ÉèÖÃ×îСÖÃÐÅ¶È struct tItem *Find_candidate_1itemsets(char **fullSet2, double sup2,int recordNum,int colNum); //Éú³ÉƵ·±1Ï struct tItem *apriori_gen(tItem *freq); //Éú³ÉºòÑ¡Ï struct tItem *Gen_candidate_itemset(tItem *cp,tItem *cp1,tItem *cp2); //Éú³ÉºóÑ¡Ïî struct tItem *Gen_frequence(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet); //Éú³ÉƵ·±Ï struct tItem *Gen_frequence1(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet); struct tItem *Compute_candidateItem_Num(tItem *c,int recordNum, int colNum, char **fullSet); //¼ÆËãºòÑ¡ÏÖÐÿһÏîµÄ×îС֧³ÖÊý struct tItem *Gen_kFrequence_subsets(tItem *f); //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ struct tItem *SubSet(char *List, int m, char *Buffer, int flag, tItem *fis, int ListLength); //Éú³ÉƵ·±¼¯ÖÐÿһÏîµÄ×Ó¼¯ struct tItem *AddToSubset(char *Buffer, int flag, tItem *fis); //½«Ò»¸ö×Ó¼¯¼ÓÈëÁ´±í struct tItem *Combine_candidate_itemsets(tItem *lc, char rItemset, int rCount); //ºÏ²¢¾Ö²¿ºòÑ¡1Ï³ÉΪ×ܵĺòÑ¡1Ï struct tItem *Combine_candidate_k_itemsets(tItem *lc,tItem *r); bool Has_infrequence_subset(tItem *pp, tItem *f); //ÅжϺòÑ¡kÏµÄ×Ó¼¯ÊÇ·ñÔÚÆµ·±k-1ÏÖÐ bool Is_before_equal(tItem *pp1, tItem *pp2); //ÅжÏÁ½¸öÏîÄ¿¼¯µÄǰk-1ÏîÊÇ·ñÏàͬ static void masterprocess(int rankNum); static void slaveprocess(int rankNum); char **fullSet; int colNum=0; int recordNum=0; double minSup=0.37; double minCon=0.50; int main(int argc,char *argv[]) { int rank,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { //printf("#%d#\n",size); masterprocess(size); } else { slaveprocess(size); } MPI_Finalize(); return(0); } void SetminSup() { cout<<"Please input the minSup: "; cin>>minSup; } void SetminCon() { cout<<"Please input the minCon: "; cin>>minCon; } int GetColNum(char fileName1[]) //¶ÁȡԴÊý¾ÝµÄÁÐÊý { ifstream file(fileName1); char ch; //int colNum=0; while(ch!='\n') { if(ch==',') { colNum++; ch=file.get(); } ch=file.get(); } //colNum++; file.close(); return colNum; } int GetRecordNum(char fileName2[]) //¶ÁȡԴÊý¾ÝµÄÐÐÊý { ifstream file(fileName2); char ch=NULL; //int recordNum=0; while(!file.eof()) { if(ch=='\n') { recordNum++; ch=file.get(); } ch=file.get(); } file.close(); return recordNum; } void GetSourceFile(char fileName[],int rNum,int cNum) //»ñȡԴÊý¾Ý¶ÁÈëÊý×éfullSet[][]ÖÐ { ifstream file(fileName); char ch; //char **fullSet; int item=0; int i=0,j=0; int temp1='A'; int temp2='a'; /*b=(int**)malloc(row*sizeof(int*)); for(i=0;i<row;i++) { b[i]=(int*)malloc(col*sizeof(int)); }*/ fullSet=(char**)malloc(rNum*sizeof(char*)); for(int m=0;m<rNum;m++) { fullSet[m]=(char*)malloc(cNum*sizeof(char)); } while(i<rNum) { while(j<colNum) { if(ch==',') { item++; ch=file.get(); if(ch=='T') { fullSet[i][j]=(char)(item+temp1); //printf("%c",fullSet[i][j]); } if(ch=='F') { fullSet[i][j]=(char)(item+temp2); //printf("%c",fullSet[i][j]); } j++; } ch=file.get(); } //printf("\n"); j=0; ch=file.get(); item=0; i++; } file.close(); } static void masterprocess(int rankNum) { char inputFileName[]="c:\\shujuku.txt"; char *buffer; int colNum,recordNum,blockNum,bound,i,j,m,k; int rank,destRank,tag; double starttime,endtime; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); starttime=MPI_Wtime(); //SetminSup(); //SetminCon(); //printf("#%d#\n",rankNum); colNum=GetColNum(inputFileName); recordNum=GetRecordNum(inputFileName); //system("pause"); printf("recordNum= %d", recordNum); printf("\n"); printf("colNum= %d",colNum); printf("\n"); GetSourceFile(inputFileName,recordNum,colNum); //system("pause"); /*for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c ",fullSet[i][j]); } printf("\n"); }*/ blockNum=recordNum/(rankNum-1); bound=blockNum*(rankNum-1); //printf("%d\n",blockNum); m=0; k=1; destRank=1; tag=1; buffer=(char*)malloc(colNum*sizeof(char*)); while(m!=recordNum) { if(m==(k*blockNum-1)&&(m!=bound-1)) { MPI_Send(&colNum,1,MPI_INT,destRank,100,MPI_COMM_WORLD); MPI_Send(&recordNum,1,MPI_INT,destRank,101,MPI_COMM_WORLD); MPI_Send(&blockNum,1,MPI_INT,destRank,tag,MPI_COMM_WORLD); //printf("%d\n",blockNum); for(i=((k-1)*blockNum);i<k*blockNum;i++) { for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; printf("%c ",buffer[j]); } MPI_Send(buffer,colNum,MPI_CHAR,destRank,tag,MPI_COMM_WORLD); printf("\n"); } printf("\n"); destRank++; tag++; k++; } else if(m==bound-1) { blockNum=recordNum-m-1+blockNum; MPI_Send(&colNum,1,MPI_INT,destRank,100,MPI_COMM_WORLD); MPI_Send(&recordNum,1,MPI_INT,destRank,101,MPI_COMM_WORLD); MPI_Send(&blockNum,1,MPI_INT,destRank,tag,MPI_COMM_WORLD); //MPI_Send(&flag,1,MPI_INT,destRank,102,MPI_COMM_WORLD); //printf("%d\n",blockNum); for(i=bound-blockNum;i<recordNum;i++) { for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; printf("%c ",buffer[j]); } MPI_Send(buffer,colNum,MPI_CHAR,destRank,tag,MPI_COMM_WORLD); printf("\n"); } printf("\n"); } m++; } /*int s,rItemNum; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); s=0; MPI_Recv(&rItemNum,1,MPI_INT,1,1000,MPI_COMM_WORLD,&status); while(s<rItemNum) { for(j=0;j<=5;j++) { MPI_Recv(&r->itemset[j],1,MPI_CHAR,1,1001,MPI_COMM_WORLD,&status); } MPI_Recv(&r->count,1,MPI_INT,1,1002,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,0,1003,MPI_COMM_WORLD,&status); s++; }*/ endtime=MPI_Wtime(); printf("The master process tooks %f seconds.\n",endtime-starttime); printf("\n"); } static void slaveprocess(int rankNum) { int rowNum,recordNum,colNum,tag,stag,rank,destRank,m,i,j; char **fSet,*buffer; double minSup=0.45; double minCon=0.50; double starttime,endtime; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); starttime=MPI_Wtime(); MPI_Recv(&colNum,1,MPI_INT,0,100,MPI_COMM_WORLD,&status); MPI_Recv(&recordNum,1,MPI_INT,0,101,MPI_COMM_WORLD,&status); //printf("%d\n",recordNum); //printf("%d\n",colNum); tag=rank; MPI_Recv(&rowNum,1,MPI_INT,0,tag,MPI_COMM_WORLD,&status); printf("\n"); printf("\n"); printf("The block in rank %d has %d records.\n",rank,rowNum); //MPI_Recv(&flag,1,MPI_INT,0,102,MPI_COMM_WORLD,&status); buffer=(char*)malloc(colNum*sizeof(char*)); fSet=(char**)malloc(rowNum*sizeof(char*)); for(m=0;m<rowNum;m++) { fSet[m]=(char*)malloc(colNum*sizeof(char)); } //½ÓÊÕ½ø³Ì0·¢ËÍÀ´µÄ³õʼ¾ØÕóµÄÒ»¿é for(i=0;i<rowNum;i++) { MPI_Recv(buffer,colNum,MPI_CHAR,0,tag,MPI_COMM_WORLD,&status); for(j=0;j<colNum;j++) { fSet[i][j]=buffer[j]; } } printf("\n"); printf("Rank %d receives part of the matrix is as follow:\n",rank); printf("\n"); for(i=0;i<rowNum;i++) { for(j=0;j<colNum;j++) { printf("%c ",fSet[i][j]); } printf("\n"); } printf("\n"); tItem *c; //¶¨Òå¾Ö²¿ºòÑ¡Ï tItem *cr; //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡¼¯ tItem *p; int count=0,s,rCount,rTag; char rItemset; c=(struct tItem*)malloc(sizeof(struct tItem)); c=Find_candidate_1itemsets(fSet,minSup,rowNum,colNum); destRank=1; stag=1; p=c; while(p!=NULL) { count++; p=p->next; } for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡1Ï { p=c; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,14,MPI_COMM_WORLD); while(p!=NULL) { MPI_Send(&p->itemset[p->tag],1,MPI_CHAR,destRank,15,MPI_COMM_WORLD); MPI_Send(&p->count,1,MPI_INT,destRank,16,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,17,MPI_COMM_WORLD); p=p->next; } } destRank++; stag++; } int reRank=1,reTag=1,itemNum; for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡1Ï { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,14,MPI_COMM_WORLD,&status); while(s<itemNum) { MPI_Recv(&rItemset,1,MPI_CHAR,reRank,15,MPI_COMM_WORLD,&status); MPI_Recv(&rCount,1,MPI_INT,reRank,16,MPI_COMM_WORLD,&status); MPI_Recv(&rTag,1,MPI_INT,reRank,17,MPI_COMM_WORLD,&status); c=Combine_candidate_itemsets(c,rItemset,rCount); //printf(" %c",rItemset); //printf(" %d",rCount); //printf(" %d",rTag); //printf("\n"); s++; } printf("\n"); } reRank++; reTag++; } //Êä³öºÏ²¢ºóµÃµ½µÄÈ«²¿ºòÑ¡1Ï p=c; printf("Now every rank get the whole candidate itemsets as follow:\n\n"); while(p!=NULL) { printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } //ÓɺòÑ¡1ÏÉú³ÉƵ·±1Ï tItem *pp,*fHead,*fp,*temp; int minNum; fp=fHead=(struct tItem*)malloc(sizeof(struct tItem)); minNum=(int)((recordNum*minSup)+1); //printf("%d",minNum); pp=c; while(pp!=NULL) { if(pp->count>minNum) { fHead->count=pp->count; fHead->tag=pp->tag; fHead->itemset[fHead->tag]=pp->itemset[pp->tag]; fHead->next=NULL; break; } pp=pp->next; } fp=fHead; pp=pp->next; while(pp!=NULL) { if(pp->count>minNum) { temp=(struct tItem*)malloc(sizeof(struct tItem)); temp->count=pp->count; temp->next=NULL; temp->tag=pp->tag; temp->itemset[temp->tag]=pp->itemset[pp->tag]; fp->next=temp; fp=temp; //printf("%c",pp->itemset[pp->tag]); } pp=pp->next; } /*printf("\n"); printf("--------The local frequence 1_itemsets--------\n"); fp=fHead; while(fp!=NULL) { printf(" %c",fp->itemset[fp->tag]); printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); fp=fp->next; }*/ tItem *f1,*kFrequence,*kf,*fis,*kfTemp; //kFrequence=(struct tItem*)malloc(sizeof(struct tItem)); f1=(struct tItem*)malloc(sizeof(struct tItem)); //f1=Find_frequence_1itemsets(fullSet,minSup); f1=fHead; //system("pause"); //printf(" %d",rowNum); //printf(" %d*&*&*&\n",colNum); kFrequence=Gen_frequence(f1,rowNum,colNum,minNum,fSet);//¾*¹ýÁ¬½ÓºÍ¼ôÖ¦Éú³É×îÖյįµ·±kÏ i=2; while(i<=5) { kfTemp=Gen_frequence(kFrequence,rowNum,colNum,minNum,fSet); if(kfTemp==NULL) { break; } kFrequence=kfTemp; i++; } //MPI_Barrier(MPI_COMM_WORLD); /*printf("^^^^^^^^^^^^^^^\n"); kf=kFrequence; while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { printf(" %c",kf->itemset[j]); } printf(" %d",kf->count); printf(" %d",kf->tag); printf("\n"); kf=kf->next; } printf("^^^^^^^^^^^^^^^\n");*/ printf("\n"); kf=kFrequence; printf("--------The frequence %d_itemsets--------\n",kf->tag+1); while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { printf(" %c",kf->itemset[j]); } printf(" %d",kf->count); printf(" %d",kf->tag); printf("\n"); kf=kf->next; } printf("\n"); /*kf=kFrequence; int kItemNum=0; while(kf!=NULL) { kItemNum++; kf=kf->next; } kf=kFrequence; if(rank==1) { MPI_Send(&kItemNum,1,MPI_INT,0,1000,MPI_COMM_WORLD); while(kf!=NULL) { for(j=0;j<=kf->tag;j++) { MPI_Send(&kf->itemset[j],1,MPI_CHAR,0,1001,MPI_COMM_WORLD); } MPI_Send(&kf->count,1,MPI_INT,0,1002,MPI_COMM_WORLD); MPI_Send(&kf->tag,1,MPI_INT,0,1003,MPI_COMM_WORLD); kf=kf->next; } }*/ kf=kFrequence; printf("\n\nThe subset of the frequence is:\n\n"); while(kf!=NULL) { fis=Gen_kFrequence_subsets(kf); //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ fis=Compute_candidateItem_Num(fis,rowNum,colNum,fSet); //¼ÆËãÿһ¸ö×Ó¼¯µÄÖ§³Ö¶È /*p=fis; p=p->next; while(p!=NULL) { for(i=0;i<=p->tag;i++) { printf(" %c",p->itemset[i]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ printf("\n\nNow we get the association rules:\n\n"); p=fis; p=p->next; while(p!=NULL) { //printf("\n"); Gen_association_rules(kf,p,minCon); printf("\n"); p=p->next; } kf=kf->next; } endtime=MPI_Wtime(); printf("The slave process %d tooks %f seconds.\n",rank,endtime-starttime); printf("\n"); } struct tItem *Gen_frequence(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet) //Éú³ÉƵ·±Ï { tItem *candidate,*cp,*fp,*fpb,*p,*p1; int i,j,k,m,count=0,rank,rankNum,destRank,stag; //int i,m,n; //char *buffer; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&rankNum); /*printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("##### %d\n",recordNum); printf("##### %d\n",colNum); printf("##### %d\n",minNum); for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c",fullSet[i][j]); } printf("\n"); } p=(struct tItem*)malloc(sizeof(struct tItem)); p=frequence; while(p!=NULL) { printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");*/ //for(k=2;frequence!=NULL;k++) //while(candidate!=NULL) //{ //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); candidate=apriori_gen(frequence); if(candidate!=NULL) { candidate=Compute_candidateItem_Num(candidate,recordNum,colNum,fullSet); destRank=1; stag=1; p=candidate; p1=candidate; while(p!=NULL) { count++; p=p->next; } //printf(" #%d#\n",count); //MPI_Barrier(MPI_COMM_WORLD); for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡kÏ { p=candidate; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,24,MPI_COMM_WORLD); while(p!=NULL) { for(j=0;j<=p->tag;j++) { MPI_Send(&p->itemset[j],1,MPI_CHAR,destRank,25,MPI_COMM_WORLD); } MPI_Send(&p->count,1,MPI_INT,destRank,26,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,27,MPI_COMM_WORLD); p=p->next; } } destRank++; stag++; } //MPI_Barrier(MPI_COMM_WORLD); int reRank=1,reTag=1,itemNum; int rCount,rTag,s; char rItemset; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡kÏ { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,24,MPI_COMM_WORLD,&status); while(s<itemNum) { for(m=0;m<=p1->tag;m++) { MPI_Recv(&r->itemset[m],1,MPI_CHAR,reRank,25,MPI_COMM_WORLD,&status); //printf(" %c",r->itemset[m]); } MPI_Recv(&r->count,1,MPI_INT,reRank,26,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,reRank,27,MPI_COMM_WORLD,&status); candidate=Combine_candidate_k_itemsets(candidate,r); //printf(" %c",rItemset); //printf(" %d",r->count); //printf(" %d",r->tag); //printf("\n"); s++; } //printf("\n"); //printf("&&&&&&&&&&&&&&&&&&&&&\n"); } reRank++; reTag++; } //MPI_Barrier(MPI_COMM_WORLD); /*cp=candidate; count=0; printf("--------The candidate %d_itemsets--------\n",cp->tag+1); while(cp!=NULL) { for(j=0;j<=cp->tag;j++) { printf(" %c",cp->itemset[j]); } printf(" %d",cp->count); printf(" %d",cp->tag); printf("\n"); count++; cp=cp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ //MPI_Barrier(MPI_COMM_WORLD); frequence=candidate; fpb=(struct tItem*)malloc(sizeof(struct tItem)); fp=(struct tItem*)malloc(sizeof(struct tItem)); fpb=frequence; fp=fpb->next; //int minNum=(int)((recordNum*minSup)+1); //printf("########## %d\n",minNum); while(fp!=NULL) //ɾ³ýºóÑ¡ÏÖÐÖ§³Ö¶ÈСÓÚ×îС֧³Ö¶ÈµÄÏîÄ¿£¬Éú³ÉƵ·±Ï { if(fpb->count<minNum) { frequence=fp; fpb=fp; fp=fp->next; } if(fp->count<minNum) { fp=fp->next; fpb->next=fp; } else { fp=fp->next; fpb=fpb->next; } } /*fp=frequence; count=0; printf("--------The frequence %d_itemsets--------\n",fp->tag+1); while(fp!=NULL) { //MPI_Barrier(MPI_COMM_WORLD); for(j=0;j<=fp->tag;j++) { printf(" %c",fp->itemset[j]); } printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); count++; fp=fp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ //MPI_Barrier(MPI_COMM_WORLD); } else { //return (NULL); //break; frequence=NULL; } //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); //MPI_Barrier(MPI_COMM_WORLD); //} return (frequence); } struct tItem *Gen_frequence1(tItem *frequence, int recordNum, int colNum, int minNum, char **fullSet) //Éú³ÉƵ·±Ï { tItem *candidate,*cp,*fp,*fpb,*p,*p1; int i,j,k,m,count=0,rank,rankNum,destRank,stag; //int i,m,n; //char *buffer; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&rankNum); //printf("*******************************************\n"); /*printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("##### %d\n",recordNum); printf("##### %d\n",colNum); printf("##### %d\n",minNum); printf("##### %d\n",rank); for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { printf(" %c",fullSet[i][j]); } printf("\n"); } p=(struct tItem*)malloc(sizeof(struct tItem)); p=frequence; while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");*/ //for(k=2;frequence!=NULL;k++) //while(candidate!=NULL) //{ printf("++++++++++++++++++++++++++++++++++++++++++++\n"); candidate=apriori_gen(frequence); /*p=candidate; int t=0; printf("²âÊÔ½á¹û\n"); while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); t++; p=p->next; } printf("Ò»¹²ÓÐ %d\n",t); printf("½áÊø²âÊÔ\n");*/ /*if(rank==2) { printf("!!!!!!\n"); p=candidate; while(p!=NULL) { for(j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } } printf("!!!!!!\n");*/ if(candidate!=NULL) { //printf("!!!!!!\n"); candidate=Compute_candidateItem_Num(candidate,recordNum,colNum,fullSet); destRank=1; stag=1; p=candidate; p1=candidate; while(p!=NULL) { count++; p=p->next; } //printf(" #%d#\n",count); //printf("½øÐе½ÕâÀï\n"); //MPI_Barrier(MPI_COMM_WORLD); for(i=1;i<=rankNum-1;i++) //ÏòÆäËû½ø³Ì·¢Ë;ֲ¿ºòÑ¡kÏ { p=candidate; if(i!=rank) { MPI_Send(&count,1,MPI_INT,destRank,54,MPI_COMM_WORLD); //printf("### %d ###\n",count); while(p!=NULL) { for(j=0;j<=p->tag;j++) { MPI_Send(&p->itemset[j],1,MPI_CHAR,destRank,55,MPI_COMM_WORLD); //printf(" %c",p->itemset[j]); } MPI_Send(&p->count,1,MPI_INT,destRank,56,MPI_COMM_WORLD); MPI_Send(&p->tag,1,MPI_INT,destRank,57,MPI_COMM_WORLD); //printf(" %d",p->count); //printf(" %d",p->tag); //printf("\n"); p=p->next; } } destRank++; stag++; } //MPI_Barrier(MPI_COMM_WORLD); int reRank=1,reTag=1,itemNum; int rCount,rTag,s; char rItemset; tItem *r; r=(struct tItem*)malloc(sizeof(struct tItem)); for(j=1;j<=rankNum-1;j++) //½ÓÊÕÆäËû½ø³Ì·¢ËÍÀ´µÄ¾Ö²¿ºòÑ¡kÏ { if(j!=rank) { s=0; MPI_Recv(&itemNum,1,MPI_INT,reRank,54,MPI_COMM_WORLD,&status); while(s<itemNum) { for(m=0;m<=p1->tag;m++) { MPI_Recv(&r->itemset[m],1,MPI_CHAR,reRank,55,MPI_COMM_WORLD,&status); //printf(" %c",r->itemset[m]); } MPI_Recv(&r->count,1,MPI_INT,reRank,56,MPI_COMM_WORLD,&status); MPI_Recv(&r->tag,1,MPI_INT,reRank,57,MPI_COMM_WORLD,&status); candidate=Combine_candidate_k_itemsets(candidate,r); //printf(" %c",rItemset); //printf(" %d",r->count); //printf(" %d",r->tag); //printf("\n"); s++; } //printf("\n"); printf("&&&&&&&&&&&&&&&&&&&&&\n"); } reRank++; reTag++; } //MPI_Barrier(MPI_COMM_WORLD); cp=candidate; count=0; printf("--------The candidate %d_itemsets--------\n",cp->tag+1); while(cp!=NULL) { for(j=0;j<=cp->tag;j++) { printf(" %c",cp->itemset[j]); } printf(" %d",cp->count); printf(" %d",cp->tag); printf("\n"); count++; cp=cp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n"); //MPI_Barrier(MPI_COMM_WORLD); frequence=candidate; fpb=(struct tItem*)malloc(sizeof(struct tItem)); fp=(struct tItem*)malloc(sizeof(struct tItem)); fpb=frequence; fp=fpb->next; //int minNum=(int)((recordNum*minSup)+1); //printf("########## %d\n",minNum); while(fp!=NULL) //ɾ³ýºóÑ¡ÏÖÐÖ§³Ö¶ÈСÓÚ×îС֧³Ö¶ÈµÄÏîÄ¿£¬Éú³ÉƵ·±Ï { if(fpb->count<minNum) { frequence=fp; fpb=fp; fp=fp->next; } if(fp->count<minNum) { fp=fp->next; fpb->next=fp; } else { fp=fp->next; fpb=fpb->next; } } fp=frequence; count=0; printf("--------The frequence %d_itemsets--------\n",fp->tag+1); while(fp!=NULL) { //MPI_Barrier(MPI_COMM_WORLD); for(j=0;j<=fp->tag;j++) { printf(" %c",fp->itemset[j]); } printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); count++; fp=fp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n"); //MPI_Barrier(MPI_COMM_WORLD); } else { //return (NULL); //break; //frequence=NULL; } //printf("++++++++++++++++++++++++++++++++++++++++++++\n"); //MPI_Barrier(MPI_COMM_WORLD); //} return (frequence); } bool Has_infrequence_subset(tItem *pp, tItem *f) //ÅжϺòÑ¡kÏµÄ×Ó¼¯ÊÇ·ñÔÚÆµ·±k-1ÏÖÐ { tItem *p,*fp; //´¢´æ*ppÖеÄk-1Ïî×Ó¼¯ int i=0,j,m=0; bool flag; while(i<=pp->tag) { p=(struct tItem*)malloc(sizeof(struct tItem)); for(j=0;j<pp->tag;j++) { if(j==i) { j++; } else { p->itemset[j]=pp->itemset[j]; } } fp=f; while(fp!=NULL) { while(m<=fp->tag) { if(p->itemset[m]==fp->itemset[m]) { m++; } else { flag=false; m++; } } flag=true; fp=fp->next; } i++; } return (flag); } struct tItem *Gen_candidate_itemset(tItem *cp,tItem *cp1,tItem *cp2) //Éú³ÉºóÑ¡Ïî { int i=0; while(i<=cp1->tag) { cp->itemset[i]=cp1->itemset[i]; //cp->tag=cp1->tag+1; i++; } cp->tag=cp1->tag+1; cp->itemset[i]=cp2->itemset[i-1]; cp->count=0; cp->next=NULL; return (cp); } bool Is_before_equal(tItem *pp1, tItem *pp2) //ÅжÏÁ½¸öÏîÄ¿¼¯µÄǰk-1ÏîÊÇ·ñÏàͬ { int i=0; bool flag; while(i<pp1->tag) { if(pp1->itemset[i]==pp2->itemset[i]) { flag=true; } else { flag=false; break; } i++; } return (flag); } struct tItem *Compute_candidateItem_Num(tItem *c,int recordNum, int colNum, char **fullSet) //¼ÆËãºòÑ¡ÏÖÐÿһÏîµÄ×îС֧³ÖÊý { tItem *cp; int i,j,m,n; char *buffer; cp=c; while(cp!=NULL) //ͳ¼ÆÃ¿¸öºòÑ¡ÏµÄ¼ÆÊý { for(i=0;i<recordNum;i++) { bool flag=true; buffer=(char*)malloc(colNum*sizeof(char*)); for(j=0;j<colNum;j++) { buffer[j]=fullSet[i][j]; } m=0; while(m<=cp->tag) { bool flag1=false; for(n=0;n<colNum;n++) { if(cp->itemset[m]==buffer[n]) { flag1=true; break; } flag1=false; } if(flag1==false) { flag=false; } m++; } if(flag==true) { cp->count++; } } cp=cp->next; } return (c); } struct tItem *apriori_gen(tItem *freq) //Éú³ÉºòÑ¡Ï { tItem *p1,*p2,*head,*cHead,*p,*pTail; int tag,i=0; //bool flag; if(freq->next!=NULL) { head=freq; p1=head; p2=head; p2=p2->next; p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; if(tag==1)//Éú³ÉºòÑ¡2Ï { //printf("############\n"); while(i<=tag) { if(i<=tag-1) { //p->count=p1->count; p->itemset[i]=p1->itemset[i]; p->tag=tag; } else { //p->count=p2->count; p->itemset[i]=p2->itemset[i-1]; p->tag=tag; } i++; } p->count=0; p->next=NULL; /*printf(" %c",p->itemset[0]); printf(" %c",p->itemset[1]); printf(" %d",p->tag);*/ pTail=p; cHead=p; p2=p2->next; //printf("#%c#",p1->itemset[p1->tag]); while(p1!=NULL) { while(p2!=NULL) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; i=0; while(i<=tag) { if(i<=tag-1) { //p->count=p1->count; p->itemset[i]=p1->itemset[i]; //printf("%c",p->itemset[i]); p->tag=tag; } else { //p->count=p2->count; p->itemset[i]=p2->itemset[i-1]; //printf("%c",p->itemset[i]); p->tag=tag; } i++; } p->count=0; p->next=NULL; //flag=Has_infrequence_subset(cHead,freq); //if(flag==true) //{ pTail->next=p; pTail=p; //} p2=p2->next; } p1=p1->next; p2=p1->next; if(p2==NULL) { break; } } } /*else if(p1->tag==3) { if(Is_before_equal(p1,p2)) { //printf("½øÐе½ÕâÀï\n"); //p=(struct tItem*)malloc(sizeof(struct tItem)); //cHead=(struct tItem*)malloc(sizeof(struct tItem)); //pTail=(struct tItem*)malloc(sizeof(struct tItem)); p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { //while(Is_before_equal(p1,p2)) while(p2!=NULL) { if(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } } //printf("½øÐе½ÕâÀï\n"); p2=p2->next; } p1=p1->next; p2=p1->next; } } //printf("½øÐе½ÕâÀï\n"); }*/ else//Éú³ÉºîÑ¡2ÏÒÔÉϵĺòÑ¡¼¯(±ê¼ÇcHeadʱºòÓÐÎÊÌâ) { /*while(p2!=NULL) { if(Is_before_equal(p1,p2)) { break; } p2=p2->next; }*/ if(Is_before_equal(p1,p2)) { //p=(struct tItem*)malloc(sizeof(struct tItem)); //cHead=(struct tItem*)malloc(sizeof(struct tItem)); //pTail=(struct tItem*)malloc(sizeof(struct tItem)); p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { //while(Is_before_equal(p1,p2)) while(p2!=NULL) { if(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } } p2=p2->next; } p1=p1->next; p2=p1->next; } } else { p1=p1->next; p2=p2->next; p=Gen_candidate_itemset(p,p1,p2); pTail=p; cHead=p; p2=p2->next; while((p1!=NULL)&&(p2!=NULL)) { while(Is_before_equal(p1,p2)) { p=(struct tItem*)malloc(sizeof(struct tItem)); tag=p1->tag+1; p=Gen_candidate_itemset(p,p1,p2); if(Has_infrequence_subset(p, freq)) { pTail->next=p; pTail=p; } p2=p2->next; } p1=p1->next; p2=p1->next; } //cHead=NULL; } } } else { cHead=NULL; } /*tItem *pp; int j,count=0; pp=cHead; printf("--------The candidate %d_itemsets--------\n",pp->tag+1); while(pp!=NULL) { for(j=0;j<=tag;j++) { printf(" %c",pp->itemset[j]); } printf(" %d",pp->count); printf(" %d",pp->tag); printf("\n"); count++; pp=pp->next; } printf("\n"); printf("The total number is: %d\n",count); printf("\n");*/ return (cHead); } struct tItem *Combine_candidate_k_itemsets(tItem *lc,tItem *r) { tItem *p; int i,j; bool flag,flagj; //printf("**************************\n"); p=lc; while(p!=NULL) { //flag=true; for(i=0;i<=r->tag;i++) { flagj=false; for(j=0;j<=p->tag;j++) { if(p->itemset[j]==r->itemset[i]) { flagj=true; break; } } if(flagj==false) { flag=false; break; } else { flag=true; } } if(flag==true) { p->count=p->count+r->count; break; } p=p->next; } return (lc); } struct tItem *Combine_candidate_itemsets(tItem *lc, char rItemset, int rCount) { tItem *p; p=lc; while(p!=NULL) { if(p->itemset[p->tag]==rItemset) { p->count=p->count+rCount; } p=p->next; } return (lc); } struct tItem *Find_candidate_1itemsets(char **fullSet2, double sup2,int recordNum,int colNum) //Éú³ÉƵ·±1Ï { tItem *cHead,*fHead; tItem *p1,*pHead,*pTail,*p; tItem *fp,*temp,*pp; fp=fHead=(struct tItem*)malloc(sizeof(struct tItem)); int i,j,count=0; bool flag; p=pHead=pTail=(struct tItem*)malloc(sizeof(struct tItem)); cHead=NULL; pHead->tag=0; pHead->itemset[pHead->tag]=fullSet2[0][0]; pHead->count=0; pHead->next=NULL; int minNum=(int)((recordNum*sup2)+1); //printf("%d",minNum); cHead=pHead; for(i=0;i<recordNum;i++) { for(j=0;j<colNum;j++) { p=cHead; while(p!=NULL) { if(p->itemset[p->tag]==fullSet2[i][j]) { p->count++; flag=false; break; } else { pTail=p; p=p->next; flag=true; } } if(flag==true) { p1=(struct tItem*)malloc(sizeof(struct tItem)); p1->tag=0; p1->itemset[p1->tag]=fullSet2[i][j]; p1->count=1; pTail->next=p1; p1->next=NULL; } } } printf("\n"); printf("--------The local candidate 1_itemsets--------\n"); p=cHead; while(p!=NULL) { count++; printf(" %c",p->itemset[p->tag]); printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; } printf("\n"); printf("In all, there are %d candidate 1_itemsets.\n",count); /*pp=cHead; while(pp!=NULL) { if(pp->count>minNum) { fHead->count=cHead->count; fHead->tag=cHead->tag; fHead->itemset[fHead->tag]=cHead->itemset[cHead->tag]; fHead->next=NULL; break; } pp=pp->next; } fp=fHead; pp=pp->next; while(pp!=NULL) { if(pp->count>minNum) { temp=(struct tItem*)malloc(sizeof(struct tItem)); temp->count=pp->count; temp->next=NULL; temp->tag=pp->tag; temp->itemset[temp->tag]=pp->itemset[pp->tag]; fp->next=temp; fp=temp; //printf("%c",pp->itemset[pp->tag]); } pp=pp->next; } printf("\n"); printf("--------The frequence 1_itemsets--------\n"); fp=fHead; while(fp!=NULL) { printf(" %c",fp->itemset[fp->tag]); printf(" %d",fp->count); printf(" %d",fp->tag); printf("\n"); fp=fp->next; } return (fHead);*/ return (cHead); } struct tItem *Gen_kFrequence_subsets(tItem *f) //Éú³ÉƵ·±kÏÿÏîµÄ×Ó¼¯µÄ¼¯ºÏ { tItem *FreItemSubset; //tItem *p; int ListLength=f->tag+1; int i; //buffer=(int*)malloc(col*sizeof(int*)) char *List,*Buffer; List=(char*)malloc(ListLength*sizeof(char*)); Buffer=(char*)malloc(ListLength*sizeof(char*)); for(i=0;i<f->tag+1;i++) { List[i]=f->itemset[i]; //printf(" %c",List[i]); } FreItemSubset=(struct tItem*)malloc(sizeof(struct tItem)); FreItemSubset->next=NULL; FreItemSubset=SubSet(List,0,Buffer,0,FreItemSubset,ListLength); /*p=FreItemSubset; p=p->next; while(p!=NULL) { for(i=0;i<=p->tag;i++) { printf(" %c",p->itemset[i]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ return (FreItemSubset); } int Index(char *List, char c, int ListLength) { for(int i=0; i<=ListLength-1; i++) { if(c==List[i]) { return i; break; } } return -1; } struct tItem *SubSet(char *List, int m, char *Buffer, int flag, tItem *fis,int ListLength) { //fis->next=NULL; //printf("###\n"); if(m <= ListLength-1) { /*if(m==0) { Buffer[0]=List[0]; }*/ //Buffer[flag]=List[m]; /*if(flag==0) { Buffer[flag]=List[m]; }*/ for(int i=(flag==0) ? 0 : Index(List,Buffer[flag-1],ListLength)+1; i<=ListLength-1; i++) //µ±flag==0ʱ£¬BufferÖÐûÓÐÈκÎÔªËØ£¬´Ëʱi=[0...ListLength-1] //µ±flag>0ʱ£¬ÕÒµ½BufferÖеÄ×îºóÒ»¸öÔªËØÔÚ¼¯ºÏListÖеÄλÖÃi£¬°Ñ[i....ListLength-1] //´¦µÄÔªËØ£¬¼Óµ½BufferÔªËØµÄ×îºóÃæ { Buffer[flag]=List[i]; fis=AddToSubset(Buffer,flag,fis); //Output(Buffer,flag); SubSet(List, m+1, Buffer,flag+1,fis,ListLength); } } /*tItem *p; p=fis; while(p!=NULL) { for(int j=0;j<=p->tag;j++) { printf(" %c",p->itemset[j]); } printf(" %d",p->count); printf(" %d",p->tag); printf("\n"); p=p->next; }*/ return (fis); } struct tItem *AddToSubset(char *Buffer, int flag, tItem *fis) //½«×Ó¼¯Ìí¼Óµ½Á´±íÖÐ { tItem *p; int i=0; p=(struct tItem*)malloc(sizeof(struct tItem)); p->count=0; p->tag=flag; while(i<=flag) { p->itemset[i]=Buffer[i]; i++; } p->next=fis->next; fis->next=p; return (fis); } void Gen_association_rules(tItem *kf, tItem *p, double minCon) //Éú³É¹ØÁª¹æÔò { int i=0; int j=0; double m; bool flag; //printf("@@@@ %f\n",minCon); m=(double)(kf->count)/(double)(p->count); if(m>=minCon) { printf("\n"); while(i<=p->tag) { if(i!=p->tag) { printf("%c ",p->itemset[i]); } else { printf("%c ",p->itemset[i]); } i++; } printf("=====> "); while(j<=kf->tag) { if(j!=kf->tag) { for(i=0;i<=p->tag;i++) { if(kf->itemset[j]==p->itemset[i]) { flag=false; break; } else { flag=true; } } if(flag==true) { printf("%c ",kf->itemset[j]); } } else { for(i=0;i<=p->tag;i++) { if(kf->itemset[j]==p->itemset[i]) { flag=false; break; } else { flag=true; } } if(flag==true) { printf("%c ",kf->itemset[j]); } } j++; } //cout << setprecision<< m <<endl; m=(double)(p->count)/(double)(kf->count); printf(" Confidence : %f",m); printf("\n"); } }Sometimes, real fast is almost as good as real time.
Just remember, Semper Gumbi - always be flexible!
- 12-01-2011 #3
I've enclosed your code in [code] tags for our sanity
.
You're asking a huge question here. Perhaps you could tell us what you're trying to do that isn't working. I'm not going to read through your code and do translation, but if you tell us exactly what concept or line you're having difficulty with, I'm sure someone can help.DISTRO=Arch
Registered Linux User #388732
- 12-11-2011 #4Just Joined!
- Join Date
- Dec 2011
- Posts
- 1
Can you please attach the shujuku.txt?? So that i can understand what you did??


Reply With Quote