diff --git a/ovf/core/VFManager.py b/ovf/core/VFManager.py index 775cb2f..1635561 100644 --- a/ovf/core/VFManager.py +++ b/ovf/core/VFManager.py @@ -200,7 +200,6 @@ class VFManager(): pre_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 @@ -215,7 +214,6 @@ class VFManager(): pre_poles=self._poles, fit_constant=self.fit_constant, fit_proportional=self.fit_proportional, - dc_enforce=self.dc_enforce, passivity_enforce=self.passivity_enforce ) if self.verbose: diff --git a/ovf/core/basis/MultiPortOrthonormalBasis.py b/ovf/core/basis/MultiPortOrthonormalBasis.py index f6dd242..897e139 100644 --- a/ovf/core/basis/MultiPortOrthonormalBasis.py +++ b/ovf/core/basis/MultiPortOrthonormalBasis.py @@ -4,7 +4,7 @@ from ovf.core.utils import cond_row_inf, cond_col_one, generate_starting_poles class MultiPortOrthonormalBasis: - def __init__(self,H,freqs,pre_poles,passivity_enforce=True,dc_enforce=True,fit_constant=True,fit_proportional=False): + def __init__(self,H,freqs,pre_poles,passivity_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 @@ -19,7 +19,6 @@ class MultiPortOrthonormalBasis: self.dc_tol = 1e-18 - self.dc_enforce = dc_enforce self.fit_constant = fit_constant self.fit_proportional = fit_proportional self.passivity_enforce = passivity_enforce @@ -414,17 +413,9 @@ class MultiPortOrthonormalBasis: """ K, N = self.Phi.shape 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: one = np.ones((K, 1), np.complex128) Phi_w = np.hstack([one, Phi]) @@ -434,7 +425,7 @@ class MultiPortOrthonormalBasis: 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 + M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1)) # (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 @@ -445,20 +436,14 @@ class MultiPortOrthonormalBasis: 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 + M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1)) # (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 has_dc: - A_re = np.real(M_kp) - A_im = np.imag(M_kp) - mask = np.ones(K, dtype=bool); mask[k0] = False - - else: - A_re = np.real(M_kp) - A_im = np.imag(M_kp) + A_re = np.real(M_kp) + A_im = np.imag(M_kp) A_blocks = [A_re, A_im] @@ -467,17 +452,15 @@ class MultiPortOrthonormalBasis: 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_sum[i].append(np.sum(np.abs(H[:,i,j])**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) + mean_row = (beta_ij / len(Phi_w)) * np.sum(Phi_w, axis=0) A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float), np.real(mean_row).astype(float)] ).reshape(1, -1)) @@ -489,16 +472,16 @@ class MultiPortOrthonormalBasis: b = np.zeros(m, float) b = np.concatenate([b, b_w0]) else: - H_kp = None + H_all = 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 = H_kp.reshape(-1,1) + H_0 = H[:,i,j] + H_all = H_0 if H_all is None else np.hstack([H_all, H_0]) + assert H_all is not None + H_all = H_all.reshape(-1,1) - b_re = np.real(d0 * H_kp) - b_im = np.imag(d0 * H_kp) + b_re = np.real(d0 * H_all) + b_im = np.imag(d0 * H_all) b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float) # ---- build final stacked-real system ----