def compute_f_fprime_t_(W, perturbation, max_dist=1): # max dist added 10/14/20 Wmx, Wmy, Wsx, Wsy, s02, k, kappa, T, XX, XXp, Eta, Xi, h1, h2, Eta1, Eta2 = parse_W( W) fval = compute_f_(Eta, Xi, s02) fprimeval = compute_fprime_(Eta, Xi, s02) resEta = Eta - u_fn(XX, fval, Wmx, Wmy, k, kappa, T) resXi = Xi - u_fn(XX, fval, Wsx, Wsy, k, kappa) YY = fval + perturbation YYp = fprimeval def dYYdt(YY, Eta1, Xi1): return -YY + compute_f_(Eta1, Xi1, s02) def dYYpdt(YYp, Eta1, Xi1): return -YYp + compute_fprime_(Eta1, Xi1, s02) for t in range(niter): if np.mean(np.abs(YY - fval)) < max_dist: Eta1 = resEta + u_fn(XX, YY, Wmx, Wmy, k, kappa, T) Xi1 = resXi + u_fn(XX, YY, Wmx, Wmy, k, kappa, T) YY = YY + dt * dYYdt(YY, Eta1, Xi1) YYp = YYp + dt * dYYpdt(YYp, Eta1, Xi1) elif np.remainder(t, 500) == 0: print('unstable fixed point?') #YYp = compute_fprime_(Eta1,Xi1,s02) return YY, YYp
def compute_f_fprime_t_(W1,W2,perturbation,max_dist=1): # max dist added 10/14/20 #Wmx,Wmy,Wsx,Wsy,s02,Kin,Kout,kappa,Tin,Tout,XX,XXp,Eta,Xi,h1,h2 = parse_W(W) W0x,W0y,W1x,W1y,W2x,W2y,W3x,W3y,s02,Kin0,Kin1,Kxout0,Kyout0,Kxout1,Kyout1,kappa,Tin0,Tin1,Txout0,Tyout0,Txout1,Tyout1,h1,h2,bl,amp = parse_W1(W1) XX,XXp,Eta,Xi = parse_W2(W2) fval = compute_f_(Eta,Xi,s02) fprimeval = compute_fprime_(Eta,Xi,s02) u0,u1,u2,u3 = compute_us(W1,W2,fval,fprimeval) resEta = Eta - u0 - u2 resXi = Xi - u1 - u3 YY = fval + perturbation YYp = fprimeval def dYYdt(YY,Eta1,Xi1): return -YY + compute_f_(Eta1,Xi1,s02) def dYYpdt(YYp,Eta1,Xi1): return -YYp +compute_fprime_(Eta1,Xi1,s02) for t in range(niter): if np.mean(np.abs(YY-fval)) < max_dist: u0,u1,u2,u3 = compute_us(W1,W2,YY,YYp) Eta1 = resEta + u0 + u2 Xi1 = resXi + u1 + u3 YY = YY + dt*dYYdt(YY,Eta1,Xi1) YYp = YYp + dt*dYYpdt(YYp,Eta1,Xi1) elif np.remainder(t,500)==0: print('unstable fixed point?') #YY = YY + np.tile(bl,nS*nT)[np.newaxis,:] #YYp = compute_fprime_(Eta1,Xi1,s02) return YY,YYp
def compute_f_fprime_t_avg_(W, perturbation, burn_in=0.5, max_dist=1): W0x, W0y, W1x, W1y, W2x, W2y, W3x, W3y, s02, k0, k1, k2, k3, kappa, T0, T1, T2, T3, XX, XXp, Eta, Xi, h = parse_W( W) fval = compute_f_(Eta, Xi, s02) fprimeval = compute_fprime_(Eta, Xi, s02) u0, u1, u2, u3 = compute_us(W, fval, fprimeval) resEta = Eta - u0 - u2 resXi = Xi - u1 - u3 YY = fval + perturbation YYp = fprimeval + 0 YYmean = np.zeros_like(Eta) YYprimemean = np.zeros_like(Eta) def dYYdt(YY, Eta1, Xi1): return -YY + compute_f_(Eta1, Xi1, s02) def dYYpdt(YYp, Eta1, Xi1): return -YYp + compute_fprime_(Eta1, Xi1, s02) for t in range(niter): if np.mean(np.abs(YY - fval)) < max_dist: u0, u1, u2, u3 = compute_us(W, YY, YYp) Eta1 = resEta + u0 + u2 Xi1 = resXi + u1 + u3 YY = YY + dt * dYYdt(YY, Eta1, Xi1) YYp = YYp + dt * dYYpdt(YYp, Eta1, Xi1) elif np.remainder(t, 500) == 0: print('unstable fixed point?') if t > niter * burn_in: YYmean = YYmean + 1 / niter / burn_in * YY YYprimemean = YYprimemean + 1 / niter / burn_in * YYp return YYmean, YYprimemean
def compute_f_fprime_t_(W, perturbation, max_dist=1): # max dist added 10/14/20 W0x, W0y, W1x, W1y, W2x, W2y, W3x, W3y, s02, k0, k1, k2, k3, kappa, T0, T1, T2, T3, XX, XXp, Eta, Xi, h = parse_W( W) fval = compute_f_(Eta, Xi, s02) fprimeval = compute_fprime_(Eta, Xi, s02) u0, u1, u2, u3 = compute_us(W, fval, fprimeval) resEta = Eta - u0 - u2 resXi = Xi - u1 - u3 YY = fval + perturbation YYp = fprimeval + 0 def dYYdt(YY, Eta1, Xi1): return -YY + compute_f_(Eta1, Xi1, s02) def dYYpdt(YYp, Eta1, Xi1): return -YYp + compute_fprime_(Eta1, Xi1, s02) for t in range(niter): if np.mean(np.abs(YY - fval)) < max_dist: u0, u1, u2, u3 = compute_us(W, YY, YYp) Eta1 = resEta + u0 + u2 Xi1 = resXi + u1 + u3 YY = YY + dt * dYYdt(YY, Eta1, Xi1) YYp = YYp + dt * dYYpdt(YYp, Eta1, Xi1) elif np.remainder(t, 500) == 0: print('unstable fixed point?') #YYprime = compute_fprime_(Eta1,Xi1,s02) return YY, YYp
def __init__(self, configurations, parameters, controls): self.configurations = configurations self.parameters = parameters self.controls = controls flat_args, self.unflatten = flatten(self.controls) self.gx = grad(self.cost) self.J = jacobian(self.forward) self.hx = hessian_vector_product(self.cost) self.hvp = hvp(self.hx) y0, t_total, N_total, number_group, population_proportion, \ t_control, number_days_per_control_change, number_control_change_times, number_time_dependent_controls = configurations self.N_total = N_total self.number_group = number_group self.t_control = t_control self.dimension = len(self.t_control) self.number_time_dependent_controls = number_time_dependent_controls self.y0 = y0 self.t_total = t_total self.interpolation = piecewiseLinear self.load_data(fips) self.initialization() if number_group > 1: # contact matrix school_closure = True # calendar from February 15th weekday = [2, 3, 4, 5, 6] # calendar from April 1st # weekday = [0, 1, 2, 5, 6] # calendar from May 1st # weekday = [0, 3, 4, 5, 6] calendar = np.zeros(1000 + 1, dtype=int) # set work days as 1 and school days as 2 for i in range(1001): if np.remainder(i, 7) in weekday: calendar[i] = 1 if not school_closure: # and i < 45 calendar[i] = 2 self.calendar = calendar contact = np.load("utils/contact_matrix.npz") self.c_home = contact["home"] self.c_school = contact["school"] self.c_work = contact["work"] self.c_other = contact["other"] self.contact_full = self.c_home + 5. / 7 * ( (1 - school_closure) * self.c_school + self.c_work) + self.c_other
def compute_f_fprime_t_avg_12_(W1, W2, perturbation, max_dist=1, burn_in=0.5): # max dist added 10/14/20 #Wmx,Wmy,Wsx,Wsy,s02,Kin,Kout,kappa,Tin,Tout,XX,XXp,Eta,Xi,h1,h2 = parse_W(W) W0x, W0y, W1x, W1y, W2x, W2y, W3x, W3y, W0xrun, W0yrun, s02, Kin0, Kin1, Kxout0, Kyout0, Kxout1, Kyout1, kappa, Tin0, Tin1, Txout0, Tyout0, Txout1, Tyout1, h1, h2, bl, amp = parse_W1( W1) XX, XXp, Eta, Xi = parse_W2(W2) fval = compute_f_(Eta, Xi, s02) fprimeval = compute_fprime_(Eta, Xi, s02) u0, u1, u2, u3 = compute_us(W1, W2, fval, fprimeval) if share_residuals: resEta = Eta - u0 - u2 resXi = Xi - u1 - u3 resEta12 = np.concatenate((resEta, resEta), axis=0) resXi12 = np.concatenate((resXi, resXi), axis=0) else: resEta12 = 0 resXi12 = 0 dHH = np.zeros((nN, nQ * nS * nT)) dHH[:, np.arange(2, nQ * nS * nT, nQ)] = 1 dHH = np.concatenate((dHH * h1, dHH * h2), axis=0) YY = fval + perturbation YYp = fprimeval XX12 = np.concatenate((XX, XX), axis=0) YY12 = np.concatenate((YY, YY), axis=0) YYp12 = np.concatenate((YYp, YYp), axis=0) YYmean = np.zeros_like(YY12) YYprimemean = np.zeros_like(YY12) def dYYdt(YY, Eta1, Xi1): return -YY + compute_f_(Eta1, Xi1, s02) def dYYpdt(YYp, Eta1, Xi1): return -YYp + compute_fprime_(Eta1, Xi1, s02) for t in range(niter): if np.mean(np.abs(YY - fval)) < max_dist: u0, u1, u2, u3 = compute_us(W1, W2, YY12, YYp12) Eta121 = resEta12 + u0 + u2 + dHH Xi121 = resXi12 + u1 + u3 YY12 = YY12 + dt * dYYdt(YY12, Eta121, Xi121) YYp12 = YYp12 + dt * dYYpdt(YYp12, Eta121, Xi121) elif np.remainder(t, 500) == 0: print('unstable fixed point?') if t > niter * burn_in: YYmean = YYmean + 1 / niter / burn_in * YY12 YYprimemean = YYprimemean + 1 / niter / burn_in * YYp12 #YYmean = YYmean + np.tile(bl,nS*nT)[np.newaxis,:] return YYmean, YYprimemean
def compute_f_fprime_t_avg_12_(W1, W2, perturbation, max_dist=1, burn_in=0.5): # max dist added 10/14/20 #Wmx,Wmy,Wsx,Wsy,s02,K,kappa,T,XX,XXp,Eta,Xi,h1,h2 = parse_W(W) Wmx, Wmy, Wsx, Wsy, s02, K, kappa, T, h1, h2 = parse_W1(W1) XX, XXp, Eta, Xi = parse_W2(W2) fval = compute_f_(Eta, Xi, s02) fprimeval = compute_fprime_(Eta, Xi, s02) if share_residuals: resEta = Eta - u_fn(XX, fval, Wmx, Wmy, K, kappa, T) resXi = Xi - u_fn(XX, fval, Wsx, Wsy, K, kappa, T) resEta12 = np.concatenate((resEta, resEta), axis=0) resXi12 = np.concatenate((resXi, resXi), axis=0) else: resEta12 = 0 resXi12 = 0 dHH = np.zeros((nN, nQ * nS * nT)) dHH[:, np.arange(2, nQ * nS * nT, nQ)] = 1 dHH = np.concatenate((dHH * h1, dHH * h2), axis=0) YY = fval + perturbation YYp = fprimeval XX12 = np.concatenate((XX, XX), axis=0) YY12 = np.concatenate((YY, YY), axis=0) YYp12 = np.concatenate((YYp, YYp), axis=0) YYmean = np.zeros_like(YY12) YYprimemean = np.zeros_like(YY12) def dYYdt(YY, Eta1, Xi1): return -YY + compute_f_(Eta1, Xi1, s02) def dYYpdt(YYp, Eta1, Xi1): return -YYp + compute_fprime_(Eta1, Xi1, s02) for t in range(niter): if np.mean(np.abs(YY - fval)) < max_dist: Eta121 = resEta12 + u_fn(XX12, YY12, Wmx, Wmy, K, kappa, T) + dHH Xi121 = resXi12 + u_fn(XX12, YY12, Wmx, Wmy, K, kappa, T) YY12 = YY12 + dt * dYYdt(YY12, Eta121, Xi121) YYp12 = YYp12 + dt * dYYpdt(YYp12, Eta121, Xi121) elif np.remainder(t, 500) == 0: print('unstable fixed point?') if t > niter * burn_in: YYmean = YYmean + 1 / niter / burn_in * YY12 YYprimemean = YYprimemean + 1 / niter / burn_in * YYp12 return YYmean, YYprimemean
def evaluate(variable_values, parameters): ax = variable_values[parameters["ax"]] bx = variable_values[parameters["bx"]] dx = bx - ax ay = variable_values[parameters["ay"]] by = variable_values[parameters["by"]] dy = by - ay angle = numpy.arctan2(dy, dx) error1 = angle - parameters["angle"] # Normalize the angular differnce using # (a + 180°) % 360° - 180° # https://stackoverflow.com/questions/1878907/the-smallest-difference-between-2-angles return numpy.remainder(error1 + math.pi, 2 * math.pi) - math.pi
def __init__(self, configurations, parameters, controls): y0, t_total, N_total, number_group, population_proportion, \ t_control, number_days_per_control_change, number_control_change_times, number_time_dependent_controls = configurations self.N_total = N_total self.number_group = number_group self.t_control = t_control self.number_time_dependent_controls = number_time_dependent_controls self.configurations = configurations self.parameters = parameters self.controls = controls self.interpolation = piecewiseLinear if number_group > 1: # contact matrix school_closure = True # calendar from February 15th weekday = [2, 3, 4, 5, 6] # calendar from April 1st # weekday = [0, 1, 2, 5, 6] # calendar from May 1st # weekday = [0, 3, 4, 5, 6] calendar = np.zeros(1000 + 1, dtype=int) # set work days as 1 and school days as 2 for i in range(1001): if np.remainder(i, 7) in weekday: calendar[i] = 1 if not school_closure: # and i < 45 calendar[i] = 2 self.calendar = calendar contact = np.load("../../utils/parameters/contact/contact_matrix.npz") self.c_home = contact["home"] self.c_school = contact["school"] self.c_work = contact["work"] self.c_other = contact["other"] self.contact_full = self.c_home + 5. / 7 * ((1 - school_closure) * self.c_school + self.c_work) + self.c_other