def run_demo_only(self, demo_target, demo_evidence_static=list(), demo_evidence_dynamic=list(), demo_evidence_val=0): #-- Set Up Reasoner reasoner = Reasoner(self.bkb, None) reasoner.set_src_metadata(self.patient_data_file) reasoner.cpp_reasoning = False #-- Initialize Result dict result = {'X': demo_evidence_val, 'Compute_time': -1} #-- Setup demographic evidence tuple if len(demo_evidence_dynamic) > 0: demo_evidence_dynamic_run = [ tuple(list(demo_evidence_dynamic) + [demo_evidence_val]) ] demo_evidence_run = demo_evidence_static + demo_evidence_dynamic_run #-- Make query and analyze query = Query(meta_evidence=demo_evidence_run, meta_targets=[demo_target], type='updating') query = reasoner.analyze_query(copy.deepcopy(query), save_dir=None) result['Compute_time'] = query.compute_time #-- Collect Updates and put into results for update, prob in query.result.updates.items(): comp_idx, state_idx = update comp_name = query.bkb.getComponentName(comp_idx) state_name = query.bkb.getComponentINodeName(comp_idx, state_idx) result[('Updates', comp_name, state_name)] = prob return result
def run_patients(self, demo_target, gene_evidence=False, demo_evidence=None, demo_value=0): reasoner = Reasoner(self.bkb, None) reasoner.set_src_metadata(self.patient_data_file) reasoner.cpp_reasoning = False #-- Comment this out for real thing #self.test_patient_hashes = [list(reasoner.metadata.keys())[0]] target_actual = '{} {} {} Actual'.format(demo_target[0], demo_target[1], demo_target[2]) results = { 'X': [demo_value for _ in range(len(self.test_patient_hashes[:10]))], 'Patient': list(), 'Compute_time': list(), 'Length_evid': list(), target_actual: list() } if gene_evidence is False and demo_evidence is None: raise ValueError('Gene and demo evidence can not be None.') if demo_evidence is not None: title = 'Evidence = {} {} X'.format(demo_evidence[0], demo_evidence[1]) demo_evidence_run = [tuple(list(demo_evidence) + [demo_value])] for patient_hash in tqdm.tqdm(self.test_patient_hashes[:10]): results['Patient'].append(patient_hash) #-- Calculate Truth prop_targ, op_targ, val_targ = demo_target op_ = _process_operator(op_targ) results[target_actual].append( op_(reasoner.metadata[patient_hash][prop_targ], val_targ)) if gene_evidence: gene_evidence_patient = { gene: 'True' for gene in patient_data[patient_hash]['Patient_Genes'] } title += ' w/ GeneEvidence' else: title += ' w/o GeneEvidence' gene_evidence_patient = dict() #-- Make query query = Query(evidence=gene_evidence_patient, meta_evidence=demo_evidence_run, meta_targets=[demo_target], type='updating') query = reasoner.analyze_query(copy.deepcopy(query), save_dir=None) results['Length_evid'].append(len(query.evidence)) results['Compute_time'].append(query.compute_time) for update, prob in query.result.updates.items(): comp_idx, state_idx = update comp_name = query.bkb.getComponentName(comp_idx) state_name = query.bkb.getComponentINodeName( comp_idx, state_idx) try: results[('Updates', comp_name, state_name)].append(prob) except: results[('Updates', comp_name, state_name)] = [prob] else: title = 'No Demographic Evidence w/ Gene Evidence' for i, patient_hash in enumerate(self.test_patient_hashes[:10]): results['Patient'].append(patient_hash) #-- Calculate Truth prop_targ, op_targ, val_targ = demo_target op_ = _process_operator(op_targ) #-- Calculate Truth results[target_actual].append( op_(reasoner.metadata[patient_hash][prop_targ], val_targ)) #-- Take intersection between all bkb genes and patient genes print('Intersecting genes') genes_patient = set([ 'mut_{}='.format(gene) for gene in reasoner.metadata[patient_hash]['Patient_Genes'] ]) bkb_comps = set(self.bkb.getAllComponentNames()) gene_intersect = genes_patient.intersection(bkb_comps) gene_evidence_patient = { gene: 'True' for gene in gene_intersect } #print(set(gene_evidence_patient.keys()) - set(self.bkb.getAllComponentNames())) #-- Make query #print(gene_evidence_patient) results['Length_evid'].append(len(gene_evidence_patient)) query = Query(evidence=gene_evidence_patient, meta_targets=[demo_target], type='updating', name='Pat50-10_600_{}'.format(i)) print('Analyzing Query.') query = reasoner.analyze_query(copy.deepcopy(query), save_dir=None) query.getReport() results['Compute_time'].append(query.compute_time) for update, prob in query.result.updates.items(): comp_idx, state_idx = update comp_name = query.bkb.getComponentName(comp_idx) state_name = query.bkb.getComponentINodeName( comp_idx, state_idx) try: results[('Updates', comp_name, state_name)].append(prob) except: results[('Updates', comp_name, state_name)] = [prob] del query print('Complete Patient {}.'.format(i)) return self.results_to_dataframe(results), title
for patient in PATIENTS } patient_data_hash = dict() for patient, dict_ in patient_data.items(): patient_data_hash[hash(patient)] = dict_ print(patient_data) #-- Denote Demographic evidence. demo_ev = [('Age', '>=', 50), ('Gender', '==', 'Male')] demo_tar = [('Survival', '>=', 2)] reasoner1 = Reasoner(fused_bkb, None) reasoner1.metadata = patient_data_hash reasoner1.cpp_reasoning = True reasoner2 = Reasoner(fused_bkb_wStruct, None) reasoner2.metadata = patient_data_hash reasoner2.cpp_reasoning = True query0 = Query( evidence={'Gene{}_mutated'.format(i): 'True' for i in range(NUM_GENES)}, targets=list(), meta_evidence=demo_ev, meta_targets=demo_tar, type='updating') query01 = reasoner1.analyze_query(copy.deepcopy(query0)) query02 = reasoner2.analyze_query(copy.deepcopy(query0))