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))