예제 #1
0
def test_roots_hermitenorm():
    rootf = sc.roots_hermitenorm
    evalf = orth.eval_hermitenorm
    weightf = orth.hermitenorm(5).weight_func

    verify_gauss_quad(rootf, evalf, weightf, -np.inf, np.inf, 5)
    verify_gauss_quad(rootf, evalf, weightf, -np.inf, np.inf, 25, atol=1e-13)
    verify_gauss_quad(rootf, evalf, weightf, -np.inf, np.inf, 100, atol=1e-12)

    x, w = sc.roots_hermitenorm(5, False)
    y, v, m = sc.roots_hermitenorm(5, True)
    assert_allclose(x, y, 1e-14, 1e-14)
    assert_allclose(w, v, 1e-14, 1e-14)

    muI, muI_err = integrate.quad(weightf, -np.inf, np.inf)
    assert_allclose(m, muI, rtol=muI_err)

    assert_raises(ValueError, sc.roots_hermitenorm, 0)
    assert_raises(ValueError, sc.roots_hermitenorm, 3.3)
    def test_gauss_quadrature(self):
        degree = 4
        alpha = 0.
        beta = 0.
        ab = jacobi_recurrence(degree + 1,
                               alpha=alpha,
                               beta=beta,
                               probability=True)

        x, w = gauss_quadrature(ab, degree + 1)
        for ii in range(degree + 1):
            if ii % 2 == 0:
                assert np.allclose(np.dot(x**ii, w), 1. / (ii + 1.))
            else:
                assert np.allclose(np.dot(x**ii, w), 0.)

        x_np, w_np = np.polynomial.legendre.leggauss(degree + 1)
        assert np.allclose(x_np, x)
        assert np.allclose(w_np / 2, w)

        degree = 4
        alpha = 4.
        beta = 1.
        ab = jacobi_recurrence(degree + 1,
                               alpha=alpha,
                               beta=beta,
                               probability=True)

        x, w = gauss_quadrature(ab, degree + 1)

        true_moments = [1., -3. / 7., 2. / 7., -4. / 21., 1. / 7.]
        for ii in range(degree + 1):
            assert np.allclose(np.dot(x**ii, w), true_moments[ii])

        degree = 4
        rho = 0.
        ab = hermite_recurrence(degree + 1, rho, probability=True)
        x, w = gauss_quadrature(ab, degree + 1)
        from scipy.special import factorial2
        assert np.allclose(np.dot(x**degree, w), factorial2(degree - 1))

        x_sp, w_sp = sp.roots_hermitenorm(degree + 1)
        w_sp /= np.sqrt(2 * np.pi)
        assert np.allclose(x_sp, x)
        assert np.allclose(w_sp, w)
    def __init__(self, N, ucoeff, delta, cs, M, mu, qvals, ncoloc, Q_co):
        self.N = N
        self.ucoeff = ucoeff
        self.delta = delta
        self.cs = cs
        self.M = M
        self.transfer_list = []
        self.sse_exp_pi_list = []
        quads, weights, weight_acc = roots_hermitenorm(10000, mu=True)
        quads_bcast = np.array([quads]*M).T
        weights = np.array(weights)
        self.t_rvs_bcast = T.as_tensor(quads_bcast)
        self.t_rvs = T.as_tensor(quads)
        self.t_ws = T.as_tensor(weights)
        self.t_accweight = T.as_tensor(weight_acc)
        self.qvals = qvals
        self.ncoloc = ncoloc

	self.dx = self.M * N
        self.t_ei1 = T.dvector('ei1')
        self.t_ei2 = T.dvector('ei2')
        self.t_e = T.dvector('e')
        self.t_ai = T.dvector('ai')
        self.t_xi_i = T.dmatrix('xi_i')

        self.t_w = T.dmatrix('w')
        self.t_w_acc = T.dscalar('w_acc')
        self.t_Qi1 = T.dmatrix('Qi1')
        self.t_mu = theano.shared(mu.flatten().reshape(1, -1), broadcastable = (True, False))
        self.ell = -100.0
        self.Q_co = Q_co

        self.t_parameters = T.dvector('parameters')

        def build_variables(self):
        self.t_c0 = self.cs * self.t_ei1[0]**2
        # self.t_Q0 = self.Q_co[0] * T.log(self.t_ei2[0]+self.Q_co[1]) + self.Q_co[2] + self.delta * self.t_xi_i
        self.t_Q0 = self.Q_co[0] + self.Q_co[1] * self.t_ei2[0] + self.delta * self.t_xi_i
        self.t_grad_Qe0 = T.grad(T.mean(self.t_Q0), self.t_ei2)
        #self.t_t0 = T.dot(self.t_ai, T.transpose(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_mu)))))
        self.t_t0 = self.t_ai[0] + self.t_ai[1]*(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_ai[2])))) + \
                self.t_ai[3] * (self.t_Qi1-self.t_ai[2])*(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_ai[2]))))
        self.t_t0_exp = T.dot(self.t_w, self.t_t0) / self.t_w_acc

        self.t_sysval0 = 1.0 / (1.0 + T.exp(-50*(self.t_Qi1 - 1.0)))
        self.t_sysval0_exp = T.dot(self.t_w, self.t_sysval0) / self.t_w_acc

        self.t_sse_pi0 = self.t_t0 - self.t_c0
        self.t_sse_pi0_exp = self.t_t0_exp - self.t_c0

        # utility of sse
        self.a = 1.0 / (1.0 - T.exp(-self.ucoeff))
        self.b = self.a
        if self.ucoeff != 0.0:
            self.t_sse_util0 = T.flatten(self.a - self.b * T.exp(-self.ucoeff * self.t_sse_pi0))
            self.t_sse_util0_exp = T.flatten(self.a - self.b * T.exp(-self.ucoeff * self.t_sse_pi0_exp))
        else:
            self.t_sse_util0 = T.flatten(self.t_sse_pi0)
            self.t_sse_util0_exp = T.flatten(self.t_sse_pi0_exp)
		
        # derivatives
        self.t_grad_tQ0 = T.grad(self.t_t0[0,0], self.t_Qi1)
        self.t_grad_tQ0_exp = T.dot(self.t_w, self.t_grad_tQ0) / self.t_w_acc

        self.t_grad_ta0 = T.grad(self.t_t0[0,0], self.t_ai)
        self.t_grad_ta0_exp = T.dot(self.t_w, self.t_grad_ta0) / self.t_w_acc

        self.t_grad_VQ0 = T.grad(self.t_sysval0[0,0], self.t_Qi1)
        self.t_gard_VQ0_exp = T.dot(self.t_w, self.t_grad_VQ0) / self.t_w_acc
	
        def cost(self):
            self.t_cost = theano.clone(self.t_c0, replace = {self.t_ei1: self.t_e}, strict = False)
    
        def Q(self):
            self.t_Q = theano.clone(self.t_Q0, replace = {self.t_ei2: self.t_e}, strict = False)

	def grad_Q_e(self):	
            self.t_grad_Q_e = theano.clone(self.t_grad_Qe0, replace = {self.t_Q0:self.t_Q, self.t_ei2:self.t_e}, strict = False)

        def transfer(self):	
            self.t_tr = theano.clone(self.t_t0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_transfer(self):	
            self.t_tr_exp = theano.clone(self.t_t0_exp, replace = {self.t_t0: self.t_tr}, strict = False)

        def system_value(self):
            self.t_sysval = theano.clone(self.t_sysval0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_system_value(self):
            self.t_sysval_exp = theano.clone(self.t_sysval0_exp, replace = {self.t_sysval0: self.t_sysval}, strict = False)

        def grad_transfer_quality(self):	
            self.t_grad_trQ = theano.clone(self.t_grad_tQ0, replace = {self.t_t0: self.t_tr, self.t_Qi1: self.t_Q}, strict = False)

        def exp_grad_transfer_quality(self):
            self.t_grad_trQ_exp = theano.clone(self.t_grad_tQ0_exp, replace = {self.t_grad_tQ0: self.t_grad_trQ}, strict = False)

        def grad_transfer_a(self):
            self.t_grad_tra = theano.clone(self.t_grad_ta0, replace = {self.t_t0: self.t_tr, self.t_Qi1:self.t_Q}, strict = False)

        def exp_grad_transfer_a(self):
            #self.t_grad_tra_exp = T.dot(self.t_w, self.t_grad_tra)
            self.t_grad_tra_exp = theano.clone(self.t_grad_ta0_exp, replace= {self.t_grad_ta0: self.t_grad_tra}, strict = False)

        def grad_sysval_Q(self):
            self.t_grad_VQ = theano.clone(self.t_grad_VQ0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_grad_sysval_Q(self):
            # self.t_grad_VQ_exp = T.dot(self.t_w, self.t_grad_VQ)
            self.t_grad_VQ_exp = theano.clone(self.t_gard_VQ0_exp, replace = {self.t_sysval0:self.t_sysval}, strict = False)

        def sse_pi(self):
            self.t_sse_pi  = theano.clone(self.t_sse_pi0, replace = {self.t_t0: self.t_tr, self.t_c0: self.t_cost}, strict = False)

        def exp_sse_pi(self):
            self.t_sse_pi_exp = theano.clone(self.t_sse_pi0_exp, replace = {self.t_t0_exp:self.t_tr_exp, self.t_c0: self.t_cost}, strict = False)

        def sse_utility(self):
            self.t_sse_util = theano.clone(self.t_sse_util0, replace = {self.t_sse_pi0: self.t_sse_pi}, strict = False)
            # self.t_sse_util = self.t_tr - self.t_cost

        def exp_sse_utility(self):
            self.t_sse_util_exp = theano.clone(self.t_sse_util0_exp, replace = {self.t_sse_pi0_exp: self.t_sse_pi_exp}, strict = False)
            # self.t_sse_util_exp  = self.t_tr_exp - self.t_cost

        def build_sse_opt_problem(self):
            t_g = [self.t_sse_util_exp[0]]
            self.sse_opt_prob = ConstrainedOptimizationProblem(self.N, 
                    self.t_e, self.t_ai, -self.t_sse_util_exp[0],
                    t_g,
                    t_gl = 0.0,
                    t_gu = POSITIVE_INFINITY,
                    t_xl = 0.0,
                    t_xu = 1.0,
                    t_other = [self.t_w, self.t_xi_i, self.t_w_acc])
            return self.sse_opt_prob

        def solve_sse_opt_prob(self, param, oth):
            res_x          = np.array(np.zeros(self.N))
            res_obj        = np.array(np.zeros(self.N))
            res_grad_p_obj = np.array(np.zeros(self.M))
            res_grad_p_x   = np.array(np.zeros(self.M))
            #do multiple restarts 
            for ran in range(40):
                lb = (ran + 0.0) / 40.0
                ub = (ran + 1.0) / 40.0
                x0 = np.random.uniform(lb, ub, 1)
                for i in range(self.N):
                    p0 = np.zeros(self.N)
		    p0[i] = x0
                    res = self.sse_opt_prob.solve(p0, param, other = oth, get_grad = True)
                    if -res['obj'] > res_obj[i] and res['status'] == 0 and not np.any(np.isnan(res['grad_p_x'])):
                        res_obj[i]       = -res['obj']
                        res_x[i]         =  res['x'][i]
                        res_grad_p_obj   =  res['grad_p_obj']
                        res_grad_p_x     =  res['grad_p_x']
            return res_x, res_obj, res_grad_p_obj, res_grad_p_x




    def __call__(self):		
        """
        TODO SALAR: The name of this function is very unintuitive.
        """
        self.build_variables()
        self.Q()
        self.cost()
        self.transfer()
        self.exp_transfer()
        self.system_value()
        self.exp_system_value()
        self.sse_pi()
        self.exp_sse_pi()
        self.sse_utility()
        self.exp_sse_utility()
        self.build_sse_opt_problem()
        
        self.grad_Q_e()
        self.grad_transfer_quality()
        self.exp_grad_transfer_quality()

        self.grad_transfer_a()
        self.exp_grad_transfer_a()

        self.grad_sysval_Q()
        self.exp_grad_sysval_Q()

        self.Q_compiled            = function([self.t_e, self.t_xi_i], self.t_Q)
        self.cost_compiled         = function([self.t_e], self.t_cost)
        self.tr_compiled           = function([self.t_e, self.t_ai, self.t_xi_i], self.t_tr)
        self.tr_exp_compiled       = function([self.t_e, self.t_ai, self.t_w, self.t_xi_i, self.t_w_acc], self.t_tr_exp)
        self.sysval_compiled       = function([self.t_e, self.t_xi_i], self.t_sysval)
        self.sysval_exp_compiled   = function([self.t_e, self.t_w, self.t_xi_i, self.t_w_acc], self.t_sysval_exp)
        self.sse_util_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_sse_util)
        self.sse_util_exp_compiled = function([self.t_e, self.t_ai, self.t_w, self.t_xi_i, self.t_w_acc], self.t_sse_util_exp)

        self.grad_Qe_compiled      = function([self.t_e, self.t_xi_i], self.t_grad_Q_e)

        self.grad_trQ_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_grad_trQ)

        self.grad_tra_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_grad_tra)

        self.grad_VQ_compiled      = function([self.t_e, self.t_xi_i], self.t_grad_VQ)
class Agent(object):
    """
    TODO SALAR
    """
    def __init__(self, N, ucoeff, delta, cs, M, mu, qvals, ncoloc, Q_co):
        self.N = N
        self.ucoeff = ucoeff
        self.delta = delta
        self.cs = cs
        self.M = M
        self.transfer_list = []
        self.sse_exp_pi_list = []
        quads, weights, weight_acc = roots_hermitenorm(10000, mu=True)
        quads_bcast = np.array([quads]*M).T
        weights = np.array(weights)
        self.t_rvs_bcast = T.as_tensor(quads_bcast)
        self.t_rvs = T.as_tensor(quads)
        self.t_ws = T.as_tensor(weights)
        self.t_accweight = T.as_tensor(weight_acc)
        self.qvals = qvals
        self.ncoloc = ncoloc

	self.dx = self.M * N
        self.t_ei1 = T.dvector('ei1')
        self.t_ei2 = T.dvector('ei2')
        self.t_e = T.dvector('e')
        self.t_ai = T.dvector('ai')
        self.t_xi_i = T.dmatrix('xi_i')

        self.t_w = T.dmatrix('w')
        self.t_w_acc = T.dscalar('w_acc')
        self.t_Qi1 = T.dmatrix('Qi1')
        self.t_mu = theano.shared(mu.flatten().reshape(1, -1), broadcastable = (True, False))
        self.ell = -100.0
        self.Q_co = Q_co

        self.t_parameters = T.dvector('parameters')

        def build_variables(self):
        self.t_c0 = self.cs * self.t_ei1[0]**2
        # self.t_Q0 = self.Q_co[0] * T.log(self.t_ei2[0]+self.Q_co[1]) + self.Q_co[2] + self.delta * self.t_xi_i
        self.t_Q0 = self.Q_co[0] + self.Q_co[1] * self.t_ei2[0] + self.delta * self.t_xi_i
        self.t_grad_Qe0 = T.grad(T.mean(self.t_Q0), self.t_ei2)
        #self.t_t0 = T.dot(self.t_ai, T.transpose(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_mu)))))
        self.t_t0 = self.t_ai[0] + self.t_ai[1]*(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_ai[2])))) + \
                self.t_ai[3] * (self.t_Qi1-self.t_ai[2])*(1.0 / (1.0 + T.exp(self.ell * (self.t_Qi1 - self.t_ai[2]))))
        self.t_t0_exp = T.dot(self.t_w, self.t_t0) / self.t_w_acc

        self.t_sysval0 = 1.0 / (1.0 + T.exp(-50*(self.t_Qi1 - 1.0)))
        self.t_sysval0_exp = T.dot(self.t_w, self.t_sysval0) / self.t_w_acc

        self.t_sse_pi0 = self.t_t0 - self.t_c0
        self.t_sse_pi0_exp = self.t_t0_exp - self.t_c0

        # utility of sse
        self.a = 1.0 / (1.0 - T.exp(-self.ucoeff))
        self.b = self.a
        if self.ucoeff != 0.0:
            self.t_sse_util0 = T.flatten(self.a - self.b * T.exp(-self.ucoeff * self.t_sse_pi0))
            self.t_sse_util0_exp = T.flatten(self.a - self.b * T.exp(-self.ucoeff * self.t_sse_pi0_exp))
        else:
            self.t_sse_util0 = T.flatten(self.t_sse_pi0)
            self.t_sse_util0_exp = T.flatten(self.t_sse_pi0_exp)
		
        # derivatives
        self.t_grad_tQ0 = T.grad(self.t_t0[0,0], self.t_Qi1)
        self.t_grad_tQ0_exp = T.dot(self.t_w, self.t_grad_tQ0) / self.t_w_acc

        self.t_grad_ta0 = T.grad(self.t_t0[0,0], self.t_ai)
        self.t_grad_ta0_exp = T.dot(self.t_w, self.t_grad_ta0) / self.t_w_acc

        self.t_grad_VQ0 = T.grad(self.t_sysval0[0,0], self.t_Qi1)
        self.t_gard_VQ0_exp = T.dot(self.t_w, self.t_grad_VQ0) / self.t_w_acc
	
        def cost(self):
            self.t_cost = theano.clone(self.t_c0, replace = {self.t_ei1: self.t_e}, strict = False)
    
        def Q(self):
            self.t_Q = theano.clone(self.t_Q0, replace = {self.t_ei2: self.t_e}, strict = False)

	def grad_Q_e(self):	
            self.t_grad_Q_e = theano.clone(self.t_grad_Qe0, replace = {self.t_Q0:self.t_Q, self.t_ei2:self.t_e}, strict = False)

        def transfer(self):	
            self.t_tr = theano.clone(self.t_t0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_transfer(self):	
            self.t_tr_exp = theano.clone(self.t_t0_exp, replace = {self.t_t0: self.t_tr}, strict = False)

        def system_value(self):
            self.t_sysval = theano.clone(self.t_sysval0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_system_value(self):
            self.t_sysval_exp = theano.clone(self.t_sysval0_exp, replace = {self.t_sysval0: self.t_sysval}, strict = False)

        def grad_transfer_quality(self):	
            self.t_grad_trQ = theano.clone(self.t_grad_tQ0, replace = {self.t_t0: self.t_tr, self.t_Qi1: self.t_Q}, strict = False)

        def exp_grad_transfer_quality(self):
            self.t_grad_trQ_exp = theano.clone(self.t_grad_tQ0_exp, replace = {self.t_grad_tQ0: self.t_grad_trQ}, strict = False)

        def grad_transfer_a(self):
            self.t_grad_tra = theano.clone(self.t_grad_ta0, replace = {self.t_t0: self.t_tr, self.t_Qi1:self.t_Q}, strict = False)

        def exp_grad_transfer_a(self):
            #self.t_grad_tra_exp = T.dot(self.t_w, self.t_grad_tra)
            self.t_grad_tra_exp = theano.clone(self.t_grad_ta0_exp, replace= {self.t_grad_ta0: self.t_grad_tra}, strict = False)

        def grad_sysval_Q(self):
            self.t_grad_VQ = theano.clone(self.t_grad_VQ0, replace = {self.t_Qi1: self.t_Q}, strict = False)

        def exp_grad_sysval_Q(self):
            # self.t_grad_VQ_exp = T.dot(self.t_w, self.t_grad_VQ)
            self.t_grad_VQ_exp = theano.clone(self.t_gard_VQ0_exp, replace = {self.t_sysval0:self.t_sysval}, strict = False)

        def sse_pi(self):
            self.t_sse_pi  = theano.clone(self.t_sse_pi0, replace = {self.t_t0: self.t_tr, self.t_c0: self.t_cost}, strict = False)

        def exp_sse_pi(self):
            self.t_sse_pi_exp = theano.clone(self.t_sse_pi0_exp, replace = {self.t_t0_exp:self.t_tr_exp, self.t_c0: self.t_cost}, strict = False)

        def sse_utility(self):
            self.t_sse_util = theano.clone(self.t_sse_util0, replace = {self.t_sse_pi0: self.t_sse_pi}, strict = False)
            # self.t_sse_util = self.t_tr - self.t_cost

        def exp_sse_utility(self):
            self.t_sse_util_exp = theano.clone(self.t_sse_util0_exp, replace = {self.t_sse_pi0_exp: self.t_sse_pi_exp}, strict = False)
            # self.t_sse_util_exp  = self.t_tr_exp - self.t_cost

        def build_sse_opt_problem(self):
            t_g = [self.t_sse_util_exp[0]]
            self.sse_opt_prob = ConstrainedOptimizationProblem(self.N, 
                    self.t_e, self.t_ai, -self.t_sse_util_exp[0],
                    t_g,
                    t_gl = 0.0,
                    t_gu = POSITIVE_INFINITY,
                    t_xl = 0.0,
                    t_xu = 1.0,
                    t_other = [self.t_w, self.t_xi_i, self.t_w_acc])
            return self.sse_opt_prob

        def solve_sse_opt_prob(self, param, oth):
            res_x          = np.array(np.zeros(self.N))
            res_obj        = np.array(np.zeros(self.N))
            res_grad_p_obj = np.array(np.zeros(self.M))
            res_grad_p_x   = np.array(np.zeros(self.M))
            #do multiple restarts 
            for ran in range(40):
                lb = (ran + 0.0) / 40.0
                ub = (ran + 1.0) / 40.0
                x0 = np.random.uniform(lb, ub, 1)
                for i in range(self.N):
                    p0 = np.zeros(self.N)
		    p0[i] = x0
                    res = self.sse_opt_prob.solve(p0, param, other = oth, get_grad = True)
                    if -res['obj'] > res_obj[i] and res['status'] == 0 and not np.any(np.isnan(res['grad_p_x'])):
                        res_obj[i]       = -res['obj']
                        res_x[i]         =  res['x'][i]
                        res_grad_p_obj   =  res['grad_p_obj']
                        res_grad_p_x     =  res['grad_p_x']
            return res_x, res_obj, res_grad_p_obj, res_grad_p_x




    def __call__(self):		
        """
        TODO SALAR: The name of this function is very unintuitive.
        """
        self.build_variables()
        self.Q()
        self.cost()
        self.transfer()
        self.exp_transfer()
        self.system_value()
        self.exp_system_value()
        self.sse_pi()
        self.exp_sse_pi()
        self.sse_utility()
        self.exp_sse_utility()
        self.build_sse_opt_problem()
        
        self.grad_Q_e()
        self.grad_transfer_quality()
        self.exp_grad_transfer_quality()

        self.grad_transfer_a()
        self.exp_grad_transfer_a()

        self.grad_sysval_Q()
        self.exp_grad_sysval_Q()

        self.Q_compiled            = function([self.t_e, self.t_xi_i], self.t_Q)
        self.cost_compiled         = function([self.t_e], self.t_cost)
        self.tr_compiled           = function([self.t_e, self.t_ai, self.t_xi_i], self.t_tr)
        self.tr_exp_compiled       = function([self.t_e, self.t_ai, self.t_w, self.t_xi_i, self.t_w_acc], self.t_tr_exp)
        self.sysval_compiled       = function([self.t_e, self.t_xi_i], self.t_sysval)
        self.sysval_exp_compiled   = function([self.t_e, self.t_w, self.t_xi_i, self.t_w_acc], self.t_sysval_exp)
        self.sse_util_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_sse_util)
        self.sse_util_exp_compiled = function([self.t_e, self.t_ai, self.t_w, self.t_xi_i, self.t_w_acc], self.t_sse_util_exp)

        self.grad_Qe_compiled      = function([self.t_e, self.t_xi_i], self.t_grad_Q_e)

        self.grad_trQ_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_grad_trQ)

        self.grad_tra_compiled     = function([self.t_e, self.t_ai, self.t_xi_i], self.t_grad_tra)

        self.grad_VQ_compiled      = function([self.t_e, self.t_xi_i], self.t_grad_VQ)


if __name__ == '__main__':

    N = 1

    kappa = np.array([1.3])

    delta = np.array([0.2])

    cs = np.array([0.3])

    M = 6

    ncoloc = 1000

    mu = np.linspace(0.5, 1.3, M)

    qvals = np.array([1.0])

    sys = Agent(N, kappa, delta, cs, M, mu, qvals, ncoloc)

    quads, weights, w_acc = roots_hermitenorm(ncoloc, mu=True)

    quads_bcast = np.array([quads]*M).T

    weights = np.array(weights)

    sys()
    param1 = np.array([1.00000606e-06, 1.02164096e-02, 6.95899824e-04, 1.00000072e-06, 
        1.25377477e-01, 3.85058853e-01])
    # test the functions

    # print sys.tr_compiled(np.array([0.3]), param, np.array([[0.1]*M]))
	
    # print sys.tr_exp_compiled(np.array([1.]), param, weights.reshape(1, -1) , quads_bcast, w_acc)

    # print sys.sysval_compiled(np.array([.6]), np.array([[1.]]))

    # print sys.sysval_exp_compiled(np.array([0.9]), weights.reshape(1,-1), quads.reshape(-1, 1), w_acc)

    # print sys.sse_util_compiled(np.array([0.3]), np.array([1.0]*M), np.array([[0.1]*M]))

    # print sys.sse_util_exp_compiled(np.array([.3]), np.array([.1]*M), weights.reshape(1, -1), quads_bcast, w_acc)
	
    h1 = []
    e = np.linspace(0,1,500)

    for i in e:
        h1 += [sys.sse_util_exp_compiled(np.array([i]), param1, weights.reshape(1, -1), quads_bcast, w_acc)]
        plt.plot(e, h1)
        plt.xlabel('e')
        plt.ylabel('$u_{sSE}$')
        plt.legend()
        plt.savefig('1.png', dpi=300)
        # plt.show()
	
    # a, b, c, d = sys.solve_sse_opt_prob(param, [weights.reshape(1, -1), quads_bcast, w_acc])
    # print a
    # print b
    # print c
    # print d

    # print sys.grad_trQ_compiled(np.array([0.3]), np.array([1.0]*M), np.array([[quads[40]]*M]))
    # sum =  0.0
    # t0 = time.time()
    # ttt = np.ndarray(shape = (ncoloc, 1))
    # for i in range(ncoloc):
    # 	ttt[i,:] = sys.grad_trQ_compiled(np.array([0.7]), np.array([1.0]*M), np.array([[quads[i]]*M]))[0,0]
    # print ttt
    # print 'trQ', np.dot(weights, ttt)/w_acc

    # ttt = np.ndarray(shape = (ncoloc, M))
    # for i in range(ncoloc):
    # 	ttt[i,:] = sys.grad_tra_compiled(np.array([0.7]), np.array([1.0]*M), np.array([quads[i]]*M).reshape(1,-1))
    # print ttt
    # print 'tra', np.dot(weights, ttt) / w_acc


    # ttt = np.ndarray(shape=(ncoloc, 1))

    # for i in range(ncoloc):
    # 	 ttt[i, :] = sys.grad_VQ_compiled(np.array([.7]), np.array([[quads[i]]]))[0][0]
    # print ttt
    # print 'VQ', np.dot(weights, ttt) / w_acc
	
    # t1 = time.time()
    # print 't', t1 - t0
    plt.show()