Exemple #1
0
def run(g, samsize, interval, outdir):

    logger.info(
        "Spectral Test for Modulus {} Multiplier {} Samsize {} Interval {}".
        format(g.get_modulus(), g.get_multiplier(), samsize, interval))

    filename = path.join(
        outdir, "mod{}_mul{}".format(g.get_modulus(), g.get_multiplier()))

    # Statistics: [(u1, u2),(u2,u3)...,(un-1,un)]
    test.statistics(filename + ".csv", g, samsize, interval)

    # Report
    r = SimpleReport("SPECTRAL TEST")
    r.add("Generator", "Class", g.__class__.__name__)
    r.add("Generator", "Modulus", g.get_modulus())
    r.add("Generator", "Multiplier", g.get_multiplier())
    r.add("Generator", "Seed", g.get_initial_seed())
    r.add("Test Parameters", "Sample Size", samsize)
    r.add("Test Parameters", "Interval", interval)

    r.save_txt(filename + "_report.txt")
    r.save_csv(filename + "_report.csv")

    logger.info("Report:\n{}".format(r))
Exemple #2
0
def run(modulus, multiplier, streams, outdir=DEFAULT_OUTDIR):

    logger.info(
        "Computing Jumpers for Modulus {} Multiplier {} Streams {}".format(
            modulus, multiplier, streams))

    filename = path.join(
        outdir, "mod{}_mul{}_str{}".format(modulus, multiplier, streams))

    jumpers = jumper_finder.find_jumpers(modulus, multiplier, streams)

    jmax = max(jumpers, key=lambda item: item[1])

    # Save raw data
    save_list_of_pairs(filename + ".csv", jumpers)

    # Report
    r = SimpleReport("JUMPER")
    r.add("General", "Modulus", modulus)
    r.add("General", "Multiplier", multiplier)
    r.add("General", "Streams", streams)
    r.add("Result", "Jumpers", len(jumpers))
    r.add("Result", "Best Jumper", jmax[0])
    r.add("Result", "Best Jump Size", jmax[1])

    r.save_txt(filename + "_report.txt")

    print(r)
Exemple #3
0
def run(modulus, multiplier, outdir=DEFAULT_OUTDIR):

    filename = path.join(outdir, "mod{}_mul{}".format(modulus, multiplier))

    logger.info("MC Check for Multiplier {} Modulus {}".format(
        multiplier, modulus))
    is_mcm = multiplier_check.is_mc_multiplier(multiplier, modulus)

    logger.info("FP Check for Multiplier {} Modulus {}".format(
        multiplier, modulus))
    is_fpm = multiplier_check.is_fp_multiplier(multiplier, modulus)

    logger.info("FP/MC Check for Multiplier {} Modulus {}".format(
        multiplier, modulus))
    is_fpmcm = is_mcm and is_fpm

    # Report
    r = SimpleReport("MULTIPLIER CHECK")
    r.add("General", "Modulus", modulus)
    r.add("General", "Multiplier", multiplier)
    r.add("Result", "FP", is_fpm)
    r.add("Result", "MC", is_mcm)
    r.add("Result", "FP/MC", is_fpmcm)

    r.save_txt(filename + "_report.txt")

    print(r)
Exemple #4
0
def run(modulus, outdir=DEFAULT_OUTDIR):

    filename = path.join(outdir, "mod{}".format(modulus))

    logger.info("Computing MC Multipliers for Modulus {}".format(modulus))
    mc_multipliers = multiplier_check.get_mc_multipliers(modulus)

    logger.info("Computing FP Multipliers for Modulus {}".format(modulus))
    fp_multipliers = multiplier_check.get_fp_multipliers(modulus)

    logger.info("Computing FP/MC Multipliers for Modulus {}".format(modulus))
    fpmc_multipliers = []
    for candidate in fp_multipliers:
        if candidate in mc_multipliers:
            fpmc_multipliers.append(candidate)

    logger.info(
        "Computing smallest/largest FP/MC Multipliers for Modulus {}".format(
            modulus))
    smallest_fpmc_multiplier = min(fpmc_multipliers, default=None)
    largest_fpmc_multiplier = max(fpmc_multipliers, default=None)

    # Save raw data
    save_list_of_numbers(filename + "_mc.txt", mc_multipliers)
    save_list_of_numbers(filename + "_fp.txt", fp_multipliers)
    save_list_of_numbers(filename + "_fpmc.txt", fpmc_multipliers)

    # Report
    r = SimpleReport("MULTIPLIERS")
    r.add("General", "Modulus", modulus)
    r.add("Multipliers", "FP", len(fp_multipliers))
    r.add("Multipliers", "MC", len(mc_multipliers))
    r.add("Multipliers", "FP/MC", len(fpmc_multipliers))
    r.add("Multipliers (%)", "FP",
          round(100 * len(fp_multipliers) / (modulus - 1), 3))
    r.add("Multipliers (%)", "MC",
          round(100 * len(mc_multipliers) / (modulus - 1), 3))
    r.add("Multipliers (%)", "FP/MC",
          round(100 * len(fpmc_multipliers) / (modulus - 1), 3))
    r.add("Result", "Smallest FP/MC Multiplier", smallest_fpmc_multiplier)
    r.add("Result", "Largest FP/MC Multiplier", largest_fpmc_multiplier)

    r.save_txt(filename + "_report.txt")

    print(r)
Exemple #5
0
def run(bits, outdir=DEFAULT_OUTDIR):
    """
    Find a modulus for the given number of bits.
    :param bits: (int) number of bits; must be positive.
    :param outdir: (str) path to the output directory.
    """
    logger.info("Computing modulus for Bits {}".format(bits))

    filename = path.join(outdir, "mod{}.txt".format(bits))

    modulus = modulus_finder.find_modulus(bits)

    # Report
    r = SimpleReport("MODULUS")
    r.add("General", "Bits", bits)
    r.add("Result", "Modulus", modulus)
    r.save_txt(filename)

    print(r)
Exemple #6
0
def run(g, samsize, bins, confidence, d, outdir):

    logger.info(
        "Extremes Test for Modulus {} Multiplier {} Streams {} Jumper {} Bins {} Samsize {} D {} Confidence {}"
        .format(g.get_modulus(), g.get_multiplier(), g.get_nstreams(),
                g.get_jumper(), bins, samsize, d, confidence))

    filename = path.join(
        outdir, "mod{}_mul{}_str{}".format(g.get_modulus(), g.get_multiplier(),
                                           g.get_nstreams()))

    # Statistics: [(stream_1, chi_1),(stream_2,chi_2),...,(stream_n,chi_n)]
    data = test.statistics(g, samsize, bins, d)
    save_csv(filename + ".csv", ["stream", "value"], data, empty=True)

    # Critical Bounds
    mn = test.critical_min(bins, confidence)
    mx = test.critical_max(bins, confidence)

    # Theoretical/Empirical Error
    err = test.error(data, mn, mx, confidence)

    # Result
    success = err["err_emp"] <= err["err_thr"]
    sugg_confidence = 1 - err["err_emp_perc"]

    # Report
    r = SimpleReport("TEST OF EXTREMES")
    r.add("Generator", "Class", g.__class__.__name__)
    r.add("Generator", "Streams", g.get_nstreams())
    r.add("Generator", "Modulus", g.get_modulus())
    r.add("Generator", "Multiplier", g.get_multiplier())
    r.add("Generator", "Jumper", g.get_jumper())
    r.add("Generator", "Seed", g.get_initial_seed())
    r.add("Test Parameters", "Sample Size", samsize)
    r.add("Test Parameters", "Bins", bins)
    r.add("Test Parameters", "Confidence", round(confidence * 100, 3))
    r.add("Test Parameters", "D", d)
    r.add("Critical Bounds", "Lower Bound", mn)
    r.add("Critical Bounds", "Upper Bound", mx)
    r.add(
        "Error",
        "Theoretical", "{} ({} %)".format(err["err_thr"],
                                          round(err["err_thr_perc"] * 100, 3)))
    r.add(
        "Error",
        "Empirical", "{} ({} %)".format(err["err_emp"],
                                        round(err["err_emp_perc"] * 100, 3)))
    r.add(
        "Error", "Empirical Lower Bound",
        "{} ({} %)".format(err["err_mn"], round(err["err_mn_perc"] * 100, 3)))
    r.add(
        "Error", "Empirical Upper Bound",
        "{} ({} %)".format(err["err_mx"], round(err["err_mx_perc"] * 100, 3)))
    r.add("Result", "Suggested Confidence", round(sugg_confidence * 100, 3))
    r.add("Result", "Success", success)

    r.save_txt(filename + "_report.txt")
    r.save_csv(filename + "_report.csv")

    logger.info("Report:\n{}".format(r))
def run(g, test_name, test_params, outdir=DEFAULT_OUTDIR):

    logger.info(
        "Kolmogorov-Smirnov Test ({}) for Modulus {} Multiplier {} Streams {} Jumper {}"
        .format(test_name, g.get_modulus(), g.get_multiplier(),
                g.get_nstreams(), g.get_jumper()))

    filename = path.join(
        outdir, "mod{}_mul{}_str{}".format(g.get_modulus(), g.get_multiplier(),
                                           g.get_nstreams()))

    if test_name == "uniformity_u":
        raise NotImplementedError(
            "Kolmogorov-Smirnov on {} is not yet implemented".format(
                test_name))
        # data = uniformity_univariate.statistics(generator, streams, samsize, bins)
    elif test_name == "uniformity_b":
        raise NotImplementedError(
            "Kolmogorov-Smirnov on {} is not yet implemented".format(
                test_name))
        # data = uniformity_bivariate.statistics(generator, streams, samsize, bins)
    elif test_name == "extremes":
        chi_square_statistics = extremes.statistics(g, test_params["samsize"],
                                                    test_params["bins"],
                                                    test_params["d"])
    elif test_name == "runsup":
        raise NotImplementedError(
            "Kolmogorov-Smirnov on {} is not yet implemented".format(
                test_name))
        # data = runsup.statistics(generator, streams, samsize, bins)
    elif test_name == "gap":
        raise NotImplementedError(
            "Kolmogorov-Smirnov on {} is not yet implemented".format(
                test_name))
        # data = gap.statistics(generator, streams, samsize, bins, test_params["a"], test_params["b"])
    elif test_name == "permutation":
        raise NotImplementedError(
            "Kolmogorov-Smirnov on {} is not yet implemented".format(
                test_name))
        # data = permutation.statistics(generator, streams, samsize, bins, test_params["t"])
    else:
        raise ValueError("{} is not a valid testname".format(test_name))

    save_csv(filename + ".csv", ["stream", "value"],
             chi_square_statistics,
             empty=True)

    # KS Statistic
    ks_distances = test.compute_ks_distances(chi_square_statistics,
                                             test_params["bins"])
    ks_statistic = test.compute_ks_statistic(ks_distances)
    ks_point = test.compute_ks_point(ks_distances)

    # KS Critical
    ks_critical_distance = test.compute_ks_critical_distance(
        g.get_nstreams(), test_params["confidence"])

    # Result
    success = ks_statistic < ks_critical_distance

    # Report
    r = SimpleReport("TEST OF KOLMOGOROV-SMIRNOV")
    r.add("Generator", "Class", g.__class__.__name__)
    r.add("Generator", "Streams", g.get_nstreams())
    r.add("Generator", "Modulus", g.get_modulus())
    r.add("Generator", "Multiplier", g.get_multiplier())
    r.add("Generator", "Jumper", g.get_jumper())
    r.add("Generator", "Seed", g.get_initial_seed())
    r.add("Test Parameters", "ChiSquare Test", test_name)
    r.add("Test Parameters", "Sample Size", test_params["samsize"])
    r.add("Test Parameters", "Bins", test_params["bins"])
    r.add("Test Parameters", "Confidence",
          round(test_params["confidence"] * 100, 3))
    if test_name == "extremes":
        r.add("Test Parameters", "D", test_params["d"])
    elif test_name == "gap":
        r.add("Test Parameters", "A", test_params["a"])
        r.add("Test Parameters", "B", test_params["b"])
    elif test_name == "permutation":
        r.add("Test Parameters", "T", test_params["t"])
    r.add("KS", "KS Statistic", round(ks_statistic, 3))
    r.add("KS", "KS Point X", round(ks_point, 3))
    r.add("KS", "KS Critical Distance", round(ks_critical_distance, 3))
    r.add("Result", "Success", success)

    r.save_txt(filename + "_report.txt")
    r.save_csv(filename + "_report.csv")

    logger.info("Report:\n{}".format(r))
Exemple #8
0
class ReportTest(unittest.TestCase):
    def setUp(self):
        """
        The test setup.
        :return: None
        """
        self.r = SimpleReport("SAMPLE REPORT")
        self.r.add("Section-1", "1st Value", 1)
        self.r.add("Section-1", "2nd Value", 2.123)
        self.r.add("Section-1", "3rd Value", "Hello World")
        self.r.add("Section-2/Subsection-1", "1st Value", 1)
        self.r.add("Section-2/Subsection-1", "2nd Value", 2.123)
        self.r.add("Section-2/Subsection-1", "3rd Value", "Hello World")
        self.r.add("Section-3", "1st Value", 1)
        self.r.add("Section-3", "2nd Value", 2.123)
        self.r.add("Section-3", "3rd Value", "Hello World")

        self.file_txt = "test.txt"
        self.file_csv = "test.csv"

    def test_string_representation(self):
        """
        Test the report string representation.
        :return: None
        """
        s = "\n"
        s += "==================================================\n"
        s += "                  SAMPLE REPORT                   \n"
        s += "==================================================\n"
        s += "\n"
        s += "                    Section-1                     \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"
        s += "\n"
        s += "              Section-2/Subsection-1              \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"
        s += "\n"
        s += "                    Section-3                     \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"

        self.assertEqual(s, str(self.r),
                         "String representation is not correct.")

    def test_save_txt(self):
        """
        Test the report saving to a TXT file.
        :return: None
        """
        s = "\n"
        s += "==================================================\n"
        s += "                  SAMPLE REPORT                   \n"
        s += "==================================================\n"
        s += "\n"
        s += "                    Section-1                     \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"
        s += "\n"
        s += "              Section-2/Subsection-1              \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"
        s += "\n"
        s += "                    Section-3                     \n"
        s += "1st Value........................................1\n"
        s += "2nd Value....................................2.123\n"
        s += "3rd Value..............................Hello World\n"

        self.r.save_txt(self.file_txt)

        with open(self.file_txt, "r") as f:
            actual = f.read()

        self.assertEqual(s, actual, "TXT file representation is not correct.")

    def test_save_csv(self):
        """
        Test the report saving to a CSV file.
        :return: None
        """
        s = "name,section-1.1st_value,section-1.2nd_value,section-1.3rd_value,section-2/subsection-1.1st_value,section-2/subsection-1.2nd_value,section-2/subsection-1.3rd_value,section-3.1st_value,section-3.2nd_value,section-3.3rd_value\n"
        s += "SAMPLE REPORT,1,2.123,Hello World,1,2.123,Hello World,1,2.123,Hello World\n"

        self.r.save_csv(self.file_csv)

        with open(self.file_csv, "r") as f:
            actual = f.read()

        self.assertEqual(s, actual, "CSV file representation is not correct.")