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
Exemple #2
0
    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
Exemple #5
0
    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
Exemple #8
0
    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
Exemple #9
0
    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