Compare commits

...

2 Commits

Author SHA1 Message Date
colin 286a267f75 app: stacked_cores: 52-xx: add some facilities for plotting 52-xx or gate runs
it's primitive; not the *best* results
2022-11-02 17:21:29 -07:00
colin ff68e57fa5 app: stacked_cores: 52-xx: collect the measurements into a db 2022-11-02 15:42:49 -07:00
4 changed files with 376 additions and 3 deletions

View File

@ -33,11 +33,11 @@ def format_float_tuple(t: tuple) -> str:
def format_list(l: list) -> str:
if len(l) == 0: return "[]"
if len(l) == 1: return f"{l}"
formatted_elems = [f"\t{e}" for e in l]
formatted_elems = [f" {e}," for e in l]
return "\n".join(["["] + formatted_elems + ["]"])
def indented(s: str) -> str:
return s.replace('\n', '\n\t')
return s.replace('\n', '\n ')
class ParameterizedMeas:
def __init__(self, meas = None):
@ -46,9 +46,19 @@ class ParameterizedMeas:
def add_meas(self, params: tuple, meas_rows: list):
self.meas[tuple(params)] = meas_rows
def all_rows(self) -> list:
# this is just `sum(self.meas.values())` but python is a idiot
rows = []
for mrows in self.meas.values():
rows.extend(mrows)
return rows
def runs(self) -> list:
return self.meas.values()
def __repr__(self) -> str:
meas_entries = "\n".join(
f"\t{format_float_tuple(k)}: {indented(format_list(v))}," for (k, v) in sorted(self.meas.items())
f" {format_float_tuple(k)}: {indented(format_list(v))}," for (k, v) in sorted(self.meas.items())
)
return f"ParameterizedMeas({{\n{meas_entries}\n}})"

View File

@ -0,0 +1,92 @@
#!/usr/bin/env python3
from math import sqrt
import plotly.express as px
from pandas import DataFrame
from stacked_cores_52xx import *
def plot(name: str, x_name: str, y_series: list):
df = DataFrame(data={ x_name: sweep_1d(len(y_series)), "y": y_series })
fig = px.line(df, x=x_name, y="y", title=name)
fig.show()
def eval_series(meas: 'ParameterizedMeas', points: list, y_idx: int = -1):
return [sample_all(meas, *p)[y_idx] for p in points]
def sample_all(meas: 'ParameterizedMeas', a0: float, a1: float) -> tuple:
runs = [extract_transfer_from_meas_rows(r) for r in meas.runs()]
distances = [(distance_to(m, (a0, a1)), m) for m in runs]
return weighted_sum_of_neighbors_by_inv_distance(distances)
def extract_transfer_from_meas_rows(meas_rows: list) -> tuple:
return (meas_rows[0].m[0], meas_rows[0].m[1], meas_rows[1].m[2], meas_rows[2].m[3])
def interpolate(meas: 'ParameterizedMeas', a0: float, a1: float) -> tuple:
"""
this interpolates a point among four neighboring points in 2d.
the implementation only supports 2d, but the technique is extendable to N dim.
"""
rows = [r.m for r in meas.all_rows()]
distances = [(distance_to(m, (a0, a1)), m) for m in rows]
# a0_below_dist, a0_below_val = min(d for d in distances if d[1][0] <= a0)
# a0_above_dist, a0_above_val = min(d for d in distances if d[1][0] >= a0)
# a1_below_dist, a1_below_val = min(d for d in distances if d[1][1] <= a1)
# a1_above_dist, a1_above_val = min(d for d in distances if d[1][1] >= a1)
a0_below = min((d for d in distances if d[1][0] <= a0), default=None)
a0_above = min((d for d in distances if d[1][0] >= a0), default=None)
a1_below = min((d for d in distances if d[1][1] <= a1), default=None)
a1_above = min((d for d in distances if d[1][1] >= a1), default=None)
neighbors = [a for a in [a0_below, a0_above, a1_below, a1_above] if a is not None]
return weighted_sum_of_neighbors_by_inv_distance(neighbors)
def weighted_sum_of_neighbors_by_inv_distance(neighbors: list) -> tuple:
"""
each neighbor is (distance, value).
return a weighted sum of these neighbors, where lower-distance neighbors are more strongly weighted.
"""
D = sum(a[0] for a in neighbors)
weight_n = lambda n: 1/max(n[0], 1e-3) # non-normalized weight for neighbor
W = sum(weight_n(n) for n in neighbors)
weighted_n = lambda n: weighted(n[1], weight_n(n)/W) # normalized weighted contribution for neighbor
return element_sum([weighted_n(n) for n in neighbors])
def weighted_sum_of_neighbors(neighbors: list) -> tuple:
"""
each neighbor is (distance, value).
return a weighted sum of these neighbors, where lower-distance neighbors are more strongly weighted.
"""
D = sum(a[0] for a in neighbors)
weight_n = lambda n: D - n[0] # non-normalized weight for neighbor
W = sum(weight_n(n) for n in neighbors)
weighted_n = lambda n: weighted(n[1], weight_n(n)/W) # normalized weighted contribution for neighbor
return element_sum([weighted_n(n) for n in neighbors])
def distance_to(p0: tuple, p1: tuple) -> float:
return sqrt(sum((x0-x1)*(x0-x1) for (x0, x1) in zip(p0, p1)))
def element_sum(lists: list) -> list:
elems = lists[0]
for l in lists[1:]:
for i, e in enumerate(l):
elems[i] += e
return elems
def weighted(l: list, scale: float) -> list:
return [e*scale for e in l]
or_gates = DB
sweep_1d = lambda points=101: [unit_to_m(x/(points-1)) for x in range(points)]
sweep_a0 = lambda a1, points=101: [(unit_to_m(x/(points-1)), a1) for x in range(points)]
sweep_a1 = lambda a0, points=101: [(a0, unit_to_m(x/(points-1))) for x in range(points)]
unit_to_m = lambda u: -17000 + 34000 * u
for name, meas in sorted(or_gates.items()):
trace = eval_series(meas, sweep_a1(-17000))
plot(f"{name}", "a1", trace)

View File

@ -0,0 +1,43 @@
#!/usr/bin/env python3
import os
from extract_meas import extract_parameterized_meas, indented
from stacked_cores_52xx_db import DB
def extract_stems(dirlist: list) -> list:
stems = set()
TERM = "-drive-"
for d in dirlist:
print(d)
if not d.startswith("52-"): continue
if TERM not in d: continue
stem = d[:d.find(TERM) + len(TERM)]
stems.add(stem)
return stems
def compute_db():
here, _ = os.path.split(__file__)
toplevel_out = f"{here}/../../../../out/applications/stacked_cores"
stems = extract_stems(os.listdir(toplevel_out))
return {
s: extract_parameterized_meas(os.path.join(toplevel_out, s), [2e-9, 4e-9, 8e-9])
for s in stems
}
def dump(path: str, db: dict):
with open(path, "w") as f:
f.write("from extract_meas import MeasRow, ParameterizedMeas\n\n")
f.write("DB = {")
for k, v in sorted(db.items()):
f.write(indented(f"\n{k!r}: {v},"))
f.write("\n}")
def update_db():
db = compute_db()
dump("stacked_cores_52xx_db.py", db)
if __name__ == '__main__': update_db()

View File

@ -0,0 +1,228 @@
from extract_meas import MeasRow, ParameterizedMeas
DB = {
'52-or--0.0004rad-1000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-2e10-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-16877, -16904, -16285, -16878]),
MeasRow(4e-09, [-28630, -28441, -8576, -15553]),
MeasRow(8e-09, [-28306, -28231, -28077, 177]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-16874, 6656, -17107, -16929]),
MeasRow(4e-09, [-28777, -28098, -1512, -16687]),
MeasRow(8e-09, [-28278, -28198, -28066, 3321]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-16843, 16301, -17065, -16869]),
MeasRow(4e-09, [-28822, -28071, 1111, -16707]),
MeasRow(8e-09, [-28270, -28189, -28066, 4568]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 8295, 8497, -17122, -16918]),
MeasRow(4e-09, [-28526, -28146, 3722, -16673]),
MeasRow(8e-09, [-28254, -28194, -28061, 5731]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16477, -16996, -17176, -16946]),
MeasRow(4e-09, [-28352, -28782, -2593, -16543]),
MeasRow(8e-09, [-28261, -28241, -28064, 2829]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16668, 16498, -17016, -16854]),
MeasRow(4e-09, [-28504, -28113, 7198, -16626]),
MeasRow(8e-09, [-28247, -28189, -28062, 7201]),
],
}),
'52-or--0.0004rad-2000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-1e10-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-16757, -16650, -9580, -16753]),
MeasRow(4e-09, [-28229, -27842, -3392, -16036]),
MeasRow(8e-09, [-27878, -27824, -27683, -2310]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-16648, 1337, -14694, -16683]),
MeasRow(4e-09, [-28508, -27696, -2683, -16542]),
MeasRow(8e-09, [-27886, -27810, -27687, -2082]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-16693, 16547, -16555, -16715]),
MeasRow(4e-09, [-28671, -27677, -106, -16607]),
MeasRow(8e-09, [-27887, -27806, -27687, -971]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 2983, 2964, -16291, -16696]),
MeasRow(4e-09, [-28067, -27725, 1009, -16637]),
MeasRow(8e-09, [-27871, -27812, -27690, -601]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16704, -16629, -15282, -16706]),
MeasRow(4e-09, [-27744, -28539, -2047, -16579]),
MeasRow(8e-09, [-27778, -27891, -27689, -1854]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16676, 16522, -16897, -16727]),
MeasRow(4e-09, [-27851, -27698, 6415, -16746]),
MeasRow(8e-09, [-27796, -27805, -27693, 1309]),
],
}),
'52-or--0.0004rad-2000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-2e10-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-17032, -17247, -17712, -17031]),
MeasRow(4e-09, [-28965, -28862, -9673, -15329]),
MeasRow(8e-09, [-28799, -28722, -28585, 350]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-16951, 10079, -17498, -16979]),
MeasRow(4e-09, [-29079, -28601, -701, -16579]),
MeasRow(8e-09, [-28767, -28689, -28572, 4599]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-16902, 16222, -17308, -16918]),
MeasRow(4e-09, [-29098, -28583, 1140, -16615]),
MeasRow(8e-09, [-28762, -28685, -28571, 5587]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 11228, 10998, -17386, -16952]),
MeasRow(4e-09, [-28915, -28630, 4699, -16563]),
MeasRow(8e-09, [-28750, -28686, -28567, 7482]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16413, -17143, -17564, -16998]),
MeasRow(4e-09, [-28842, -29037, -3065, -16220]),
MeasRow(8e-09, [-28764, -28722, -28574, 3465]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16643, 16461, -17135, -16882]),
MeasRow(4e-09, [-28906, -28612, 7107, -16533]),
MeasRow(8e-09, [-28741, -28679, -28567, 8799]),
],
}),
'52-or--0.0004rad-2000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-30000001024e0-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-17103, -17386, -18064, -17089]),
MeasRow(4e-09, [-29333, -29282, -9525, -13929]),
MeasRow(8e-09, [-29281, -29200, -29110, 4900]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-17034, 12903, -17738, -17040]),
MeasRow(4e-09, [-29380, -29136, 443, -15910]),
MeasRow(8e-09, [-29260, -29180, -29089, 9612]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-16976, 16188, -17496, -16985]),
MeasRow(4e-09, [-29385, -29124, 1572, -15974]),
MeasRow(8e-09, [-29258, -29175, -29089, 10218]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 13491, 13574, -17576, -17007]),
MeasRow(4e-09, [-29294, -29149, 5833, -15960]),
MeasRow(8e-09, [-29249, -29171, -29082, 12488]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16386, -17283, -17831, -17046]),
MeasRow(4e-09, [-29277, -29332, -3114, -15211]),
MeasRow(8e-09, [-29263, -29189, -29095, 7945]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16627, 16446, -17234, -16926]),
MeasRow(4e-09, [-29291, -29138, 7254, -15969]),
MeasRow(8e-09, [-29244, -29165, -29077, 13189]),
],
}),
'52-or--0.0004rad-5000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-30000001024e0-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-17215, -17627, -18647, -17200]),
MeasRow(4e-09, [-29987, -29936, -9605, -13641]),
MeasRow(8e-09, [-29970, -29952, -29859, 4176]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-17140, 13426, -18165, -17134]),
MeasRow(4e-09, [-30002, -29867, 205, -15391]),
MeasRow(8e-09, [-29962, -29939, -29844, 8045]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-17054, 16241, -17807, -17056]),
MeasRow(4e-09, [-30004, -29860, 1298, -15454]),
MeasRow(8e-09, [-29960, -29936, -29843, 8530]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 12364, 13869, -17934, -17091]),
MeasRow(4e-09, [-29975, -29873, 5187, -15527]),
MeasRow(8e-09, [-29959, -29933, -29838, 10250]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16403, -17493, -18281, -17133]),
MeasRow(4e-09, [-29964, -29960, -3570, -14599]),
MeasRow(8e-09, [-29964, -29947, -29850, 6638]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16642, 16478, -17423, -16973]),
MeasRow(4e-09, [-29971, -29868, 6812, -15544]),
MeasRow(8e-09, [-29955, -29929, -29839, 10948]),
],
}),
'52-or--0.0004rad-5000ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-49999998976e0-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-17269, -17747, -18930, -17257]),
MeasRow(4e-09, [-30532, -30505, -8672, -11666]),
MeasRow(8e-09, [-30542, -30568, -30482, 6999]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-17208, 12746, -18402, -17198]),
MeasRow(4e-09, [-30531, -30485, 340, -13040]),
MeasRow(8e-09, [-30541, -30562, -30468, 9809]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-17104, 16242, -17981, -17097]),
MeasRow(4e-09, [-30531, -30479, 1673, -13238]),
MeasRow(8e-09, [-30541, -30560, -30467, 10181]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 11178, 13470, -18141, -17155]),
MeasRow(4e-09, [-30530, -30480, 4702, -13242]),
MeasRow(8e-09, [-30542, -30559, -30462, 11103]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16402, -17600, -18510, -17178]),
MeasRow(4e-09, [-30529, -30501, -3107, -12672]),
MeasRow(8e-09, [-30541, -30564, -30473, 8718]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16633, 16468, -17520, -16999]),
MeasRow(4e-09, [-30527, -30473, 6476, -13306]),
MeasRow(8e-09, [-30540, -30556, -30463, 11596]),
],
}),
'52-or--0.0004rad-500ctl_cond-20000coupling_cond-2000ps-100ps-3ctl-3coupling-3_1_winding-49999998976e0-drive-': ParameterizedMeas({
(-1.000, -1.000,): [
MeasRow(2e-09, [-17062, -17312, -17911, -17059]),
MeasRow(4e-09, [-29152, -29125, -9394, -11763]),
MeasRow(8e-09, [-29139, -29027, -28928, 8454]),
],
(-1.000, 0.000,): [
MeasRow(2e-09, [-17023, 13648, -17638, -17023]),
MeasRow(4e-09, [-29163, -28990, 569, -14326]),
MeasRow(8e-09, [-29121, -28986, -28871, 13032]),
],
(-1.000, 1.000,): [
MeasRow(2e-09, [-16965, 16158, -17435, -16962]),
MeasRow(4e-09, [-29165, -28975, 1495, -14497]),
MeasRow(8e-09, [-29118, -28980, -28866, 13417]),
],
( 0.000, 0.000,): [
MeasRow(2e-09, [ 13197, 14274, -17489, -16997]),
MeasRow(4e-09, [-29132, -28975, 5489, -14455]),
MeasRow(8e-09, [-29110, -28967, -28847, 14870]),
],
( 1.000, -1.000,): [
MeasRow(2e-09, [ 16364, -17232, -17722, -17014]),
MeasRow(4e-09, [-29122, -29129, -3513, -13042]),
MeasRow(8e-09, [-29126, -29003, -28892, 11345]),
],
( 1.000, 1.000,): [
MeasRow(2e-09, [ 16590, 16410, -17188, -16904]),
MeasRow(4e-09, [-29126, -28962, 6689, -14511]),
MeasRow(8e-09, [-29105, -28961, -28842, 15194]),
],
}),
}