Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. import pymc3 as pm
  2. import theano.tensor as tt
  3.  
  4. Ks=np.array([8.0,2.15])
  5.  
  6. with pm.Model() as model:
  7.  
  8. # Common "shared" orbital parameters
  9. logK = pm.Uniform("logK",lower=np.log(0.5), upper=np.log(100.0), testval=np.log(Ks), shape=2)
  10.  
  11. # Mass
  12. # logmpl = pm.Normal("logmpl", mu=np.log(float(msini1.value)*M_star[0],float(msini2.value)*M_star[0]), sd=(5.0,5.0),shape=2)
  13. # mpl = pm.Deterministic("mpl", tt.exp(logmpl))
  14.  
  15. BoundedNormal = pm.Bound(pm.Normal, lower=1.0, upper=2000.0)
  16. P = BoundedNormal("P", mu=np.array(periods), sd=np.array(period_errs), shape=2,
  17. testval=np.array(periods))
  18.  
  19. #ecc = pm.Uniform("ecc", lower=0, upper=1, testval=0.1,shape=2)
  20. ecc = pm.Beta("ecc", alpha=0.867, beta=3.03, shape=2, testval=np.array([0.01, 0.15]))
  21. omega = xo.distributions.Angle("omega",shape=2)
  22. t0 = pm.Normal("t0", mu=np.array(t0s), sd=np.array(t0_errs), shape=2)
  23.  
  24. # Track some parameters
  25. K = pm.Deterministic("K", pm.math.exp(logK))
  26.  
  27. # We need to include a linear trend too
  28. trend = pm.Normal("trend", mu=0.0, sd=100.0)
  29.  
  30. # Set up the orbit
  31. orbit = xo.orbits.KeplerianOrbit(period=P, t0=t0, ecc=ecc, omega=omega)
  32.  
  33. # Loop over datasets
  34. logss = []
  35. sys_vels = []
  36. gp_params = []
  37. for t in utel:
  38. xt = x[tel== t]
  39. yt = y[tel == t]
  40. yerrt = yerr[tel == t]
  41.  
  42. # Jitter for this instrument
  43. logs = pm.Uniform("logs_{0}".format(t), lower=-15, upper=15, testval=0.0) #<--- CHANGE?
  44. logss.append(logs)
  45.  
  46. # Systemic velocity for this instrument
  47. sys_vel = pm.Uniform("sys_vel_{0}".format(t),lower=-100,upper=100,testval=0.0)
  48. sys_vels.append(sys_vel)
  49.  
  50. # Compute the model RV
  51. vrad = orbit.get_radial_velocity(xt, K=K)
  52. #pm.Deterministic("vrad", vrad)
  53.  
  54. # And the background model
  55. bkg_rv = sys_vel + trend * (xt - x_ref)
  56. #bkg = pm.Deterministic("bkg_rv",bkg_rv)
  57.  
  58. # Sum over planets and add the background to get the full model
  59. #rv_model = pm.Deterministic("rv_model", tt.sum(vrad, axis=-1) + bkg_rv)
  60.  
  61. # Noise model (error bar + jitter)
  62. err = pm.math.sqrt(yerrt**2 + pm.math.exp(2*logs))
  63. mod = tt.sum(vrad, axis=-1) + bkg_rv
  64.  
  65. #GP
  66. logS1 = pm.Normal("logS1_{0}".format(t), mu=0.0, sd=15.0, testval=np.log(np.var(yt)))
  67. logw1 = pm.Normal("logw1_{0}".format(t), mu=0.0, sd=15.0, testval=np.log(3.0))
  68. logS2 = pm.Normal("logS2_{0}".format(t), mu=0.0, sd=15.0, testval=np.log(np.var(yt)))
  69. logw2 = pm.Normal("logw2_{0}".format(t), mu=0.0, sd=15.0, testval=np.log(3.0))
  70. logQ = pm.Normal("logQ_{0}".format(t), mu=0.0, sd=15.0, testval=0)
  71. gp_params += [logS1, logw1, logS2, logw2, logQ]
  72.  
  73. # Set up the kernel an GP
  74. kernel = xo.gp.terms.SHOTerm(log_S0=logS1, log_w0=logw1, Q=1.0/np.sqrt(2))
  75. kernel += xo.gp.terms.SHOTerm(log_S0=logS2, log_w0=logw2, log_Q=logQ)
  76. gp = xo.gp.GP(kernel, xt, err)
  77.  
  78. # Add a custom "potential" (log probability function) with the GP likelihood
  79. pm.Potential("rv_obs_{0}".format(t), gp.log_likelihood(yt-mod))
  80. pm.Deterministic("gp_pred_{0}".format(t), gp.predict())
  81.  
  82.  
  83. # Do 'pfs2' explicitly so can try to connect pfs1 and pfs2 sys_vel terms
  84. # xt = x[tel== 'pfs2']
  85. # yt = y[tel == 'pfs2']
  86. # yerrt = yerr[tel == 'pfs2']
  87.  
  88. # logs = pm.Uniform("logs_{0}".format('pfs2'), lower=-5.0, upper=5.0, testval=0.0)
  89. #logs = pm.Normal("logs_{0}".format('pfs2'), mu=np.log(10.0), sd=10.0)
  90. # logss.append(logs)
  91.  
  92. # BoundedNormal = pm.Bound(pm.Normal, lower=sys_vel-2.0, upper=sys_vel+2.0)
  93. # sys_vel = BoundedNormal("sys_vel_{0}".format('pfs2'),mu=sys_vel, sd=2.0)
  94. # sys_vels.append(sys_vel)
  95.  
  96. # vrad = orbit.get_radial_velocity(xt, K=K)
  97.  
  98. # bkg_rv = sys_vel + trend * (xt - x_ref)
  99.  
  100. # err = pm.math.sqrt(yerrt**2 + pm.math.exp(2*logs))
  101. # pm.Normal("obs_{0}".format('pfs2'), mu=tt.sum(vrad, axis=-1) + bkg_rv, sd=err, observed=yt)
  102.  
  103. pm.Normal("pfs", mu=0, sd=3.0, observed=model.sys_vel_pfs1 - model.sys_vel_pfs2)
  104. pm.Deterministic("rv_model", orbit.get_radial_velocity(x, K=K))
  105.  
  106.  
  107. # These are for plotting
  108. rv_model_pred = []
  109. for i in range(2):
  110. x_pred = P[i] * phase_pred + t0[i]
  111. rv_model_pred.append(orbit.get_radial_velocity(x_pred, K=K)[:, i])
  112. pm.Deterministic("rv_model_pred", tt.stack(rv_model_pred))
  113. pm.Deterministic("gp_pred", gp.predict())
  114.  
  115.  
  116. print("\nOptimizing GP params...")
  117. map_soln = xo.optimize(vars=sys_vels + logss)
  118. map_soln = xo.optimize(map_soln, vars=[t0])
  119. map_soln = xo.optimize(map_soln, vars=gp_params)
  120. map_soln = xo.optimize(map_soln, vars=[t0, P, logK, ecc, omega])
  121. map_soln = xo.optimize(map_soln)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement