double PairDistribution_Distributions_getFractionCorrect (PairDistribution me, Distributions dist, long column) { try { double correct = 0.0; long pairmin = 1; char32 string [1000]; Distributions_checkSpecifiedColumnNumberWithinRange (dist, column); autoPairDistribution thee = Data_copy (me); NUMsort_p (thy pairs -> size, (void **) thy pairs -> item, (int (*) (const void *, const void *)) compare); double total = PairDistributions_getTotalWeight_checkPositive (thee.peek()); do { long pairmax = pairmin, length, ipair; double sum = 0.0, sumDist = 0.0; char32 *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1; for (ipair = pairmin + 1; ipair <= thy pairs -> size; ipair ++) { PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]); if (! str32equ (prob -> string1, firstInput)) { pairmax = ipair - 1; break; } } if (ipair > thy pairs -> size) pairmax = thy pairs -> size; for (ipair = pairmin; ipair <= pairmax; ipair ++) { PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]); double p = prob -> weight / total, pout = 0.0; Melder_sprint (string, 1000, prob -> string1, U" \\-> ", prob -> string2); for (long idist = 1; idist <= dist -> numberOfRows; idist ++) { if (str32equ (string, dist -> rowLabels [idist])) { pout = dist -> data [idist] [column]; break; } } sum += p * pout; } Melder_sprint (string, 1000, firstInput, U" \\-> "); length = str32len (string); for (long idist = 1; idist <= dist -> numberOfRows; idist ++) { if (str32nequ (string, dist -> rowLabels [idist], length)) { sumDist += dist -> data [idist] [column]; } } if (sumDist != 0.0) correct += sum / sumDist; pairmin = pairmax + 1; } while (pairmin <= thy pairs -> size); return correct; } catch (MelderError) { Melder_throw (me, U" & ", dist, U": could not compute our fraction correct."); } }
static double PairDistribution_getFractionCorrect (PairDistribution me, int which) { try { double correct = 0.0; long pairmin = 1, ipair; autoPairDistribution thee = Data_copy (me); NUMsort_p (thy pairs -> size, (void **) thy pairs -> item, (int (*) (const void *, const void *)) compare); double total = PairDistributions_getTotalWeight_checkPositive (thee.peek()); do { long pairmax = pairmin; char32 *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1; for (ipair = pairmin + 1; ipair <= thy pairs -> size; ipair ++) { PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]); if (! str32equ (prob -> string1, firstInput)) { pairmax = ipair - 1; break; } } if (ipair > thy pairs -> size) pairmax = thy pairs -> size; if (which == 0) { double pmax = 0.0; for (ipair = pairmin; ipair <= pairmax; ipair ++) { PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]); double p = prob -> weight / total; if (p > pmax) pmax = p; } correct += pmax; } else { double sum = 0.0, p2 = 0.0; for (ipair = pairmin; ipair <= pairmax; ipair ++) { PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]); double p = prob -> weight / total; sum += p; p2 += p * p; } correct += p2 / sum; } pairmin = pairmax + 1; } while (pairmin <= thy pairs -> size); return correct; } catch (MelderError) { Melder_throw (me, U": could not compute my fraction correct."); } }
void Categories_sort (Categories me) { NUMsort_p (my size, my item, (int (*) (const void *, const void *)) compare); }