def create_node_mi(name, parents, minum, milb, miub, mibins): node_mi = Node(name, parents=parents, rvname='continuous') minames = node_mi.discretize(milb, miub, minum, infinity='+-', bins=mibins) node_insp = parents[0] node_ai = parents[1] ainum = node_ai.nstates() labels = itertools.product(np.arange(node_insp.nstates()), np.arange(ainum)) labels = [label for label in labels] for i,label in enumerate(labels): if label[0] == 0: #no inspection probs = 1./minum * np.ones(minum) else: # with insepction if label[0] == 1: lmd = lmd1; beta = beta1 elif label[0] == 2: lmd = lmd2; beta = beta2 elif label[0] == 3: lmd = lmd3; beta = beta3 rvnames = ['Ai'] rvs = [node_ai.truncate_rv(label[1], lmd=trunclmd)] aimean = rvs[0].stats('m')[()] rv_am = stats.norm(aimean, sigmae) pod = 1.-stats.norm.cdf((np.log(aimean)-lmd)/beta) probs = rv_am.cdf(node_mi.bins[1:])-rv_am.cdf(node_mi.bins[:-1]) probs = probs/np.sum(probs)*pod probs[0] = probs[0]+(1.-pod) node_mi.assign_cpt(probs,label=np.asarray(label),statenames=node_mi.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_mi
def create_node_a(name, parents, ainum, ailb, aiub, aiedges, node_repair=None, asmp0=None): if node_repair is None: node_ai = Node(name, parents=parents, rvname='continuous') else: node_ai = Node(name, parents=parents + [node_repair], rvname='continuous') # dynamic discretization of nodes a and M node_ap = parents[0] knum = parents[1].nstates() mnum = parents[2].nstates() ainames = node_ai.discretize(ailb, aiub, ainum, infinity='+', bins=aiedges) aibins = node_ai.bins if node_repair is None: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum)) else: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum), np.arange(2)) labels = [label for label in labels] for i, label in enumerate(labels): if len(label) == 4 and label[-1] == 1: binnum, dummy = np.histogram(asmp0, aibins) probs = binnum / np.sum(binnum, dtype=float) node_ai.assign_cpt(probs, label=np.asarray(label), statenames=node_ai.statenames) else: truncrvs = [] for j, pstate in enumerate(label): truncrvs.append(node_ai.parents[j].truncate_rv(pstate, lmd=trunclmd)) rvnames = ['Ap', 'K', 'M'] rvs = truncrvs[:3] probs, smpdb = mc2ai(rvnames, rvs, node_ai.bins, acrit, nsmp=nsmp) # clean Ai states given Ai-1 apstate = label[0] aplb = node_ap.bins[apstate] aiubs = node_ai.bins[1:] probs[aiubs <= aplb] = 0. probs = probs / np.sum(probs) node_ai.assign_cpt(probs, label=np.asarray(label), statenames=node_ai.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_ai
def create_node_a(name, parents, ainum, ailb, aiub, aiedges, node_repair=None, asmp0=None): if node_repair is None: node_ai = Node(name, parents=parents, rvname='continuous') else: node_ai = Node(name, parents=parents+[node_repair], rvname='continuous') # dynamic discretization of nodes a and M node_ap = parents[0] knum = parents[1].nstates() mnum = parents[2].nstates() ainames = node_ai.discretize(ailb, aiub, ainum, infinity='+', bins=aiedges) aibins = node_ai.bins if node_repair is None: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum),np.arange(mnum)) else: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum), np.arange(2)) labels = [label for label in labels] for i,label in enumerate(labels): if len(label)==4 and label[-1] == 1: binnum,dummy = np.histogram(asmp0, aibins) probs = binnum/np.sum(binnum, dtype=float) node_ai.assign_cpt(probs,label=np.asarray(label),statenames=node_ai.statenames) else: truncrvs=[] for j,pstate in enumerate(label): truncrvs.append(node_ai.parents[j].truncate_rv(pstate,lmd=trunclmd)) rvnames = ['Ap', 'K', 'M'] rvs = truncrvs[:3] probs,smpdb = mc2ai(rvnames, rvs, node_ai.bins, acrit, nsmp=nsmp) # clean Ai states given Ai-1 apstate = label[0] aplb = node_ap.bins[apstate] aiubs = node_ai.bins[1:] probs[aiubs<=aplb] = 0. probs = probs/np.sum(probs) node_ai.assign_cpt(probs,label=np.asarray(label),statenames=node_ai.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_ai
def create_node_mi(name, parents, minum, milb, miub, mibins): node_mi = Node(name, parents=parents, rvname='continuous') minames = node_mi.discretize(milb, miub, minum, infinity='+-', bins=mibins) node_insp = parents[0] node_ai = parents[1] ainum = node_ai.nstates() labels = itertools.product(np.arange(node_insp.nstates()), np.arange(ainum)) labels = [label for label in labels] for i, label in enumerate(labels): if label[0] == 0: #no inspection probs = 1. / minum * np.ones(minum) else: # with insepction if label[0] == 1: lmd = lmd1 beta = beta1 elif label[0] == 2: lmd = lmd2 beta = beta2 elif label[0] == 3: lmd = lmd3 beta = beta3 rvnames = ['Ai'] rvs = [node_ai.truncate_rv(label[1], lmd=trunclmd)] aimean = rvs[0].stats('m')[()] rv_am = stats.norm(aimean, sigmae) pod = 1. - stats.norm.cdf((np.log(aimean) - lmd) / beta) probs = rv_am.cdf(node_mi.bins[1:]) - rv_am.cdf(node_mi.bins[:-1]) probs = probs / np.sum(probs) * pod probs[0] = probs[0] + (1. - pod) node_mi.assign_cpt(probs, label=np.asarray(label), statenames=node_mi.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_mi
ai = Node("A" + str(i + 1), parents=[aarray[-1], node_k, node_m], rvname='continuous') mi = Node("M" + str(i + 1), parents=[ai], rvname='continuous') aarray.append(ai) marray.append(mi) # discretize continuous rv # node a0 a0num = 20 + 2 mu, var = rv_a0.stats() sigma = np.sqrt(var) lb = mu - 3. * sigma ub = mu + 3. * sigma a0bins = np.linspace(lb, ub, a0num - 1) a0names = node_a0.discretize(lb, ub, a0num, infinity='+-', bins=a0bins) # node m mnum = 20 + 2 mu, var = rv_m.stats() sigma = np.sqrt(var) lb = mu - 3. * sigma ub = mu + 3. * sigma mbins = np.linspace(lb, ub, mnum - 1) mnames = node_m.discretize(lb, ub, mnum, infinity='+-', bins=mbins) # node k knum = 20 + 1 ksmp_prior, msmp_prior = ksmp_mc(nsmp, rv_C, rv_Sre, G, rv_m, rv_Na) klb = np.percentile(ksmp_prior, 5) kub = np.percentile(ksmp_prior, 95) if klb > 0: kbins = np.hstack((0., np.linspace(klb, kub, knum - 1)))
node_a0 = Node('a0', parents=None, rvname='normal', rv=rv_a0) aarray = [node_a0] marray=[] for i in range(life): ai = Node("A"+str(i+1), parents=[aarray[-1], node_k, node_m], rvname='continuous') mi = Node("M"+str(i+1), parents=[ai], rvname='continuous') aarray.append(ai) marray.append(mi) # discretize continuous rv # node a0 a0num = 20+2 mu,var = rv_a0.stats(); sigma = np.sqrt(var) lb = mu-3.*sigma; ub = mu+3.*sigma a0bins = np.linspace(lb, ub, a0num-1) a0names = node_a0.discretize(lb, ub, a0num, infinity='+-', bins=a0bins) # node m mnum = 20+2 mu,var = rv_m.stats(); sigma = np.sqrt(var) lb = mu-3.*sigma; ub = mu+3.*sigma mbins = np.linspace(lb, ub, mnum-1) mnames = node_m.discretize(lb, ub, mnum, infinity='+-', bins=mbins) # node k knum = 20+1 ksmp_prior,msmp_prior = ksmp_mc(nsmp, rv_C, rv_Sre, G, rv_m, rv_Na) klb = np.percentile(ksmp_prior, 5) kub = np.percentile(ksmp_prior, 95) if klb>0: kbins = np.hstack((0., np.linspace(klb, kub, knum-1))) else: kbins = np.linspace(0, kub, knum)
for i in range(life): h = Node("H"+str(i+1), parents=[uh], rvname='continuous') e = Node("E"+str(i+1),parents=[earray[-1],q,h], rvname='discrete') harray.append(h) earray.append(e) # discretize continuous rv # r4, m4, r5 and m5 r4num = 20+1 r5num = 20+1 m4num = 20+2 m5num = 20+2 m = r5.rv.stats('m'); s = np.sqrt(r5.rv.stats('v')) lb = 50.; ub = 250. r4bins = np.hstack((0, np.linspace(lb, ub, r4num-1))) r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50.; ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num-1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # q qnum = 30+1 qlb = 0.; qub = 150. qbins = np.hstack(np.linspace(qlb, qub, qnum)) qnames = q.discretize(qlb, qub, qnum, infinity='+', bins=qbins) # uh uhnum = 50+1 uhlb = 0.; uhub = 150. uhbins = np.hstack(np.linspace(uhlb, uhub, uhnum)) uhnames = uh.discretize(uhlb, uhub, uhnum, infinity='+', bins=uhbins)
# create nodes r5 = Node("R5", parents=None, rvname='lognormal', rv=rv5) r4 = Node("R4", parents=[r5], rvname='lognormal', rv=rv4) m4 = Node("M4", parents=[r4], rvname='continuous') m5 = Node("M5", parents=[r5], rvname='continuous') e = Node("E",parents=[r4,r5], rvname='discrete') # discretize continuous rv r4num = 20+1 r5num = 20+1 m4num = 20+2 m5num = 20+2 m = r5.rv.stats('m'); s = np.sqrt(r5.rv.stats('v')) lb = 50.; ub = 250. r4bins = np.hstack((0, np.linspace(lb, ub, r4num-1))) r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50.; ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num-1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # calculate and assignCPT # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis,:] r5.assign_cpt(r5cpt, statenames=r5names) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates())) mvnorm = stats.multivariate_normal(mean=None,cov=np.array([[1.,rolnR],[rolnR,1.]]))
rvname='discrete') harray.append(h) earray.append(e) # discretize continuous rv # r4, m4, r5 and m5 r4num = 20 + 1 r5num = 20 + 1 m4num = 20 + 2 m5num = 20 + 2 m = r5.rv.stats('m') s = np.sqrt(r5.rv.stats('v')) lb = 50. ub = 250. r4bins = np.hstack((0, np.linspace(lb, ub, r4num - 1))) r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50. ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num - 1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # q qnum = 30 + 1 qlb = 0. qub = 150. qbins = np.hstack(np.linspace(qlb, qub, qnum)) qnames = q.discretize(qlb, qub, qnum, infinity='+', bins=qbins) # uh uhnum = 50 + 1 uhlb = 0.
# random variables rvX1 = stats.lognorm(1., scale=np.exp(0)) rvX3 = stats.lognorm(1., scale=np.exp(3*np.sqrt(2))) # create nodes x1 = Node("X1", parents=None, rvname='lognormal', rv=rvX1) x2 = Node("X2", parents=[x1], rvname='continuous') y = Node("Y", parents=[x2], rvname='discrete') # discretize continuous rv x1num = 5 x2num = 5 m = x1.rv.stats('m'); s = np.sqrt(x1.rv.stats('v')) #lb = np.maximum(0, m-2*s); ub = m+2*s lb = 0.; ub = m+1.5*s x1names = x1.discretize(lb, ub, x1num, infinity='+') x2names = x2.discretize(lb*10., ub*10., x2num, infinity='+') # calculate and assign CPT # node X1 x1cpt = x1.rv.cdf(x1.bins[1:]) - x1.rv.cdf(x1.bins[:-1]) x1cpt = x1cpt[np.newaxis,:] x1.assign_cpt(x1cpt, statenames=x1names) # node X2 lmd = 0.05 nstate = x2num labels = itertools.product(np.arange(x1.nstates())) for i, label in enumerate(labels): rvs = [] probs=[] for j, pstate in enumerate(label):
r4 = Node("R4", parents=[r5], rvname='lognormal', rv=rv4) m4 = Node("M4", parents=[r4], rvname='continuous') m5 = Node("M5", parents=[r5], rvname='continuous') e = Node("E", parents=[r4, r5], rvname='discrete') # discretize continuous rv r4num = 20 + 1 r5num = 20 + 1 m4num = 20 + 2 m5num = 20 + 2 m = r5.rv.stats('m') s = np.sqrt(r5.rv.stats('v')) lb = 50. ub = 250. r4bins = np.hstack((0, np.linspace(lb, ub, r4num - 1))) r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50. ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num - 1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # calculate and assignCPT # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis, :] r5.assign_cpt(r5cpt, statenames=r5names) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates()))