def _wtext(f, header, frm, printargs, perpage, nrows): if perpage < 1: # one additional in case nrows is zero perpage = nrows + 1 pages = (nrows + perpage - 1) // perpage for p in range(pages): if p > 0: f.write(chr(12)) f.write(header) b = p * perpage e = b + perpage writer.vecwrite(f, frm, *printargs, so=slice(b, e))
def _wttab(f, header, hu, frm, res, loop_vars, rows, count_filter, desclen, descfrm, caselen): f.write(header) ec = {} # event counter for lbl, vals, case_pv, ext, extcases in loop_vars: f.write(f"{lbl} Responses\n\n") hu_ = hu.replace("Maximum", lbl) f.write(hu_) ec[lbl] = _event_count(vals, case_pv, count_filter) extcases = _add_zero_case(vals, extcases) writer.vecwrite(f, frm, rows, res.drminfo.labels, vals, ext, extcases) f.write("\n\n") _add_max_plus_min(ec) _wttab_eventcount(f, res, ec, count_filter, desclen, descfrm, caselen)
def test_vecwrite_2file(): r = np.array([1.2, 45.8]) s = "test string" i = [5] v = ["short string", "a bit longer string"] frm = "{:3}, {:5.1f}, {:<25}, {}" + chr(10) writer.vecwrite("temp.writer", frm, i, r, v, s) try: with open("temp.writer") as f: txt = f.read() finally: os.remove("temp.writer") sbe = (" 5, 1.2, short string , test string\n" " 5, 45.8, a bit longer string , test string\n") assert txt == sbe
def _wttab_eventcount(f, res, ec, count_filter, desclen, descfrm, caselen): # extrema count n = len(res.cases) f.write(f"Extrema Count\nFilter: {count_filter}\n\n") widths = [desclen, *([caselen] * n)] headers = ["Description", *res.cases] for j, frm, lbl in zip( (0, 1), (f"{{:{caselen}d}}", f"{{:{caselen}.1f}}"), ("Count", "Percent") ): formats = [descfrm, *([frm] * n)] hu_, frm_ = writer.formheader( headers, widths, formats, sep=[7, 1], just="c", ulchar="=" ) f.write(hu_) rowlabels, table = _rowlbls_table(lbl, ec, j) writer.vecwrite(f, frm_, rowlabels, table) if j == 0: f.write("\n")
def _wtcmp(f, header, hu, frm, printargs, perpage, prtpv, pctinfo, desc): prtpv = prtpv.nonzero()[0] if perpage < 1: # one additional in case size is zero perpage = prtpv.size + 1 pages = (prtpv.size + perpage - 1) // perpage if prtpv.size < len(printargs[0]): for i, item in enumerate(printargs): printargs[i] = [item[j] for j in prtpv] tabhead = header + hu pager = "\n" # + chr(12) for p in range(pages): if p > 0: f.write(pager) f.write(tabhead) b = p * perpage e = b + perpage writer.vecwrite(f, frm, *printargs, so=slice(b, e)) f.write(pager) for lbl, hdr in zip(("mx", "mn", "amx"), (maxhdr, minhdr, absmhdr)): if lbl in pctinfo: f.write(_get_histogram_str(desc, hdr, pctinfo[lbl]))
def _get_histogram_str(desc, hdr, pctinfo): pctcount = pctinfo["hsto"] s = [ (f"\n\n {desc} - {hdr} Comparison Histogram\n\n"), (" % Diff Count Percent\n -------- -------- -------\n" ), ] with StringIO() as f: writer.vecwrite(f, " {:8.2f} {:8.0f} {:7.2f}\n", pctcount) s.append(f.getvalue()) s.append("\n") # total_percent_10 will either be 0 or 1000: # - 0 if all % diffs are "n/a" # - 1000 otherwise total_percent_10 = np.round(pctcount[:, 2].sum() * 10) last = -1.0 for pdiff in [1, 2, 5, 10, 15, 20, 25, 50, 100, 500]: pvdiff = abs(pctcount[:, 0]) <= pdiff num = pctcount[pvdiff, 2].sum() if num > last: s.append(f" {num:.1f}% of values are within {pdiff}%\n") if np.round(num * 10) == total_percent_10: break last = num pct = pctinfo["pct"] n = len(pct) if n == 0: s.append("\n % Diff Statistics: [Min, Max, Mean, StdDev]" " = [n/a, n/a, n/a, n/a]\n") else: stddev = 0.0 if n <= 1 else pct.std(ddof=1) s.append( "\n % Diff Statistics: [Min, Max, Mean, StdDev]" f" = [{pct.min():.2f}, {pct.max():.2f}, {pct.mean():.4f}, {stddev:.4f}]\n" ) return "".join(s)
def test_vecwrite_slice(): r = np.array([1.2, 45.8, 2.4, 12.3, 6.5]) m = np.arange(10).reshape(5, -1) # [[0, 1], [2, 3] ... s = "test" i = [5] v = ["short string", "a bit longer string", "3rd", "fourth", "number 5"] frm = "{:3}, {:5.1f}, {:<25}, {:1d}-{:1d}, {}" + chr(10) with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s) txt = f.getvalue() sbe = (" 5, 1.2, short string , 0-1, test\n" " 5, 45.8, a bit longer string , 2-3, test\n" " 5, 2.4, 3rd , 4-5, test\n" " 5, 12.3, fourth , 6-7, test\n" " 5, 6.5, number 5 , 8-9, test\n") assert txt == sbe with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s, so=slice(1, 5, 2)) txt = f.getvalue() sbe = ( #' 5, 1.2, short string , 0-1, test\n' " 5, 45.8, a bit longer string , 2-3, test\n" #' 5, 2.4, 3rd , 4-5, test\n' " 5, 12.3, fourth , 6-7, test\n" #' 5, 6.5, number 5 , 8-9, test\n' ) assert txt == sbe with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s, so=slice(1, None, 2)) txt = f.getvalue() sbe = ( #' 5, 1.2, short string , 0-1, test\n' " 5, 45.8, a bit longer string , 2-3, test\n" #' 5, 2.4, 3rd , 4-5, test\n' " 5, 12.3, fourth , 6-7, test\n" #' 5, 6.5, number 5 , 8-9, test\n' ) assert txt == sbe with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s, so=slice(3)) txt = f.getvalue() sbe = ( " 5, 1.2, short string , 0-1, test\n" " 5, 45.8, a bit longer string , 2-3, test\n" " 5, 2.4, 3rd , 4-5, test\n" #' 5, 12.3, fourth , 6-7, test\n' #' 5, 6.5, number 5 , 8-9, test\n' ) assert txt == sbe with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s, so=slice(3, None)) txt = f.getvalue() sbe = ( #' 5, 1.2, short string , 0-1, test\n' #' 5, 45.8, a bit longer string , 2-3, test\n' #' 5, 2.4, 3rd , 4-5, test\n' " 5, 12.3, fourth , 6-7, test\n" " 5, 6.5, number 5 , 8-9, test\n") assert txt == sbe v = list("too long to be compatible") with StringIO() as f: assert_raises(ValueError, writer.vecwrite, f, frm, i, r, v, m, s, so=slice(1, None, 2)) with StringIO() as f: writer.vecwrite(f, frm, i, r, v, m, s, so=slice(5)) txt = f.getvalue() sbe = (" 5, 1.2, t , 0-1, test\n" " 5, 45.8, o , 2-3, test\n" " 5, 2.4, o , 4-5, test\n" " 5, 12.3, , 6-7, test\n" " 5, 6.5, l , 8-9, test\n") assert txt == sbe
def test_formheader(): descs = ["Item 1", "A different item"] mx = np.array([[1.2, 2.3], [3.4, 4.5]]) * 1000 time = np.array([[1.234], [2.345]]) formats = ["{:<25s}", "{:10.2f}", "{:8.3f}"] widths = [25, 10, 8] assert_raises(ValueError, writer.formheader, 44, widths, formats, sep=[4, 5, 2], just=0) headers = [["The"] * 3, ["Descriptions", "Maximum", "Time", "BAD"]] assert_raises(ValueError, writer.formheader, headers, widths, formats, sep=[4, 5, 2], just=0) headers = [["The"] * 3, ["Descriptions", "Maximum", "Time"]] assert_raises(ValueError, writer.formheader, headers, [25, 10], formats, sep=[4, 5, 2], just=0) hu, f = writer.formheader(headers, widths, formats, sep=[4, 5, 2], just=0) with StringIO() as fout: fout.write(hu) writer.vecwrite(fout, f, descs, mx, time) s = fout.getvalue() sbe = (" The The The\n" " Descriptions Maximum Time\n" " ------------------------- ---------- --------\n" " Item 1 1200.00 2300.000\n" " A different item 3400.00 4500.000\n") assert sbe == s headers = ["Descriptions", "Maximum", "Time"] hu, f = writer.formheader(headers, widths, formats, sep=[4, 5, 2], just=0) with StringIO() as fout: fout.write(hu) writer.vecwrite(fout, f, descs, mx, time) s = fout.getvalue() sbe = (" Descriptions Maximum Time\n" " ------------------------- ---------- --------\n" " Item 1 1200.00 2300.000\n" " A different item 3400.00 4500.000\n") assert sbe == s headers = ["Descriptions", "Maximum", "Time"] hu, f = writer.formheader(headers, widths, formats, sep=2, just=("l", "c", "r")) with StringIO() as fout: fout.write(hu) writer.vecwrite(fout, f, descs, mx, time) s = fout.getvalue() sbe = (" Descriptions Maximum Time\n" " ------------------------- ---------- --------\n" " Item 1 1200.00 2300.000\n" " A different item 3400.00 4500.000\n") assert sbe == s