// // Programmer: Craig Stuart Sapp // Creation Date: Sun Dec 21 05:13:34 PST 2008 // Last Modified: Mon May 18 11:42:45 PDT 2009 // Filename: ...sig/examples/all/cherryc.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/cherryc.cpp // Syntax: C++; museinfo // // Description: Performance correlation comparison // #include "humdrum.h" #include "MidiFile.h" #include #include // function declarations: void checkOptions (Options& opts, int argc, char** argv); void example (void); void usage (const char* command); void getSequences (Array >& performances, Array >& names, HumdrumFile& infile); int compareSequences (Array& a, Array& b, int ind, int len); double pearsonCorrelation (int size, double* x, double* y); double pearsonCorrelationHole (int size, double* x, double* y, int ignore); double getMean (Array& data); double getSampleSD (double mean, Array& data); void removeIndex (Array& a, Array& b, int best); double model (double x); double modelOld (double x); double getDifference (Array& data, Array& models, int preexclude, int exclude, double parameter); double getCorrected (Array& data, Array& models, int preexclude, int exclude); double getParabolicMinimum (double x1, double y1, double x2, double y2, double x3, double y3); void extractNames (Array >& names, HumdrumRecord& record); double adjustedCorrelation (Array a, Array b); double adjustedCorrelationNew (Array a, Array b, int count); void printCorrelations (Array >& corr, Array >& names); void fixLocations (Array& locations); double adjustedCorrelationSigmoid(Array a, Array b); double sigmoid (double value); // User interface variables: Options options; int verboseQ = 0; int mmaQ = 1; int exclude = 5; int preexclude = 5; int printSig = 0; // used with -s option double sigsens = 1.0; int printAdj = 0; // used with -a option int printNew = 0; // used with -n option int newcount = 20; // used with -n option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumFile infile; infile.read(options.getArg(1)); Array > names; // name/year of the performer Array > performances; // data for each performer getSequences(performances, names, infile); Array > rawcorr; Array > adjcorr; rawcorr.setSize(performances.getSize()); adjcorr.setSize(performances.getSize()); int i, j; for (i=0; i >& corr, Array >& names) { int i, j; cout << "**name"; for (i=0; i a, Array b) { int i, best; int len = a.getSize(); Array data; data.setSize(a.getSize()); data.setSize(0); Array models; models.setSize(a.getSize()); models.setAll(0.0); models.allowGrowth(0); for (i=0; i value; value.setSize(count); value.allowGrowth(0); Array parameter; parameter.setSize(count); parameter.allowGrowth(0); for (i=0; i a, Array b, int ncount) { int i, best; int len = a.getSize(); //Array data; //data.setSize(a.getSize()); //data.setSize(0); Array models; models.setSize(a.getSize()); models.setAll(0.0); models.allowGrowth(0); // first adjust the values so that they are z-scores: // dividing by the sd is not necessary but the mean subtraction is. double amean, bmean; double asd, bsd; amean = getMean(a); bmean = getMean(b); asd = getSampleSD(amean, a); bsd = getSampleSD(bmean, b); Array afinale(a.getSize()); Array bfinale(b.getSize()); for (i=0; i locations; locations.setSize(iterations); locations.setAll(0); // int iterations = a.getSize()-exclude; for (i=0; i window; window.setSize(locations.getSize()); window.allowGrowth(0); for (i=0; i a, Array b) { // first adjust the values so that they are z-scores: // dividing by the sd is not necessary but the mean subtraction is. double amean, bmean; double asd, bsd; amean = getMean(a); bmean = getMean(b); asd = getSampleSD(amean, a); bsd = getSampleSD(bmean, b); int i; for (i=0; i& locations) { int i, j; for (i=0; i= locations[i]) { locations[j]++; } } } } ////////////////////////////// // // getCorrected -- // double getCorrected(Array& data, Array& models, int preexclude, int exclude) { double target = data[0]; double targethi = (1.0 - target)/2 + target; double targetlo = target/2; double value = getDifference(data, models, preexclude, exclude, target); double valuehi = getDifference(data, models, preexclude, exclude, targethi); double valuelo = getDifference(data, models, preexclude, exclude, targetlo); double minimum = getParabolicMinimum(targetlo, valuelo, target, value, targethi, valuehi); return minimum; } ////////////////////////////// // // getParabolicMinimum -- or maximum if inflection is negative... // double getParabolicMinimum(double x1, double y1, double x2, double y2, double x3, double y3) { double a = (x3*(y2-y1)+x2*(y1-y3)+x1*(y3-y2))/((x1-x2)*(x1-x3)*(x2-x3)); double b = (x3*x3*(y1-y2)+x1*x1*(y2-y3)+x2*x2*(y3-y1))/ ((x1-x2)*(x1-x3)*(x2-x3)); //double c = (x1*x3*(x3-x1)*y2 + x2*x2*(x3*y1-x1*y3)+x2(x1*x1*y3-x3*x3*y1))/ // ((x1-x2)*(x1-x3)*(x2-x3)); return -b/(2.0*a); } ////////////////////////////// // // getDifference -- // double getDifference(Array& data, Array& models, int preexclude, int exclude, double parameter) { int i; double sum = 0.0; double value; for (i=preexclude; i& a, Array& b, int best) { int i; int size = a.getSize(); for (i=best; i >& performances, Array >& names, HumdrumFile& infile) { int i, j; double value; int pcount = infile.getMaxTracks(); int rcount = infile.getNumLines(); int foundnames = 0; performances.setSize(pcount); names.setSize(pcount); performances.allowGrowth(0); names.allowGrowth(0); for (i=0; i >& names, HumdrumRecord& record) { int i, len; for (i=0; i& a, Array& b, int ind, int len) { int i; double basecorr; double corr; Array corrlist; corrlist.setSize(a.getSize()); corrlist.setSize(0); Array index; index.setSize(a.getSize()); index.setSize(0); basecorr = pearsonCorrelation(a.getSize(), a.getBase(), b.getBase()); if (verboseQ) { cout << "base" << "\t" << basecorr << "\n"; } for (i=0; i zscores; zscores.setSize(corrlist.getSize()); int asize = corrlist.getSize(); for (i=0; i zscores[maxi]) { maxi = i; } } //if (mmaQ) { // cout << "{" << ind << "/" << len << ", " << corrlist[maxi] << "}"; //} if (verboseQ) { cout << "max\t" << maxi << "\t"; cout << "mean\t" << mean << "\t"; cout << "sd\t" << sd << "\t"; cout << corrlist[maxi] << "\t" << zscores[maxi] << "\n"; for (i=0; i& data) { int size = data.getSize(); double sum = 0.0; double value; int i; for (i=0; i& data) { int size = data.getSize(); if (size <= 0) { return 0.0; } int i; double sum = 0.0; for (i=0; i b) { return -1; } else { return 0; } } ////////////////////////////// // // pearsonCorrelationHole -- // double pearsonCorrelationHole(int size, double* x, double* y, int ignore) { double sumx = 0.0; double sumy = 0.0; double sumco = 0.0; double meanx = x[0]; double meany = y[0]; int starti = 1; if (ignore == 0) { meanx = x[1]; meany = y[1]; starti = 2; } double sweep; double deltax; double deltay; int i; for (i=starti; i