chore: 分离了sweep和vf部分,vf部分准备写为包

This commit is contained in:
mayge
2025-09-24 22:18:53 -04:00
parent 8e3472c839
commit ba87d6d784
24 changed files with 684 additions and 17745 deletions

3
.gitignore vendored
View File

@@ -5,4 +5,5 @@ __pycache__/
__pypackages__/
env/
.venv/
.vscode/
.vscode/
outputs/

File diff suppressed because it is too large Load Diff

View File

@@ -1,626 +0,0 @@
import numpy as np
from core.sk_iter import generate_starting_poles
from scipy.linalg import block_diag
import skrf as rf
from skrf import VectorFitting
from core.freqency import auto_select_multple_ports
import matplotlib.pyplot as plt
import random as rnd
def cond_row_inf(A, use_pinv=True):
"""行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。"""
A = np.asarray(A)
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf)
def cond_col_one(A, use_pinv=True):
"""列条件数 κ1(A) = ||A||1 * ||A^{-1}||1矩形阵用广义逆。"""
A = np.asarray(A)
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1)
class MultiPortOrthonormalBasis:
def __init__(self,H,freqs,poles,weights=None,passivity=True,dc_enforce=True,fit_constant=True,fit_proportional=False):
self.least_squares_condition = None
self.least_squares_row_condition = None
self.least_squares_col_condition = None
self.least_squares_rms_error = None
self.eigenval_condition = None
self.eigenval_row_condition = None
self.eigenval_col_condition = None
self.eigenval_rms_error = None
self.Cr = None
self.dc_tol = 1e-18
self.dc_enforce = dc_enforce
self.fit_constant = fit_constant
self.fit_proportional = fit_proportional
self.freqs = freqs
self.H = H
self.ports = H.shape[1]
self.s = self.freqs * 2j * np.pi
self.P = len(poles)
self.poles = poles
self.Phi = self.generate_basis(self.s, self.poles)
self.A = self.matrix_A(self.poles)
self.B = self.vector_B(self.poles)
self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights)
self.D = self.w0
self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles)))
z = np.linalg.eigvals(self.A - self.B @ self.C)
if passivity:
self.next_poles = self.passivity_enforce(z)
else:
self.next_poles = z
self.eigenval_condition,\
self.eigenval_row_condition,\
self.eigenval_col_condition,\
self.eigenval_rms_error = self.eigen_metric()
self.Dt = self.eval_Dt_state_space()
self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt)
pass
def eigen_metric(self):
"""Return condition number and RMS error of eigenvalues of A-BC."""
z = np.linalg.eigvals(self.A - self.B @ self.C)
cond = np.linalg.cond(self.A - self.B @ self.C)
rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2))
row_cond = cond_row_inf(self.A - self.B @ self.C)
col_cond = cond_col_one(self.A - self.B @ self.C)
return cond,row_cond,col_cond,rms
def least_squares_metric(self,A,b):
"""Return condition number and RMS error of least-squares matrix A and rhs b."""
cond = np.linalg.cond(A)
rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2))
row_cond = cond_row_inf(A)
col_cond = cond_col_one(A)
return cond,row_cond,col_cond,rms
def passivity_enforce(self,poles):
"""enforce poles' real parts to be negative"""
enforced_poles = []
for pole in poles:
if pole.real > 0:
pole = -np.conj(pole)
enforced_poles.append(pole)
return enforced_poles
def eval_Dt_state_space(self):
"""Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array)."""
s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel()
A = np.asarray(self.A, float); n = A.shape[0]
B = np.asarray(self.B, float).reshape(n, 1)
C = np.asarray(self.C, float).reshape(1, n)
D = self.D
I = np.eye(n, dtype=float)
out = np.empty_like(s, dtype=float)
for k, sk in enumerate(s):
DS = D + (C @ np.linalg.inv(sk*I - A) @ B)
out[k] = DS[0, 0]
return out
def generate_basis(self,s, poles):
"""Real basis of (15)-(16); returns Φ(s) and a layout for packing C."""
def all_pass(s,ap_list):
res = 1.0 +0.0j
for ap in ap_list:
res *= (s - np.conj(ap)) / (s + ap)
return res
cols = []
ap_list = []
i = 0
while i < len(poles):
ap = -poles[i]
if ap.real < 0:
raise ValueError("poles must be in the LHP")
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)):
ap1 = - poles[i+1]
phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1)))
phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1)))
cols += [phi1, phi2]
i += 2
ap_list.append(ap)
ap_list.append(ap1)
else:
basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap))
cols.append(basis)
i += 1
ap_list.append(ap)
Phi = np.column_stack(cols).astype(np.complex128)
return Phi
def matrix_A(self, poles):
def A_col(p:np.complex128,index:int):
ap = -p
if abs(ap.imag) < 1e-14:
col = []
for i in range(index):
col.append(0.0)
col.append(-ap.real)
for i in range(len(poles)-index-1):
col.append(2*(-ap).real)
return np.array([col], float)
else:
col1 = []
col2 = []
for i in range(index):
col1.append(0.0)
col2.append(0.0)
col1.append(-ap.real); col2.append(-ap.real - np.abs(ap))
col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real)
for i in range(len(poles)-index-2):
col1.append(2*(-ap).real)
col2.append(2*(-ap).real)
return np.array([col1, col2], float)
i = 0
cols = []
while i < len(poles):
p = poles[i]
cols.extend(A_col(p,i))
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2
else: i += 1
A = np.column_stack(cols).astype(float)
return A
def vector_B(self, poles):
return np.ones((len(poles), 1), float)
def fit_denominator(self, H, weights=None, d0 = 1.0):
"""
Solve formula (70) on the real basis Φ to obtain:
- d (real) → packs into C for this state's block structure
- gamma (complex)
Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|.
"""
K, N = self.Phi.shape
one = np.ones((K, 1), np.complex128)
Phi = self.Phi
dc_tol = 1e-18
has_dc = self.dc_enforce and self.freqs[0] < dc_tol
keep = np.ones(K, dtype=bool)
# SK weighting (applied only to the (73) rows we keep in LS)
if has_dc:
# Enforce DC response exactly:
k0 = int(np.argmin(np.abs(self.freqs)))
keep[k0] = False
if self.fit_constant:
Phi_w = np.hstack([one, Phi])
index = 0
M_kp = None
for i in range(self.ports):
for j in range(self.ports):
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
M0[:,index*N:(index+1)*N] = Phi
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex
index+=1
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
assert M_kp is not None
else:
index = 0
M_kp = None
for i in range(self.ports):
for j in range(self.ports):
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
M0[:,index*N:(index+1)*N] = Phi
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex
index+=1
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
assert M_kp is not None
if weights is None:
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
else:
weights_kp0 = weights[keep]
weights0 = []
for i in range(self.ports **2 ):
for res in weights_kp0:
weights0.append(1/res)
weights_kp = np.diag(np.array(weights0))
if has_dc:
M_w_kp = weights_kp @ M_kp
A_re = np.real(M_w_kp)
A_im = np.imag(M_w_kp)
mask = np.ones(K, dtype=bool); mask[k0] = False
# exact (unweighted) DC rows:
# A_dc_re = np.real(M_kp).reshape(1, -1)
# A_dc_im = np.imag(M_kp).reshape(1, -1)
else:
M_w_kp = weights_kp @ M_kp
A_re = np.real(M_w_kp)
A_im = np.imag(M_w_kp)
# A_dc_re = A_dc_im = None
A_blocks = [A_re, A_im]
if self.fit_constant:
Hk_sum = []
for i in range(self.ports):
Hk_sum.append([])
for j in range(self.ports):
Hk_kp0 = H[:,i,j][keep]
Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2))
# Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0])
K_keep = int(np.count_nonzero(keep))
A_w0 = []
b_w0 = []
# Hk_sum = np.sum(np.abs(Hk_kp)**2)
for i in range(self.ports):
for j in range(self.ports):
beta_ij = float(np.sqrt(Hk_sum[i][j]))
mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0)
A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float),
np.real(mean_row).astype(float)]
).reshape(1, -1))
b_w0.append(np.array([beta_ij], float))
b_w0 = np.asarray(b_w0).ravel()
A_blocks += A_w0
m = A_re.shape[0] + A_im.shape[0]
b = np.zeros(m, float)
b = np.concatenate([b, b_w0])
else:
H_kp = None
for i in range(self.ports):
for j in range(self.ports):
H_0 = H[:,i,j][keep]
H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0])
assert H_kp is not None
H_kp = weights_kp @ H_kp.reshape(-1,1)
b_re = np.real(d0 * H_kp)
b_im = np.imag(d0 * H_kp)
b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float)
# ---- build final stacked-real system ----
# if A_dc_re is not None:
# A_blocks += [A_dc_re, A_dc_im]
# b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0
# ---- QR solve for x = [c_H (N); c_w (N+1)] ----
A = np.vstack(A_blocks).astype(float)
Q, R = np.linalg.qr(A, mode="reduced")
if self.fit_constant:
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
else:
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
x = np.linalg.solve(R22, Q2.T @ b)
# diagnostics
resid = Q2 @ R22 @ x - b
# self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2)))
# self.least_squares_condition = float(np.linalg.cond(R))
self.least_squares_condition,\
self.least_squares_row_condition,\
self.least_squares_col_condition,\
self.least_squares_rms_error = self.least_squares_metric(A, b)
return self.extract_C_d_e(x,N,d0)
def extract_C_d_e(self,C,N,d0=1.0):
a = np.sqrt(2 * np.real(-np.array(self.poles)))
if self.fit_proportional and self.fit_constant:
d = C[1]
e = C[0]
C = a * C[2:]
return C.reshape(1, -1), d, e
elif self.fit_proportional and not self.fit_constant:
d = 0.0
e = C[0]
C = a * C[1:]
return C.reshape(1, -1), d, e
elif not self.fit_proportional and self.fit_constant:
d = C[0]
e = 0.0
C = a * C[1:]
return C.reshape(1, -1), d, e
else:
C = a * C
return C.reshape(1, -1), d0, 0.0
def non_bias_Cr(self,w0):
A = np.asarray(self.Phi)
den = np.diag((w0 + self.Phi @ self.residuals.T).ravel())
Cr = []
for i in range(self.ports):
Cr.append([])
for j in range(self.ports):
b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1)
Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
Cr[i].append(Cr_ij)
return Cr
def get_model_responses(self,freqs):
H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex)
s = 1j * 2*np.pi * np.asarray(freqs, float).ravel()
phi = self.generate_basis(s, self.poles)
den = self.w0 + phi @ self.residuals.T
if self.Cr is None:
self.Cr = self.non_bias_Cr(w0=self.w0)
for i in range(self.ports):
for j in range(self.ports):
num = phi @ self.Cr[i][j]
H[:,i,j] = (num / den).reshape(1,-1)
return H
class VFUtils():
def __init__(self,npoles_cplx,freqs,H,model=MultiPortOrthonormalBasis,iterations:int=5):
poles = generate_starting_poles(npoles_cplx,beta_min=1e4,beta_max=freqs[-1]*1.1)
self.model=model(H=H,freqs=freqs,poles=poles)
self.freqs=freqs
self.H=H
self.iterations=iterations
self.nports = H.shape[1]
self.least_squares_condition = []
self.least_squares_row_condition = []
self.least_squares_col_condition = []
self.least_squares_rms_error = []
self.eigenval_condition = []
self.eigenval_row_condition = []
self.eigenval_col_condition = []
self.eigenval_rms_error = []
self.model_responses_freqs = None
self.model_responses_H = None
def fit(self):
for i in range(self.iterations):
print(f"Iteration {i+1}/{self.iterations}")
poles = self.model.next_poles
weights = self.model.Dt
self.model = self.model.__class__(H=self.H,freqs=self.freqs,poles=poles,weights=weights)
print("A:",self.model.A)
print("B:",self.model.B)
print("C:",self.model.C)
print("D:",self.model.D)
print("next_pozles:",self.model.next_poles)
print("Dt:",self.model.Dt)
print("Dt/Dt_1:",np.linalg.norm(self.model.Dt_Dt_1))
self.least_squares_condition.append(self.model.least_squares_condition)
self.least_squares_row_condition.append(self.model.least_squares_row_condition)
self.least_squares_col_condition.append(self.model.least_squares_col_condition)
self.least_squares_rms_error.append(self.model.least_squares_rms_error)
self.eigenval_condition.append(self.model.eigenval_condition)
self.eigenval_row_condition.append(self.model.eigenval_row_condition)
self.eigenval_col_condition.append(self.model.eigenval_col_condition)
self.eigenval_rms_error.append(self.model.eigenval_rms_error)
return self.model
def plot_metrics(self):
plt.figure(figsize=(16, 12))
plt.subplot(4, 2, 1)
plt.plot(self.least_squares_condition, label='Least Squares Condition')
plt.legend()
plt.subplot(4, 2, 2)
plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition')
plt.legend()
plt.subplot(4, 2, 3)
plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition')
plt.legend()
plt.subplot(4, 2, 4)
plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error')
plt.legend()
plt.subplot(4, 2, 5)
plt.plot(self.eigenval_condition, label='Eigenvalue Condition')
plt.legend()
plt.subplot(4, 2, 6)
plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition')
plt.legend()
plt.subplot(4, 2, 7)
plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition')
plt.legend()
plt.subplot(4, 2, 8)
plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error')
plt.legend()
plt.savefig("fit_metrics.png")
def plot_model_responses(self):
assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first."
for i in range(self.nports):
for j in range(self.nports):
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Magnitude")
plt.legend(loc="best")
plt.subplot(2, 2, 2)
plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Phase (deg)")
plt.legend(loc="best")
plt.tight_layout()
plt.subplot(2, 2, 3)
plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Real Part")
plt.legend(loc="best")
plt.subplot(2, 2, 4)
plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Imag Part")
plt.legend(loc="best")
plt.tight_layout()
plt.savefig(f"model_response_{i+1}{j+1}.png")
print(f"Saved model_response_{i+1}{j+1}.png")
def get_model_responses(self,freqs):
self.model_responses_freqs = freqs
self.model_responses_H = self.model.get_model_responses(freqs)
return self.model_responses_H
def noise(n:complex,coeff:float=0.05):
noise_r = rnd.gauss(-coeff * n.real, coeff * n.real)
noise_i = rnd.gauss(-coeff * n.imag, coeff * n.imag)
return complex(n.real + noise_r, n.imag + noise_i)
if __name__ == "__main__":
start_point = 0
id = 3000
network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p")
# network = rf.data.ring_slot
ports = network.nports
K = 100
full_freqences = network.f[start_point:]
noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
# noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
# sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20)
poles = generate_starting_poles(2,beta_min=1e4,beta_max=freqs[-1]*1.1)
vf = VFUtils(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K)
model = vf.fit()
vf.plot_metrics()
model_responses = vf.get_model_responses(full_freqences)
vf.plot_model_responses()
# # Original plot functions
# Dt_1 = np.ones((len(freqs),1),np.complex128)
# # Levi step (no weighting):
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles)
# Dt = basis.Dt
# poles = basis.next_poles
# print("Levi step (no weighting):")
# print("A:",basis.A)
# print("B:",basis.B)
# print("C:",basis.C)
# print("D:",basis.D)
# print("next_pozles:",basis.next_poles)
# print("Dt:",Dt, "norm:",np.linalg.norm(Dt))
# # SK weighting (optional, after first pass):
# least_squares_condition = []
# least_squares_rms_error = []
# eigenval_condition = []
# eigenval_rms_error = []
# for i in range(K):
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt)
# Dt_1 = Dt
# Dt = basis.Dt
# poles = basis.next_poles
# print(f"SK Iteration {i+1}/{K}")
# print("A:",basis.A)
# print("B:",basis.B)
# print("C:",basis.C)
# print("D:",basis.D)
# print("z:",basis.next_poles)
# print("Dt:",Dt)
# print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1))
# least_squares_condition.append(basis.least_squares_condition)
# least_squares_rms_error.append(basis.least_squares_rms_error)
# eigenval_condition.append(basis.eigenval_condition)
# eigenval_rms_error.append(basis.eigenval_rms_error)
# # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0])
# H_evaluated = basis.get_model_responses(full_freqences)
# fitted_points = H_evaluated
# sliced_freqences = freqs
# input_points = H
# for i in range(ports):
# for j in range(ports):
# fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False)
# ax00 = axes[0][0]
# ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# ax00.set_title(f"Response i={i+1}, j={j+1}")
# ax00.set_ylabel("Magnitude")
# ax00.legend(loc="best")
# ax01 = axes[0][1]
# ax01.set_title(f"Response i={i+1}, j={j+1}")
# ax01.set_ylabel("Phase (deg)")
# ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples')
# ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
# ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples')
# ax01.legend(loc="best")
# # ax00 = axes[0][0]
# # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# # ax00.set_title(f"Response i={i+1}, j={j+1}")
# # ax00.set_ylabel("Real Part")
# # ax00.legend(loc="best")
# # ax01 = axes[0][1]
# # ax01.set_title(f"Response i={i+1}, j={j+1}")
# # ax01.set_ylabel("Imag Part")
# # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# # ax01.legend(loc="best")
# ax10 = axes[1][0]
# ax10.plot(least_squares_condition, label='Least Squares Condition')
# ax10.set_title("least_squares_condition")
# ax10.set_ylabel("Magnitude")
# ax10.legend(loc="best")
# ax11 = axes[1][1]
# ax11.plot(least_squares_rms_error, label='Least Squares RMS Error')
# ax11.set_title("least_squares_rms_error")
# ax11.set_ylabel("Magnitude")
# ax11.legend(loc="best")
# ax20 = axes[2][0]
# ax20.plot(eigenval_condition, label='Eigenvalue Condition')
# ax20.set_title("eigenval_condition")
# ax20.set_ylabel("Magnitude")
# ax20.legend(loc="best")
# ax21 = axes[2][1]
# ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error')
# ax21.set_title("eigenval_rms_error")
# ax21.set_ylabel("Magnitude")
# ax21.legend(loc="best")
# fig.tight_layout()
# plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png")
# print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png")

176
core/VFManager.py Normal file
View File

@@ -0,0 +1,176 @@
import matplotlib.pyplot as plt
import numpy as np
from .basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis
from .utils import generate_starting_poles
class VFManager():
def __init__(
self,
npoles_cplx,
freqs,
H,
model=MultiPortOrthonormalBasis,
iterations:int=5,
fit_constant:bool=True,
fit_proportional:bool=False,
dc_enforce:bool=False,
passivity_enforce:bool=True,
verbose:bool=True
):
self.freqs=freqs
self.H=H
self.iterations=iterations
self.fit_constant=fit_constant
self.fit_proportional=fit_proportional
self.dc_enforce=dc_enforce
self.passivity_enforce=passivity_enforce
self.verbose=verbose
self.nports = H.shape[1]
self.npoles_cplx = npoles_cplx
self.least_squares_condition = []
self.least_squares_row_condition = []
self.least_squares_col_condition = []
self.least_squares_rms_error = []
self.eigenval_condition = []
self.eigenval_row_condition = []
self.eigenval_col_condition = []
self.eigenval_rms_error = []
self.model_instance = None
self.model_responses_freqs = None
self.model_responses_H = None
self.model=model
def fit(self):
self.levi()
self.model_instance = self.sk_iteration()
return self.model
def levi(self):
self.poles = generate_starting_poles(self.npoles_cplx,beta_min=1e4,beta_max=self.freqs[-1]*1.1)
self.model_instance=self.model(
H=self.H,
freqs=self.freqs,
poles=self.poles,
fit_constant=self.fit_constant,
fit_proportional=self.fit_proportional,
dc_enforce=self.dc_enforce,
passivity_enforce=self.passivity_enforce
)
return self.model_instance
def sk_iteration(self):
for i in range(self.iterations):
assert self.model_instance is not None ,"Please run levi() first."
self.poles = self.model_instance.next_poles
self.weights = self.model_instance.Dt
self.model_instance = self.model(
H=self.H,
freqs=self.freqs,
poles=self.poles,
weights=self.weights,
fit_constant=self.fit_constant,
fit_proportional=self.fit_proportional,
dc_enforce=self.dc_enforce,
passivity_enforce=self.passivity_enforce
)
if self.verbose:
print(f"Iteration {i+1}/{self.iterations}")
print("A:",self.model_instance.A)
print("B:",self.model_instance.B)
print("C:",self.model_instance.C)
print("D:",self.model_instance.D)
print("next_pozles:",self.model_instance.next_poles)
print("Dt:",self.model_instance.Dt)
print("Dt/Dt_1:",np.linalg.norm(self.model_instance.Dt_Dt_1))
self.least_squares_condition.append(self.model_instance.least_squares_condition)
self.least_squares_row_condition.append(self.model_instance.least_squares_row_condition)
self.least_squares_col_condition.append(self.model_instance.least_squares_col_condition)
self.least_squares_rms_error.append(self.model_instance.least_squares_rms_error)
self.eigenval_condition.append(self.model_instance.eigenval_condition)
self.eigenval_row_condition.append(self.model_instance.eigenval_row_condition)
self.eigenval_col_condition.append(self.model_instance.eigenval_col_condition)
self.eigenval_rms_error.append(self.model_instance.eigenval_rms_error)
return self.model_instance
def plot_metrics(self,show:bool=True,save_path=None):
plt.figure(figsize=(16, 12))
plt.subplot(4, 2, 1)
plt.plot(self.least_squares_condition, label='Least Squares Condition')
plt.legend()
plt.subplot(4, 2, 2)
plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition')
plt.legend()
plt.subplot(4, 2, 3)
plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition')
plt.legend()
plt.subplot(4, 2, 4)
plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error')
plt.legend()
plt.subplot(4, 2, 5)
plt.plot(self.eigenval_condition, label='Eigenvalue Condition')
plt.legend()
plt.subplot(4, 2, 6)
plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition')
plt.legend()
plt.subplot(4, 2, 7)
plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition')
plt.legend()
plt.subplot(4, 2, 8)
plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error')
plt.legend()
if show:
plt.show()
if save_path is not None:
if self.verbose:
print(f"Saving metrics plot to {save_path}/fitting_metrics.png")
plt.savefig(f"{save_path}/fitting_metrics.png")
def plot_model_responses(self,show:bool=True,save_path=None):
assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first."
for i in range(self.nports):
for j in range(self.nports):
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Magnitude")
plt.legend(loc="best")
plt.subplot(2, 2, 2)
plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Phase (deg)")
plt.legend(loc="best")
plt.tight_layout()
plt.subplot(2, 2, 3)
plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Real Part")
plt.legend(loc="best")
plt.subplot(2, 2, 4)
plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
plt.title(f"Response i={i+1}, j={j+1}")
plt.ylabel("Imag Part")
plt.legend(loc="best")
plt.tight_layout()
if show:
plt.show()
if save_path is not None:
if self.verbose:
print(f"Saving response plot for port {i+1},{j+1} to {save_path}/response_{i+1}_{j+1}.png")
plt.savefig(f"{save_path}/response_{i+1}_{j+1}.png")
def get_model_responses(self,freqs):
assert self.model_instance is not None ,"Please run levi() and sk_iteration() first."
self.model_responses_freqs = freqs
self.model_responses_H = self.model_instance.get_model_responses(freqs)
return self.model_responses_H

View File

@@ -0,0 +1,362 @@
import numpy as np
import skrf as rf
from ..utils import cond_row_inf, cond_col_one, generate_starting_poles
class MultiPortOrthonormalBasis:
def __init__(self,H,freqs,poles,weights=None,passivity_enforce=True,dc_enforce=True,fit_constant=True,fit_proportional=False):
self.least_squares_condition = None
self.least_squares_row_condition = None
self.least_squares_col_condition = None
self.least_squares_rms_error = None
self.eigenval_condition = None
self.eigenval_row_condition = None
self.eigenval_col_condition = None
self.eigenval_rms_error = None
self.Cr = None
self.dc_tol = 1e-18
self.dc_enforce = dc_enforce
self.fit_constant = fit_constant
self.fit_proportional = fit_proportional
self.freqs = freqs
self.H = H
self.ports = H.shape[1]
self.s = self.freqs * 2j * np.pi
self.P = len(poles)
self.poles = poles
self.Phi = self.generate_basis(self.s, self.poles)
self.A = self.matrix_A(self.poles)
self.B = self.vector_B(self.poles)
self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights)
self.D = self.w0
self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles)))
z = np.linalg.eigvals(self.A - self.B @ self.C)
if passivity_enforce:
self.next_poles = self.passivity_enforce(z)
else:
self.next_poles = z
self.eigenval_condition,\
self.eigenval_row_condition,\
self.eigenval_col_condition,\
self.eigenval_rms_error = self.eigen_metric()
self.Dt = self.eval_Dt_state_space()
self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt)
pass
def eigen_metric(self):
"""Return condition number and RMS error of eigenvalues of A-BC."""
z = np.linalg.eigvals(self.A - self.B @ self.C)
cond = np.linalg.cond(self.A - self.B @ self.C)
rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2))
row_cond = cond_row_inf(self.A - self.B @ self.C)
col_cond = cond_col_one(self.A - self.B @ self.C)
return cond,row_cond,col_cond,rms
def least_squares_metric(self,A,b):
"""Return condition number and RMS error of least-squares matrix A and rhs b."""
cond = np.linalg.cond(A)
rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2))
row_cond = cond_row_inf(A)
col_cond = cond_col_one(A)
return cond,row_cond,col_cond,rms
def passivity_enforce(self,poles):
"""enforce poles' real parts to be negative"""
enforced_poles = []
for pole in poles:
if pole.real > 0:
pole = -np.conj(pole)
enforced_poles.append(pole)
return enforced_poles
def eval_Dt_state_space(self):
"""Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array)."""
s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel()
A = np.asarray(self.A, float); n = A.shape[0]
B = np.asarray(self.B, float).reshape(n, 1)
C = np.asarray(self.C, float).reshape(1, n)
D = self.D
I = np.eye(n, dtype=float)
out = np.empty_like(s, dtype=np.complex128)
for k, sk in enumerate(s):
DS = D + (C @ np.linalg.inv(sk*I - A) @ B)
out[k] = DS[0, 0]
return out
def generate_basis(self,s, poles):
"""Real basis of (15)-(16); returns Φ(s) and a layout for packing C."""
def all_pass(s,ap_list):
res = 1.0 +0.0j
for ap in ap_list:
res *= (s - np.conj(ap)) / (s + ap)
return res
cols = []
ap_list = []
i = 0
while i < len(poles):
ap = -poles[i]
if ap.real < 0:
raise ValueError("poles must be in the LHP")
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)):
ap1 = - poles[i+1]
phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1)))
phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1)))
cols += [phi1, phi2]
i += 2
ap_list.append(ap)
ap_list.append(ap1)
else:
basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap))
cols.append(basis)
i += 1
ap_list.append(ap)
Phi = np.column_stack(cols).astype(np.complex128)
return Phi
def matrix_A(self, poles):
def A_col(p:np.complex128,index:int):
ap = -p
if abs(ap.imag) < 1e-14:
col = []
for i in range(index):
col.append(0.0)
col.append(-ap.real)
for i in range(len(poles)-index-1):
col.append(2*(-ap).real)
return np.array([col], float)
else:
col1 = []
col2 = []
for i in range(index):
col1.append(0.0)
col2.append(0.0)
col1.append(-ap.real); col2.append(-ap.real - np.abs(ap))
col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real)
for i in range(len(poles)-index-2):
col1.append(2*(-ap).real)
col2.append(2*(-ap).real)
return np.array([col1, col2], float)
i = 0
cols = []
while i < len(poles):
p = poles[i]
cols.extend(A_col(p,i))
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2
else: i += 1
A = np.column_stack(cols).astype(float)
return A
def vector_B(self, poles):
return np.ones((len(poles), 1), float)
def fit_denominator(self, H, weights=None, d0 = 1.0):
"""
Solve formula (70) on the real basis Φ to obtain:
- d (real) → packs into C for this state's block structure
- gamma (complex)
Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|.
"""
K, N = self.Phi.shape
one = np.ones((K, 1), np.complex128)
Phi = self.Phi
dc_tol = 1e-18
has_dc = self.dc_enforce and self.freqs[0] < dc_tol
keep = np.ones(K, dtype=bool)
# SK weighting (applied only to the (73) rows we keep in LS)
if has_dc:
# Enforce DC response exactly:
k0 = int(np.argmin(np.abs(self.freqs)))
keep[k0] = False
if self.fit_constant:
Phi_w = np.hstack([one, Phi])
index = 0
M_kp = None
for i in range(self.ports):
for j in range(self.ports):
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
M0[:,index*N:(index+1)*N] = Phi
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex
index+=1
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
assert M_kp is not None
else:
index = 0
M_kp = None
for i in range(self.ports):
for j in range(self.ports):
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
M0[:,index*N:(index+1)*N] = Phi
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex
index+=1
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
assert M_kp is not None
if weights is None:
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
else:
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
# weights_kp0 = weights[keep]
# weights0 = []
# for i in range(self.ports **2 ):
# for res in weights_kp0:
# weights0.append(1/res)
# weights_kp = np.diag(np.array(weights0))
if has_dc:
M_w_kp = weights_kp @ M_kp
A_re = np.real(M_w_kp)
A_im = np.imag(M_w_kp)
mask = np.ones(K, dtype=bool); mask[k0] = False
# exact (unweighted) DC rows:
# A_dc_re = np.real(M_kp).reshape(1, -1)
# A_dc_im = np.imag(M_kp).reshape(1, -1)
else:
M_w_kp = weights_kp @ M_kp
A_re = np.real(M_w_kp)
A_im = np.imag(M_w_kp)
# A_dc_re = A_dc_im = None
A_blocks = [A_re, A_im]
if self.fit_constant:
Hk_sum = []
for i in range(self.ports):
Hk_sum.append([])
for j in range(self.ports):
Hk_kp0 = H[:,i,j][keep]
Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2))
# Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0])
K_keep = int(np.count_nonzero(keep))
A_w0 = []
b_w0 = []
# Hk_sum = np.sum(np.abs(Hk_kp)**2)
for i in range(self.ports):
for j in range(self.ports):
beta_ij = float(np.sqrt(Hk_sum[i][j]))
mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0)
A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float),
np.real(mean_row).astype(float)]
).reshape(1, -1))
b_w0.append(np.array([beta_ij], float))
b_w0 = np.asarray(b_w0).ravel()
A_blocks += A_w0
m = A_re.shape[0] + A_im.shape[0]
b = np.zeros(m, float)
b = np.concatenate([b, b_w0])
else:
H_kp = None
for i in range(self.ports):
for j in range(self.ports):
H_0 = H[:,i,j][keep]
H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0])
assert H_kp is not None
H_kp = weights_kp @ H_kp.reshape(-1,1)
b_re = np.real(d0 * H_kp)
b_im = np.imag(d0 * H_kp)
b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float)
# ---- build final stacked-real system ----
# if A_dc_re is not None:
# A_blocks += [A_dc_re, A_dc_im]
# b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0
# ---- QR solve for x = [c_H (N); c_w (N+1)] ----
A = np.vstack(A_blocks).astype(float)
Q, R = np.linalg.qr(A, mode="reduced")
if self.fit_constant:
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
else:
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
x = np.linalg.solve(R22, Q2.T @ b)
# diagnostics
resid = Q2 @ R22 @ x - b
# self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2)))
# self.least_squares_condition = float(np.linalg.cond(R))
self.least_squares_condition,\
self.least_squares_row_condition,\
self.least_squares_col_condition,\
self.least_squares_rms_error = self.least_squares_metric(A, b)
return self.extract_C_d_e(x,N,d0)
def extract_C_d_e(self,C,N,d0=1.0):
a = np.sqrt(2 * np.real(-np.array(self.poles)))
if self.fit_proportional and self.fit_constant:
d = C[1]
e = C[0]
C = a * C[2:]
return C.reshape(1, -1), d, e
elif self.fit_proportional and not self.fit_constant:
d = 0.0
e = C[0]
C = a * C[1:]
return C.reshape(1, -1), d, e
elif not self.fit_proportional and self.fit_constant:
d = C[0]
e = 0.0
C = a * C[1:]
return C.reshape(1, -1), d, e
else:
C = a * C
return C.reshape(1, -1), d0, 0.0
def non_bias_Cr(self,w0):
A = np.asarray(self.Phi)
den = np.diag((w0 + self.Phi @ self.residuals.T).ravel())
Cr = []
for i in range(self.ports):
Cr.append([])
for j in range(self.ports):
b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1)
Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
Cr[i].append(Cr_ij)
return Cr
def get_model_responses(self,freqs):
H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex)
s = 1j * 2*np.pi * np.asarray(freqs, float).ravel()
phi = self.generate_basis(s, self.poles)
den = self.w0 + phi @ self.residuals.T
if self.Cr is None:
self.Cr = self.non_bias_Cr(w0=self.w0)
for i in range(self.ports):
for j in range(self.ports):
num = phi @ self.Cr[i][j]
H[:,i,j] = (num / den).reshape(1,-1)
return H

View File

@@ -1,9 +1,9 @@
import numpy as np
from core.sk_iter import generate_starting_poles
from core.utils import generate_starting_poles
from scipy.linalg import block_diag
import skrf as rf
from skrf import VectorFitting
from core.freqency import auto_select_multple_ports
from core.sample import auto_select_multple_ports
import matplotlib.pyplot as plt
import random as rnd

View File

@@ -1,9 +1,9 @@
import numpy as np
from core.sk_iter import generate_starting_poles
from core.utils import generate_starting_poles
from scipy.linalg import block_diag
import skrf as rf
from skrf import VectorFitting
from core.freqency import auto_select
from core.sample import auto_select
class BasicBasis:
def __init__(self,H,freqs,poles,weights=None):

View File

@@ -1,9 +1,9 @@
import numpy as np
from core.sk_iter import generate_starting_poles
from core.utils import generate_starting_poles
from scipy.linalg import block_diag
import skrf as rf
from skrf import VectorFitting
from core.freqency import auto_select
from core.sample import auto_select
class BasicBasisQR:
def __init__(self,H,freqs,poles,weights=None):

View File

@@ -1,9 +1,9 @@
import numpy as np
from core.sk_iter import generate_starting_poles
from core.utils import generate_starting_poles
from scipy.linalg import block_diag
import skrf as rf
from skrf import VectorFitting
from core.freqency import auto_select
from core.sample import auto_select
import random as rnd
class RelaxedBasicBasisQR:

View File

@@ -1,909 +0,0 @@
"""
.. currentmodule:: skrf.util
========================================
util (:mod:`skrf.util`)
========================================
Holds utilities that are general conveniences.
Time-related utilities
----------------------
.. autosummary::
:toctree: generated/
now_string
now_string_2_dt
ProgressBar
Array-related functions
-----------------------
.. autosummary::
:toctree: generated/
find_nearest
find_nearest_index
has_duplicate_value
smooth
File-related functions
----------------------
.. autosummary::
:toctree: generated/
get_fid
get_extn
basename_noext
git_version
unique_name
findReplace
dict_2_recarray
General Purpose Objects
-----------------------
.. autosummary::
:toctree: generated/
HomoList
HomoDict
"""
from __future__ import annotations
import collections
import contextlib
import fnmatch
import os
import pprint
import re
import sys
import warnings
from datetime import datetime
from functools import wraps
from pathlib import Path
from subprocess import PIPE, Popen
from typing import Any, Callable, Iterable, TypeVar
import numpy as np
from skrf.constants import Number
try:
import matplotlib.pyplot as plt
from matplotlib.axes import Axes
from matplotlib.figure import Figure
except ImportError:
Figure = TypeVar("Figure")
Axes = TypeVar("Axes")
pass
def plotting_available() -> bool:
return "matplotlib" in sys.modules
def partial_with_docs(func, *args1, **kwargs1):
@wraps(func)
def method(self, *args2, **kwargs2):
return func(self, *args1, *args2, **kwargs1, **kwargs2)
return method
def axes_kwarg(func):
"""
This decorator checks if a :class:`matplotlib.axes.Axes` object is passed,
if not the current axis will be gathered through :func:`plt.gca`.
Raises
------
RuntimeError
When trying to run the decorated function without matplotlib
"""
@wraps(func)
def wrapper(*args, **kwargs):
ax = kwargs.pop('ax', None)
try:
if ax is None:
ax = plt.gca()
except NameError as err:
raise RuntimeError("Plotting is not available") from err
func(*args, ax=ax, **kwargs)
return wrapper
def copy_doc(copy_func: Callable) -> Callable:
"""Use Example: copy_doc(self.copy_func)(self.func) or used as deco"""
def wrapper(func: Callable) -> Callable:
func.__doc__ = copy_func.__doc__
return func
return wrapper
def figure(*args, **kwargs) -> Figure:
"""
Wraps the matplotlib figure call and raises if not available.
Raises
------
RuntimeError
When trying to get subplots without matplotlib installed.
"""
try:
return plt.figure(*args, **kwargs)
except NameError as err:
raise RuntimeError("Plotting is not available") from err
def subplots(*args, **kwargs) -> tuple[Figure, np.ndarray]:
"""
Wraps the matplotlib subplots call and raises if not available.
Raises
------
RuntimeError
When trying to get subplots without matplotlib installed.
"""
try:
return plt.subplots(*args, **kwargs)
except NameError as err:
raise RuntimeError("Plotting is not available") from err
def now_string() -> str:
"""
Return a unique sortable string, representing the current time.
Nice for generating date-time stamps to be used in file-names,
the companion function :func:`now_string_2_dt` can be used
to read these string back into datetime objects.
Returns
-------
now : string
curent date-time stamps.
See Also
--------
now_string_2_dt
"""
return datetime.now().__str__().replace('-','.').replace(':','.').replace(' ','.')
def now_string_2_dt(s: str) -> datetime:
"""
Converts the output of :func:`now_string` to a datetime object.
Parameters
----------
s : str
date-time stamps string as generated by :func:`now_string`
Returns
-------
dt : datetime
date-time stamps
See Also
--------
now_string
"""
return datetime(*[int(k) for k in s.split('.')])
def find_nearest(array: np.ndarray, value: Number) -> Number:
"""
Find the nearest value in array.
Parameters
----------
array : np.ndarray
array we are searching for a value in
value : element of the array
value to search for
Returns
--------
found_value : an element of the array
the value that is numerically closest to `value`
"""
idx = find_nearest_index(array, value)
return array[idx]
def find_nearest_index(array: np.ndarray, value: Number) -> int:
"""
Find the nearest index for a value in array.
Parameters
----------
array : np.ndarray
array we are searching for a value in
value : element of the array
value to search for
Returns
--------
found_index : int
the index at which the numerically closest element to `value`
was found at
References
----------
taken from http://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array
"""
return (np.abs(array-value)).argmin()
def slice_domain(x: np.ndarray, domain: tuple):
"""
Returns a slice object closest to the `domain` of `x`
domain = x[slice_domain(x, (start, stop))]
Parameters
----------
vector : np.ndarray
an array of values
domain : tuple
tuple of (start,stop) values defining the domain over
which to slice
Examples
--------
>>> x = linspace(0,10,101)
>>> idx = slice_domain(x, (2,6))
>>> x[idx]
"""
start = find_nearest_index(x, domain[0])
stop = find_nearest_index(x, domain[1])
return slice(start, stop+1)
# file IO
def get_fid(file, *args, **kwargs):
r"""
Return a file object, given a filename or file object.
Useful when you want to allow the arguments of a function to
be either files or filenames
Parameters
----------
file : str/unicode, Path, or file-object
file to open
\*args, \*\*kwargs : arguments and keyword arguments to `open()`
Returns
-------
fid : file object
"""
if isinstance(file, (str, Path)):
return open(file, *args, **kwargs)
else:
return file
def get_extn(filename: str | Path) -> str:
"""
Get the extension from a filename.
The extension is defined as everything passed the last '.'.
Returns None if it ain't got one
Parameters
----------
filename : string or Path
the filename
Returns
-------
ext : string, None
either the extension (not including '.') or None if there
isn't one
"""
if isinstance(filename, Path):
return filename.suffix.strip('.') or None
ext = os.path.splitext(filename)[-1]
if len(ext) == 0:
return None
else:
return ext[1:]
def basename_noext(filename: str) -> str:
"""
Get the basename and strips extension.
Parameters
----------
filename : string
the filename
Returns
-------
basename : str
file basename (ie. without extension)
"""
return os.path.splitext(os.path.basename(filename))[0]
# git
def git_version(modname: str) -> str:
"""
Return output 'git describe', executed in a module's root directory.
Parameters
----------
modname : str
module name
Returns
-------
out : str
output of 'git describe'
"""
mod = __import__(modname)
mod_dir = os.path.split(mod.__file__)[0]
p = Popen(['git', 'describe'], stdout=PIPE, stderr=PIPE, cwd=mod_dir)
try:
out, er = p.communicate()
except(OSError):
return None
out = out.strip('\n')
if out == '':
return None
return out
def dict_2_recarray(d: dict, delim: str, dtype: list[tuple]) -> np.ndarray:
"""
Turn a dictionary of structured keys to a record array of objects.
This is useful if you save data-base like meta-data in the form
or file-naming conventions, aka 'the poor-mans database'
Parameters
----------
d : dict
dictionnary of structured keys
delim : str
delimiter string
dtype : list of tuple
list of type, where a type is tuple like ('type_name', type)
Returns
-------
ra : numpy.array
Examples
--------
Given a directory of networks like:
>>> ls
a1,0.0,0.0.s1p a1,3.0,3.0.s1p a2,3.0,-3.0.s1p b1,-3.0,3.0.s1p
...
you can sort based on the values or each field, after defining their
type with `dtype`. The `values` field accesses the objects.
>>> d = rf.read_all_networks('/tmp/')
>>> delim = ','
>>> dtype = [('name', object), ('voltage', float), ('current', float)]
>>> ra = dict_2_recarray(d=rf.ran(dir), delim=delim, dtype =dtype)
then you can sift like you do with numpy arrays
>>> ra[ra['voltage'] < 3]['values']
array([1-Port Network: 'a2,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
1-Port Network: 'b1,0.0,3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
1-Port Network: 'a1,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
"""
split_keys = [tuple(k.split(delim)+[d[k]]) for k in d.keys()]
x = np.array(split_keys, dtype=dtype+[('values',object)])
return x
def findReplace(directory: str, find: str, replace: str, file_pattern: str):
r"""
Find/replace some txt in all files in a directory, recursively.
This was found in [1]_ .
Parameters
----------
directory : str
path of a directory
find : str
pattern to search for
replace : str
string to replace with
file_pattern : str
file pattern for filtering. Ex: '\*.txt'.
Examples
--------
>>> rf.findReplace('some_dir', 'find this', 'replace with this', '*.txt')
References
----------
.. [1] http://stackoverflow.com/questions/4205854/python-way-to-recursively-find-and-replace-string-in-text-files
"""
for path, _dirs, files in os.walk(os.path.abspath(directory)):
for filename in fnmatch.filter(files, file_pattern):
filepath = os.path.join(path, filename)
with open(filepath) as f:
s = f.read()
s = s.replace(find, replace)
with open(filepath, "w") as f:
f.write(s)
# general purpose objects
class HomoList(collections.abc.Sequence):
"""
A Homogeneous Sequence.
Provides a class for a list-like object which contains
homogeneous values. Attributes of the values can be accessed through
the attributes of HomoList. Searching is done like numpy arrays.
Initialized from a list of all the same type
>>> h = HomoDict([Foo(...), Foo(...)])
The individual values of `h` can be access in identical fashion to
Lists.
>>> h[0]
Assuming that `Foo` has property `prop` and function `func` ...
Access elements' properties:
>>> h.prop
Access elements' functions:
>>> h.func()
Searching:
>>> h[h.prop == value]
>>> h[h.prop < value]
Multiple search:
>>> h[set(h.prop==value1) & set( h.prop2==value2)]
Combos:
>>> h[h.prop==value].func()
"""
def __init__(self, list_):
self.store = list(list_)
def __eq__(self, value):
return [k for k in range(len(self)) if self.store[k] == value ]
def __ne__(self, value):
return [k for k in range(len(self)) if self.store[k] != value ]
def __gt__(self, value):
return [k for k in range(len(self)) if self.store[k] > value ]
def __ge__(self, value):
return [k for k in range(len(self)) if self.store[k] >= value ]
def __lt__(self, value):
return [k for k in range(len(self)) if self.store[k] < value ]
def __le__(self, value):
return [k for k in range(len(self)) if self.store[k] <= value ]
def __getattr__(self, name):
return self.__class__(
[k.__getattribute__(name) for k in self.store])
def __getitem__(self, idx):
try:
return self.store[idx]
except(TypeError):
return self.__class__([self.store[k] for k in idx])
def __call__(self, *args, **kwargs):
return self.__class__(
[k(*args,**kwargs) for k in self.store])
def __setitem__(self, idx, value):
self.store[idx] = value
def __delitem__(self, idx):
del self.store[idx]
def __iter__(self):
return iter(self.store)
def __len__(self):
return len(self.store)
def __str__(self):
return pprint.pformat(self.store)
def __repr__(self):
return pprint.pformat(self.store)
class HomoDict(collections.abc.MutableMapping):
"""
A Homogeneous Mutable Mapping.
Provides a class for a dictionary-like object which contains
homogeneous values. Attributes of the values can be accessed through
the attributes of HomoDict. Searching is done like numpy arrays.
Initialized from a dictionary containing values of all the same type
>>> h = HomoDict({'a':Foo(...),'b': Foo(...), 'c':Foo(..)})
The individual values of `h` can be access in identical fashion to
Dictionaries.
>>> h['key']
Assuming that `Foo` has property `prop` and function `func` ...
Access elements' properties:
>>> h.prop
Access elements' functions:
>>> h.func()
Searching:
>>> h[h.prop == value]
>>> h[h.prop < value]
Multiple search:
>>> h[set(h.prop==value1) & set( h.prop2==value2)]
Combos:
>>> h[h.prop==value].func()
"""
def __init__(self, dict_):
self.store = dict(dict_)
def __eq__(self, value):
return [k for k in self.store if self.store[k] == value ]
def __ne__(self, value):
return [k for k in self.store if self.store[k] != value ]
def __gt__(self, value):
return [k for k in self.store if self.store[k] > value ]
def __ge__(self, value):
return [k for k in self.store if self.store[k] >= value ]
def __lt__(self, value):
return [k for k in self.store if self.store[k] < value ]
def __le__(self, value):
return [k for k in self.store if self.store[k] <= value ]
def __getattr__(self, name):
return self.__class__(
{k: getattr(self.store[k],name) for k in self.store})
def __getitem__(self, key):
if isinstance(key, str):
return self.store[key]
else:
c = self.__class__({k:self.store[k] for k in key})
return c
#if len(c) == 1:
# return c.store.values()[0]
#else:
# return c
def __call__(self, *args, **kwargs):
return self.__class__(
{k: self.store[k](*args, **kwargs) for k in self.store})
def __setitem__(self, key, value):
self.store[key] = value
def __delitem__(self, key):
del self.store[key]
def __iter__(self):
return iter(self.store)
def __len__(self):
return len(self.store)
def __str__(self):
return pprint.pformat(self.store)
def __repr__(self):
return pprint.pformat(self.store)
def copy(self):
return HomoDict(self.store)
def filter_nones(self):
self.store = {k:self.store[k] for k in self.store \
if self.store[k] is not None}
def filter(self, **kwargs):
"""
Filter self based on kwargs
This is equivalent to:
>>> h = HomoDict(...)
>>> for k in kwargs:
>>> h = h[k ==kwargs[k]]
>>> return h
prefixing the kwarg value with a '!' causes a not equal test (!=)
Examples
----------
>>> h = HomoDict(...)
>>> h.filter(name='jean', age = '18', gender ='!female')
"""
a = self
for k in kwargs:
if kwargs[k][0] == '!':
a = a[a.__getattr__(k) != kwargs[k][1:]]
else:
a = a[a.__getattr__(k) == kwargs[k]]
return a
def has_duplicate_value(value: Any, values: Iterable, index: int) -> bool | int:
"""
Check if there is another value of the current index in the list.
Parameters
----------
value : Any
any value in a list
values : Iterable
the iterable containing the values
index : int
the index of the current item we are checking for.
Returns
-------
index : bool or int
returns None if no duplicate found, or the index of the first found duplicate
Examples
--------
>>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], -1) # -> 2
>>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], 2) # -> 4
>>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 0) # -> 3
>>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 3) # -> False
"""
for i, val in enumerate(values):
if i == index:
continue
if value == val:
return i
return False
def unique_name(name: str, names: list, exclude: int = -1) -> str:
"""
Pass in a name and a list of names, and increment with _## as necessary to ensure a unique name.
Parameters
----------
name : str
the chosen name, to be modified if necessary
names : list
list of names (str)
exclude : int, optional
the index of an item to be excluded from the search. Default is -1.
Returns
-------
unique_name : str
"""
if not has_duplicate_value(name, names, exclude):
return name
else:
if re.match(r"_\d\d", name[-3:]):
name_base = name[:-3]
suffix = int(name[-2:])
else:
name_base = name
suffix = 1
for num in range(suffix, 100, 1):
name = f"{name_base:s}_{num:02d}"
if not has_duplicate_value(name, names, exclude):
break
return name
def smooth(x: np.ndarray, window_len: int = 11, window: str = 'flat') -> np.ndarray:
"""
Smooth the data using a window with requested size.
Based on the function from the scipy cookbook [#]_
This method is based on the convolution of a scaled window with the signal.
The signal is prepared by introducing reflected copies of the signal
(with the window size) in both ends so that transient parts are minimized
in the beginning and end part of the output signal.
Parameters
----------
x : numpy.array
the input signal
window_len : int, optional
the dimension of the smoothing window; should be an odd integer.
Default is 11.
window : str, optional
the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'
flat window will produce a moving average smoothing. Default is 'flat'
Returns
-------
y : numpy.array
The smoothed signal
Examples
--------
>>> t = linspace(-2, 2, 0.1)
>>> x = sin(t) + randn(len(t))*0.1
>>> y = smooth(x)
See Also
--------
numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve
scipy.signal.lfilter
Note
----
`length(output) != length(input)`.
To correct this: `return y[(window_len/2-1):-(window_len/2)]` instead of just `y`.
References
----------
.. [#] http://scipy-cookbook.readthedocs.io/items/SignalSmooth.html
"""
if x.ndim != 1:
raise ValueError("smooth only accepts 1 dimension arrays.")
if x.size < window_len:
raise ValueError("Input vector needs to be bigger than window size.")
if window_len < 3:
return x
if window not in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
raise ValueError("Window is one of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'")
s = np.r_[x[window_len - 1:0:-1], x, x[-2:-window_len - 1:-1]]
if window == 'flat': # moving average
w = np.ones(window_len, 'd')
else:
w = eval('np.' + window + '(window_len)')
y = np.convolve(w / w.sum(), s, mode='same')
return y[window_len-1:-(window_len-1)]
class ProgressBar:
"""
A progress bar based off of the notebook/ipython progress bar from PyMC.
Useful when waiting for long operations such as taking a large number
of VNA measurements that may take a few minutes.
Examples
--------
>>> from time import sleep
>>> pb = rf.ProgressBar(10)
>>> for idx in range(10):
>>> sleep(1)
>>> pb.animate(idx)
"""
def __init__(self, iterations: int, label: str = "iterations"):
"""
Progress bar constructor.
Parameters
----------
iterations : int
Number of expected iterations
label : str, optional
Progress bar label, by default "iterations"
"""
self.iterations = iterations
self.label = label
self.prog_bar = '[]'
self.fill_char = '*'
self.width = 50
self.__update_amount(0)
def animate(self, iteration: int):
"""
Animate the progress bar.
Parameters
----------
iteration : int
current iteration
"""
print('\r', self, end='')
sys.stdout.flush()
self.update_iteration(iteration + 1)
def update_iteration(self, elapsed_iter: int):
self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0)
self.prog_bar += ' %d of %s %s complete' % (elapsed_iter, self.iterations, self.label)
def __update_amount(self, new_amount: int):
percent_done = int(round((new_amount / 100.0) * 100.0))
all_full = self.width - 2
num_hashes = int(round((percent_done / 100.0) * all_full))
self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'
pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))
pct_string = '%d%%' % percent_done
self.prog_bar = self.prog_bar[0:pct_place] + \
(pct_string + self.prog_bar[pct_place + len(pct_string):])
def __str__(self):
return str(self.prog_bar)
@contextlib.contextmanager
def suppress_numpy_warnings(**kw):
olderr = np.seterr(**kw)
yield
np.seterr(**olderr)
def suppress_warning_decorator(msg):
def suppress_warnings_decorated(func):
@wraps(func)
def suppressed_func(*k, **kw):
with warnings.catch_warnings():
warnings.filterwarnings("ignore", message=f"{msg}.*")
res = func(*k, **kw)
return res
return suppressed_func
return suppress_warnings_decorated

View File

@@ -2,6 +2,18 @@ import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Tuple
def cond_row_inf(A, use_pinv=True):
"""行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。"""
A = np.asarray(A)
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf)
def cond_col_one(A, use_pinv=True):
"""列条件数 κ1(A) = ||A||1 * ||A^{-1}||1矩形阵用广义逆。"""
A = np.asarray(A)
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1)
def generate_starting_poles(n_pairs: int, beta_min: float, beta_max: float, alpha_scale: float = 0.01):
"""
仅生成复共轭对: p = -alpha + j beta, p*

File diff suppressed because it is too large Load Diff

558
main.py
View File

@@ -1,446 +1,136 @@
from core.orthonormal_basis import generate_laguerre_basis
from core.sk_iter import generate_starting_poles
import numpy as np
import skrf as rf
import matplotlib.pyplot as plt
import sympy as sp
from scipy.linalg import null_space
from plotly.subplots import make_subplots
import plotly.graph_objs
from core.freqency import auto_select
from scipy.linalg import block_diag
from core.VFManager import VFManager
from core.utils import generate_starting_poles
from core.sample import auto_select_multple_ports
from core.basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis
network = rf.Network("/tmp/paramer/simulation/3500/3500.s2p")
freqs = network.f
s = freqs * 2j * np.pi
vf = rf.VectorFitting(network)
vf.vector_fit(n_poles_real=2, n_poles_cmplx=1,parameter_type="y")
poles = vf.poles
residues = vf.residues
y = vf.network.y
# fig, ax = plt.subplots(2, 2)
# fig.set_size_inches(12, 8)
# vf.plot("mag",0,0,freqs,ax=ax[0][0],parameter="y")
# rms_error11 = vf.get_rms_error(0,0,"y")
# print("rms_error11",rms_error11)
# vf.plot("mag",1,0,freqs,ax=ax[1][0],parameter="y")
# rms_error21 = vf.get_rms_error(1,0,"y")
# print("rms_error21",rms_error21)
# vf.plot("mag",0,1,freqs,ax=ax[0][1],parameter="y")
# rms_error12 = vf.get_rms_error(0,1,"y")
# print("rms_error12",rms_error12)
# vf.plot("mag",1,1,freqs,ax=ax[1][1],parameter="y")
# rms_error22 = vf.get_rms_error(1,1,"y")
# print("rms_error22",rms_error22)
# fig.tight_layout()
# plt.show()
# plt.savefig(f"img.png")
def formula_67(s,y):
diag_values = [y[i][0][0] for i in range(len(y))]
H = np.diag(diag_values)
P = 2
start_poles = generate_starting_poles(P,beta_min=1e8,beta_max=freqs[-1])
basis = generate_laguerre_basis(start_poles,s).T
print("start_poles",start_poles)
print("basis",basis)
# first step iteration
# A*x = b
A11 = np.real(basis)
print("A11 shape:",A11.shape)
A12 = np.real(- H @ basis[:,1:])
print("A12 shape:",A12.shape)
# print("A11",A11)
A21 = np.imag(basis)
print("A21 shape:",A21.shape)
A22 = np.imag(- H @ basis[:,1:])
print("A22 shape:",A22.shape)
A1 = np.hstack([A11,A12])
A2 = np.hstack([A21,A22])
A = np.vstack([A1,A2])
print ("A shape:",A.shape)
b1 = np.real(H @ basis[:,0])
b2 = np.imag(H @ basis[:,0])
b = np.hstack([b1,b2])
Q, R = np.linalg.qr(A, mode='reduced')
print("Q :",Q)
print("R :",R)
print("b shape:",b.shape)
# x = np.linalg.solve(R, Q.T @ b)
x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
# print("x_qr",x_star)
print("residuals",residuals)
# print("rank",rank)
# print("s",s)
x_ne = np.linalg.inv(A.T @ A) @ A.T @ b
print("x_ne",x_ne)
# sk iteration
target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:]))
D_t = basis @ target_vec
print("D_t",D_t)
K = 25
for i in range(K):
print(f"Iteration {i+1}/{K}")
A11 = np.real(basis / D_t[:, np.newaxis])
A12 = np.real(- H @ basis[:,1:] / D_t[:, np.newaxis])
A21 = np.imag(basis / D_t[:, np.newaxis])
A22 = np.imag(- H @ basis[:,1:] / D_t[:, np.newaxis])
A1 = np.hstack([A11,A12])
A2 = np.hstack([A21,A22])
A = np.vstack([A1,A2])
b1 = np.real(H @ basis[:,0])
b2 = np.imag(H @ basis[:,0])
b = np.hstack([b1,b2])
x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
# print("x_lstsq",x_star)
# print("residuals",residuals)
# print("rank",rank)
# print("s",s)
x_ne = np.linalg.inv(A.T @ A) @ A.T @ b
# print("x_ne",x_ne)
target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:]))
D_t_pre = D_t
D_t = basis @ target_vec
print("Dt", D_t)
# print("D_t/D_t_pre",D_t/D_t_pre)
# print("D_t",D_t)
n_target_vec = np.array(list(x_ne[:len(x_ne)//2+1]))
N_t = basis @ n_target_vec
# print("H = N_t / D_t",np.abs(N_t / D_t))
class formula_70_psi:
"""
VF-(70) with final pole-residue model.
After fit():
self.poles : (P,) complex
self.res : (P, M) complex # residues per response (columns)
self.h : (M,) complex # optional constants
self.g : (M,) complex # optional proportional terms
"""
# -------- internals --------
def __init__(self, s, P, H, beta_min, beta_max ,alpha_scale=0.01, n_iter=20, d0=1.0, include_const=True, include_linear=False, verbose=True):
self.s = s
self.P = P
self.H = H
self.beta_min = beta_min
self.beta_max = beta_max
self.alpha_scale = alpha_scale
self.z0 = self._generate_starting_poles(P, beta_min=beta_min, beta_max=beta_max,alpha_scale=alpha_scale)
self.z0 = np.array(self.z0, dtype=np.complex128)
self.n_iter = n_iter
self.d0 = d0
self.include_const = include_const
self.include_linear = include_linear
self.verbose = verbose
self.rel_iteration = []
self.cond_iteration = []
self.conf_poles_recognize = []
self.rms_error_iteration = []
self.rms_error_poles_recongnize = []
@staticmethod
def _generate_starting_poles(P, beta_min:float, beta_max:float, alpha_scale=0.01):
"""
仅生成复共轭对: p = -alpha + j beta, p*。
n_pairs: 复对数量 (总极点数 = 2*n_pairs)
beta_min,beta_max: 想要覆盖的虚部范围 (单位: rad/s)
alpha_scale: alpha = alpha_scale * beta (文中 {α_p}=0.01{β_p})
返回: list[complex] (正虚部先, 后跟共轭)
"""
betas = 2*np.pi*np.linspace(beta_min, beta_max, P)
poles = []
for b in betas:
alpha = alpha_scale * b
p = -alpha + 1j * b
poles += [p, np.conj(p)]
return poles
def _generate_laguerre_basis(self, s: np.ndarray, z: np.ndarray):
poles = z
poles = sorted(poles, key=lambda p: np.real(p))
basis = np.zeros((len(poles)+1,len(s)),dtype=complex)
product = np.ones(len(s),dtype=complex)
basis[0] = np.ones(len(s),dtype=complex) # φ_0 = 1
i = 0
while i < len(poles):
if np.real(poles[i]) >= 0:
raise ValueError(f"极点必须在左半平面: {poles[i]}")
# 复对首 (正虚部)
if np.iscomplex(poles[i]) and np.imag(poles[i]) > 0:
if i + 1 >= len(poles):
raise ValueError("复极点缺少共轭")
pn = poles[i]
pc = poles[i + 1]
if not np.isclose(pc, np.conj(pn)):
pc, pn = pn,pc
if not np.isclose(pc, np.conj(pn)):
raise ValueError("复极点未按 (p, p*) 顺序排列 (正虚部在前)")
poles[i], poles[i+1] = pc, pn # swap
sigma = -np.real(pn) # >0
scale = np.sqrt(2 * sigma)
r = np.abs(pn)
denom = (s - pn) * (s - pc)
# 两个基函数
phi_p = scale * (s - r) / denom * product
phi_pc = scale * (s + r) / denom * product
# product 先乘 (s + p^*)/(s - p),再乘 (s + p)/(s - p^*)
product = product * (s + pc) / (s - pn)
product = product * (s + pn) / (s - pc)
basis[i + 1] = phi_p
basis[i + 2] = phi_pc
i += 2
continue
# 复对次 (负虚部) —— 应该被首元素处理,出现表示顺序错误
if np.iscomplex(pn) and np.imag(pn) < 0:
raise ValueError("检测到负虚部复极点但其共轭尚未处理,请将正虚部成员放在前面。")
# 实极点
sigma = -np.real(pn)
if sigma <= 0:
raise ValueError("实极点实部应为负 (稳定)。")
scale = np.sqrt(2 * sigma)
phi = scale / (s - pn) * product
# 更新乘积
product = product * (s + pn) / (s - pn)
i += 1
basis[i + 1] = phi
return basis
def _orthonormal_psi(self,s,z):
s = np.asarray(s, np.complex128).reshape(-1)
z = np.asarray(z, np.complex128).reshape(-1)
return self._generate_laguerre_basis(s,z).T
@staticmethod
def _psi(s, z):
s = np.asarray(s, np.complex128).reshape(-1)
z = np.asarray(z, np.complex128).reshape(-1)
return 1.0 / (s[:, None] + z[None, :])
# @staticmethod
# def _lhp(z):
# z = np.asarray(z, np.complex128).reshape(-1).copy()
# z[z.real > 0] = -np.conj(z[z.real > 0])
# return z
def _build_70(self, s, H_list, z_ref, d0):
Hs = [np.asarray(h, np.complex128).reshape(-1) for h in H_list]
K, P, M = len(s), len(z_ref), len(Hs)
Psi = self._psi(s, z_ref)
Z = np.zeros((K, P))
rows, rhs = [], []
for m, H in enumerate(Hs):
Hp = H[:, None]
L_re = np.real(Hp * Psi); L_im = np.imag(Hp * Psi) # acts on c
R_re = -np.real(Psi); R_im = -np.imag(Psi) # acts on r^(m)
rows.append(np.hstack([L_re] + [R_re if j == m else Z for j in range(M)]))
rhs.append(-np.real(d0 * H))
rows.append(np.hstack([L_im] + [R_im if j == m else Z for j in range(M)]))
rhs.append(-np.imag(d0 * H))
A = np.vstack(rows)
b = np.concatenate(rhs)
cond_poles_recognize = np.linalg.cond(A)
rms_error_poles_recongnize = np.sqrt(np.mean(np.abs(A @ np.zeros(A.shape[1]) - b)**2))
return A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize
def _step_70(self, s, H_list, z_ref, d0=1.0, scale=True):
A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize = self._build_70(s, H_list, z_ref, d0)
if scale:
coln = np.maximum(np.linalg.norm(A, axis=0), 1e-12)
x, *_ = np.linalg.lstsq(A / coln, b, rcond=None)
x = x / coln
cond_iteration = np.linalg.cond(A)
rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2))
else:
x, *_ = np.linalg.lstsq(A, b, rcond=None)
cond_iteration = np.linalg.cond(A)
rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2))
c = x[:P]
res_ratio = np.empty((P, M), np.complex128)
off = P
for m in range(M):
res_ratio[:, m] = x[off:off+P]; off += P
# relocate poles with test matrix
Sigma = np.diag(-np.asarray(z_ref, np.complex128))
T = Sigma - (np.ones((P, 1), np.complex128) @ (c.reshape(1, -1) / d0))
z_new = -np.linalg.eigvals(T)
# z_new = self._lhp(z_new)
# cond = np.linalg.cond(T)
return z_new, c, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, res_ratio
# -------- public API --------
def fit(self):
"""
s : (K,) complex samples (j*2π*f_sel)
H : (K,) complex or (K,M) or list of M vectors
z0: initial poles (P,) complex (LHP + conjugate pairs recommended)
"""
# normalize responses -> list
if isinstance(self.H, (list, tuple)):
H_list = [np.asarray(h, np.complex128).reshape(-1) for h in self.H]
else:
H_arr = np.asarray(self.H, np.complex128)
if H_arr.ndim == 1:
H_list = [H_arr]
elif H_arr.ndim == 2 and H_arr.shape[0] == len(self.s):
H_list = [H_arr[:, i].copy() for i in range(H_arr.shape[1])]
else:
raise ValueError("H must be (K,), list of (K,), or (K,M) with M responses.")
M = len(H_list)
# z = self._lhp(np.asarray(self.z0, np.complex128))
z = self.z0
# SK/VF relocations
for it in range(self.n_iter):
z_next, c_last, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, _ = self._step_70(self.s, H_list, z, d0=self.d0, scale=True)
rel = np.linalg.norm(z_next) / max(1.0, np.linalg.norm(z))
if self.verbose:
print(f"[VF-70] iter {it+1:02d}/{self.n_iter:02d} Δz_rel={rel}")
self.cond_iteration.append(cond_iteration)
self.rms_error_iteration.append(rms_error_iteration)
self.conf_poles_recognize.append(cond_poles_recognize)
self.rms_error_poles_recongnize.append(rms_error_poles_recongnize)
self.rel_iteration.append(rel)
z = z_next
# ---- Finalize: refit residues with fixed poles z (poleresidue model) ----
Phi = self._psi(self.s, z) # K x P
# Build design matrix for extras
extras = []
if self.include_const: extras.append(np.ones(len(self.s), np.complex128))
if self.include_linear: extras.append(self.s.astype(np.complex128))
if extras:
X_base = np.column_stack([Phi] + extras) # K x (P + E)
else:
X_base = Phi
res = np.empty((len(z), M), np.complex128)
h = np.zeros(M, np.complex128)
g = np.zeros(M, np.complex128)
for m, Hm in enumerate(H_list):
theta, *_ = np.linalg.lstsq(X_base, Hm, rcond=None) # complex LS
res[:, m] = theta[:len(z)]
e = len(theta) - len(z)
if e >= 1: h[m] = theta[len(z)]
if e >= 2: g[m] = theta[len(z)+1]
# store the rational function
self.poles = z # (P,)
self.res = res # (P, M)
self.h = h # (M,)
self.g = g # (M,)
return self
# Evaluate the stored **rational** model on any grid
def evaluate(self, s_eval, m=None):
if not hasattr(self, "poles"):
raise RuntimeError("Model not fitted. Call fit(...) first.")
s_eval = np.asarray(s_eval, np.complex128).reshape(-1)
Phi = self._psi(s_eval, self.poles) # K_eval x P
if m is None:
H = Phi @ self.res
if np.any(self.h): H += self.h
if np.any(self.g): H += s_eval[:, None] * self.g
return H # (K_eval, M) or (K_eval,1)
m = int(m)
H = Phi @ self.res[:, m]
H += self.h[m]
H += s_eval * self.g[m]
return H # (K_eval,)
# def plot_rel_and_cond(self):
# fig, (ax1, ax2) = plt.subplots(2,1,figsize=(15,20))
# ax1.plot(np.log(self.rel), 'g-', label='rel')
# ax2.plot(np.log(self.cond), 'b-', label='cond')
# ax1.set_xlabel('Iteration')
# ax1.set_ylabel('Relative Change', color='g')
# ax2.set_ylabel('Condition Number', color='b')
# ax1.tick_params(axis='y', labelcolor='g')
# ax2.tick_params(axis='y', labelcolor='b')
# fig.tight_layout()
# plt.title('Relative Change and Condition Number per Iteration')
# # plt.show()
# plt.savefig(f"img_rel_cond.png")
def plot_rel_and_cond(self):
fig = make_subplots(rows=3, cols=2)
fig.add_trace(plotly.graph_objs.Scatter(y=self.rel_iteration, mode='lines+markers', name='rel'), row=1, col=1)
fig.add_trace(plotly.graph_objs.Scatter(y=self.cond_iteration, mode='lines+markers', name='cond_iteration'), row=2, col=1)
fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_iteration, mode='lines+markers', name='rms_error_iteration'), row=3, col=1)
fig.add_trace(plotly.graph_objs.Scatter(y=self.conf_poles_recognize, mode='lines+markers', name='cond_poles_recognize'), row=2, col=2)
fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_poles_recongnize, mode='lines+markers', name='rms_error_poles_recognize'), row=3, col=2)
fig.update_xaxes(title_text='Iteration', row=1, col=1)
fig.update_yaxes(title_text='Relative Change', row=1, col=1)
fig.update_yaxes(title_text='Condition Number (Iteration)', row=2, col=1)
fig.update_yaxes(title_text='RMS Error (Iteration)', row=3, col=1)
fig.update_yaxes(title_text='Condition Number (Pole Recognition)', row=2, col=2)
fig.update_yaxes(title_text='RMS Error (Pole Recognition)', row=3, col=2)
fig.update_layout(height=800, width=800, title_text='Relative Change and Condition Number per Iteration')
fig.write_image("img_rel_cond.png")
# fig.show()
def evaluate_on_freq(self, freq_eval, m=None):
return self.evaluate(1j * 2*np.pi * np.asarray(freq_eval, float), m=m)
if __name__ == "__main__":
# formula_67(s,y)
H11 = np.array([y[i,0,0] for i in range(len(y))])
H11_slice,freqs_slice = auto_select(H11,freqs,max_points=20)
s_slice = freqs_slice * 2j * np.pi
P_pairs = 2
start_point = 0
id = 3000
network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p")
# network = rf.data.ring_slot
ports = network.nports
K = 100
K = 10
f70 = formula_70_psi(s_slice,P_pairs, H11_slice, beta_min=1e8, beta_max=freqs_slice[-1],alpha_scale=0.01, n_iter=K, d0=1.0, verbose=True)
model = f70.fit()
model.plot_rel_and_cond()
full_freqences = network.f[start_point:]
noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
Hfit_dense = model.evaluate_on_freq(freqs)
# noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
# sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=False)
H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20)
# (1) Magnitude plot like your screenshot
ax0 = axes[0]
ax0.plot(freqs, np.abs(H11), 'o', ms=4, color='red', label='Samples')
ax0.plot(freqs, np.abs(Hfit_dense), '-', lw=2, color='k', label='Fit')
ax0.plot(freqs_slice, np.abs(H11_slice), 'x', ms=4, color='blue', label='Input Samples')
ax0.set_title("Response i=0, j=0")
ax0.set_ylabel("Magnitude")
ax0.legend(loc="best")
vf = VFManager(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K,verbose=False)
model = vf.fit()
vf.plot_metrics(show=False,save_path="outputs")
model_responses = vf.get_model_responses(full_freqences)
vf.plot_model_responses(show=False,save_path="outputs")
# (2) RMS error vs iteration
# ax1 = axes[1]
# its = np.arange(1, K+1)
# ax1.plot(its, hist["rms_rel"], '-o', lw=2)
# ax1.set_xlabel("Iteration")
# ax1.set_ylabel("RMS error (relative)")
# ax1.grid(True, alpha=0.3)
# ax1.set_title(f"RMS(final) = {hist['rms_rel'][-1]:.3e}")
# # Original plot functions
# Dt_1 = np.ones((len(freqs),1),np.complex128)
# # Levi step (no weighting):
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles)
# Dt = basis.Dt
# poles = basis.next_poles
fig.tight_layout()
plt.savefig(f"img_formula_70.png")
# print("Levi step (no weighting):")
# print("A:",basis.A)
# print("B:",basis.B)
# print("C:",basis.C)
# print("D:",basis.D)
# print("next_pozles:",basis.next_poles)
# print("Dt:",Dt, "norm:",np.linalg.norm(Dt))
# # SK weighting (optional, after first pass):
# least_squares_condition = []
# least_squares_rms_error = []
# eigenval_condition = []
# eigenval_rms_error = []
# for i in range(K):
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt)
# Dt_1 = Dt
# Dt = basis.Dt
# poles = basis.next_poles
# print(f"SK Iteration {i+1}/{K}")
# print("A:",basis.A)
# print("B:",basis.B)
# print("C:",basis.C)
# print("D:",basis.D)
# print("z:",basis.next_poles)
# print("Dt:",Dt)
# print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1))
# least_squares_condition.append(basis.least_squares_condition)
# least_squares_rms_error.append(basis.least_squares_rms_error)
# eigenval_condition.append(basis.eigenval_condition)
# eigenval_rms_error.append(basis.eigenval_rms_error)
# # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0])
# H_evaluated = basis.get_model_responses(full_freqences)
# fitted_points = H_evaluated
# sliced_freqences = freqs
# input_points = H
# for i in range(ports):
# for j in range(ports):
# fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False)
# ax00 = axes[0][0]
# ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# ax00.set_title(f"Response i={i+1}, j={j+1}")
# ax00.set_ylabel("Magnitude")
# ax00.legend(loc="best")
# ax01 = axes[0][1]
# ax01.set_title(f"Response i={i+1}, j={j+1}")
# ax01.set_ylabel("Phase (deg)")
# ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples')
# ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
# ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples')
# ax01.legend(loc="best")
# # ax00 = axes[0][0]
# # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# # ax00.set_title(f"Response i={i+1}, j={j+1}")
# # ax00.set_ylabel("Real Part")
# # ax00.legend(loc="best")
# # ax01 = axes[0][1]
# # ax01.set_title(f"Response i={i+1}, j={j+1}")
# # ax01.set_ylabel("Imag Part")
# # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
# # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
# # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
# # ax01.legend(loc="best")
# ax10 = axes[1][0]
# ax10.plot(least_squares_condition, label='Least Squares Condition')
# ax10.set_title("least_squares_condition")
# ax10.set_ylabel("Magnitude")
# ax10.legend(loc="best")
# ax11 = axes[1][1]
# ax11.plot(least_squares_rms_error, label='Least Squares RMS Error')
# ax11.set_title("least_squares_rms_error")
# ax11.set_ylabel("Magnitude")
# ax11.legend(loc="best")
# ax20 = axes[2][0]
# ax20.plot(eigenval_condition, label='Eigenvalue Condition')
# ax20.set_title("eigenval_condition")
# ax20.set_ylabel("Magnitude")
# ax20.legend(loc="best")
# ax21 = axes[2][1]
# ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error')
# ax21.set_title("eigenval_rms_error")
# ax21.set_ylabel("Magnitude")
# ax21.legend(loc="best")
# fig.tight_layout()
# plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png")
# print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png")

View File

@@ -1,155 +0,0 @@
from abc import abstractmethod
from skrf import Network
from schemas.paramer import SimulationRequestUnit, UuidResponseUnit, SimulationResponseUnit
from typing import List, Literal, Union, Dict
import requests
import time
from utils import send_get_request
from pydantic import BaseModel, Field
import itertools
import json
import numpy as np
class ModelBasicParametersUnit(BaseModel):
name: str
type: Literal["number","integer","string","boolean"]
range: List[Union[float,int,str,bool]]
class ModelBasicInfo(BaseModel):
base_url: str = Field(default="http://localhost:8105/api/v1")
nports: int = Field(default=2)
cell_name: str
template_name: str
user_id: int = Field(default=0)
template_version: str = Field(default="")
class ModelBasicDatasetUnit(BaseModel):
nports: int = Field(default=2)
parameters: Dict[str, Union[float, int, str, bool]]
id: int = Field(default=0)
result_dir: str = Field(default="")
@property
def network(self) -> Network:
try:
network = Network(f"{self.result_dir}/{self.id}.s{self.nports}p")
return network
except Exception as e:
raise RuntimeError(f"Error loading network from {self.result_dir}: {e}")
@property
def s_params(self) -> np.ndarray:
return self.network.s
@property
def y_params(self) -> np.ndarray:
return self.network.y
@property
def z_params(self) -> np.ndarray:
return self.network.z
@property
def freqs(self) -> np.ndarray:
return self.network.f
class ModelBasic:
def __init__(self):
self._dataset:List[ModelBasicDatasetUnit] = []
@property
@abstractmethod
def info(self)->ModelBasicInfo:
pass
@property
@abstractmethod
def parameters(self)->List[ModelBasicParametersUnit]:
pass
@property
@abstractmethod
def settings(self)->dict:
pass
def sweep(self):
parameters_list = []
lst = [res.range for res in self.parameters]
parameters_name = [res.name for res in self.parameters]
result = [list(item) for item in itertools.product(*lst)]
for res in result:
parameters_list.append({parameters_name[i]:res[i] for i in range(len(res))})
for res in parameters_list:
print(f"Simulating with parameters: {res}")
request_unit = SimulationRequestUnit(
user_id=self.info.user_id,
template_name=self.info.template_name,
template_version=self.info.template_version,
cell_name=self.info.cell_name,
parameters=res,
settings=self.settings
)
response = self.simulate(request_unit)
self._dataset.append(ModelBasicDatasetUnit(nports=self.info.nports,parameters=res, id=response.id, result_dir=response.result_path))
@property
def results(self)->List[ModelBasicDatasetUnit]:
return self._dataset
def export(self, path:str|None):
if path is None:
path = f"{self.info.cell_name}_dataset.json"
with open(path,"w") as f:
json.dump([dict(item) for item in self.results],f,indent=4)
def load(self, path:str|None):
if path is None:
path = f"{self.info.cell_name}_dataset.json"
with open(path,"r") as f:
data = json.load(f)
self._dataset += [ModelBasicDatasetUnit(**item) for item in data]
def clear(self):
self._dataset = []
def simulate(self,simulation_request:SimulationRequestUnit)->UuidResponseUnit:
def send_simulate_request(url, data:list)->list[dict]:
response = requests.post(url, json = data)
if response.status_code not in [200,201,202]:
raise RuntimeError(f"send_simulate_request: {response.status_code}, {response.text}")
return response.json()
response = send_simulate_request(f"{self.info.base_url}/simulations/create", [dict(simulation_request)])
simulation_response_model:SimulationResponseUnit = SimulationResponseUnit(**(response[0]))
time.sleep(0.05)
response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}")
assert isinstance(response, dict), "Response is not a dictionary."
uuid_model = UuidResponseUnit(**response)
time.sleep(0.05) # Wait for 2 seconds before checking the status again
status = uuid_model.status
while status != "completed" and status != "failed":
time.sleep(0.05) # Wait for 2 seconds before checking again
response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}")
assert isinstance(response, dict), "Response is not a dictionary."
try:
uuid_model = UuidResponseUnit(**response)
except Exception as e:
print(f"Error parsing response: {e}")
continue
assert response is not None, "No response received from the server."
status = uuid_model.status
if status == "failed":
raise RuntimeError(f"Simulation failed: {uuid_model.error_message}")
else:
return uuid_model

View File

@@ -1,45 +0,0 @@
from typing import List,Optional
from pydantic import BaseModel, Field
from schemas.paramer import SimulationRequestUnit
from skrf import Network
import re
from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit
W = []
L = []
i = 15.52
while i <= 100:
W.append(i)
L.append(i)
i = int(i*1.05*100 + 0.5) / 100.0
class Capa(ModelBasic):
def __init__(self):
super().__init__()
@property
def info(self) -> ModelBasicInfo:
return ModelBasicInfo(
nports=2,
cell_name="capa",
template_name="em_interface_compound",
user_id=0,
template_version=""
)
@property
def settings(self) -> dict:
return {}
@property
def parameters(self) -> List[ModelBasicParametersUnit]:
return [
ModelBasicParametersUnit(name="W",type="number",range=W),
ModelBasicParametersUnit(name="L",type="number",range=L)
]

View File

@@ -1,45 +0,0 @@
from typing import List,Optional
from pydantic import BaseModel, Field
from schemas.paramer import SimulationRequestUnit
from skrf import Network
import re
from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit
W = []
L = []
i = 15.52
while i <= 100:
W.append(i)
L.append(i)
i = int(i*1.05*100 + 0.5) / 100.0
class Mlin(ModelBasic):
def __init__(self):
super().__init__()
@property
def info(self) -> ModelBasicInfo:
return ModelBasicInfo(
nports=2,
cell_name="mlin",
template_name="em_interface_compound",
user_id=0,
template_version=""
)
@property
def settings(self) -> dict:
return {}
@property
def parameters(self) -> List[ModelBasicParametersUnit]:
return [
ModelBasicParametersUnit(name="W",type="number",range=W),
ModelBasicParametersUnit(name="L",type="number",range=L)
]

View File

@@ -1,309 +0,0 @@
! Created with skrf 1.8.0 (http://scikit-rf.org).
# Hz S RI R 50.0
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
0.0 0.5169316987261682 -0.14305278198989352 0.4988694955145437 0.12530267192181432 0.4988694955145437 0.12530267192181432 0.5263854174928203 -0.14417829506357768
1000.0 0.5169316947040424 -0.14305278151191225 0.4988694984093659 0.12530266799393616 0.4988694984093659 0.12530266799393616 0.5263854133767084 -0.14417829453782283
10000.0 0.5169316585049104 -0.14305277721008075 0.4988695244627657 0.12530263264303276 0.4988695244627657 0.12530263264303276 0.5263853763317018 -0.14417828980602918
12589.0 0.5169316480916267 -0.14305277597258723 0.4988695319574604 0.12530262247375623 0.4988695319574604 0.12530262247375623 0.5263853656750881 -0.14417828844484987
15849.0 0.5169316349794967 -0.14305277441436826 0.4988695413945808 0.12530260966887344 0.4988695413945808 0.12530260966887344 0.5263853522565635 -0.14417828673088906
19953.0 0.5169316184726925 -0.1430527724527331 0.4988695532749311 0.12530259354886147 0.4988695532749311 0.12530259354886147 0.5263853353640404 -0.14417828457319115
25119.0 0.5169315976943908 -0.14305276998348182 0.4988695682295826 0.12530257325744293 0.4988695682295826 0.12530257325744293 0.5263853141002066 -0.14417828185714157
31623.0 0.5169315715344848 -0.1430527668746916 0.4988695870575062 0.1253025477105234 0.4988695870575062 0.1253025477105234 0.526385287329015 -0.14417827843763203
39811.0 0.5169315386013189 -0.14305276296098088 0.4988696107603104 0.12530251554905705 0.4988696107603104 0.12530251554905705 0.5263852536262912 -0.1441782741327513
50119.0 0.5169314971412463 -0.14305275803394987 0.49886964060013766 0.12530247506048903 0.49886964060013766 0.12530247506048903 0.5263852111974101 -0.1441782687132703
63096.0 0.5169314449461201 -0.14305275183118685 0.4988696781662454 0.1253024240884142 0.4988696781662454 0.1253024240884142 0.5263851577826266 -0.1441782618905496
79433.0 0.5169313792366513 -0.14305274402240672 0.49886972545895575 0.12530235991866878 0.49886972545895575 0.12530235991866878 0.5263850905377072 -0.1441782533012926
100000.0 0.5169312965135905 -0.14305273419176578 0.498869784996764 0.12530227913399875 0.498869784996764 0.12530227913399875 0.5263850058816346 -0.14417824248809258
125893.0 0.5169311923686877 -0.14305272181539658 0.4988698599523953 0.12530217742944966 0.4988698599523953 0.12530217742944966 0.5263848993031504 -0.1441782288747222
158489.0 0.5169310612634759 -0.14305270623511884 0.4988699543120198 0.12530204939633327 0.4988699543120198 0.12530204939633327 0.5263847651343683 -0.1441782117372171
199526.0 0.5169308962075003 -0.14305268662020118 0.49887007310683856 0.1253018882079974 0.49887007310683856 0.1253018882079974 0.5263845962214859 -0.14417819016181527
251189.0 0.5169306884124163 -0.14305266192625446 0.49887022266203807 0.12530168528202823 0.49887022266203807 0.12530168528202823 0.5263843835707991 -0.1441781629997424
316228.0 0.5169304268173779 -0.14305263083883016 0.4988704109383793 0.12530142981676085 0.4988704109383793 0.12530142981676085 0.526384115863 -0.14417812880517264
398107.0 0.5169300974897413 -0.14305259170220114 0.4988706479635265 0.12530110820602533 0.4988706479635265 0.12530110820602533 0.5263837788398773 -0.14417808575689117
501187.0 0.5169296828890162 -0.14305254243189108 0.4988709463617992 0.125300703320345 0.4988709463617992 0.125300703320345 0.5263833545510671 -0.14417803156208114
630957.0 0.5169291609377541 -0.14305248040426072 0.4988713220228765 0.12530019359959674 0.4988713220228765 0.12530019359959674 0.5263828204032315 -0.1441779633348741
794328.0 0.5169285038390437 -0.14305240231598146 0.4988717949528746 0.12529955189821454 0.4988717949528746 0.12529955189821454 0.5263821479499213 -0.14417787744177832
1000000.0 0.5169276766003909 -0.14305230400861618 0.49887239033674674 0.12529874404365846 0.49887239033674674 0.12529874404365846 0.5263813013809635 -0.14417776930872658
1258925.0 0.5169266351714739 -0.14305218024731395 0.49887313987858567 0.12529772701780695 0.49887313987858567 0.12529772701780695 0.526380235616701 -0.14417763317765178
1584893.0 0.5169253240871785 -0.14305202444071294 0.49887408349798956 0.12529644665522024 0.49887408349798956 0.12529644665522024 0.5263788938959513 -0.14417746179839447
1995262.0 0.5169236735314454 -0.14305182829201415 0.4988752714432822 0.12529483477578932 0.4988752714432822 0.12529483477578932 0.5263772047712447 -0.144177246044902
2511886.0 0.5169215956047378 -0.14305158135541474 0.49887676697790806 0.1252928055396649 0.49887676697790806 0.1252928055396649 0.5263750782890728 -0.1441769744273278
3162278.0 0.5169189796463092 -0.14305127048021582 0.4988786497471103 0.12529025087913537 0.4988786497471103 0.12529025087913537 0.5263724012028501 -0.14417663248057871
3981072.0 0.5169156863538554 -0.1430508791120138 0.49888102001016127 0.12528703475606862 0.49888102001016127 0.12528703475606862 0.5263690309551585 -0.14417620199566117
5011872.0 0.5169115403466041 -0.14305038640891315 0.4988840039928882 0.12528298589926556 0.4988840039928882 0.12528298589926556 0.5263647880670566 -0.14417566004756066
6309573.0 0.5169063208299607 -0.14304976613213158 0.49888776060655593 0.12527788868785483 0.49888776060655593 0.12527788868785483 0.5263594465845839 -0.14417497777496466
7943282.0 0.5168997498468791 -0.14304898524981696 0.4988924899036425 0.12527147167796068 0.4988924899036425 0.12527147167796068 0.5263527220555985 -0.14417411884453263
10000000.0 0.5168914774683946 -0.14304800217712021 0.4988984437365743 0.12526339314025572 0.4988984437365743 0.12526339314025572 0.5263442563742526 -0.14417303751506683
12589254.0 0.516881063163137 -0.14304676456218599 0.49890593916654286 0.12525322286602916 0.49890593916654286 0.12525322286602916 0.526333598715163 -0.14417167620221563
15848932.0 0.5168679523282272 -0.14304520649713184 0.498915375354792 0.12524041924801782 0.498915375354792 0.12524041924801782 0.5263201815158981 -0.14416996241069416
19952623.0 0.5168514467668739 -0.14304324500966592 0.49892725481061334 0.12522430044978053 0.49892725481061334 0.12522430044978053 0.5263032902647165 -0.14416780487524355
25118864.0 0.5168306674957757 -0.14304077564319373 0.49894221015976653 0.12520400808460874 0.49894221015976653 0.12520400808460874 0.5262820254388815 -0.14416508869897593
31622777.0 0.5168045079396447 -0.14303766689455033 0.49896103783152573 0.12517846150680842 0.49896103783152573 0.12517846150680842 0.5262552546054668 -0.14416166923516513
39810717.0 0.5167715750151072 -0.14303375321253045 0.49898474046203506 0.12514630027614093 0.49898474046203506 0.12514630027614093 0.5262215521285504 -0.14415736438598972
50118723.0 0.5167301149184613 -0.14302882617865584 0.49901458030667317 0.12510581168454307 0.49901458030667317 0.12510581168454307 0.5261791232228341 -0.1441519449018302
63095734.0 0.5166779197480051 -0.14302262341036215 0.49905214644624535 0.12505483956650784 0.49905214644624535 0.12505483956650784 0.5261257083939916 -0.14414512217534436
79432823.0 0.5166122099212112 -0.1430148145876941 0.4990994394142159 0.12499066947149441 0.4990994394142159 0.12499066947149441 0.5260584631082538 -0.14413653287154995
100000000.0 0.5165294861484319 -0.1430049838621606 0.49915897773484985 0.12490988410622846 0.49915897773484985 0.12490988410622846 0.525973806307144 -0.14412571957846906
125892541.0 0.5164253430918343 -0.1429926077123401 0.4992339320374304 0.12480818136003487 0.4992339320374304 0.12480818136003487 0.5258672297121321 -0.1441121064494314
158489319.0 0.5162942347507815 -0.14297702706275484 0.499328293914133 0.12468014518777729 0.499328293914133 0.12468014518777729 0.525733057727714 -0.14409496853526813
199526231.0 0.516129179129203 -0.14295741218713942 0.4994470884781358 0.12451895719754857 0.4994470884781358 0.12451895719754857 0.5255641452076658 -0.14407339317971052
251188643.0 0.5159213864101769 -0.14293271852146178 0.4995966419754571 0.1243160335379748 0.4995966419754571 0.1243160335379748 0.5253514969410836 -0.14404623141598272
316227766.0 0.5156597908770215 -0.14290163103837383 0.49978491867278524 0.1240605677874669 0.49978491867278524 0.1240605677874669 0.5250837886357498 -0.14401203678155508
398107171.0 0.5153304616115358 -0.14286249421578498 0.5000219449923526 0.12373895546115266 0.5000219449923526 0.12373895546115266 0.5247467638460045 -0.1439689882871723
501187234.0 0.5149158606330113 -0.14281322387560505 0.5003203434474182 0.12333406953339042 0.5003203434474182 0.12333406953339042 0.5243224747764942 -0.1439147934439998
630957344.0 0.514393908928449 -0.1427511961926681 0.50069600484314 0.12282434835303803 0.50069600484314 0.12282434835303803 0.5237883264880697 -0.14384656617914132
794328235.0 0.5137368106564871 -0.14267310796550947 0.5011689345257409 0.12218264739897594 0.5011689345257409 0.12218264739897594 0.5231158736265745 -0.1437606731406718
800000996.0 0.5137139940982403 -0.14267039649196073 0.5011853561602363 0.12216036548496063 0.5011853561602363 0.12216036548496063 0.5230925239077618 -0.14375769065905702
1000000000.0 0.5129095729488049 -0.14257480071256423 0.5017643177176059 0.1213747937659555 0.5017643177176059 0.1213747937659555 0.5222693056360564 -0.14365254021249166
1600000990.0 0.5104962935004823 -0.1422880114729652 0.5035012139053171 0.11901806298384085 0.5035012139053171 0.11901806298384085 0.5197996344470474 -0.14333708678134274
2400000990.0 0.5072785928785918 -0.14190562645110177 0.505817071667767 0.11587576045915382 0.505817071667767 0.11587576045915382 0.5165067449616364 -0.14291648290047396
3200000980.0 0.5040608922969224 -0.14152324143401826 0.5081329294012686 0.11273345797374554 0.5081329294012686 0.11273345797374554 0.5132138555173865 -0.14249587902486277
4000000980.0 0.5008431916750319 -0.14114085641215496 0.5104487871637186 0.10959115544905842 0.5104487871637186 0.10959115544905842 0.5099209660319755 -0.1420752751439941
4800000980.0 0.49762549105314136 -0.14075847139029166 0.5127646449261685 0.10644885292437128 0.5127646449261685 0.10644885292437128 0.5066280765465645 -0.14165467126312542
5600000970.0 0.4944077904714721 -0.1403760863732082 0.5150805026596701 0.10330655043896295 0.5150805026596701 0.10330655043896295 0.5033351871023147 -0.1412340673875143
6400000970.0 0.49119008984958146 -0.13999370135134492 0.51739636042212 0.10016424791427578 0.51739636042212 0.10016424791427578 0.5000422976169037 -0.14081346350664567
7200000960.0 0.48797238926791214 -0.1396113163342615 0.5197122181556217 0.0970219454288674 0.5197122181556217 0.0970219454288674 0.4967494081726538 -0.14039285963103457
8000000960.0 0.4847546886460215 -0.13922893131239825 0.5220280759180717 0.09387964290418022 0.5220280759180717 0.09387964290418022 0.49345651868724266 -0.13997225575016592
8800000960.0 0.48153698802413086 -0.138846546290535 0.5243439336805215 0.09073734037949305 0.5243439336805215 0.09073734037949305 0.4901636292018316 -0.1395516518692973
9600000950.0 0.47831928744246155 -0.13846416127345157 0.5266597914140232 0.08759503789408464 0.5266597914140232 0.08759503789408464 0.48687073975758166 -0.13913104799368622
10400000900.0 0.4751015870216772 -0.1380817762754874 0.5289756490317319 0.08445273556579136 0.5289756490317319 0.08445273556579136 0.48357785047797625 -0.13871044413910533
11200000900.0 0.47188388639978657 -0.13769939125362413 0.5312915067941818 0.08131043304110418 0.5312915067941818 0.08131043304110418 0.4802849609925652 -0.1382898402582367
12000000900.0 0.4686661857778959 -0.13731700623176088 0.5336073645566316 0.078168130516417 0.5336073645566316 0.078168130516417 0.4769920715071541 -0.13786923637736806
12800000900.0 0.4654484851560053 -0.13693462120989763 0.5359232223190815 0.07502582799172978 0.5359232223190815 0.07502582799172978 0.473699182021743 -0.13744863249649944
13600000900.0 0.4622307845341146 -0.1365522361880344 0.5382390800815314 0.0718835254670426 0.5382390800815314 0.0718835254670426 0.4704062925363319 -0.13702802861563082
14400000900.0 0.45901308391222395 -0.13616985116617114 0.5405549378439812 0.0687412229423554 0.5405549378439812 0.0687412229423554 0.46711340305092086 -0.13660742473476217
15200000900.0 0.4557953832903334 -0.13578746614430787 0.5428707956064311 0.06559892041766822 0.5428707956064311 0.06559892041766822 0.4638205135655099 -0.13618682085389353
16000000900.0 0.4525776826684428 -0.13540508112244465 0.545186653368881 0.06245661789298104 0.545186653368881 0.06245661789298104 0.46052762408009884 -0.1357662169730249
16800000900.0 0.44935998204655214 -0.1350226961005814 0.5475025111313307 0.059314315368293846 0.5475025111313307 0.059314315368293846 0.4572347345946877 -0.13534561309215629
17600000900.0 0.4461422814246615 -0.13464031107871813 0.5498183688937807 0.056172012843606664 0.5498183688937807 0.056172012843606664 0.45394184510927665 -0.13492500921128764
18400000900.0 0.44292458080277086 -0.13425792605685488 0.5521342266562306 0.05302971031891947 0.5521342266562306 0.05302971031891947 0.4506489556238656 -0.134504405330419
19200000900.0 0.4397068801808802 -0.13387554103499164 0.5544500844186804 0.049887407794232286 0.5544500844186804 0.049887407794232286 0.44735606613845447 -0.13408380144955034
20000000900.0 0.4364891795589896 -0.1334931560131284 0.5567659421811303 0.04674510526954509 0.5567659421811303 0.04674510526954509 0.4440631766530434 -0.13366319756868175
20800000900.0 0.43327147893709894 -0.13311077099126514 0.5590817999435801 0.04360280274485791 0.5590817999435801 0.04360280274485791 0.44077028716763234 -0.1332425936878131
21600000900.0 0.43005377831520825 -0.13272838596940187 0.56139765770603 0.040460500220170684 0.56139765770603 0.040460500220170684 0.43747739768222127 -0.13282198980694446
22400000900.0 0.4268360776933176 -0.13234600094753862 0.5637135154684798 0.03731819769548349 0.5637135154684798 0.03731819769548349 0.43418450819681015 -0.1324013859260758
23200000900.0 0.42361837707142697 -0.13196361592567538 0.5660293732309296 0.03417589517079632 0.5660293732309296 0.03417589517079632 0.4308916187113991 -0.1319807820452072
24000000900.0 0.4204006764495363 -0.1315812309038121 0.5683452309933795 0.031033592646109123 0.5683452309933795 0.031033592646109123 0.427598729225988 -0.13156017816433854
24800000900.0 0.4171829758276457 -0.13119884588194886 0.5706610887558294 0.02789129012142194 0.5706610887558294 0.02789129012142194 0.42430583974057695 -0.1311395742834699
25600000900.0 0.413965275205755 -0.13081646086008564 0.5729769465182792 0.024748987596734745 0.5729769465182792 0.024748987596734745 0.42101295025516583 -0.13071897040260128
26400000900.0 0.41074757458386435 -0.13043407583822236 0.5752928042807292 0.02160668507204755 0.5752928042807292 0.02160668507204755 0.41772006076975476 -0.13029836652173266
27200000900.0 0.4075298739619737 -0.13005169081635912 0.577608662043179 0.018464382547360367 0.577608662043179 0.018464382547360367 0.4144271712843437 -0.129877762640864
28000000900.0 0.40431217334008307 -0.12966930579449584 0.5799245198056288 0.01532208002267317 0.5799245198056288 0.01532208002267317 0.41113428179893263 -0.12945715875999536
28800000900.0 0.40109447271819243 -0.1292869207726326 0.5822403775680787 0.012179777497985989 0.5822403775680787 0.012179777497985989 0.40784139231352157 -0.1290365548791267
29600000900.0 0.3978767720963018 -0.12890453575076935 0.5845562353305285 0.009037474973298792 0.5845562353305285 0.009037474973298792 0.40454850282811045 -0.1286159509982581
30400000800.0 0.3946590718766237 -0.1285221507767042 0.5868720928034962 0.0058951728413994126 0.5868720928034962 0.0058951728413994126 0.4012556137543105 -0.12819534716996492
31200000800.0 0.39144137125473305 -0.12813976575484096 0.589187950565946 0.0027528703167122442 0.589187950565946 0.0027528703167122442 0.39796272426889945 -0.1277747432890963
32000000800.0 0.3882236706328424 -0.1277573807329777 0.5915038083283959 -0.0003894322079749657 0.5915038083283959 -0.0003894322079749657 0.3946698347834884 -0.12735413940822765
32800000800.0 0.38500597001095177 -0.12737499571111444 0.5938196660908457 -0.003531734732662134 0.5938196660908457 -0.003531734732662134 0.3913769452980773 -0.126933535527359
33333334200.0 0.38286083599488296 -0.1271200723313402 0.5953635714588004 -0.005626603344312142 0.5953635714588004 -0.005626603344312142 0.38918168536672915 -0.12665313290506292
33600000800.0 0.3817882693890611 -0.12699261068925122 0.5961355238532955 -0.00667403725734933 0.5961355238532955 -0.00667403725734933 0.38808405581266625 -0.12651293164649038
34400000800.0 0.37857056876717043 -0.12661022566738794 0.5984513816157454 -0.009816339782036526 0.5984513816157454 -0.009816339782036526 0.3847911663272552 -0.12609232776562176
35200000800.0 0.3753528681452798 -0.1262278406455247 0.6007672393781952 -0.012958642306723722 0.6007672393781952 -0.012958642306723722 0.38149827684184406 -0.12567172388475312
36000000800.0 0.37213516752338927 -0.12584545562366145 0.6030830971406451 -0.01610094483141089 0.6030830971406451 -0.01610094483141089 0.378205387356433 -0.12525112000388447
36800000800.0 0.3689174669014986 -0.12546307060179818 0.6053989549030949 -0.019243247356098087 0.6053989549030949 -0.019243247356098087 0.374912497871022 -0.12483051612301584
37600000800.0 0.365699766279608 -0.12508068557993493 0.6077148126655447 -0.022385549880785283 0.6077148126655447 -0.022385549880785283 0.3716196083856109 -0.12440991224214719
38400000800.0 0.36248206565771734 -0.12469830055807167 0.6100306704279946 -0.02552785240547245 0.6100306704279946 -0.02552785240547245 0.36832671890019986 -0.12398930836127856
39200000800.0 0.3592643650358267 -0.12431591553620841 0.6123465281904446 -0.028670154930159675 0.6123465281904446 -0.028670154930159675 0.3650338294147888 -0.12356870448040991
40000000800.0 0.35604666441393606 -0.12393353051434516 0.6146623859528944 -0.03181245745484684 0.6146623859528944 -0.03181245745484684 0.3617409399293777 -0.12314810059954127
40800000800.0 0.3528289637920454 -0.1235511454924819 0.6169782437153443 -0.03495475997953404 0.6169782437153443 -0.03495475997953404 0.35844805044396666 -0.12272749671867263
41600000800.0 0.3496112631701548 -0.12316876047061864 0.6192941014777941 -0.03809706250422121 0.6192941014777941 -0.03809706250422121 0.3551551609585556 -0.122306892837804
42400000800.0 0.3463935625482641 -0.12278637544875538 0.621609959240244 -0.041239365028908403 0.621609959240244 -0.041239365028908403 0.3518622714731445 -0.12188628895693535
43200000800.0 0.34317586192637345 -0.12240399042689212 0.6239258170026938 -0.0443816675535956 0.6239258170026938 -0.0443816675535956 0.3485693819877334 -0.12146568507606671
44000000800.0 0.3399581613044828 -0.12202160540502888 0.6262416747651436 -0.047523970078282796 0.6262416747651436 -0.047523970078282796 0.3452764925023223 -0.12104508119519806
44800000800.0 0.3367404606825921 -0.12163922038316562 0.6285575325275935 -0.05066627260297002 0.6285575325275935 -0.05066627260297002 0.3419836030169112 -0.12062447731432943
45600000800.0 0.3335227600607015 -0.12125683536130236 0.6308733902900433 -0.05380857512765719 0.6308733902900433 -0.05380857512765719 0.33869071353150015 -0.12020387343346078
46400000800.0 0.33030505943881083 -0.12087445033943911 0.6331892480524932 -0.056950877652344384 0.6331892480524932 -0.056950877652344384 0.3353978240460891 -0.11978326955259215
47200000800.0 0.3270873588169202 -0.12049206531757584 0.635505105814943 -0.06009318017703158 0.635505105814943 -0.06009318017703158 0.33210493456067797 -0.1193626656717235
48000000800.0 0.32386965819502955 -0.12010968029571262 0.6378209635773928 -0.06323548270171878 0.6378209635773928 -0.06323548270171878 0.3288120450752669 -0.11894206179085487
48800000800.0 0.3206519575731389 -0.11972729527384936 0.6401368213398427 -0.06637778522640594 0.6401368213398427 -0.06637778522640594 0.32551915558985584 -0.11852145790998625
49600000800.0 0.3174342569512483 -0.1193449102519861 0.6424526791022925 -0.06952008775109311 0.6424526791022925 -0.06952008775109311 0.32222626610444477 -0.11810085402911762
50400000700.0 0.31421655673157023 -0.11896252527792098 0.6447685365752602 -0.0726623898829925 0.6447685365752602 -0.0726623898829925 0.31893337703064484 -0.11768025020082445
51200000700.0 0.3109988561096796 -0.11858014025605772 0.64708439433771 -0.0758046924076797 0.64708439433771 -0.0758046924076797 0.31564048754523377 -0.11725964631995581
52000000700.0 0.30778115548778895 -0.11819775523419446 0.6494002521001598 -0.07894699493236687 0.6494002521001598 -0.07894699493236687 0.3123475980598227 -0.11683904243908717
52800000700.0 0.3045634548658982 -0.11781537021233121 0.6517161098626097 -0.0820892974570541 0.6517161098626097 -0.0820892974570541 0.30905470857441164 -0.11641843855821853
53600000700.0 0.3013457542440076 -0.11743298519046795 0.6540319676250597 -0.08523159998174126 0.6540319676250597 -0.08523159998174126 0.3057618190890005 -0.11599783467734989
54400000700.0 0.298128053622117 -0.11705060016860469 0.6563478253875095 -0.08837390250642846 0.6563478253875095 -0.08837390250642846 0.30246892960358945 -0.11557723079648125
55200000700.0 0.29491035300022633 -0.11666821514674144 0.6586636831499593 -0.09151620503111563 0.6586636831499593 -0.09151620503111563 0.2991760401181784 -0.11515662691561261
56000000700.0 0.29169265237833564 -0.11628583012487817 0.6609795409124092 -0.09465850755580285 0.6609795409124092 -0.09465850755580285 0.29588315063276727 -0.11473602303474396
56800000700.0 0.288474951756445 -0.11590344510301492 0.663295398674859 -0.09780081008049002 0.663295398674859 -0.09780081008049002 0.2925902611473562 -0.11431541915387533
57600000700.0 0.28525725113455436 -0.11552106008115166 0.6656112564373089 -0.10094311260517722 0.6656112564373089 -0.10094311260517722 0.28929737166194514 -0.11389481527300668
58400000700.0 0.2820395505126637 -0.1151386750592884 0.6679271141997587 -0.10408541512986441 0.6679271141997587 -0.10408541512986441 0.28600448217653407 -0.11347421139213805
59200000700.0 0.2788218498907731 -0.11475629003742516 0.6702429719622085 -0.10722771765455161 0.6702429719622085 -0.10722771765455161 0.282711592691123 -0.1130536075112694
60000000700.0 0.27560414926888244 -0.1143739050155619 0.6725588297246584 -0.11037002017923878 0.6725588297246584 -0.11037002017923878 0.27941870320571194 -0.11263300363040077
60800000700.0 0.2723864486469918 -0.11399151999369864 0.6748746874871082 -0.11351232270392594 0.6748746874871082 -0.11351232270392594 0.2761258137203008 -0.11221239974953212
61600000700.0 0.2691687480251011 -0.11360913497183538 0.6771905452495581 -0.11665462522861317 0.6771905452495581 -0.11665462522861317 0.2728329242348897 -0.11179179586866347
62400000700.0 0.26595104740321046 -0.11322674994997212 0.6795064030120079 -0.11979692775330034 0.6795064030120079 -0.11979692775330034 0.26954003474947863 -0.11137119198779484
63200000700.0 0.2627333467813198 -0.11284436492810887 0.6818222607744578 -0.12293923027798753 0.6818222607744578 -0.12293923027798753 0.26624714526406756 -0.1109505881069262
64000000700.0 0.2595156461594292 -0.11246197990624561 0.6841381185369076 -0.1260815328026747 0.6841381185369076 -0.1260815328026747 0.2629542557786565 -0.11052998422605756
64800000700.0 0.25629794553753854 -0.11207959488438235 0.6864539762993576 -0.12922383532736192 0.6864539762993576 -0.12922383532736192 0.2596613662932454 -0.11010938034518891
65600000700.0 0.2530802449156479 -0.1116972098625191 0.6887698340618074 -0.1323661378520491 0.6887698340618074 -0.1323661378520491 0.2563684768078343 -0.10968877646432028
66400000700.0 0.24986254429375726 -0.11131482484065584 0.6910856918242572 -0.13550844037673626 0.6910856918242572 -0.13550844037673626 0.25307558732242325 -0.10926817258345164
66666667300.0 0.24878997768793537 -0.11118736319856684 0.6918576442187524 -0.1365558742897735 0.6918576442187524 -0.1365558742897735 0.25197795776836035 -0.10912797132487909
67200000700.0 0.24664484367186656 -0.11093243981879258 0.6934015495867071 -0.13865074290142348 0.6934015495867071 -0.13865074290142348 0.24978269783701218 -0.108847568702583
68000000700.0 0.24342714304997592 -0.11055005479692932 0.6957174073491569 -0.14179304542611065 0.6957174073491569 -0.14179304542611065 0.24648980835160106 -0.10842696482171435
68800000700.0 0.24020944242808528 -0.11016766977506606 0.6980332651116068 -0.14493534795079788 0.6980332651116068 -0.14493534795079788 0.24319691886619 -0.10800636094084572
69600000700.0 0.23699174180619464 -0.10978528475320282 0.7003491228740566 -0.14807765047548505 0.7003491228740566 -0.14807765047548505 0.23990402938077893 -0.10758575705997708
70400000600.0 0.23377404158651655 -0.10940289977913768 0.7026649803470242 -0.1512199526073844 0.7026649803470242 -0.1512199526073844 0.23661114030697905 -0.10716515323168392
71200000600.0 0.2305563409646259 -0.10902051475727442 0.7049808381094741 -0.15436225513207158 0.7049808381094741 -0.15436225513207158 0.23331825082156799 -0.10674454935081529
72000000600.0 0.22733864034273527 -0.10863812973541118 0.7072966958719239 -0.1575045576567588 0.7072966958719239 -0.1575045576567588 0.23002536133615692 -0.10632394546994664
72800000600.0 0.22412093972084463 -0.1082557447135479 0.7096125536343738 -0.16064686018144603 0.7096125536343738 -0.16064686018144603 0.2267324718507458 -0.10590334158907799
73600000600.0 0.22090323909895399 -0.10787335969168466 0.7119284113968236 -0.1637891627061332 0.7119284113968236 -0.1637891627061332 0.22343958236533473 -0.10548273770820936
74400000600.0 0.21768553847706335 -0.10749097466982141 0.7142442691592734 -0.16693146523082036 0.7142442691592734 -0.16693146523082036 0.22014669287992367 -0.10506213382734073
75200000600.0 0.2144678378551727 -0.10710858964795814 0.7165601269217233 -0.17007376775550753 0.7165601269217233 -0.17007376775550753 0.2168538033945126 -0.10464152994647208
76000000600.0 0.211250137233282 -0.10672620462609489 0.7188759846841732 -0.17321607028019476 0.7188759846841732 -0.17321607028019476 0.21356091390910148 -0.10422092606560343
76800000600.0 0.20803243661139137 -0.10634381960423163 0.721191842446623 -0.17635837280488192 0.721191842446623 -0.17635837280488192 0.21026802442369041 -0.1038003221847348
77600000600.0 0.20481473598950073 -0.10596143458236837 0.7235077002090728 -0.1795006753295691 0.7235077002090728 -0.1795006753295691 0.20697513493827935 -0.10337971830386616
78400000600.0 0.2015970353676101 -0.10557904956050512 0.7258235579715228 -0.18264297785425632 0.7258235579715228 -0.18264297785425632 0.20368224545286823 -0.10295911442299752
79200000600.0 0.19837933474571945 -0.10519666453864185 0.7281394157339726 -0.18578528037894348 0.7281394157339726 -0.18578528037894348 0.20038935596745716 -0.10253851054212887
80000000600.0 0.1951616341238288 -0.1048142795167786 0.7304552734964225 -0.1889275829036307 0.7304552734964225 -0.1889275829036307 0.1970964664820461 -0.10211790666126024
80800000600.0 0.19194393350193817 -0.10443189449491538 0.7327711312588723 -0.19206988542831788 0.7327711312588723 -0.19206988542831788 0.19380357699663503 -0.1016973027803916
81600000600.0 0.18872623288004747 -0.10404950947305211 0.7350869890213221 -0.1952121879530051 0.7350869890213221 -0.1952121879530051 0.1905106875112239 -0.10127669889952295
82400000600.0 0.18550853225815683 -0.10366712445118886 0.737402846783772 -0.19835449047769227 0.737402846783772 -0.19835449047769227 0.18721779802581284 -0.10085609501865433
83200000600.0 0.1822908316362662 -0.1032847394293256 0.7397187045462218 -0.20149679300237944 0.7397187045462218 -0.20149679300237944 0.18392490854040178 -0.1004354911377857
84000000600.0 0.17907313101437555 -0.10290235440746234 0.7420345623086717 -0.2046390955270666 0.7420345623086717 -0.2046390955270666 0.1806320190549907 -0.10001488725691707
84800000600.0 0.1758554303924849 -0.1025199693855991 0.7443504200711215 -0.20778139805175383 0.7443504200711215 -0.20778139805175383 0.1773391295695796 -0.09959428337604842
85600000600.0 0.17263772977059427 -0.10213758436373582 0.7466662778335714 -0.210923700576441 0.7466662778335714 -0.210923700576441 0.17404624008416852 -0.09917367949517977
86400000600.0 0.16942002914870363 -0.10175519934187258 0.7489821355960212 -0.21406600310112817 0.7489821355960212 -0.21406600310112817 0.17075335059875746 -0.09875307561431114
87200000600.0 0.16620232852681294 -0.10137281432000932 0.7512979933584711 -0.2172083056258154 0.7512979933584711 -0.2172083056258154 0.16746046111334634 -0.09833247173344249
88000000600.0 0.16298462790492235 -0.10099042929814606 0.7536138511209209 -0.22035060815050256 0.7536138511209209 -0.22035060815050256 0.16416757162793533 -0.09791186785257386
88800000600.0 0.15976692728303166 -0.10060804427628281 0.7559297088833707 -0.22349291067518978 0.7559297088833707 -0.22349291067518978 0.16087468214252415 -0.09749126397170521
89600000600.0 0.15654922666114102 -0.10022565925441954 0.7582455666458207 -0.226635213199877 0.7582455666458207 -0.226635213199877 0.15758179265711308 -0.09707066009083656
90400000500.0 0.15333152644146297 -0.09984327428035442 0.7605614241187882 -0.22977751533177632 0.7605614241187882 -0.22977751533177632 0.15428890358331326 -0.09665005626254342
91200000500.0 0.15011382581957228 -0.09946088925849116 0.7628772818812382 -0.23291981785646354 0.7628772818812382 -0.23291981785646354 0.1509960140979021 -0.09622945238167477
92000000500.0 0.14689612519768164 -0.0990785042366279 0.765193139643688 -0.2360621203811507 0.765193139643688 -0.2360621203811507 0.14770312461249102 -0.09580884850080613
92800000500.0 0.143678424575791 -0.09869611921476465 0.7675089974061378 -0.23920442290583793 0.7675089974061378 -0.23920442290583793 0.14441023512707996 -0.0953882446199375
93600000500.0 0.14046072395390036 -0.09831373419290139 0.7698248551685877 -0.2423467254305251 0.7698248551685877 -0.2423467254305251 0.1411173456416689 -0.09496764073906885
94400000500.0 0.13724302333200972 -0.09793134917103813 0.7721407129310376 -0.24548902795521227 0.7721407129310376 -0.24548902795521227 0.13782445615625782 -0.0945470368582002
95200000500.0 0.13402532271011908 -0.09754896414917488 0.7744565706934874 -0.24863133047989944 0.7744565706934874 -0.24863133047989944 0.13453156667084676 -0.09412643297733159
96000000500.0 0.13080762208822844 -0.09716657912731162 0.7767724284559372 -0.2517736330045866 0.7767724284559372 -0.2517736330045866 0.1312386771854357 -0.09370582909646294
96800000500.0 0.12758992146633774 -0.09678419410544836 0.7790882862183871 -0.2549159355292739 0.7790882862183871 -0.2549159355292739 0.12794578770002457 -0.09328522521559429
97600000500.0 0.1243722208444471 -0.0964018090835851 0.781404143980837 -0.25805823805396105 0.781404143980837 -0.25805823805396105 0.12465289821461345 -0.09286462133472564
98400000500.0 0.12115452022255646 -0.09601942406172184 0.7837200017432868 -0.2612005405786482 0.7837200017432868 -0.2612005405786482 0.12136000872920238 -0.09244401745385701
99200000500.0 0.11793681960066582 -0.0956370390398586 0.7860358595057366 -0.2643428431033354 0.7860358595057366 -0.2643428431033354 0.11806711924379132 -0.09202341357298838
100000000000.0 0.11471912098983805 -0.09525465425698598 0.7883517158207753 -0.2674851436640835 0.7883517158207753 -0.2674851436640835 0.1147742318164362 -0.09160280995499716
100800000000.0 0.11150142036794741 -0.09487226923512272 0.7906675735832251 -0.2706274461887707 0.7906675735832251 -0.2706274461887707 0.11148134233102514 -0.09118220607412852
101600000000.0 0.10828371974605677 -0.09448988421325946 0.7929834313456751 -0.2737697487134579 0.7929834313456751 -0.2737697487134579 0.10818845284561407 -0.09076160219325988
102400000000.0 0.10506601912416613 -0.09410749919139622 0.7952992891081249 -0.27691205123814505 0.7952992891081249 -0.27691205123814505 0.104895563360203 -0.09034099831239123
103200000000.0 0.10184831850227544 -0.09372511416953294 0.7976151468705748 -0.28005435376283233 0.7976151468705748 -0.28005435376283233 0.10160267387479183 -0.08992039443152258
104000000000.0 0.0986306178803848 -0.0933427291476697 0.7999310046330246 -0.2831966562875195 0.7999310046330246 -0.2831966562875195 0.09830978438938076 -0.08949979055065395
104800000000.0 0.09541291725849416 -0.09296034412580644 0.8022468623954745 -0.28633895881220667 0.8022468623954745 -0.28633895881220667 0.0950168949039697 -0.08907918666978532
105600000000.0 0.09219521663660352 -0.09257795910394317 0.8045627201579243 -0.28948126133689384 0.8045627201579243 -0.28948126133689384 0.09172400541855863 -0.08865858278891667
106400000000.0 0.08897751601471288 -0.09219557408207993 0.8068785779203742 -0.292623563861581 0.8068785779203742 -0.292623563861581 0.08843111593314756 -0.08823797890804803
107200000000.0 0.08575981539282224 -0.09181318906021667 0.809194435682824 -0.2957658663862682 0.809194435682824 -0.2957658663862682 0.0851382264477365 -0.0878173750271794
108000000000.0 0.0825421147709316 -0.09143080403835341 0.8115102934452738 -0.2989081689109554 0.8115102934452738 -0.2989081689109554 0.08184533696232543 -0.08739677114631075
108800000000.0 0.0793244141490409 -0.09104841901649015 0.8138261512077237 -0.3020504714356426 0.8138261512077237 -0.3020504714356426 0.07855244747691426 -0.0869761672654421
109600000000.0 0.07610671352715026 -0.09066603399462689 0.8161420089701736 -0.3051927739603298 0.8161420089701736 -0.3051927739603298 0.07525955799150319 -0.08655556338457346
110400000000.0 0.07288901290525962 -0.09028364897276364 0.8184578667326234 -0.308335076485017 0.8184578667326234 -0.308335076485017 0.07196666850609212 -0.08613495950370482
111200000000.0 0.06967131228336898 -0.08990126395090038 0.8207737244950732 -0.3114773790097042 0.8207737244950732 -0.3114773790097042 0.06867377902068106 -0.08571435562283619
112000000000.0 0.06645361166147834 -0.08951887892903712 0.8230895822575232 -0.31461968153439135 0.8230895822575232 -0.31461968153439135 0.06538088953526999 -0.08529375174196754
112800000000.0 0.0632359110395877 -0.08913649390717387 0.8254054400199731 -0.3177619840590785 0.8254054400199731 -0.3177619840590785 0.06208800004985893 -0.08487314786109891
113600000000.0 0.06001821041769706 -0.08875410888531061 0.8277212977824229 -0.3209042865837657 0.8277212977824229 -0.3209042865837657 0.05879511056444786 -0.08445254398023028
114400000000.0 0.05680050979580642 -0.08837172386344735 0.8300371555448727 -0.3240465891084529 0.8300371555448727 -0.3240465891084529 0.055502221079036795 -0.08403194009936163
115200000000.0 0.053582809173915724 -0.0879893388415841 0.8323530133073226 -0.32718889163314013 0.8323530133073226 -0.32718889163314013 0.05220933159362562 -0.08361133621849298
116000000000.0 0.050365108552025084 -0.08760695381972083 0.8346688710697725 -0.3303311941578273 0.8346688710697725 -0.3303311941578273 0.04891644210821455 -0.08319073233762433
116800000000.0 0.047147407930134444 -0.08722456879785759 0.8369847288322223 -0.33347349668251447 0.8369847288322223 -0.33347349668251447 0.04562355262280349 -0.0827701284567557
117600000000.0 0.043929707308243804 -0.08684218377599433 0.8393005865946721 -0.3366157992072017 0.8393005865946721 -0.3366157992072017 0.04233066313739242 -0.08234952457588707
118400000000.0 0.040712006686353164 -0.08645979875413107 0.8416164443571219 -0.33975810173188886 0.8416164443571219 -0.33975810173188886 0.039037773651981356 -0.08192892069501842
119200000000.0 0.037494306064462524 -0.08607741373226782 0.8439323021195718 -0.34290040425657603 0.8439323021195718 -0.34290040425657603 0.03574488416657029 -0.08150831681414979
120000000000.0 0.034276605442571884 -0.08569502871040456 0.8462481598820216 -0.3460427067812632 0.8462481598820216 -0.3460427067812632 0.032451994681159224 -0.08108771293328114
120800000000.0 0.031058904820681188 -0.0853126436885413 0.8485640176444715 -0.3491850093059505 0.8485640176444715 -0.3491850093059505 0.029159105195748103 -0.08066710905241249
121600000000.0 0.027841204198790548 -0.08493025866667804 0.8508798754069213 -0.35232731183063765 0.8508798754069213 -0.35232731183063765 0.02586621571033698 -0.08024650517154386
122400000000.0 0.024623503576899908 -0.08454787364481478 0.8531957331693713 -0.3554696143553248 0.8531957331693713 -0.3554696143553248 0.022573326224925916 -0.07982590129067521
123200000000.0 0.021405802955009268 -0.08416548862295153 0.855511590931821 -0.358611916880012 0.855511590931821 -0.358611916880012 0.01928043673951485 -0.07940529740980658
124000000000.0 0.018188102333118628 -0.08378310360108827 0.857827448694271 -0.36175421940469915 0.857827448694271 -0.36175421940469915 0.015987547254103784 -0.07898469352893794
124800000000.0 0.014970401711227987 -0.08340071857922501 0.8601433064567208 -0.3648965219293864 0.8601433064567208 -0.3648965219293864 0.012694657768692719 -0.0785640896480693
125600000000.0 0.011752701089337347 -0.08301833355736177 0.8624591642191706 -0.36803882445407354 0.8624591642191706 -0.36803882445407354 0.009401768283281653 -0.07814348576720066
126400000000.0 0.008535000467446596 -0.0826359485354985 0.8647750219816205 -0.37118112697876077 0.8647750219816205 -0.37118112697876077 0.006108878797870476 -0.07772288188633202
127200000000.0 0.005317299845555956 -0.08225356351363525 0.8670908797440704 -0.374323429503448 0.8670908797440704 -0.374323429503448 0.0028159893124594104 -0.07730227800546337
128000000000.0 0.002099599223665316 -0.08187117849177199 0.8694067375065202 -0.37746573202813516 0.8694067375065202 -0.37746573202813516 -0.0004769001729516553 -0.07688167412459473
128800000000.0 -0.001118101398225324 -0.08148879346990873 0.87172259526897 -0.3806080345528223 0.87172259526897 -0.3806080345528223 -0.003769789658362721 -0.07646107024372609
129600000000.0 -0.004335802020115853 -0.08110640844804548 0.8740384530314198 -0.3837503370775095 0.8740384530314198 -0.3837503370775095 -0.007062679143773787 -0.07604046636285745
130400000000.0 -0.007553502642006493 -0.08072402342618222 0.8763543107938697 -0.38689263960219666 0.8763543107938697 -0.38689263960219666 -0.010355568629184853 -0.07561986248198882
131200000000.0 -0.010771203263897133 -0.08034163840431896 0.8786701685563195 -0.39003494212688383 0.8786701685563195 -0.39003494212688383 -0.013648458114595918 -0.07519925860112017
132000000000.0 -0.013988903885787773 -0.07995925338245571 0.8809860263187694 -0.393177244651571 0.8809860263187694 -0.393177244651571 -0.016941347600006984 -0.07477865472025154
132800000000.0 -0.017206604507678525 -0.07957686836059244 0.8833018840812192 -0.3963195471762583 0.8833018840812192 -0.3963195471762583 -0.02023423708541816 -0.07435805083938289
133333334000.0 -0.019351740937022743 -0.07932194469402942 0.8848457911860673 -0.3984144181446352 0.8848457911860673 -0.3984144181446352 -0.022429499486433357 -0.07407764790163389
133600000000.0 -0.020424305129569165 -0.0791944833387292 0.8856177418436691 -0.39946184970094545 0.8856177418436691 -0.39946184970094545 -0.023527126570829227 -0.07393744695851424
134400000000.0 -0.023642005751459805 -0.07881209831686593 0.887933599606119 -0.4026041522256326 0.887933599606119 -0.4026041522256326 -0.026820016056240292 -0.07351684307764561
135200000000.0 -0.026859706373350445 -0.07842971329500267 0.8902494573685689 -0.4057464547503198 0.8902494573685689 -0.4057464547503198 -0.030112905541651358 -0.07309623919677696
136000000000.0 -0.030077406995241085 -0.07804732827313943 0.8925653151310187 -0.40888875727500695 0.8925653151310187 -0.40888875727500695 -0.033405795027062424 -0.07267563531590833
136800000000.0 -0.033295107617131725 -0.07766494325127617 0.8948811728934685 -0.41203105979969423 0.8948811728934685 -0.41203105979969423 -0.03669868451247349 -0.0722550314350397
137600000000.0 -0.036512808239022365 -0.0772825582294129 0.8971970306559183 -0.4151733623243814 0.8971970306559183 -0.4151733623243814 -0.039991573997884555 -0.07183442755417105
138400000000.0 -0.039730508860913116 -0.07690017320754965 0.8995128884183683 -0.41831566484906857 0.8995128884183683 -0.41831566484906857 -0.04328446348329573 -0.0714138236733024
139200000000.0 -0.042948209482803756 -0.07651778818568639 0.9018287461808181 -0.42145796737375585 0.9018287461808181 -0.42145796737375585 -0.0465773529687068 -0.07099321979243377
140000000000.0 -0.046165910104694396 -0.07613540316382314 0.9041446039432679 -0.424600269898443 0.9041446039432679 -0.424600269898443 -0.049870242454117863 -0.07057261591156512
140800000000.0 -0.04938361072658504 -0.07575301814195988 0.9064604617057177 -0.4277425724231302 0.9064604617057177 -0.4277425724231302 -0.05316313193952893 -0.07015201203069649
141600000000.0 -0.05260131134847568 -0.07537063312009662 0.9087763194681676 -0.43088487494781735 0.9087763194681676 -0.43088487494781735 -0.056456021424939995 -0.06973140814982784
142400000000.0 -0.05581901197036632 -0.07498824809823337 0.9110921772306175 -0.4340271774725045 0.9110921772306175 -0.4340271774725045 -0.05974891091035106 -0.0693108042689592
143200000000.0 -0.059036712592256846 -0.07460586307637011 0.9134080349930673 -0.4371694799971917 0.9134080349930673 -0.4371694799971917 -0.06304180039576213 -0.06889020038809056
144000000000.0 -0.0622544132141476 -0.07422347805450685 0.9157238927555171 -0.44031178252187897 0.9157238927555171 -0.44031178252187897 -0.06633468988117319 -0.06846959650722191
144800000000.0 -0.06547211383603824 -0.07384109303264359 0.918039750517967 -0.44345408504656614 0.918039750517967 -0.44345408504656614 -0.06962757936658437 -0.06804899262635328
145600000000.0 -0.06868981445792888 -0.07345870801078033 0.9203556082804168 -0.4465963875712533 0.9203556082804168 -0.4465963875712533 -0.07292046885199543 -0.06762838874548464
146400000000.0 -0.07190751507981952 -0.07307632298891709 0.9226714660428668 -0.4497386900959405 0.9226714660428668 -0.4497386900959405 -0.0762133583374065 -0.067207784864616
147200000000.0 -0.07512521570171016 -0.07269393796705383 0.9249873238053166 -0.45288099262062764 0.9249873238053166 -0.45288099262062764 -0.07950624782281757 -0.06678718098374736
148000000000.0 -0.0783429163236008 -0.07231155294519057 0.9273031815677664 -0.4560232951453148 0.9273031815677664 -0.4560232951453148 -0.08279913730822863 -0.06636657710287872
148800000000.0 -0.08156061694549144 -0.07192916792332732 0.9296190393302162 -0.459165597670002 0.9296190393302162 -0.459165597670002 -0.0860920267936397 -0.06594597322201008
149600000000.0 -0.08477831756738208 -0.07154678290146406 0.9319348970926661 -0.46230790019468915 0.9319348970926661 -0.46230790019468915 -0.08938491627905076 -0.06552536934114143
150400000000.0 -0.08799601818927283 -0.0711643978796008 0.934250754855116 -0.4654502027193764 0.934250754855116 -0.4654502027193764 -0.09267780576446183 -0.06510476546027279
151200000000.0 -0.09121371881116347 -0.07078201285773754 0.9365666126175658 -0.4685925052440636 0.9365666126175658 -0.4685925052440636 -0.0959706952498729 -0.06468416157940415
152000000000.0 -0.09443141943305411 -0.07039962783587428 0.9388824703800156 -0.47173480776875076 0.9388824703800156 -0.47173480776875076 -0.09926358473528407 -0.0642635576985355
152800000000.0 -0.09764912005494475 -0.07001724281401103 0.9411983281424655 -0.47487711029343793 0.9411983281424655 -0.47487711029343793 -0.10255647422069514 -0.06384295381766687
153600000000.0 -0.10086682067683539 -0.06963485779214777 0.9435141859049154 -0.4780194128181252 0.9435141859049154 -0.4780194128181252 -0.1058493637061062 -0.06342234993679824
154400000000.0 -0.10408452129872603 -0.06925247277028451 0.9458300436673652 -0.4811617153428124 0.9458300436673652 -0.4811617153428124 -0.10914225319151727 -0.06300174605592959
155200000000.0 -0.10730222192061667 -0.06887008774842127 0.948145901429815 -0.48430401786749955 0.948145901429815 -0.48430401786749955 -0.11243514267692833 -0.06258114217506096
156000000000.0 -0.11051992254250731 -0.06848770272655799 0.9504617591922649 -0.4874463203921868 0.9504617591922649 -0.4874463203921868 -0.1157280321623394 -0.06216053829419231
156800000000.0 -0.11373762316439795 -0.06810531770469475 0.9527776169547149 -0.490588622916874 0.9527776169547149 -0.490588622916874 -0.11902092164775047 -0.06173993441332366
157600000000.0 -0.11695532378628859 -0.06772293268283149 0.9550934747171647 -0.49373092544156116 0.9550934747171647 -0.49373092544156116 -0.12231381113316153 -0.06131933053245503
158400000000.0 -0.12017302440817923 -0.06734054766096823 0.9574093324796145 -0.49687322796624833 0.9574093324796145 -0.49687322796624833 -0.1256067006185726 -0.06089872665158638
159200000000.0 -0.12339072503006987 -0.06695816263910498 0.9597251902420643 -0.5000155304909355 0.9597251902420643 -0.5000155304909355 -0.12889959010398377 -0.06047812277071775
160000000000.0 -0.1266084256519605 -0.06657577761724172 0.9620410480045141 -0.5031578330156227 0.9620410480045141 -0.5031578330156227 -0.13219247958939484 -0.060057518889849115
160800000000.0 -0.12982612627385115 -0.06619339259537846 0.964356905766964 -0.5063001355403098 0.964356905766964 -0.5063001355403098 -0.1354853690748059 -0.05963691500898047
161600000000.0 -0.1330438268957419 -0.0658110075735152 0.9666727635294139 -0.5094424380649971 0.9666727635294139 -0.5094424380649971 -0.13877825856021697 -0.05921631112811182
162400000000.0 -0.13626152751763254 -0.06542862255165194 0.9689886212918637 -0.5125847405896843 0.9689886212918637 -0.5125847405896843 -0.14207114804562804 -0.05879570724724319
163200000000.0 -0.13947922813952318 -0.06504623752978869 0.9713044790543135 -0.5157270431143715 0.9713044790543135 -0.5157270431143715 -0.1453640375310391 -0.05837510336637454
164000000000.0 -0.14269692876141382 -0.06466385250792543 0.9736203368167634 -0.5188693456390586 0.9736203368167634 -0.5188693456390586 -0.14865692701645017 -0.057954499485505906
164800000000.0 -0.14591462938330446 -0.06428146748606217 0.9759361945792133 -0.5220116481637458 0.9759361945792133 -0.5220116481637458 -0.15194981650186123 -0.05753389560463726
165600000000.0 -0.1491323300051951 -0.06389908246419893 0.9782520523416631 -0.525153950688433 0.9782520523416631 -0.525153950688433 -0.1552427059872723 -0.057113291723768625
166400000000.0 -0.15235003062708574 -0.06351669744233567 0.9805679101041129 -0.5282962532131201 0.9805679101041129 -0.5282962532131201 -0.15853559547268348 -0.05669268784289999
167200000000.0 -0.15556773124897638 -0.0631343124204724 0.9828837678665627 -0.5314385557378074 0.9828837678665627 -0.5314385557378074 -0.16182848495809454 -0.056272083962031344
168000000000.0 -0.15878543187086702 -0.06275192739860914 0.9851996256290128 -0.5345808582624946 0.9851996256290128 -0.5345808582624946 -0.1651213744435056 -0.0558514800811627
168800000000.0 -0.16200313249275766 -0.062369542376745885 0.9875154833914626 -0.5377231607871817 0.9875154833914626 -0.5377231607871817 -0.16841426392891667 -0.05543087620029406
169600000000.0 -0.1652208331146483 -0.06198715735488264 0.9898313411539124 -0.5408654633118689 0.9898313411539124 -0.5408654633118689 -0.17170715341432774 -0.055010272319425416
170400000000.0 -0.16843853373653894 -0.06160477233301938 0.9921471989163622 -0.5440077658365562 0.9921471989163622 -0.5440077658365562 -0.1750000428997388 -0.05458966843855678
171200000000.0 -0.17165623435842958 -0.06122238731115612 0.9944630566788121 -0.5471500683612434 0.9944630566788121 -0.5471500683612434 -0.17829293238514987 -0.054169064557688135
172000000000.0 -0.17487393498032022 -0.06084000228929287 0.9967789144412619 -0.5502923708859305 0.9967789144412619 -0.5502923708859305 -0.18158582187056094 -0.0537484606768195
172800000000.0 -0.17809163560221086 -0.06045761726742961 0.9990947722037118 -0.5534346734106177 0.9990947722037118 -0.5534346734106177 -0.184878711355972 -0.05332785679595087
173600000000.0 -0.1813093362241016 -0.06007523224556635 1.0014106299661616 -0.556576975935305 1.0014106299661616 -0.556576975935305 -0.18817160084138318 -0.052907252915082206
174400000000.0 -0.18452703684599225 -0.05969284722370309 1.0037264877286116 -0.5597192784599921 1.0037264877286116 -0.5597192784599921 -0.19146449032679425 -0.05248664903421357
175200000000.0 -0.1877447374678829 -0.05931046220183983 1.0060423454910614 -0.5628615809846793 1.0060423454910614 -0.5628615809846793 -0.1947573798122053 -0.05206604515334494
176000000000.0 -0.19096243808977353 -0.058928077179976585 1.0083582032535112 -0.5660038835093665 1.0083582032535112 -0.5660038835093665 -0.19805026929761638 -0.05164544127247629
176800000000.0 -0.19418013871166417 -0.058545692158113324 1.010674061015961 -0.5691461860340536 1.010674061015961 -0.5691461860340536 -0.20134315878302744 -0.05122483739160766
177600000000.0 -0.19739783933355481 -0.058163307136250064 1.0129899187784108 -0.5722884885587408 1.0129899187784108 -0.5722884885587408 -0.2046360482684385 -0.05080423351073901
178400000000.0 -0.20061553995544545 -0.05778092211438682 1.0153057765408606 -0.575430791083428 1.0153057765408606 -0.575430791083428 -0.20792893775384957 -0.05038362962987038
179200000000.0 -0.2038332405773361 -0.05739853709252356 1.0176216343033104 -0.5785730936081152 1.0176216343033104 -0.5785730936081152 -0.21122182723926064 -0.049963025749001744
180000000000.0 -0.20705094119922673 -0.0570161520706603 1.0199374920657602 -0.5817153961328023 1.0199374920657602 -0.5817153961328023 -0.2145147167246717 -0.049542421868133096
180800000000.0 -0.21026864182111737 -0.05663376704879705 1.0222533498282103 -0.5848576986574895 1.0222533498282103 -0.5848576986574895 -0.21780760621008277 -0.04912181798726446
181600000000.0 -0.21348634244300801 -0.05625138202693379 1.02456920759066 -0.5880000011821768 1.02456920759066 -0.5880000011821768 -0.22110049569549395 -0.048701214106395815
182400000000.0 -0.21670404306489877 -0.05586899700507052 1.02688506535311 -0.591142303706864 1.02688506535311 -0.591142303706864 -0.22439338518090512 -0.048280610225527154
183200000000.0 -0.2199217436867894 -0.05548661198320726 1.0292009231155599 -0.5942846062315512 1.0292009231155599 -0.5942846062315512 -0.2276862746663162 -0.04786000634465852
184000000000.0 -0.22313944430868005 -0.05510422696134401 1.0315167808780097 -0.5974269087562384 1.0315167808780097 -0.5974269087562384 -0.23097916415172726 -0.04743940246378989
184800000000.0 -0.2263571449305707 -0.05472184193948075 1.0338326386404595 -0.6005692112809256 1.0338326386404595 -0.6005692112809256 -0.23427205363713832 -0.04701879858292124
185600000000.0 -0.22957484555246133 -0.05433945691761749 1.0361484964029093 -0.6037115138056127 1.0361484964029093 -0.6037115138056127 -0.2375649431225494 -0.046598194702052606
186400000000.0 -0.23279254617435197 -0.053957071895754244 1.038464354165359 -0.6068538163302999 1.038464354165359 -0.6068538163302999 -0.24085783260796045 -0.04617759082118396
187200000000.0 -0.2360102467962426 -0.053574686873890984 1.0407802119278091 -0.6099961188549872 1.0407802119278091 -0.6099961188549872 -0.24415072209337152 -0.045756986940315325
188000000000.0 -0.23922794741813325 -0.053192301852027724 1.043096069690259 -0.6131384213796743 1.043096069690259 -0.6131384213796743 -0.24744361157878259 -0.04533638305944668
188800000000.0 -0.2424456480400239 -0.05280991683016448 1.0454119274527087 -0.6162807239043615 1.0454119274527087 -0.6162807239043615 -0.25073650106419365 -0.044915779178578044
189600000000.0 -0.24566334866191453 -0.05242753180830122 1.0477277852151587 -0.6194230264290487 1.0477277852151587 -0.6194230264290487 -0.2540293905496047 -0.04449517529770941
190400000000.0 -0.24888104928380517 -0.05204514678643796 1.0500436429776085 -0.6225653289537358 1.0500436429776085 -0.6225653289537358 -0.2573222800350158 -0.04407457141684076
191200000000.0 -0.2520987499056958 -0.05166276176457471 1.0523595007400584 -0.625707631478423 1.0523595007400584 -0.625707631478423 -0.26061516952042685 -0.04365396753597213
192000000000.0 -0.25531645052758645 -0.05128037674271145 1.0546753585025082 -0.6288499340031102 1.0546753585025082 -0.6288499340031102 -0.2639080590058379 -0.04323336365510348
192800000000.0 -0.2585341511494771 -0.05089799172084819 1.056991216264958 -0.6319922365277973 1.056991216264958 -0.6319922365277973 -0.267200948491249 -0.04281275977423485
193600000000.0 -0.2617518517713677 -0.050515606698984944 1.0593070740274078 -0.6351345390524845 1.0593070740274078 -0.6351345390524845 -0.27049383797666005 -0.042392155893366215
194400000000.0 -0.2649695523932585 -0.05013322167712167 1.0616229317898578 -0.6382768415771719 1.0616229317898578 -0.6382768415771719 -0.27378672746207133 -0.041971552012497554
195200000000.0 -0.2681872530151491 -0.04975083665525841 1.0639387895523076 -0.6414191441018591 1.0639387895523076 -0.6414191441018591 -0.2770796169474824 -0.041550948131628906
196000000000.0 -0.27140495363703976 -0.04936845163339515 1.0662546473147576 -0.6445614466265462 1.0662546473147576 -0.6445614466265462 -0.28037250643289346 -0.04113034425076027
196800000000.0 -0.2746226542589304 -0.0489860666115319 1.0685705050772074 -0.6477037491512334 1.0685705050772074 -0.6477037491512334 -0.28366539591830453 -0.040709740369891625
197600000000.0 -0.27784035488082104 -0.04860368158966864 1.0708863628396572 -0.6508460516759206 1.0708863628396572 -0.6508460516759206 -0.2869582854037156 -0.04028913648902299
198400000000.0 -0.2810580555027117 -0.04822129656780538 1.073202220602107 -0.6539883542006077 1.073202220602107 -0.6539883542006077 -0.29025117488912666 -0.03986853260815436
199200000000.0 -0.2842757561246023 -0.04783891154594214 1.0755180783645568 -0.6571306567252949 1.0755180783645568 -0.6571306567252949 -0.2935440643745377 -0.03944792872728571
200000000000.0 -0.28749345674649296 -0.047456526524078876 1.0778339361270066 -0.6602729592499821 1.0778339361270066 -0.6602729592499821 -0.2968369538599488 -0.03902732484641708

View File

@@ -1,309 +0,0 @@
! Created with skrf 1.8.0 (http://scikit-rf.org).
# Hz S RI R 50.0
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
0.0 0.54669299140207 -0.1662104177109195 0.46100154888068945 0.1530653599528759 0.46100154888068945 0.1530653599528759 0.5593473899566386 -0.16509997898188067
1000.0 0.5466929861541492 -0.16621041680285528 0.46100155138238874 0.1530653541325667 0.46100155138238874 0.1530653541325667 0.559347384635358 -0.16509997772031268
10000.0 0.5466929389228627 -0.16621040863027736 0.4610015738976825 0.15306530174978375 0.4610015738976825 0.15306530174978375 0.5593473367438332 -0.16509996636620083
12589.0 0.546692925335996 -0.16621040627929912 0.46100158037458194 0.15306528668100317 0.46100158037458194 0.15306528668100317 0.5593473229670379 -0.16509996310000133
15849.0 0.5466929082277745 -0.16621040331900977 0.4610015885301217 0.15306526770679513 0.4610015885301217 0.15306526770679513 0.5593473056196633 -0.1650999589872897
19953.0 0.5466928866903079 -0.16621039959231423 0.4610015987970956 0.1530652438202461 0.4610015987970956 0.1530652438202461 0.559347283781128 -0.1650999538098147
25119.0 0.5466928595795495 -0.1662103949012545 0.46100161172087417 0.15306521375252868 0.46100161172087417 0.15306521375252868 0.5593472562913927 -0.16509994729255453
31623.0 0.5466928254470731 -0.16621038899520488 0.46100162799192645 0.15306517589723756 0.46100162799192645 0.15306517589723756 0.5593472216817841 -0.16509993908731635
39811.0 0.5466927824770983 -0.16621038155997508 0.4610016484758403 0.1530651282405457 0.4610016484758403 0.1530651282405457 0.5593471781111391 -0.1650999287575977
50119.0 0.5466927283815316 -0.16621037219964918 0.4610016742633567 0.1530650682447983 0.4610016742633567 0.1530650682447983 0.5593471232593793 -0.16509991575335498
63096.0 0.5466926602792644 -0.16621036041569986 0.4610017067279085 0.15306499271464558 0.4610017067279085 0.15306499271464558 0.5593470542051218 -0.16509989938198727
79433.0 0.5466925745439837 -0.1662103455806548 0.46100174759817003 0.15306489762825393 0.46100174759817003 0.15306489762825393 0.5593469672713616 -0.16509987877175114
100000.0 0.5466924666099984 -0.16621032690449813 0.46100179905061955 0.15306477792195428 0.46100179905061955 0.15306477792195428 0.5593468578285848 -0.16509985282508244
125893.0 0.5466923307255872 -0.16621030339199147 0.46100186382711955 0.15306462721668773 0.46100186382711955 0.15306462721668773 0.5593467200446678 -0.16509982015930266
158489.0 0.5466921596643636 -0.16621027379273035 0.46100194537250994 0.1530644374978885 0.46100194537250994 0.1530644374978885 0.5593465465922074 -0.16509977903723272
199526.0 0.5466919443054411 -0.16621023652849923 0.46100204803474415 0.1530641986498592 0.46100204803474415 0.1530641986498592 0.5593463282228179 -0.16509972726626743
251189.0 0.5466916731821132 -0.16621018961517778 0.4610021772800351 0.15306389795522415 0.4610021772800351 0.15306389795522415 0.5593460533095016 -0.16509966208988075
316228.0 0.5466913318625978 -0.1662101305555894 0.46100233998805595 0.15306351940813304 0.46100233998805595 0.15306351940813304 0.5593457072187367 -0.16509958003876077
398107.0 0.5466909021680975 -0.16621005620419965 0.46100254482469305 0.1530630428470347 0.46100254482469305 0.1530630428470347 0.5593452715176075 -0.16509947674283593
501187.0 0.54669036121243 -0.16620996260094054 0.46100280269985694 0.1530624428895607 0.46100280269985694 0.1530624428895607 0.5593447230000097 -0.16509934670040832
630957.0 0.5466896801897587 -0.16620984476144754 0.46100312734537524 0.15306168758803368 0.46100312734537524 0.15306168758803368 0.5593440324574342 -0.16509918298673124
794328.0 0.5466888228317034 -0.16620969641008893 0.4610035360504917 0.1530607367182967 0.4610035360504917 0.1530607367182967 0.5593431631145115 -0.1650989768831084
1000000.0 0.5466877434813538 -0.166209509646706 0.46100405057999033 0.15305953964365956 0.46100405057999033 0.15305953964365956 0.5593420686761007 -0.16509871741389834
1258925.0 0.5466863846634824 -0.16620927452617953 0.4610046983324818 0.15305803262009574 0.4610046983324818 0.15305803262009574 0.5593406908635374 -0.16509839076240854
1584893.0 0.5466846740092625 -0.16620897852630398 0.46100551380639954 0.1530561353855411 0.46100551380639954 0.1530561353855411 0.5593389562963631 -0.16509797953161645
1995262.0 0.5466825204252861 -0.16620860588490077 0.4610065404262399 0.1530537469110683 0.4610065404262399 0.1530537469110683 0.5593367726077901 -0.16509746182322513
2511886.0 0.546679809223494 -0.16620813675713456 0.46100783286413954 0.15305073999963972 0.46100783286413954 0.15305073999963972 0.5593340235065535 -0.16509681006692783
3162278.0 0.5466763960178437 -0.16620754615943462 0.4610094599493512 0.15304695451708789 0.4610094599493512 0.15304695451708789 0.559330562588262 -0.16509598955320468
3981072.0 0.5466720990518489 -0.166206802641905 0.4610115083257286 0.1530421888828234 0.4610115083257286 0.1530421888828234 0.5593262055556852 -0.16509495658891016
5011872.0 0.5466666894951747 -0.16620586660931375 0.46101408707736796 0.15303618930808321 0.46101408707736796 0.15303618930808321 0.5593207203797069 -0.16509365616463398
6309573.0 0.5466598792632135 -0.16620468821347584 0.4610173335350524 0.15302863628699287 0.4610173335350524 0.15302863628699287 0.5593138149486316 -0.16509201902660173
7943282.0 0.5466513056879083 -0.1662032047007977 0.46102142058371554 0.15301912759544334 0.46102142058371554 0.15301912759544334 0.5593051215247256 -0.1650899579916349
10000000.0 0.546640512194909 -0.16620133706878468 0.4610265658736982 0.15300715686071253 0.4610265658736982 0.15300715686071253 0.5592941771512603 -0.16508736330205745
12589254.0 0.5466269239952031 -0.16619898585988765 0.46103304340861984 0.15299208660179292 0.46103304340861984 0.15299208660179292 0.5592803990043426 -0.16508409678211294
15848932.0 0.5466098174634991 -0.16619602586294838 0.46104119814279354 0.15297311426788723 0.46104119814279354 0.15297311426788723 0.5592630533432417 -0.16507998447671546
19952623.0 0.5465882816184877 -0.1661922994480081 0.46105146434369926 0.1529492295173389 0.46105146434369926 0.1529492295173389 0.55924121645219 -0.1650748073915405
25118864.0 0.5465611695953194 -0.16618760816943778 0.4610643887251971 0.1529191603972328 0.4610643887251971 0.1529191603972328 0.5592137254345031 -0.16506828982730595
31622777.0 0.546527037575551 -0.16618170219879488 0.4610806595598022 0.15288130561245666 0.4610806595598022 0.15288130561245666 0.5591791162888364 -0.16506008469890535
39810717.0 0.5464840679156028 -0.16617426702349875 0.4611011433235758 0.15283364926981186 0.4611011433235758 0.15283364926981186 0.5591355459630696 -0.16504975505596017
50118723.0 0.5464299723173738 -0.1661649066921378 0.46112693085497947 0.152773653487488 0.46112693085497947 0.152773653487488 0.559080694171358 -0.16503675080562896
63095734.0 0.5463618699925138 -0.1661531227328507 0.4611593954343257 0.15269812327076424 0.4611593954343257 0.15269812327076424 0.5590116398552845 -0.16502037942404513
79432823.0 0.5462761342447099 -0.16613828760697735 0.46120026591845537 0.15260303636108943 0.46120026591845537 0.15260303636108943 0.5589247056215441 -0.16499976907563838
100000000.0 0.5461681993304599 -0.1661196112895713 0.4612517188107773 0.15248332903124232 0.4612517188107773 0.15248332903124232 0.5588152619028559 -0.1649738221836484
125892541.0 0.5460323173281535 -0.1660960991996931 0.46131649416249504 0.15233262643622567 0.46131649416249504 0.15233262643622567 0.5586774804283577 -0.16494115698294182
158489319.0 0.5458612520216092 -0.16606649923211647 0.46139804149922853 0.1521429031088094 0.46139804149922853 0.1521429031088094 0.5585040238279905 -0.16490003393149014
199526231.0 0.5456458935609996 -0.16602923508089748 0.46150070351328915 0.15190405559168585 0.46150070351328915 0.15190405559168585 0.5582856549068324 -0.16484826307721756
251188643.0 0.545374773318821 -0.16598232229337812 0.46162994733327123 0.1516033643789841 0.46162994733327123 0.1516033643789841 0.5580107447193196 -0.1647830874323488
316227766.0 0.5450334531578723 -0.1659232625933056 0.4617926556618101 0.1512248165719648 0.4617926556618101 0.1512248165719648 0.5576646532999023 -0.16470103615717366
398107171.0 0.5446037565321509 -0.1658489108358039 0.46199749331205503 0.1507482531164152 0.46199749331205503 0.1507482531164152 0.5572289500156269 -0.164597739721414
501187234.0 0.5440628005341162 -0.16575530751947015 0.4622553686335967 0.15014829527571583 0.4622553686335967 0.15014829527571583 0.556680432082547 -0.16446769721431742
630957344.0 0.5433817772855165 -0.16563746792659956 0.46258001442705865 0.1493929931084779 0.46258001442705865 0.1493929931084779 0.5559898889218124 -0.16430398339847893
794328235.0 0.5425244198022299 -0.16548911666695781 0.4629887192708573 0.14844212400590961 0.4629887192708573 0.14844212400590961 0.5551205465790867 -0.1640978799131498
800000996.0 0.5424946496022605 -0.16548396543570207 0.46300291081308503 0.14840910678277924 0.46300291081308503 0.14840910678277924 0.5550903602263816 -0.16409072333950084
1000000000.0 0.5414450706859694 -0.16530235349743766 0.4635032481815683 0.14724505073654004 0.4635032481815683 0.14724505073654004 0.5540261094188117 -0.163838410999558
1600000990.0 0.5382963130608676 -0.16475751407036499 0.46500427023877794 0.1437528594446324 0.46500427023877794 0.1437528594446324 0.5508333358280478 -0.16308146896121212
2400000990.0 0.5340979764879871 -0.16403106269957954 0.467005629679481 0.13909661207156374 0.467005629679481 0.13909661207156374 0.5465763113977863 -0.16207221457535398
3200000980.0 0.5298996399675858 -0.16330461133787472 0.4690069890951671 0.13444036475669813 0.4690069890951671 0.13444036475669813 0.5423192870207375 -0.16106296020211155
4000000980.0 0.5257013033947053 -0.16257815996708924 0.47100834853587015 0.12978411738362944 0.47100834853587015 0.12978411738362944 0.538062262590476 -0.16005370581625342
4800000980.0 0.521502966821825 -0.16185170859630377 0.47300970797657327 0.12512787001056075 0.47300970797657327 0.12512787001056075 0.5338052381602144 -0.1590444514303953
5600000970.0 0.5173046303014237 -0.16112525723459895 0.47501106739225935 0.12047162269569517 0.47501106739225935 0.12047162269569517 0.5295482137831657 -0.15803519705715285
6400000970.0 0.5131062937285432 -0.1603988058638135 0.4770124268329624 0.11581537532262648 0.4770124268329624 0.11581537532262648 0.5252911893529042 -0.15702594267129472
7200000960.0 0.508907957208142 -0.15967235450210868 0.47901378624864854 0.1111591280077609 0.47901378624864854 0.1111591280077609 0.5210341649758555 -0.1560166882980523
8000000960.0 0.5047096206352615 -0.1589459031313232 0.4810151456893516 0.10650288063469221 0.4810151456893516 0.10650288063469221 0.516777140545594 -0.15500743391219415
8800000960.0 0.5005112840623811 -0.15821945176053775 0.4830165051300547 0.10184663326162352 0.4830165051300547 0.10184663326162352 0.5125201161153324 -0.15399817952633604
9600000950.0 0.4963129475419798 -0.15749300039883293 0.48501786454574075 0.09719038594675794 0.48501786454574075 0.09719038594675794 0.5082630917382837 -0.1529889251530936
10400000900.0 0.49211461123149536 -0.15676654907345067 0.4870192238613589 0.09253413886470471 0.4870192238613589 0.09253413886470471 0.5040060675740862 -0.15197967083031386
11200000900.0 0.4879162746586149 -0.15604009770266522 0.48902058330206194 0.08787789149163604 0.48902058330206194 0.08787789149163604 0.4997490431438247 -0.15097041644445575
12000000900.0 0.4837179380857345 -0.15531364633187975 0.49102194274276506 0.08322164411856735 0.49102194274276506 0.08322164411856735 0.49549201871356313 -0.1499611620585976
12800000900.0 0.479519601512854 -0.15458719496109427 0.4930233021834681 0.07856539674549864 0.4930233021834681 0.07856539674549864 0.4912349942833016 -0.1489519076727395
13600000900.0 0.47532126493997356 -0.15386074359030882 0.4950246616241712 0.07390914937242997 0.4950246616241712 0.07390914937242997 0.4869779698530401 -0.14794265328688136
14400000900.0 0.47112292836709313 -0.15313429221952335 0.4970260210648743 0.06925290199936128 0.4970260210648743 0.06925290199936128 0.48272094542277855 -0.14693339890102325
15200000900.0 0.46692459179421264 -0.1524078408487379 0.4990273805055774 0.0645966546262926 0.4990273805055774 0.0645966546262926 0.478463920992517 -0.1459241445151651
16000000900.0 0.4627262552213322 -0.15168138947795243 0.5010287399462805 0.059940407253223915 0.5010287399462805 0.059940407253223915 0.47420689656225545 -0.144914890129307
16800000900.0 0.45852791864845177 -0.15095493810716698 0.5030300993869835 0.05528415988015524 0.5030300993869835 0.05528415988015524 0.4699498721319939 -0.14390563574344886
17600000900.0 0.4543295820755713 -0.1502284867363815 0.5050314588276866 0.05062791250708655 0.5050314588276866 0.05062791250708655 0.4656928477017324 -0.14289638135759075
18400000900.0 0.45013124550269085 -0.14950203536559603 0.5070328182683898 0.045971665134017875 0.5070328182683898 0.045971665134017875 0.46143582327147087 -0.1418871269717326
19200000900.0 0.4459329089298104 -0.14877558399481058 0.5090341777090928 0.041315417760949186 0.5090341777090928 0.041315417760949186 0.4571787988412094 -0.1408778725858745
20000000900.0 0.4417345723569299 -0.1480491326240251 0.5110355371497959 0.036659170387880496 0.5110355371497959 0.036659170387880496 0.45292177441094783 -0.13986861820001636
20800000900.0 0.4375362357840495 -0.14732268125323966 0.5130368965904989 0.03200292301481182 0.5130368965904989 0.03200292301481182 0.4486647499806863 -0.13885936381415825
21600000900.0 0.433337899211169 -0.1465962298824542 0.515038256031202 0.027346675641743118 0.515038256031202 0.027346675641743118 0.44440772555042474 -0.13785010942830012
22400000900.0 0.42913956263828856 -0.1458697785116687 0.5170396154719051 0.02269042826867443 0.5170396154719051 0.02269042826867443 0.4401507011201632 -0.136840855042442
23200000900.0 0.4249412260654081 -0.14514332714088327 0.5190409749126081 0.018034180895605767 0.5190409749126081 0.018034180895605767 0.4358936766899017 -0.13583160065658387
24000000900.0 0.42074288949252764 -0.1444168757700978 0.5210423343533113 0.013377933522537078 0.5210423343533113 0.013377933522537078 0.43163665225964015 -0.13482234627072576
24800000900.0 0.4165445529196472 -0.14369042439931234 0.5230436937940144 0.008721686149468444 0.5230436937940144 0.008721686149468444 0.42737962782937866 -0.13381309188486762
25600000900.0 0.4123462163467667 -0.14296397302852687 0.5250450532347174 0.004065438776399727 0.5250450532347174 0.004065438776399727 0.4231226033991171 -0.13280383749900948
26400000900.0 0.4081478797738862 -0.1422375216577414 0.5270464126754205 -0.0005908085966689625 0.5270464126754205 -0.0005908085966689625 0.41886557896885557 -0.13179458311315137
27200000900.0 0.40394954320100585 -0.14151107028695595 0.5290477721161236 -0.005247055969737624 0.5290477721161236 -0.005247055969737624 0.414608554538594 -0.13078532872729326
28000000900.0 0.39975120662812536 -0.14078461891617047 0.5310491315568266 -0.009903303342806341 0.5310491315568266 -0.009903303342806341 0.4103515301083325 -0.12977607434143512
28800000900.0 0.3955528700552449 -0.14005816754538503 0.5330504909975298 -0.014559550715875003 0.5330504909975298 -0.014559550715875003 0.406094505678071 -0.128766819955577
29600000900.0 0.3913545334823645 -0.13933171617459955 0.5350518504382329 -0.019215798088943692 0.5350518504382329 -0.019215798088943692 0.40183748124780944 -0.12775756556971887
30400000800.0 0.3871561974342761 -0.1386052648946205 0.537053209628766 -0.023872044879981458 0.537053209628766 -0.023872044879981458 0.39758045734967595 -0.12674831131001754
31200000800.0 0.3829578608613956 -0.13787881352383505 0.539054569069469 -0.02852829225305012 0.539054569069469 -0.02852829225305012 0.3933234329194144 -0.12573905692415943
32000000800.0 0.3787595242885151 -0.13715236215304957 0.5410559285101721 -0.033184539626118836 0.5410559285101721 -0.033184539626118836 0.38906640848915286 -0.1247298025383013
32800000800.0 0.37456118771563474 -0.13642591078226413 0.5430572879508753 -0.0378407869991875 0.5430572879508753 -0.0378407869991875 0.3848093840588914 -0.12372054815244318
33333334200.0 0.3717622963171864 -0.13594160980786954 0.5443915277447906 -0.04094495230258724 0.5443915277447906 -0.04094495230258724 0.3819713674172983 -0.12304771181109989
33600000800.0 0.37036285114275425 -0.13569945941147865 0.5450586473915783 -0.04249703437225619 0.5450586473915783 -0.04249703437225619 0.3805523596286299 -0.12271129376658504
34400000800.0 0.3661645145698738 -0.1349730080406932 0.5470600068322814 -0.04715328174532485 0.5470600068322814 -0.04715328174532485 0.37629533519836833 -0.12170203938072693
35200000800.0 0.3619661779969933 -0.13424655666990773 0.5490613662729845 -0.051809529118393566 0.5490613662729845 -0.051809529118393566 0.3720383107681068 -0.1206927849948688
36000000800.0 0.3577678414241129 -0.13352010529912228 0.5510627257136875 -0.05646577649146223 0.5510627257136875 -0.05646577649146223 0.36778128633784524 -0.11968353060901069
36800000800.0 0.3535695048512324 -0.1327936539283368 0.5530640851543906 -0.06112202386453092 0.5530640851543906 -0.06112202386453092 0.3635242619075837 -0.11867427622315255
37600000800.0 0.34937116827835196 -0.13206720255755133 0.5550654445950938 -0.06577827123759963 0.5550654445950938 -0.06577827123759963 0.35926723747732214 -0.11766502183729442
38400000800.0 0.34517283170547153 -0.13134075118676589 0.5570668040357968 -0.0704345186106683 0.5570668040357968 -0.0704345186106683 0.35501021304706065 -0.1166557674514363
39200000800.0 0.34097449513259104 -0.1306142998159804 0.5590681634764999 -0.07509076598373698 0.5590681634764999 -0.07509076598373698 0.35075318861679916 -0.11564651306557817
40000000800.0 0.3367761585597106 -0.12988784844519496 0.561069522917203 -0.07974701335680565 0.561069522917203 -0.07974701335680565 0.3464961641865376 -0.11463725867972002
40800000800.0 0.33257782198683017 -0.12916139707440946 0.563070882357906 -0.08440326072987436 0.563070882357906 -0.08440326072987436 0.34223913975627607 -0.1136280042938619
41600000800.0 0.3283794854139497 -0.128434945703624 0.5650722417986092 -0.08905950810294302 0.5650722417986092 -0.08905950810294302 0.3379821153260145 -0.11261874990800377
42400000800.0 0.32418114884106924 -0.12770849433283854 0.5670736012393122 -0.09371575547601171 0.5670736012393122 -0.09371575547601171 0.333725090895753 -0.11160949552214565
43200000800.0 0.3199828122681888 -0.12698204296205307 0.5690749606800153 -0.0983720028490804 0.5690749606800153 -0.0983720028490804 0.3294680664654915 -0.11060024113628752
44000000800.0 0.3157844756953083 -0.12625559159126762 0.5710763201207183 -0.10302825022214904 0.5710763201207183 -0.10302825022214904 0.32521104203523 -0.10959098675042941
44800000800.0 0.31158613912242783 -0.12552914022048214 0.5730776795614214 -0.10768449759521778 0.5730776795614214 -0.10768449759521778 0.3209540176049684 -0.10858173236457128
45600000800.0 0.30738780254954745 -0.12480268884969667 0.5750790390021245 -0.11234074496828647 0.5750790390021245 -0.11234074496828647 0.3166969931747069 -0.10757247797871315
46400000800.0 0.30318946597666696 -0.12407623747891122 0.5770803984428275 -0.1169969923413551 0.5770803984428275 -0.1169969923413551 0.31243996874444535 -0.10656322359285503
47200000800.0 0.29899112940378647 -0.12334978610812575 0.5790817578835307 -0.12165323971442385 0.5790817578835307 -0.12165323971442385 0.3081829443141838 -0.10555396920699689
48000000800.0 0.29479279283090604 -0.12262333473734029 0.5810831173242338 -0.12630948708749254 0.5810831173242338 -0.12630948708749254 0.30392591988392226 -0.10454471482113878
48800000800.0 0.2905944562580256 -0.12189688336655483 0.5830844767649368 -0.13096573446056115 0.5830844767649368 -0.13096573446056115 0.29966889545366077 -0.10353546043528065
49600000800.0 0.28639611968514517 -0.12117043199576934 0.5850858362056399 -0.13562198183362983 0.5850858362056399 -0.13562198183362983 0.2954118710233992 -0.1025262060494225
50400000700.0 0.2821977836370567 -0.1204439807157903 0.587087195396173 -0.1402782286246676 0.587087195396173 -0.1402782286246676 0.29115484712526574 -0.10151695178972117
51200000700.0 0.2779994470641763 -0.11971752934500482 0.5890885548368762 -0.1449344759977363 0.5890885548368762 -0.1449344759977363 0.28689782269500425 -0.10050769740386305
52000000700.0 0.27380111049129585 -0.11899107797421937 0.5910899142775792 -0.14959072337080498 0.5910899142775792 -0.14959072337080498 0.2826407982647427 -0.09949844301800494
52800000700.0 0.26960277391841536 -0.1182646266034339 0.5930912737182823 -0.15424697074387367 0.5930912737182823 -0.15424697074387367 0.27838377383448115 -0.0984891886321468
53600000700.0 0.2654044373455349 -0.11753817523264844 0.5950926331589854 -0.15890321811694236 0.5950926331589854 -0.15890321811694236 0.2741267494042196 -0.09747993424628865
54400000700.0 0.2612061007726545 -0.11681172386186295 0.5970939925996884 -0.16355946549001096 0.5970939925996884 -0.16355946549001096 0.2698697249739581 -0.09647067986043052
55200000700.0 0.25700776419977406 -0.11608527249107749 0.5990953520403915 -0.16821571286307965 0.5990953520403915 -0.16821571286307965 0.26561270054369657 -0.09546142547457241
56000000700.0 0.25280942762689357 -0.11535882112029203 0.6010967114810947 -0.1728719602361484 0.6010967114810947 -0.1728719602361484 0.261355676113435 -0.09445217108871427
56800000700.0 0.24861109105401313 -0.11463236974950652 0.6030980709217977 -0.177528207609217 0.6030980709217977 -0.177528207609217 0.25709865168317353 -0.09344291670285612
57600000700.0 0.24441275448113264 -0.11390591837872108 0.6050994303625008 -0.1821844549822857 0.6050994303625008 -0.1821844549822857 0.252841627252912 -0.092433662316998
58400000700.0 0.24021441790825215 -0.1131794670079356 0.6071007898032039 -0.1868407023553544 0.6071007898032039 -0.1868407023553544 0.24858460282265044 -0.09142440793113984
59200000700.0 0.23601608133537183 -0.1124530156371501 0.6091021492439069 -0.19149694972842304 0.6091021492439069 -0.19149694972842304 0.244327578392389 -0.09041515354528172
60000000700.0 0.2318177447624914 -0.11172656426636465 0.61110350868461 -0.1961531971014917 0.61110350868461 -0.1961531971014917 0.2400705539621275 -0.0894058991594236
60800000700.0 0.22761940818961096 -0.11100011289557918 0.6131048681253132 -0.2008094444745604 0.6131048681253132 -0.2008094444745604 0.23581352953186596 -0.08839664477356547
61600000700.0 0.22342107161673058 -0.11027366152479372 0.6151062275660163 -0.20546569184762906 0.6151062275660163 -0.20546569184762906 0.23155650510160453 -0.08738739038770735
62400000700.0 0.21922273504385015 -0.10954721015400828 0.6171075870067194 -0.21012193922069775 0.6171075870067194 -0.21012193922069775 0.22729948067134298 -0.08637813600184925
63200000700.0 0.2150243984709697 -0.10882075878322288 0.6191089464474225 -0.2147781865937664 0.6191089464474225 -0.2147781865937664 0.2230424562410815 -0.08536888161599118
64000000700.0 0.21082606189808928 -0.10809430741243745 0.6211103058881257 -0.21943443396683512 0.6211103058881257 -0.21943443396683512 0.21878543181082 -0.0843596272301331
64800000700.0 0.2066277253252088 -0.10736785604165203 0.6231116653288288 -0.2240906813399039 0.6231116653288288 -0.2240906813399039 0.2145284073805584 -0.08335037284427502
65600000700.0 0.2024293887523283 -0.10664140467086661 0.6251130247695318 -0.22874692871297256 0.6251130247695318 -0.22874692871297256 0.2102713829502969 -0.08234111845841692
66400000700.0 0.19823105217944786 -0.10591495330008116 0.6271143842102349 -0.23340317608604128 0.6271143842102349 -0.23340317608604128 0.20601435852003536 -0.08133186407255882
66666667300.0 0.19683160700501573 -0.10567280290369029 0.6277815038570227 -0.23495525815571028 0.6277815038570227 -0.23495525815571028 0.20459535073136687 -0.08099544602804397
67200000700.0 0.19403271560656726 -0.10518850192929571 0.629115743650938 -0.23805942345911005 0.629115743650938 -0.23805942345911005 0.2017573340897737 -0.08032260968670073
68000000700.0 0.18983437903368683 -0.10446205055851027 0.631117103091641 -0.24271567083217868 0.631117103091641 -0.24271567083217868 0.19750030965951215 -0.0793133553008426
68800000700.0 0.1856360424608064 -0.10373559918772479 0.633118462532344 -0.2473719182052474 0.633118462532344 -0.2473719182052474 0.19324328522925066 -0.07830410091498448
69600000700.0 0.18143770588792596 -0.10300914781693934 0.6351198219730472 -0.2520281655783161 0.6351198219730472 -0.2520281655783161 0.18898626079898911 -0.07729484652912635
70400000600.0 0.17723936983983757 -0.10228269653696029 0.6371211811635804 -0.25668441236935385 0.6371211811635804 -0.25668441236935385 0.18472923690085563 -0.07628559226942502
71200000600.0 0.17304103326695708 -0.10155624516617483 0.6391225406042834 -0.26134065974242254 0.6391225406042834 -0.26134065974242254 0.18047221247059414 -0.0752763378835669
72000000600.0 0.16884269669407664 -0.10082979379538937 0.6411239000449864 -0.2659969071154912 0.6411239000449864 -0.2659969071154912 0.1762151880403326 -0.07426708349770879
72800000600.0 0.16464436012119615 -0.1001033424246039 0.6431252594856895 -0.27065315448856 0.6431252594856895 -0.27065315448856 0.17195816361007105 -0.07325782911185065
73600000600.0 0.16044602354831572 -0.09937689105381842 0.6451266189263927 -0.27530940186162867 0.6451266189263927 -0.27530940186162867 0.1677011391798095 -0.0722485747259925
74400000600.0 0.15624768697543517 -0.09865043968303296 0.6471279783670957 -0.27996564923469724 0.6471279783670957 -0.27996564923469724 0.163444114749548 -0.07123932034013437
75200000600.0 0.15204935040255474 -0.0979239883122475 0.6491293378077987 -0.28462189660776593 0.6491293378077987 -0.28462189660776593 0.15918709031928635 -0.07023006595427626
76000000600.0 0.14785101382967425 -0.09719753694146202 0.6511306972485018 -0.28927814398083473 0.6511306972485018 -0.28927814398083473 0.1549300658890248 -0.06922081156841813
76800000600.0 0.14365267725679381 -0.09647108557067656 0.6531320566892049 -0.2939343913539033 0.6531320566892049 -0.2939343913539033 0.15067304145876326 -0.06821155718256
77600000600.0 0.13945434068391338 -0.0957446341998911 0.655133416129908 -0.298590638726972 0.655133416129908 -0.298590638726972 0.14641601702850177 -0.06720230279670188
78400000600.0 0.1352560041110329 -0.09501818282910562 0.6571347755706112 -0.3032468861000407 0.6571347755706112 -0.3032468861000407 0.14215899259824022 -0.06619304841084375
79200000600.0 0.1310576675381524 -0.09429173145832016 0.6591361350113142 -0.3079031334731094 0.6591361350113142 -0.3079031334731094 0.13790196816797867 -0.06518379402498563
80000000600.0 0.12685933096527197 -0.0935652800875347 0.6611374944520172 -0.31255938084617807 0.6611374944520172 -0.31255938084617807 0.13364494373771718 -0.0641745396391275
80800000600.0 0.12266099439239153 -0.09283882871674924 0.6631388538927203 -0.31721562821924676 0.6631388538927203 -0.31721562821924676 0.12938791930745563 -0.06316528525326938
81600000600.0 0.11846265781951104 -0.09211237734596378 0.6651402133334234 -0.32187187559231545 0.6651402133334234 -0.32187187559231545 0.1251308948771941 -0.062156030867411255
82400000600.0 0.1142643212466306 -0.09138592597517832 0.6671415727741266 -0.32652812296538414 0.6671415727741266 -0.32652812296538414 0.12087387044693254 -0.06114677648155313
83200000600.0 0.11006598467375017 -0.09065947460439283 0.6691429322148296 -0.3311843703384528 0.6691429322148296 -0.3311843703384528 0.11661684601667105 -0.060137522095695006
84000000600.0 0.10586764810086974 -0.08993302323360737 0.6711442916555327 -0.3358406177115215 0.6711442916555327 -0.3358406177115215 0.1123598215864095 -0.059128267709836854
84800000600.0 0.10166931152798925 -0.0892065718628219 0.6731456510962357 -0.3404968650845902 0.6731456510962357 -0.3404968650845902 0.10810279715614796 -0.05811901332397873
85600000600.0 0.09747097495510881 -0.08848012049203643 0.6751470105369388 -0.3451531124576589 0.6751470105369388 -0.3451531124576589 0.10384577272588646 -0.057109758938120606
86400000600.0 0.09327263838222832 -0.08775366912125097 0.6771483699776419 -0.3498093598307276 0.6771483699776419 -0.3498093598307276 0.09958874829562492 -0.05610050455226248
87200000600.0 0.08907430180934783 -0.0870272177504655 0.6791497294183451 -0.3544656072037963 0.6791497294183451 -0.3544656072037963 0.09533172386536337 -0.05509125016640436
88000000600.0 0.08487596523646745 -0.08630076637968005 0.6811510888590481 -0.35912185457686496 0.6811510888590481 -0.35912185457686496 0.09107469943510188 -0.054081995780546246
88800000600.0 0.08067762866358691 -0.08557431500889458 0.6831524482997512 -0.3637781019499336 0.6831524482997512 -0.3637781019499336 0.08681767500484028 -0.053072741394688094
89600000600.0 0.07647929209070647 -0.08484786363810912 0.6851538077404542 -0.3684343493230023 0.6851538077404542 -0.3684343493230023 0.08256065057457873 -0.05206348700882997
90400000500.0 0.0722809560426182 -0.08412141235813009 0.6871551669309873 -0.37309059611404 0.6871551669309873 -0.37309059611404 0.07830362667644536 -0.05105423274912867
91200000500.0 0.06808261946973765 -0.0833949609873446 0.6891565263716904 -0.3777468434871088 0.6891565263716904 -0.3777468434871088 0.07404660224618376 -0.050044978363270515
92000000500.0 0.06388428289685716 -0.08266850961655914 0.6911578858123935 -0.3824030908601775 0.6911578858123935 -0.3824030908601775 0.06978957781592221 -0.049035723977412404
92800000500.0 0.059685946323976724 -0.08194205824577368 0.6931592452530966 -0.38705933823324606 0.6931592452530966 -0.38705933823324606 0.06553255338566072 -0.04802646959155428
93600000500.0 0.05548760975109629 -0.08121560687498822 0.6951606046937997 -0.39171558560631475 0.6951606046937997 -0.39171558560631475 0.06127552895539917 -0.047017215205696156
94400000500.0 0.051289273178215855 -0.08048915550420276 0.6971619641345027 -0.39637183297938344 0.6971619641345027 -0.39637183297938344 0.05701850452513768 -0.04600796081983803
95200000500.0 0.04709093660533542 -0.0797627041334173 0.6991633235752058 -0.40102808035245213 0.6991633235752058 -0.40102808035245213 0.052761480094876134 -0.04499870643397992
96000000500.0 0.042892600032454986 -0.07903625276263183 0.7011646830159088 -0.4056843277255208 0.7011646830159088 -0.4056843277255208 0.04850445566461459 -0.0439894520481218
96800000500.0 0.038694263459574385 -0.07830980139184636 0.703166042456612 -0.4103405750985895 0.703166042456612 -0.4103405750985895 0.04424743123435304 -0.042980197662263644
97600000500.0 0.034495926886694006 -0.0775833500210609 0.7051674018973151 -0.4149968224716582 0.7051674018973151 -0.4149968224716582 0.039990406804091494 -0.04197094327640552
98400000500.0 0.030297590313813516 -0.07685689865027544 0.7071687613380182 -0.4196530698447269 0.7071687613380182 -0.4196530698447269 0.03573338237382995 -0.04096168889054741
99200000500.0 0.026099253740933137 -0.07613044727948998 0.7091701207787212 -0.4243093172177956 0.7091701207787212 -0.4243093172177956 0.03147635794356851 -0.03995243450468927
100000000000.0 0.02190091979201303 -0.07540399636273662 0.7111714789685747 -0.4289655616807096 0.7111714789685747 -0.4289655616807096 0.02721933617394723 -0.03894318074961514
100800000000.0 0.01770258321913254 -0.07467754499195116 0.7131728384092777 -0.4336218090537783 0.7131728384092777 -0.4336218090537783 0.02296231174368568 -0.03793392636375703
101600000000.0 0.01350424664625216 -0.0739510936211657 0.7151741978499808 -0.438278056426847 0.7151741978499808 -0.438278056426847 0.018705287313424135 -0.03692467197789892
102400000000.0 0.00930591007337167 -0.07322464225038024 0.7171755572906839 -0.44293430379991566 0.7171755572906839 -0.44293430379991566 0.0144482628831627 -0.03591541759204078
103200000000.0 0.00510757350049118 -0.07249819087959476 0.7191769167313871 -0.44759055117298446 0.7191769167313871 -0.44759055117298446 0.010191238452901041 -0.034906163206182644
104000000000.0 0.0009092369276106904 -0.0717717395088093 0.7211782761720901 -0.45224679854605304 0.7211782761720901 -0.45224679854605304 0.005934214022639495 -0.033896908820324534
104800000000.0 -0.0032890996452696886 -0.07104528813802384 0.7231796356127932 -0.45690304591912173 0.7231796356127932 -0.45690304591912173 0.0016771895923780589 -0.032887654434466396
105600000000.0 -0.007487436218150179 -0.07031883676723838 0.7251809950534962 -0.4615592932921904 0.7251809950534962 -0.4615592932921904 -0.002579834837883488 -0.031878400048608285
106400000000.0 -0.011685772791030558 -0.06959238539645292 0.7271823544941993 -0.4662155406652591 0.7271823544941993 -0.4662155406652591 -0.006836859268145035 -0.030869145662750147
107200000000.0 -0.015884109363911048 -0.06886593402566746 0.7291837139349024 -0.4708717880383278 0.7291837139349024 -0.4708717880383278 -0.011093883698406581 -0.029859891276892037
108000000000.0 -0.020082445936791538 -0.068139482654882 0.7311850733756055 -0.4755280354113965 0.7311850733756055 -0.4755280354113965 -0.015350908128668017 -0.028850636891033926
108800000000.0 -0.024280782509672028 -0.06741303128409652 0.7331864328163086 -0.4801842827844652 0.7331864328163086 -0.4801842827844652 -0.019607932558929675 -0.02784138250517576
109600000000.0 -0.028479119082552518 -0.06668657991331106 0.7351877922570116 -0.48484053015753387 0.7351877922570116 -0.48484053015753387 -0.02386495698919122 -0.02683212811931765
110400000000.0 -0.0326774556554329 -0.0659601285425256 0.7371891516977147 -0.48949677753060256 0.7371891516977147 -0.48949677753060256 -0.028121981419452657 -0.02582287373345954
111200000000.0 -0.03687579222831339 -0.06523367717174014 0.7391905111384178 -0.49415302490367125 0.7391905111384178 -0.49415302490367125 -0.032379005849714204 -0.0248136193476014
112000000000.0 -0.041074128801193766 -0.06450722580095468 0.741191870579121 -0.49880927227673993 0.741191870579121 -0.49880927227673993 -0.03663603027997575 -0.02380436496174329
112800000000.0 -0.045272465374074256 -0.0637807744301692 0.743193230019824 -0.5034655196498086 0.743193230019824 -0.5034655196498086 -0.0408930547102373 -0.022795110575885152
113600000000.0 -0.049470801946954635 -0.06305432305938374 0.745194589460527 -0.5081217670228773 0.745194589460527 -0.5081217670228773 -0.04515007914049873 -0.021785856190027042
114400000000.0 -0.053669138519835125 -0.06232787168859828 0.7471959489012301 -0.512778014395946 0.7471959489012301 -0.512778014395946 -0.04940710357076028 -0.02077660180416893
115200000000.0 -0.057867475092715726 -0.06160142031781281 0.7491973083419332 -0.5174342617690146 0.7491973083419332 -0.5174342617690146 -0.05366412800102194 -0.019767347418310766
116000000000.0 -0.062065811665596105 -0.06087496894702735 0.7511986677826363 -0.5220905091420833 0.7511986677826363 -0.5220905091420833 -0.057921152431283485 -0.018758093032452655
116800000000.0 -0.0662641482384766 -0.060148517576241886 0.7532000272233395 -0.526746756515152 0.7532000272233395 -0.526746756515152 -0.06217817686154492 -0.017748838646594545
117600000000.0 -0.07046248481135697 -0.059422066205456425 0.7552013866640425 -0.5314030038882207 0.7552013866640425 -0.5314030038882207 -0.06643520129180647 -0.016739584260736406
118400000000.0 -0.07466082138423746 -0.058695614834670964 0.7572027461047455 -0.5360592512612894 0.7572027461047455 -0.5360592512612894 -0.07069222572206801 -0.015730329874878296
119200000000.0 -0.07885915795711784 -0.057969163463885504 0.7592041055454486 -0.5407154986343581 0.7592041055454486 -0.5407154986343581 -0.07494925015232945 -0.014721075489020158
120000000000.0 -0.08305749452999833 -0.05724271209310004 0.7612054649861517 -0.5453717460074268 0.7612054649861517 -0.5453717460074268 -0.079206274582591 -0.013711821103162047
120800000000.0 -0.08725583110287882 -0.05651626072231457 0.7632068244268548 -0.5500279933804955 0.7632068244268548 -0.5500279933804955 -0.08346329901285265 -0.01270256671730391
121600000000.0 -0.09145416767575931 -0.05578980935152911 0.765208183867558 -0.5546842407535642 0.765208183867558 -0.5546842407535642 -0.0877203234431142 -0.011693312331445771
122400000000.0 -0.0956525042486398 -0.055063357980743646 0.767209543308261 -0.5593404881266328 0.767209543308261 -0.5593404881266328 -0.09197734787337564 -0.01068405794558766
123200000000.0 -0.09985084082152018 -0.054336906609958185 0.769210902748964 -0.5639967354997015 0.769210902748964 -0.5639967354997015 -0.09623437230363718 -0.00967480355972955
124000000000.0 -0.10404917739440067 -0.053610455239172725 0.7712122621896671 -0.5686529828727702 0.7712122621896671 -0.5686529828727702 -0.10049139673389873 -0.008665549173871412
124800000000.0 -0.10824751396728105 -0.052884003868387264 0.7732136216303702 -0.5733092302458389 0.7732136216303702 -0.5733092302458389 -0.10474842116416028 -0.007656294788013301
125600000000.0 -0.11244585054016154 -0.0521575524976018 0.7752149810710733 -0.5779654776189076 0.7752149810710733 -0.5779654776189076 -0.10900544559442171 -0.006647040402155163
126400000000.0 -0.11664418711304203 -0.05143110112681633 0.7772163405117765 -0.5826217249919763 0.7772163405117765 -0.5826217249919763 -0.11326247002468337 -0.005637786016297025
127200000000.0 -0.12084252368592252 -0.05070464975603087 0.7792176999524795 -0.587277972365045 0.7792176999524795 -0.587277972365045 -0.11751949445494492 -0.004628531630438915
128000000000.0 -0.1250408602588029 -0.04997819838524539 0.7812190593931825 -0.5919342197381137 0.7812190593931825 -0.5919342197381137 -0.12177651888520635 -0.0036192772445807764
128800000000.0 -0.1292391968316834 -0.049251747014459904 0.7832204188338856 -0.5965904671111824 0.7832204188338856 -0.5965904671111824 -0.1260335433154679 -0.002610022858722666
129600000000.0 -0.13343753340456388 -0.04852529564367444 0.7852217782745887 -0.601246714484251 0.7852217782745887 -0.601246714484251 -0.13029056774572945 -0.0016007684728645277
130400000000.0 -0.13763586997744426 -0.04779884427288898 0.7872231377152918 -0.6059029618573195 0.7872231377152918 -0.6059029618573195 -0.134547592175991 -0.0005915140870063895
131200000000.0 -0.14183420655032475 -0.04707239290210352 0.7892244971559949 -0.6105592092303882 0.7892244971559949 -0.6105592092303882 -0.13880461660625243 0.0004177402988517209
132000000000.0 -0.14603254312320513 -0.04634594153131806 0.7912258565966979 -0.6152154566034569 0.7912258565966979 -0.6152154566034569 -0.14306164103651398 0.0014269946847098591
132800000000.0 -0.15023087969608573 -0.045619490160532586 0.793227216037401 -0.6198717039765258 0.793227216037401 -0.6198717039765258 -0.14731866546677563 0.0024362490705679973
133333334000.0 -0.15302977424328645 -0.04513518864129948 0.794561457332336 -0.6229758727721109 0.794561457332336 -0.6229758727721109 -0.1501566853011369 0.0031090861688520544
133600000000.0 -0.1544292162689661 -0.044893038789747125 0.7952285754781041 -0.6245279513495945 0.7952285754781041 -0.6245279513495945 -0.15157568989703707 0.0034455034564261078
134400000000.0 -0.1586275528418466 -0.044166587418961664 0.7972299349188072 -0.6291841987226632 0.7972299349188072 -0.6291841987226632 -0.15583271432729862 0.004454757842284246
135200000000.0 -0.16282588941472698 -0.0434401360481762 0.7992312943595102 -0.6338404460957316 0.7992312943595102 -0.6338404460957316 -0.16008973875756016 0.005464012228142356
136000000000.0 -0.16702422598760747 -0.04271368467739074 0.8012326538002134 -0.6384966934688003 0.8012326538002134 -0.6384966934688003 -0.1643467631878217 0.006473266614000467
136800000000.0 -0.17122256256048796 -0.04198723330660528 0.8032340132409164 -0.643152940841869 0.8032340132409164 -0.643152940841869 -0.16860378761808315 0.007482520999858605
137600000000.0 -0.17542089913336834 -0.04126078193581982 0.8052353726816195 -0.6478091882149377 0.8052353726816195 -0.6478091882149377 -0.1728608120483447 0.008491775385716716
138400000000.0 -0.17961923570624894 -0.04053433056503433 0.8072367321223226 -0.6524654355880066 0.8072367321223226 -0.6524654355880066 -0.17711783647860635 0.009501029771574854
139200000000.0 -0.18381757227912932 -0.039807879194248885 0.8092380915630257 -0.6571216829610751 0.8092380915630257 -0.6571216829610751 -0.18137486090886779 0.010510284157432992
140000000000.0 -0.1880159088520098 -0.03908142782346341 0.8112394510037287 -0.6617779303341438 0.8112394510037287 -0.6617779303341438 -0.18563188533912933 0.011519538543291102
140800000000.0 -0.19221424542489018 -0.038354976452677964 0.8132408104444319 -0.6664341777072125 0.8132408104444319 -0.6664341777072125 -0.18988890976939088 0.01252879292914924
141600000000.0 -0.19641258199777067 -0.03762852508189249 0.8152421698851349 -0.6710904250802812 0.8152421698851349 -0.6710904250802812 -0.19414593419965243 0.013538047315007351
142400000000.0 -0.20061091857065105 -0.03690207371110704 0.817243529325838 -0.6757466724533499 0.817243529325838 -0.6757466724533499 -0.19840295862991386 0.014547301700865461
143200000000.0 -0.20480925514353154 -0.03617562234032157 0.8192448887665411 -0.6804029198264185 0.8192448887665411 -0.6804029198264185 -0.2026599830601754 0.0155565560867236
144000000000.0 -0.20900759171641203 -0.03544917096953609 0.8212462482072442 -0.6850591671994872 0.8212462482072442 -0.6850591671994872 -0.20691700749043707 0.016565810472581738
144800000000.0 -0.21320592828929252 -0.034722719598750645 0.8232476076479472 -0.6897154145725559 0.8232476076479472 -0.6897154145725559 -0.2111740319206985 0.01757506485843985
145600000000.0 -0.217404264862173 -0.03399626822796517 0.8252489670886504 -0.6943716619456246 0.8252489670886504 -0.6943716619456246 -0.21543105635096005 0.018584319244297987
146400000000.0 -0.2216026014350534 -0.033269816857179724 0.8272503265293534 -0.6990279093186933 0.8272503265293534 -0.6990279093186933 -0.2196880807812216 0.019593573630156097
147200000000.0 -0.22580093800793388 -0.03254336548639425 0.8292516859700565 -0.703684156691762 0.8292516859700565 -0.703684156691762 -0.22394510521148314 0.020602828016014235
148000000000.0 -0.22999927458081426 -0.0318169141156088 0.8312530454107596 -0.7083404040648307 0.8312530454107596 -0.7083404040648307 -0.22820212964174458 0.021612082401872346
148800000000.0 -0.23419761115369475 -0.031090462744823327 0.8332544048514626 -0.7129966514378994 0.8332544048514626 -0.7129966514378994 -0.23245915407200612 0.022621336787730456
149600000000.0 -0.23839594772657513 -0.03036401137403788 0.8352557642921656 -0.717652898810968 0.8352557642921656 -0.717652898810968 -0.23671617850226767 0.023630591173588594
150400000000.0 -0.24259428429945573 -0.029637560003252406 0.8372571237328688 -0.7223091461840367 0.8372571237328688 -0.7223091461840367 -0.24097320293252933 0.024639845559446732
151200000000.0 -0.2467926208723361 -0.02891110863246693 0.8392584831735719 -0.7269653935571054 0.8392584831735719 -0.7269653935571054 -0.24523022736279076 0.025649099945304843
152000000000.0 -0.2509909574452166 -0.028184657261681484 0.841259842614275 -0.7316216409301741 0.841259842614275 -0.7316216409301741 -0.2494872517930523 0.02665835433116298
152800000000.0 -0.2551892940180971 -0.02745820589089601 0.8432612020549781 -0.7362778883032428 0.8432612020549781 -0.7362778883032428 -0.25374427622331386 0.02766760871702109
153600000000.0 -0.25938763059097747 -0.026731754520110562 0.8452625614956811 -0.7409341356763115 0.8452625614956811 -0.7409341356763115 -0.2580013006535753 0.02867686310287923
154400000000.0 -0.26358596716385796 -0.026005303149325087 0.8472639209363841 -0.7455903830493802 0.8472639209363841 -0.7455903830493802 -0.26225832508383684 0.02968611748873734
155200000000.0 -0.26778430373673834 -0.02527885177853964 0.8492652803770873 -0.7502466304224489 0.8492652803770873 -0.7502466304224489 -0.2665153495140984 0.03069537187459545
156000000000.0 -0.27198264030961894 -0.024552400407754138 0.8512666398177904 -0.7549028777955176 0.8512666398177904 -0.7549028777955176 -0.27077237394436005 0.03170462626045362
156800000000.0 -0.2761809768824993 -0.02382594903696869 0.8532679992584935 -0.7595591251685863 0.8532679992584935 -0.7595591251685863 -0.2750293983746215 0.03271388064631173
157600000000.0 -0.2803793134553798 -0.023099497666183216 0.8552693586991966 -0.764215372541655 0.8552693586991966 -0.764215372541655 -0.279286422804883 0.03372313503216984
158400000000.0 -0.2845776500282602 -0.02237304629539777 0.8572707181398996 -0.7688716199147236 0.8572707181398996 -0.7688716199147236 -0.2835434472351446 0.034732389418027976
159200000000.0 -0.2887759866011407 -0.021646594924612295 0.8592720775806026 -0.7735278672877923 0.8592720775806026 -0.7735278672877923 -0.287800471665406 0.035741643803886086
160000000000.0 -0.29297432317402117 -0.020920143553826848 0.8612734370213058 -0.778184114660861 0.8612734370213058 -0.778184114660861 -0.29205749609566756 0.036750898189744224
160800000000.0 -0.29717265974690155 -0.020193692183041373 0.8632747964620089 -0.7828403620339297 0.8632747964620089 -0.7828403620339297 -0.2963145205259291 0.037760152575602335
161600000000.0 -0.30137099631978215 -0.019467240812255898 0.865276155902712 -0.7874966094069984 0.865276155902712 -0.7874966094069984 -0.30057154495619076 0.03876940696146047
162400000000.0 -0.3055693328926625 -0.01874078944147045 0.8672775153434151 -0.7921528567800671 0.8672775153434151 -0.7921528567800671 -0.3048285693864522 0.03977866134731861
163200000000.0 -0.309767669465543 -0.018014338070684977 0.8692788747841181 -0.7968091041531358 0.8692788747841181 -0.7968091041531358 -0.30908559381671374 0.04078791573317672
164000000000.0 -0.3139660060384234 -0.01728788669989953 0.8712802342248211 -0.8014653515262045 0.8712802342248211 -0.8014653515262045 -0.3133426182469753 0.04179717011903483
164800000000.0 -0.3181643426113039 -0.016561435329114055 0.8732815936655243 -0.8061215988992732 0.8732815936655243 -0.8061215988992732 -0.31759964267723684 0.04280642450489297
165600000000.0 -0.32236267918418426 -0.015834983958328608 0.8752829531062274 -0.8107778462723418 0.8752829531062274 -0.8107778462723418 -0.3218566671074983 0.04381567889075108
166400000000.0 -0.32656101575706475 -0.015108532587543133 0.8772843125469305 -0.8154340936454103 0.8772843125469305 -0.8154340936454103 -0.3261136915377598 0.04482493327660922
167200000000.0 -0.33075935232994524 -0.014382081216757686 0.8792856719876335 -0.820090341018479 0.8792856719876335 -0.820090341018479 -0.33037071596802137 0.04583418766246733
168000000000.0 -0.33495768890282573 -0.013655629845972211 0.8812870314283366 -0.8247465883915479 0.8812870314283366 -0.8247465883915479 -0.3346277403982829 0.04684344204832547
168800000000.0 -0.3391560254757062 -0.012929178475186737 0.8832883908690397 -0.8294028357646166 0.8832883908690397 -0.8294028357646166 -0.33888476482854446 0.047852696434183606
169600000000.0 -0.3433543620485866 -0.01220272710440129 0.8852897503097428 -0.8340590831376853 0.8852897503097428 -0.8340590831376853 -0.343141789258806 0.048861950820041716
170400000000.0 -0.3475526986214671 -0.011476275733615815 0.8872911097504459 -0.8387153305107538 0.8872911097504459 -0.8387153305107538 -0.34739881368906755 0.04987120520589983
171200000000.0 -0.35175103519434747 -0.010749824362830368 0.889292469191149 -0.8433715778838224 0.889292469191149 -0.8433715778838224 -0.351655838119329 0.050880459591757965
172000000000.0 -0.35594937176722796 -0.010023372992044893 0.891293828631852 -0.8480278252568911 0.891293828631852 -0.8480278252568911 -0.35591286254959054 0.051889713977616075
172800000000.0 -0.36014770834010834 -0.009296921621259446 0.893295188072555 -0.8526840726299598 0.893295188072555 -0.8526840726299598 -0.3601698869798521 0.052898968363474214
173600000000.0 -0.36434604491298894 -0.008570470250473944 0.8952965475132582 -0.8573403200030285 0.8952965475132582 -0.8573403200030285 -0.36442691141011363 0.05390822274933235
174400000000.0 -0.3685443814858693 -0.007844018879688497 0.8972979069539613 -0.8619965673760972 0.8972979069539613 -0.8619965673760972 -0.3686839358403752 0.05491747713519046
175200000000.0 -0.3727427180587498 -0.007117567508903022 0.8992992663946644 -0.8666528147491659 0.8992992663946644 -0.8666528147491659 -0.3729409602706367 0.0559267315210486
176000000000.0 -0.3769410546316303 -0.006391116138117575 0.9013006258353674 -0.8713090621222346 0.9013006258353674 -0.8713090621222346 -0.37719798470089827 0.05693598590690671
176800000000.0 -0.3811393912045107 -0.0056646647673321004 0.9033019852760705 -0.8759653094953033 0.9033019852760705 -0.8759653094953033 -0.3814550091311597 0.05794524029276482
177600000000.0 -0.38533772777739117 -0.0049382133965466535 0.9053033447167735 -0.880621556868372 0.9053033447167735 -0.880621556868372 -0.38571203356142125 0.05895449467862296
178400000000.0 -0.38953606435027155 -0.004211762025761179 0.9073047041574767 -0.8852778042414406 0.9073047041574767 -0.8852778042414406 -0.3899690579916828 0.05996374906448107
179200000000.0 -0.39373440092315204 -0.0034853106549757318 0.9093060635981798 -0.8899340516145093 0.9093060635981798 -0.8899340516145093 -0.39422608242194435 0.06097300345033921
180000000000.0 -0.3979327374960324 -0.002758859284190257 0.9113074230388828 -0.894590298987578 0.9113074230388828 -0.894590298987578 -0.3984831068522058 0.06198225783619732
180800000000.0 -0.4021310740689129 -0.00203240791340481 0.9133087824795859 -0.8992465463606467 0.9133087824795859 -0.8992465463606467 -0.40274013128246733 0.06299151222205543
181600000000.0 -0.4063294106417933 -0.0013059565426193354 0.9153101419202889 -0.9039027937337152 0.9153101419202889 -0.9039027937337152 -0.4069971557127289 0.06400076660791357
182400000000.0 -0.410527747214674 -0.0005795051718338606 0.9173115013609922 -0.9085590411067841 0.9173115013609922 -0.9085590411067841 -0.41125418014299053 0.06501002099377173
183200000000.0 -0.4147260837875544 0.0001469461989516141 0.9193128608016952 -0.9132152884798528 0.9193128608016952 -0.9132152884798528 -0.4155112045732521 0.06601927537962984
184000000000.0 -0.41892442036043487 0.0008733975697370611 0.9213142202423983 -0.9178715358529215 0.9213142202423983 -0.9178715358529215 -0.4197682290035136 0.06702852976548798
184800000000.0 -0.42312275693331536 0.0015998489405225358 0.9233155796831014 -0.9225277832259902 0.9233155796831014 -0.9225277832259902 -0.4240252534337752 0.06803778415134609
185600000000.0 -0.42732109350619574 0.0023263003113079828 0.9253169391238044 -0.9271840305990589 0.9253169391238044 -0.9271840305990589 -0.4282822778640366 0.0690470385372042
186400000000.0 -0.4315194300790762 0.0030527516820934575 0.9273182985645074 -0.9318402779721275 0.9273182985645074 -0.9318402779721275 -0.43253930229429816 0.07005629292306234
187200000000.0 -0.4357177666519566 0.0037792030528789045 0.9293196580052105 -0.9364965253451962 0.9293196580052105 -0.9364965253451962 -0.4367963267245597 0.07106554730892045
188000000000.0 -0.4399161032248371 0.004505654423664379 0.9313210174459137 -0.9411527727182649 0.9313210174459137 -0.9411527727182649 -0.44105335115482114 0.07207480169477859
188800000000.0 -0.4441144397977175 0.005232105794449826 0.9333223768866168 -0.9458090200913336 0.9333223768866168 -0.9458090200913336 -0.4453103755850827 0.0730840560806367
189600000000.0 -0.44831277637059797 0.005958557165235301 0.9353237363273198 -0.9504652674644023 0.9353237363273198 -0.9504652674644023 -0.44956740001534423 0.07409331046649481
190400000000.0 -0.45251111294347846 0.006685008536020748 0.9373250957680228 -0.9551215148374708 0.9373250957680228 -0.9551215148374708 -0.4538244244456058 0.07510256485235295
191200000000.0 -0.45670944951635883 0.007411459906806223 0.9393264552087259 -0.9597777622105395 0.9393264552087259 -0.9597777622105395 -0.4580814488758673 0.07611181923821106
192000000000.0 -0.4609077860892392 0.00813791127759167 0.941327814649429 -0.9644340095836081 0.941327814649429 -0.9644340095836081 -0.46233847330612887 0.0771210736240692
192800000000.0 -0.4651061226621198 0.008864362648377144 0.9433291740901322 -0.9690902569566768 0.9433291740901322 -0.9690902569566768 -0.4665954977363902 0.07813032800992731
193600000000.0 -0.4693044592350002 0.009590814019162591 0.9453305335308352 -0.9737465043297455 0.9453305335308352 -0.9737465043297455 -0.47085252216665174 0.07913958239578542
194400000000.0 -0.4735027958078808 0.010317265389948094 0.9473318929715384 -0.9784027517028144 0.9473318929715384 -0.9784027517028144 -0.4751095465969135 0.08014883678164358
195200000000.0 -0.4777011323807612 0.011043716760733568 0.9493332524122414 -0.9830589990758831 0.9493332524122414 -0.9830589990758831 -0.47936657102717506 0.08115809116750172
196000000000.0 -0.4818994689536418 0.011770168131519015 0.9513346118529444 -0.9877152464489518 0.9513346118529444 -0.9877152464489518 -0.4836235954574366 0.08216734555335983
196800000000.0 -0.48609780552652215 0.01249661950230449 0.9533359712936476 -0.9923714938220205 0.9533359712936476 -0.9923714938220205 -0.48788061988769815 0.08317659993921797
197600000000.0 -0.49029614209940253 0.013223070873089937 0.9553373307343507 -0.9970277411950892 0.9553373307343507 -0.9970277411950892 -0.4921376443179597 0.08418585432507608
198400000000.0 -0.49449447867228313 0.013949522243875412 0.9573386901750538 -1.0016839885681579 0.9573386901750538 -1.0016839885681579 -0.496394668748221 0.08519510871093419
199200000000.0 -0.4986928152451635 0.014675973614660859 0.9593400496157568 -1.0063402359412263 0.9593400496157568 -1.0063402359412263 -0.5006516931784826 0.08620436309679233
200000000000.0 -0.5028911518180439 0.015402424985446334 0.9613414090564599 -1.010996483314295 0.9613414090564599 -1.010996483314295 -0.5049087176087441 0.08721361748265047

View File

@@ -1,49 +0,0 @@
from pydantic import BaseModel, Field
from typing import List,Union,Literal,Optional
class SimulationRequestUnit(BaseModel):
user_id:int = Field(default=0)
template_name:str = Field(default="em_interface_compound")
template_version:str = Field(default="")
cell_name:str = Field(default="capa")
parameters:dict = Field(default={"W":10,"L":10})
settings:dict = Field(default={})
class UuidResponseUnit(BaseModel):
id:int
user_id:Optional[int]
template_name:str
template_version:str
cell_name:str
status:Literal["pending","running","completed","failed"]
parameters:dict
settings:dict
input_hash:str
storage_type: str
result_path:str
completed_at:Optional[str]
result_json:Optional[dict]
error_message:Optional[str]
failure_count:Optional[int]
last_failed_at:Optional[str]
cpu_usage:Optional[float]
memory_usage:Optional[float]
disk_usage:Optional[float]
gpu_usage:Optional[float]
node_name:Optional[str]
jobs:Optional[List]
results:Optional[List]
created_at:str
updated_at:str
class SimulationResponseUnit(BaseModel):
template_name:str
template_version:str
template_id:int
cell_name:str
cell_id:int
parameters:dict
settings:dict
input_hash:str
status:str
message:str

View File

@@ -1,13 +0,0 @@
from models.mlin import Mlin
W = []
L = []
i = 15.52
while i <= 100:
W.append(i)
L.append(i)
i = int(i*1.05*100 + 0.5) / 100.0
model = Mlin()
model.sweep()
model.export("mlin_sweep")

View File

@@ -1,55 +0,0 @@
import requests
import time
from schemas.paramer import SimulationRequestUnit, SimulationResponseUnit, UuidResponseUnit
import skrf as rf
from typing import Literal
import matplotlib.pyplot as plt
def send_get_request(url):
try:
response = requests.get(url)
response.raise_for_status() # Raise an error for bad responses
return response.json()
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
return None
def get_network(file_path: str) -> rf.Network:
network = rf.Network(file_path)
return network
def get_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z']):
rms_error = []
for i in range(vf.network.nports):
rms_error_row = []
for j in range(vf.network.nports):
rms_error = vf.get_rms_error(i, j, parameter_type)
rms_error_row.append(rms_error)
rms_error.append(rms_error_row)
return rms_error
def show_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z'],show_plot:bool=True,save_path:str|None=None):
freqs = vf.network.f
nports = vf.network.nports
fig, ax = plt.subplots(nports, nports)
fig.set_size_inches(6*nports, 4*nports)
for i in range(nports):
for j in range(nports):
vf.plot("mag",0,1,freqs,ax=ax[i][j],parameter=parameter_type)
fig.tight_layout()
if show_plot:
plt.show()
if save_path:
plt.savefig(save_path)
def remove_simulation_with_high_rms_error(simulations:list[rf.VectorFitting],limit:float=0.015,parameter_type:Literal['s','y','z']='s'):
nports = simulations[0].network.nports
index_of_filtered_simulations = []
for res in simulations:
for i in range(nports):
for j in range(nports):
rms_error = res.get_rms_error(i, j, parameter_type)
if rms_error > limit:
index_of_filtered_simulations.append(i*nports+j)
break