void Distributions_peek (Distributions me, long column, char32 **string, long *number) { Distributions_checkSpecifiedColumnNumberWithinRange (me, column); if (my numberOfRows < 1) Melder_throw (me, U": I have no candidates."); double total = 0.0; for (long irow = 1; irow <= my numberOfRows; irow ++) { total += my data [irow] [column]; } if (total <= 0.0) Melder_throw (me, U": the total weight of column ", column, U" is not positive."); long irow; do { double rand = NUMrandomUniform (0, total), sum = 0.0; for (irow = 1; irow <= my numberOfRows; irow ++) { sum += my data [irow] [column]; if (rand <= sum) break; } } while (irow > my numberOfRows); // guard against rounding errors if (my rowLabels [irow] == NULL) Melder_throw (me, U": no string in row ", irow, U"."); if (string) *string = my rowLabels [irow]; if (number) *number = irow; }
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); Collection_sort (thy pairs.get(), PairProbability_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."); } }