void freeGraphDiscription(GraphDiscription gd){ int i; for(i = 0; i < gd->numVert; i++){ free(gd->vertLabels[i]); freeJetBunch(gd->bunch[i]); } free(gd->bunch); free(gd->verts); free(gd->vertLabels); free(gd->edges); free(gd); }
GraphDiscription buildBunchGraph(GraphDiscription modelJets, JetSimilarityMeasure jetSim, int bunchsize){ int vert; assert(bunchsize > 1); for(vert = 0; vert < modelJets->numVert; vert++){ Matrix dist; int size, i, j; FTYPE maxsim, minsim, smallest; int minjet; JetBunch finalBunch = makeJetBunch(); MESSAGE1ARG("Selecting jets for point: %s",modelJets->vertLabels[vert]); size = modelJets->bunch[vert]->size; assert(bunchsize <= size); assert(size > 0); dist = makeZeroMatrix(size, size); smallest = maxsim = jetSim(modelJets->bunch[vert]->jets[0],modelJets->bunch[vert]->jets[0]); for(i = 0; i < size; i++){ for(j = 0; j < size; j++){ ME(dist,i,j) = jetSim(modelJets->bunch[vert]->jets[i],modelJets->bunch[vert]->jets[j]); maxsim = MAX( maxsim, ME(dist,i,j) ); smallest = MIN(smallest, ME(dist,i,j)); } } /* find the minimum similarity */ minsim = 0.0; minjet = -1; for(i = 0; i < size; i++){ for(j = 0; j < size; j++){ if(minjet < 0 || minsim > ME(dist,i,j) ){ minsim = ME(dist,i,j); minjet = i; } } } while(1){ /* MESSAGE2ARG(" Adding jet %03d to final bunch. sim=%+f",minjet,minsim); */ /* add that jet to the final bunch */ addJetToBunch(finalBunch, modelJets->bunch[vert]->jets[minjet]); /* eleminate the newly added jet from the old bunch and the distance matrix */ modelJets->bunch[vert]->jets[minjet] = NULL; for( i = 0; i < size; i++){ /* Make sure new value is greater that the maximum similarity */ ME(dist,i,minjet) = 2*ABS(maxsim); } if(finalBunch->size >= bunchsize) break; minsim = 0.0; minjet = -1; for(j = 0; j < size; j++){ FTYPE locmax = smallest; for(i = 0; i < size; i++){ /* compute the best similarity to the jets in the data set */ if(modelJets->bunch[vert]->jets[i] == NULL){ locmax = MAX(locmax,ME(dist,i,j)); } } if(minjet < 0 || minsim > locmax ){ minsim = locmax; minjet = j; } } } freeJetBunch(modelJets->bunch[vert]); modelJets->bunch[vert] = finalBunch; freeMatrix(dist); } return modelJets; }