In [1]:
import basepair
import modisco
Using TensorFlow backend.
Can not use cuDNN on context None: cannot compile with cuDNN. We got this error:
b'/usr/bin/ld: cannot find -lcudnn\ncollect2: error: ld returned 1 exit status\n'
Mapped name None to device cuda: GeForce GTX TITAN X (0000:09:00.0)
In [2]:
from keras.models import Model, load_model
from basepair.losses import twochannel_multinomial_nll
In [3]:
# Use gpus 3, 5
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3, 5"
In [4]:
model = load_model("model.h5", custom_objects={"twochannel_multinomial_nll": twochannel_multinomial_nll})
WARNING:tensorflow:From /users/amr1/miniconda3/envs/basepair/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py:497: calling conv1d (from tensorflow.python.ops.nn_ops) with data_format=NHWC is deprecated and will be removed in a future version.
Instructions for updating:
`NHWC` for data_format is deprecated, use `NWC` instead
2018-08-10 17:06:02,871 [WARNING] From /users/amr1/miniconda3/envs/basepair/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py:497: calling conv1d (from tensorflow.python.ops.nn_ops) with data_format=NHWC is deprecated and will be removed in a future version.
Instructions for updating:
`NHWC` for data_format is deprecated, use `NWC` instead
WARNING:tensorflow:From /users/amr1/miniconda3/envs/basepair/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py:198: retry (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Use the retry module or similar alternatives.
2018-08-10 17:06:11,315 [WARNING] From /users/amr1/miniconda3/envs/basepair/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py:198: retry (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Use the retry module or similar alternatives.
In [5]:
from basepair.utils import read_pkl
train,valid,test = read_pkl("/users/avsec/workspace/basepair-workflow/models/0/data.pkl")
In [6]:
from basepair.eval import evaluate
evaluate(model, valid[0], valid[1])
Out[6]:
{'loss': 953.9045610385498,
 'profile/Oct4_loss': 271.63486264911495,
 'profile/Sox2_loss': 162.5192502521077,
 'profile/Klf4_loss': 228.8282409395277,
 'profile/Nanog_loss': 265.30063137148727,
 'counts/Oct4_loss': 0.612707477322428,
 'counts/Sox2_loss': 0.5658578240037332,
 'counts/Klf4_loss': 0.8421652589296793,
 'counts/Nanog_loss': 0.5414273575545541}
In [7]:
task_names = ["profile/Oct4", "profile/Sox2", "profile/Klf4", "profile/Nanog",
              "counts/Oct4", "counts/Sox2", "counts/Klf4", "counts/Nanog"]
In [8]:
import keras.backend as K
inp = model.inputs[0]
fn_pos = {}
fn_neg = {}
for task_id, task_name in enumerate(task_names):
    if "counts" in task_name:
        fn_pos[task_name] = K.function([inp], K.gradients(model.outputs[task_id][:, 0], inp))
        fn_neg[task_name] = K.function([inp], K.gradients(model.outputs[task_id][:, 1], inp))
    else:
        fn_pos[task_name] = K.function([inp], K.gradients(K.sum(K.stop_gradient(K.softmax(
            model.outputs[task_id][:, :, 0])) * model.outputs[task_id][:, :, 0], axis=-1), inp))
        fn_neg[task_name] = K.function([inp], K.gradients(K.sum(K.stop_gradient(K.softmax(
            model.outputs[task_id][:, :, 1])) * model.outputs[task_id][:, :, 1], axis=-1), inp))
In [9]:
import numpy as np
from basepair.data import numpy_minibatch

grads_pos = {}
grads_neg = {}

for task_name in task_names:
    grads_pos[task_name] = np.concatenate([np.array(fn_pos[task_name]([batch])).squeeze()
                                           for batch in numpy_minibatch(test[0], 512)])
    grads_neg[task_name] = np.concatenate([np.array(fn_neg[task_name]([batch])).squeeze()
                                           for batch in numpy_minibatch(test[0], 512)])
In [10]:
# Setup different scores
hyp_scores = {}
scores = {}
for task_name in task_names:
    hyp_scores[task_name] = grads_pos[task_name] + grads_neg[task_name]
    hyp_scores[task_name] = hyp_scores[task_name] - hyp_scores[task_name].mean(-1, keepdims=True)
    scores[task_name] = hyp_scores[task_name] * test[0]
In [11]:
from concise.utils.plot import seqlogo_fig, seqlogo
import matplotlib.pyplot as plt
fig, (ax0, ax1)= plt.subplots(2, 1, sharex=True, figsize=(20, 6))

ax0.set_title("scores")
seqlogo(scores["profile/Oct4"][0], ax=ax0)

ax1.set_title("hyp_scores")
seqlogo(hyp_scores["profile/Oct4"][0], ax=ax1)
In [12]:
onehot_data = test[0]
task_to_scores = scores
task_to_hyp_scores = hyp_scores
In [13]:
from collections import OrderedDict, Counter

#Compute the contributions at each position, for each task
per_position_contrib_scores = OrderedDict([                             
                                (x, np.sum(task_to_scores[x],axis=2))
                                for x in task_names])
In [14]:
from modisco import coordproducers
from importlib import reload
reload(coordproducers)

sliding_window_size = 15
flank_size = 5
target_seqlet_fdr = 0.01

#Instantiate the coordinate producer
coord_producer = coordproducers.FixedWindowAroundChunks(
                        sliding=sliding_window_size,                                   
                        flank=flank_size,                                              
                        thresholding_function=coordproducers.LaplaceThreshold( 
                                                    min_seqlets=100,
                                                    target_fdr=target_seqlet_fdr,          
                                                    verbose=True))

#Call the coordinate producer on per-position contribution scores for each task
task_name_to_coord_producer_results = OrderedDict() 
for task_name in per_position_contrib_scores:           
    print("#####\nON TASK",task_name,"\n######")                   
    score_track = per_position_contrib_scores[task_name]
    coord_producer_results = coord_producer(score_track=score_track)
    #Given the coordinates, seqlets can be created by retrieving the
    # necessary data from the TrackSet
    task_name_to_coord_producer_results[task_name] = coord_producer_results
#####
ON TASK profile/Oct4 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.06272237650491297
Mu: 6.272238e-02 +/- 5.164275e-06
Lablace_b: 0.13675267338757877 and 0.26831232495393914
Thresholds: -2.254446812948212 and 2.3295194422397763
#fdrs pass: 0 and 47718
CDFs: 0.9999999562263241 and 0.9997857468648444
Est. FDRs: 0.04976302362660334 and 0.009999971030520126
Got 4951 coords
#####
ON TASK profile/Sox2 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.045344737669453024
Mu: 4.534474e-02 +/- 7.964348e-06
Lablace_b: 0.18949890219485732 and 0.38504940363020723
Thresholds: -2.5902491534743457 and 3.6465112244095654
#fdrs pass: 0 and 19591
CDFs: 0.9999990885487755 and 0.9999132499068857
Est. FDRs: 1.0 and 0.009999964934338964
Got 2377 coords
#####
ON TASK profile/Klf4 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.05034356342628599
Mu: 5.034356e-02 +/- 5.107764e-06
Lablace_b: 0.1337662994634723 and 0.23574372222591358
Thresholds: -1.2848593497222125 and 3.777519037593156
#fdrs pass: 5645 and 33
CDFs: 0.999953757400083 and 0.9999998639556859
Est. FDRs: 0.009992938651624674 and 0.00883926167115202
Got 608 coords
#####
ON TASK profile/Nanog 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.06349483411759138
Manually adjusting thresholds to get desired num seqlets
Mu: 6.349483e-02 +/- 8.054338e-06
Lablace_b: 0.22911074920808383 and 0.6207645179870789
Thresholds: -0.3409210713580251 and 0.46791073959320784
#fdrs pass: 28 and 2
CDFs: 0.8288396863607121 and 0.47872647879138286
Est. FDRs: 0.00862771133685263 and 0.009575170239049921
Got 104405 coords
#####
ON TASK counts/Oct4 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.004830946036614478
Mu: 4.830946e-03 +/- 1.168427e-05
Lablace_b: 0.3600689673539755 and 0.6746920251888032
Thresholds: -4.561612020424567 and 5.411820997306146
#fdrs pass: 0 and 72635
CDFs: 0.9999968938738012 and 0.999669205127915
Est. FDRs: 1.0 and 0.009998468542695912
Got 6778 coords
#####
ON TASK counts/Sox2 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.042713225513696676
Mu: 4.271323e-02 +/- 9.642631e-06
Lablace_b: 0.38259173421045284 and 0.7275008695693094
Thresholds: -4.625033795207739 and 6.7749376899302005
#fdrs pass: 0 and 21095
CDFs: 0.999994971225306 and 0.9999042630018354
Est. FDRs: 1.0 and 0.00999986154862899
Got 2993 coords
#####
ON TASK counts/Klf4 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.14965462397783996
Manually adjusting thresholds to get desired num seqlets
Mu: 1.496546e-01 +/- 7.342227e-06
Lablace_b: 0.48361083330497207 and 0.6047189024093382
Thresholds: -0.07398149657994507 and 0.373290744535625
#fdrs pass: 0 and 0
CDFs: 0.3702484631322891 and 0.30914015620545643
Est. FDRs: 0.12174942285120949 and 1.0
Got 149713 coords
#####
ON TASK counts/Nanog 
######
Computing windowed sums
Computing threshold
peak(mu)= 0.26885830906033514
Manually adjusting thresholds to get desired num seqlets
Mu: 2.688583e-01 +/- 8.386284e-06
Lablace_b: 0.3577641274311097 and 1.0236574462594892
Thresholds: -0.7418581292331219 and 1.2795747473537922
#fdrs pass: 0 and 0
CDFs: 0.9406967767726961 and 0.6274403306677442
Est. FDRs: 0.6151365456437361 and 1.0
Got 71446 coords
In [15]:
from modisco import core

contrib_scores_tracks = [core.DataTrack(name=key+"_contrib_scores",                                     
                                        fwd_tracks=task_to_scores[key],                                 
                                        rev_tracks=[x[::-1, ::-1] for x in                              
                                                    task_to_scores[key]],                               
                                        has_pos_axis=True) for key in task_names]
hypothetical_contribs_tracks = [core.DataTrack(name=key+"_hypothetical_contribs",                   
                                               fwd_tracks=task_to_hyp_scores[key],               
                                               rev_tracks=[x[::-1, ::-1] for x in                   
                                                            task_to_hyp_scores[key]],            
                                               has_pos_axis=True) for key in task_names]                 
onehot_track = core.DataTrack(name="sequence", fwd_tracks=onehot_data,                
                              rev_tracks=[x[::-1, ::-1] for x in onehot_data],        
                              has_pos_axis=True)
track_set = core.TrackSet(data_tracks=contrib_scores_tracks                       
                          +hypothetical_contribs_tracks+[onehot_track])
In [16]:
task_name_to_seqlets = OrderedDict()
for task_name in task_name_to_coord_producer_results:
    coord_producer_results = task_name_to_coord_producer_results[task_name]
    task_name_to_seqlets[task_name] = track_set.create_seqlets(
                                        coords=coord_producer_results.coords)
In [17]:
import itertools

overlap_portion = 0.5
#Create a class that resolves overlaps. overlap_detector
# specifies how to decide if seqlets are overlapping, and
# seqlet_comparator specifies how to pick between
# seqlets that are deemed to be overlapping.
overlap_resolver = core.SeqletsOverlapResolver(                    
            overlap_detector=core.CoordOverlapDetector(overlap_portion),   
            seqlet_comparator=core.SeqletComparator(                            
                                value_provider=lambda x: x.coor.score))

#take the union over everything, resolving overlaps as specified
# by overlap_resolver
final_seqlets = overlap_resolver(itertools.chain(*task_name_to_seqlets.values()))
In [18]:
# load modisco object
In [19]:
grads_pos_valid = {}
grads_neg_valid = {}

for task_name in task_names:
    grads_pos_valid[task_name] = np.concatenate([np.array(fn_pos[task_name]([batch])).squeeze()
                                           for batch in numpy_minibatch(valid[0], 512)])
    grads_neg_valid[task_name] = np.concatenate([np.array(fn_neg[task_name]([batch])).squeeze()
                                           for batch in numpy_minibatch(valid[0], 512)])
In [20]:
# Setup different scores
hyp_scores_valid = {}
scores_valid = {}
for task_name in task_names:
    hyp_scores_valid[task_name] = grads_pos_valid[task_name] + grads_neg_valid[task_name]
    hyp_scores_valid[task_name] = hyp_scores_valid[task_name] - hyp_scores_valid[task_name].mean(-1, keepdims=True)
    scores_valid[task_name] = hyp_scores_valid[task_name] * valid[0]
In [21]:
onehot_data_valid = valid[0]
task_to_scores_valid = scores_valid
task_to_hyp_scores_valid = hyp_scores_valid
In [22]:
import h5py
import modisco
import modisco.util
import modisco.core
import modisco.tfmodisco_workflow.seqlets_to_patterns
from modisco.tfmodisco_workflow import workflow

track_set_valid = modisco.tfmodisco_workflow.workflow.prep_track_set(
    task_names=task_names,
    contrib_scores=task_to_scores_valid,
    hypothetical_contribs=task_to_hyp_scores_valid,
    one_hot=onehot_data_valid)

grp = h5py.File("modisco_results_on_valid.hdf5","r")
loaded_tfmodisco_results =\
    workflow.TfModiscoResults.from_hdf5(grp, track_set=track_set_valid)
grp.close()
In [23]:
# next step sampling N seqlets for each of the motif objects identified by modisco
In [24]:
num_communities = 0
num_samples = 50
U = []
for metacluster_idx in\
    sorted(loaded_tfmodisco_results
           .metacluster_idx_to_submetacluster_results.keys()):
    for pattern in loaded_tfmodisco_results.metacluster_idx_to_submetacluster_results[metacluster_idx].seqlets_to_patterns_result.patterns:
        num_communities += 1
        ids = np.random.choice(len(pattern.seqlets), num_samples-1, replace=False)
        U.append(pattern.to_seqlet())
        for idx in ids:
            U.append(pattern.seqlets[idx])
In [25]:
len(U)
Out[25]:
750
In [26]:
len(final_seqlets)
Out[26]:
144193
In [27]:
# making it smaller because it is taking very long...
#final_seqlets = final_seqlets[:100]
In [31]:
# for testing only
# what proportion of seqlets get mapped to the correct cluster when you set the candidate seqlets to be the motif seqlets?
metacluster_assignments = []
true_assignments = []
final_seqlets = []
for metacluster_idx in\
    sorted(loaded_tfmodisco_results
           .metacluster_idx_to_submetacluster_results.keys()):
    for idx, pattern in enumerate(loaded_tfmodisco_results.metacluster_idx_to_submetacluster_results[metacluster_idx].seqlets_to_patterns_result.patterns):
        final_seqlets.extend(pattern.seqlets[:50])
        true_assignments.extend([idx]*len(pattern.seqlets[:50]))
        metacluster_assignments.extend([metacluster_idx]*len(pattern.seqlets[:50]))
In [32]:
print(num_communities, len(final_seqlets), len(true_assignments), len(metacluster_assignments))
15 750 750 750
In [33]:
# fine grained affmat calculation
from importlib import reload
from modisco import affinitymat
reload(affinitymat.core)
reload(affinitymat)
from modisco import hit_scoring
reload(hit_scoring.fast_hit_scoring)
reload(hit_scoring)
from collections import OrderedDict

pattern_to_scorer = OrderedDict()
pattern_scorers = []
pattern_names = []

seqlet_size_to_score_with = 25

A_motifsseqlets = {}
A_candidateseqlets = {}

for metacluster_idx in\
    sorted(loaded_tfmodisco_results
           .metacluster_idx_to_submetacluster_results.keys()):
    print("now working on metacluster: ", metacluster_idx)
    submetacluster_results =(
        loaded_tfmodisco_results
            .metacluster_idx_to_submetacluster_results[metacluster_idx])
    activity_pattern = submetacluster_results.activity_pattern
    relevant_task_names = [task_name for (task_name,x) in
                           zip(task_names, activity_pattern) if np.abs(x) != 0]
    
    patterns_in_submetacluster =\
        submetacluster_results.seqlets_to_patterns_result.patterns
 
    pattern_comparison_settings = affinitymat.core.PatternComparisonSettings(
        track_names=([x+"_contrib_scores" for x in relevant_task_names]
                     +[x+"_hypothetical_contribs" for x in relevant_task_names]),
        track_transformer=affinitymat.L1Normalizer(),
        min_overlap=0.7)

    pattern_to_seqlets_sim_computer = hit_scoring.PatternsToSeqletsSimComputer(
        pattern_comparison_settings=pattern_comparison_settings,
        cross_metric_computer=\
            affinitymat.core.ParallelCpuCrossMetricOnNNpairs(
                n_cores=10,
                cross_metric_single_region=
                    affinitymat.core.CrossContinJaccardSingleRegionWithArgmax(),
                verbose=False),
        seqlet_trimmer=modisco.hit_scoring.SeqletTrimToBestWindow(
                        window_size=seqlet_size_to_score_with,
                        track_names=[x+"_contrib_scores" for x
                                     in relevant_task_names]))
    
    print("about to get A_motifsseqlets")
    A_motifsseqlets[metacluster_idx] = pattern_to_seqlets_sim_computer(U, U)
    print("about to get A_candidateseqlets")
    A_candidateseqlets[metacluster_idx] = pattern_to_seqlets_sim_computer(final_seqlets, U)
now working on metacluster:  metacluster_0
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_1
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_10
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_11
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_12
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_13
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_2
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_3
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_4
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_5
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_6
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_7
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_8
about to get A_motifsseqlets
about to get A_candidateseqlets
now working on metacluster:  metacluster_9
about to get A_motifsseqlets
about to get A_candidateseqlets
In [34]:
# got a matrix A_motifsseqlets for each metacluster
In [35]:
slim_A_motifsseqlets = {}
slim_A_candidateseqlets = {}

for metacluster_idx in\
    sorted(loaded_tfmodisco_results
           .metacluster_idx_to_submetacluster_results.keys()):
    slim_A_motifsseqlets[metacluster_idx] = A_motifsseqlets[metacluster_idx][:,:,0]
    slim_A_candidateseqlets[metacluster_idx] = A_candidateseqlets[metacluster_idx][:,:,0]
In [36]:
# compute DeltaQ for all the communities,
# and then assign the seqlet to the community
# that gives the highest DeltaQ, as per the formula
# on this page: https://en.wikipedia.org/wiki/Louvain_Modularity#Algorithm
In [37]:
assignments = {}
correct = 0
total = 0
for idx, candidate in enumerate(final_seqlets):
    relevant_metacluster = metacluster_assignments[idx]
    m = np.sum(slim_A_motifsseqlets[relevant_metacluster])
    k_i = np.sum(slim_A_candidateseqlets[relevant_metacluster][idx,:])
    max_delta_q = float("-inf")
    best_assignment = -1
    for i in range(num_communities):
        Sigma_in = np.sum(slim_A_motifsseqlets[relevant_metacluster][(i*num_samples):((i+1)*num_samples), (i*num_samples):((i+1)*num_samples)])
        Sigma_tot = np.sum(slim_A_motifsseqlets[relevant_metacluster][(i*num_samples):((i+1)*num_samples), :])
        k_i_in = np.sum(slim_A_candidateseqlets[relevant_metacluster][idx,(i*num_samples):((i+1)*num_samples)])
        delta_q = (((Sigma_in+(2*k_i_in))/(2*m))-(((Sigma_tot+k_i)/(2*m))**2))-(((Sigma_in)/(2*m))-((Sigma_tot)/(2*m))**2-((k_i)/(2*m))**2)
        if delta_q >= max_delta_q:
            max_delta_q = delta_q
            best_assignment = i
    print("we assigned candidate ", idx, " to community ", best_assignment)
    if (true_assignments[idx] == best_assignment):
        correct += 1
    total += 1
we assigned candidate  0  to community  0
we assigned candidate  1  to community  0
we assigned candidate  2  to community  0
we assigned candidate  3  to community  0
we assigned candidate  4  to community  0
we assigned candidate  5  to community  0
we assigned candidate  6  to community  0
we assigned candidate  7  to community  0
we assigned candidate  8  to community  0
we assigned candidate  9  to community  0
we assigned candidate  10  to community  0
we assigned candidate  11  to community  0
we assigned candidate  12  to community  0
we assigned candidate  13  to community  0
we assigned candidate  14  to community  0
we assigned candidate  15  to community  0
we assigned candidate  16  to community  0
we assigned candidate  17  to community  0
we assigned candidate  18  to community  0
we assigned candidate  19  to community  0
we assigned candidate  20  to community  0
we assigned candidate  21  to community  0
we assigned candidate  22  to community  0
we assigned candidate  23  to community  0
we assigned candidate  24  to community  0
we assigned candidate  25  to community  0
we assigned candidate  26  to community  0
we assigned candidate  27  to community  0
we assigned candidate  28  to community  0
we assigned candidate  29  to community  0
we assigned candidate  30  to community  0
we assigned candidate  31  to community  0
we assigned candidate  32  to community  0
we assigned candidate  33  to community  0
we assigned candidate  34  to community  0
we assigned candidate  35  to community  0
we assigned candidate  36  to community  0
we assigned candidate  37  to community  0
we assigned candidate  38  to community  0
we assigned candidate  39  to community  0
we assigned candidate  40  to community  0
we assigned candidate  41  to community  0
we assigned candidate  42  to community  0
we assigned candidate  43  to community  0
we assigned candidate  44  to community  0
we assigned candidate  45  to community  0
we assigned candidate  46  to community  0
we assigned candidate  47  to community  0
we assigned candidate  48  to community  0
we assigned candidate  49  to community  0
we assigned candidate  50  to community  1
we assigned candidate  51  to community  1
we assigned candidate  52  to community  1
we assigned candidate  53  to community  1
we assigned candidate  54  to community  1
we assigned candidate  55  to community  1
we assigned candidate  56  to community  1
we assigned candidate  57  to community  1
we assigned candidate  58  to community  1
we assigned candidate  59  to community  1
we assigned candidate  60  to community  1
we assigned candidate  61  to community  1
we assigned candidate  62  to community  1
we assigned candidate  63  to community  1
we assigned candidate  64  to community  1
we assigned candidate  65  to community  1
we assigned candidate  66  to community  1
we assigned candidate  67  to community  1
we assigned candidate  68  to community  1
we assigned candidate  69  to community  1
we assigned candidate  70  to community  1
we assigned candidate  71  to community  1
we assigned candidate  72  to community  1
we assigned candidate  73  to community  1
we assigned candidate  74  to community  1
we assigned candidate  75  to community  1
we assigned candidate  76  to community  1
we assigned candidate  77  to community  1
we assigned candidate  78  to community  1
we assigned candidate  79  to community  1
we assigned candidate  80  to community  1
we assigned candidate  81  to community  1
we assigned candidate  82  to community  1
we assigned candidate  83  to community  1
we assigned candidate  84  to community  1
we assigned candidate  85  to community  1
we assigned candidate  86  to community  1
we assigned candidate  87  to community  1
we assigned candidate  88  to community  1
we assigned candidate  89  to community  1
we assigned candidate  90  to community  1
we assigned candidate  91  to community  1
we assigned candidate  92  to community  1
we assigned candidate  93  to community  1
we assigned candidate  94  to community  1
we assigned candidate  95  to community  1
we assigned candidate  96  to community  1
we assigned candidate  97  to community  1
we assigned candidate  98  to community  1
we assigned candidate  99  to community  1
we assigned candidate  100  to community  5
we assigned candidate  101  to community  2
we assigned candidate  102  to community  5
we assigned candidate  103  to community  5
we assigned candidate  104  to community  5
we assigned candidate  105  to community  5
we assigned candidate  106  to community  0
we assigned candidate  107  to community  5
we assigned candidate  108  to community  0
we assigned candidate  109  to community  8
we assigned candidate  110  to community  5
we assigned candidate  111  to community  0
we assigned candidate  112  to community  5
we assigned candidate  113  to community  8
we assigned candidate  114  to community  5
we assigned candidate  115  to community  2
we assigned candidate  116  to community  5
we assigned candidate  117  to community  8
we assigned candidate  118  to community  5
we assigned candidate  119  to community  0
we assigned candidate  120  to community  5
we assigned candidate  121  to community  5
we assigned candidate  122  to community  5
we assigned candidate  123  to community  5
we assigned candidate  124  to community  5
we assigned candidate  125  to community  8
we assigned candidate  126  to community  5
we assigned candidate  127  to community  0
we assigned candidate  128  to community  0
we assigned candidate  129  to community  5
we assigned candidate  130  to community  8
we assigned candidate  131  to community  2
we assigned candidate  132  to community  5
we assigned candidate  133  to community  2
we assigned candidate  134  to community  5
we assigned candidate  135  to community  2
we assigned candidate  136  to community  2
we assigned candidate  137  to community  8
we assigned candidate  138  to community  12
we assigned candidate  139  to community  0
we assigned candidate  140  to community  0
we assigned candidate  141  to community  2
we assigned candidate  142  to community  2
we assigned candidate  143  to community  5
we assigned candidate  144  to community  2
we assigned candidate  145  to community  5
we assigned candidate  146  to community  2
we assigned candidate  147  to community  2
we assigned candidate  148  to community  5
we assigned candidate  149  to community  0
we assigned candidate  150  to community  3
we assigned candidate  151  to community  11
we assigned candidate  152  to community  11
we assigned candidate  153  to community  11
we assigned candidate  154  to community  10
we assigned candidate  155  to community  11
we assigned candidate  156  to community  3
we assigned candidate  157  to community  11
we assigned candidate  158  to community  10
we assigned candidate  159  to community  11
we assigned candidate  160  to community  11
we assigned candidate  161  to community  11
we assigned candidate  162  to community  11
we assigned candidate  163  to community  3
we assigned candidate  164  to community  10
we assigned candidate  165  to community  11
we assigned candidate  166  to community  3
we assigned candidate  167  to community  3
we assigned candidate  168  to community  11
we assigned candidate  169  to community  11
we assigned candidate  170  to community  3
we assigned candidate  171  to community  10
we assigned candidate  172  to community  11
we assigned candidate  173  to community  10
we assigned candidate  174  to community  10
we assigned candidate  175  to community  11
we assigned candidate  176  to community  11
we assigned candidate  177  to community  11
we assigned candidate  178  to community  11
we assigned candidate  179  to community  11
we assigned candidate  180  to community  10
we assigned candidate  181  to community  11
we assigned candidate  182  to community  11
we assigned candidate  183  to community  10
we assigned candidate  184  to community  11
we assigned candidate  185  to community  11
we assigned candidate  186  to community  11
we assigned candidate  187  to community  10
we assigned candidate  188  to community  10
we assigned candidate  189  to community  11
we assigned candidate  190  to community  10
we assigned candidate  191  to community  10
we assigned candidate  192  to community  3
we assigned candidate  193  to community  3
we assigned candidate  194  to community  10
we assigned candidate  195  to community  11
we assigned candidate  196  to community  3
we assigned candidate  197  to community  3
we assigned candidate  198  to community  11
we assigned candidate  199  to community  11
we assigned candidate  200  to community  4
we assigned candidate  201  to community  4
we assigned candidate  202  to community  4
we assigned candidate  203  to community  4
we assigned candidate  204  to community  4
we assigned candidate  205  to community  4
we assigned candidate  206  to community  4
we assigned candidate  207  to community  4
we assigned candidate  208  to community  4
we assigned candidate  209  to community  4
we assigned candidate  210  to community  4
we assigned candidate  211  to community  4
we assigned candidate  212  to community  4
we assigned candidate  213  to community  4
we assigned candidate  214  to community  4
we assigned candidate  215  to community  4
we assigned candidate  216  to community  4
we assigned candidate  217  to community  4
we assigned candidate  218  to community  4
we assigned candidate  219  to community  4
we assigned candidate  220  to community  4
we assigned candidate  221  to community  4
we assigned candidate  222  to community  4
we assigned candidate  223  to community  4
we assigned candidate  224  to community  4
we assigned candidate  225  to community  4
we assigned candidate  226  to community  4
we assigned candidate  227  to community  4
we assigned candidate  228  to community  4
we assigned candidate  229  to community  4
we assigned candidate  230  to community  4
we assigned candidate  231  to community  4
we assigned candidate  232  to community  4
we assigned candidate  233  to community  4
we assigned candidate  234  to community  4
we assigned candidate  235  to community  4
we assigned candidate  236  to community  4
we assigned candidate  237  to community  4
we assigned candidate  238  to community  4
we assigned candidate  239  to community  4
we assigned candidate  240  to community  4
we assigned candidate  241  to community  4
we assigned candidate  242  to community  4
we assigned candidate  243  to community  4
we assigned candidate  244  to community  4
we assigned candidate  245  to community  4
we assigned candidate  246  to community  4
we assigned candidate  247  to community  1
we assigned candidate  248  to community  4
we assigned candidate  249  to community  4
we assigned candidate  250  to community  8
we assigned candidate  251  to community  5
we assigned candidate  252  to community  8
we assigned candidate  253  to community  5
we assigned candidate  254  to community  5
we assigned candidate  255  to community  8
we assigned candidate  256  to community  5
we assigned candidate  257  to community  0
we assigned candidate  258  to community  5
we assigned candidate  259  to community  5
we assigned candidate  260  to community  8
we assigned candidate  261  to community  8
we assigned candidate  262  to community  5
we assigned candidate  263  to community  5
we assigned candidate  264  to community  8
we assigned candidate  265  to community  8
we assigned candidate  266  to community  0
we assigned candidate  267  to community  8
we assigned candidate  268  to community  5
we assigned candidate  269  to community  5
we assigned candidate  270  to community  5
we assigned candidate  271  to community  8
we assigned candidate  272  to community  0
we assigned candidate  273  to community  5
we assigned candidate  274  to community  5
we assigned candidate  275  to community  5
we assigned candidate  276  to community  8
we assigned candidate  277  to community  8
we assigned candidate  278  to community  0
we assigned candidate  279  to community  5
we assigned candidate  280  to community  5
we assigned candidate  281  to community  5
we assigned candidate  282  to community  5
we assigned candidate  283  to community  8
we assigned candidate  284  to community  5
we assigned candidate  285  to community  5
we assigned candidate  286  to community  5
we assigned candidate  287  to community  5
we assigned candidate  288  to community  8
we assigned candidate  289  to community  0
we assigned candidate  290  to community  5
we assigned candidate  291  to community  12
we assigned candidate  292  to community  8
we assigned candidate  293  to community  8
we assigned candidate  294  to community  5
we assigned candidate  295  to community  5
we assigned candidate  296  to community  5
we assigned candidate  297  to community  5
we assigned candidate  298  to community  5
we assigned candidate  299  to community  8
we assigned candidate  300  to community  6
we assigned candidate  301  to community  6
we assigned candidate  302  to community  12
we assigned candidate  303  to community  12
we assigned candidate  304  to community  12
we assigned candidate  305  to community  5
we assigned candidate  306  to community  6
we assigned candidate  307  to community  6
we assigned candidate  308  to community  0
we assigned candidate  309  to community  12
we assigned candidate  310  to community  12
we assigned candidate  311  to community  12
we assigned candidate  312  to community  0
we assigned candidate  313  to community  12
we assigned candidate  314  to community  8
we assigned candidate  315  to community  8
we assigned candidate  316  to community  8
we assigned candidate  317  to community  0
we assigned candidate  318  to community  0
we assigned candidate  319  to community  8
we assigned candidate  320  to community  8
we assigned candidate  321  to community  12
we assigned candidate  322  to community  12
we assigned candidate  323  to community  12
we assigned candidate  324  to community  12
we assigned candidate  325  to community  12
we assigned candidate  326  to community  8
we assigned candidate  327  to community  12
we assigned candidate  328  to community  0
we assigned candidate  329  to community  0
we assigned candidate  330  to community  12
we assigned candidate  331  to community  0
we assigned candidate  332  to community  0
we assigned candidate  333  to community  0
we assigned candidate  334  to community  0
we assigned candidate  335  to community  12
we assigned candidate  336  to community  6
we assigned candidate  337  to community  12
we assigned candidate  338  to community  0
we assigned candidate  339  to community  12
we assigned candidate  340  to community  0
we assigned candidate  341  to community  12
we assigned candidate  342  to community  0
we assigned candidate  343  to community  8
we assigned candidate  344  to community  8
we assigned candidate  345  to community  8
we assigned candidate  346  to community  0
we assigned candidate  347  to community  8
we assigned candidate  348  to community  6
we assigned candidate  349  to community  6
we assigned candidate  350  to community  4
we assigned candidate  351  to community  7
we assigned candidate  352  to community  4
we assigned candidate  353  to community  4
we assigned candidate  354  to community  4
we assigned candidate  355  to community  4
we assigned candidate  356  to community  4
we assigned candidate  357  to community  4
we assigned candidate  358  to community  4
we assigned candidate  359  to community  4
we assigned candidate  360  to community  14
we assigned candidate  361  to community  4
we assigned candidate  362  to community  4
we assigned candidate  363  to community  4
we assigned candidate  364  to community  4
we assigned candidate  365  to community  4
we assigned candidate  366  to community  4
we assigned candidate  367  to community  4
we assigned candidate  368  to community  4
we assigned candidate  369  to community  4
we assigned candidate  370  to community  4
we assigned candidate  371  to community  4
we assigned candidate  372  to community  4
we assigned candidate  373  to community  14
we assigned candidate  374  to community  4
we assigned candidate  375  to community  4
we assigned candidate  376  to community  4
we assigned candidate  377  to community  4
we assigned candidate  378  to community  4
we assigned candidate  379  to community  4
we assigned candidate  380  to community  4
we assigned candidate  381  to community  4
we assigned candidate  382  to community  4
we assigned candidate  383  to community  4
we assigned candidate  384  to community  4
we assigned candidate  385  to community  4
we assigned candidate  386  to community  4
we assigned candidate  387  to community  4
we assigned candidate  388  to community  4
we assigned candidate  389  to community  4
we assigned candidate  390  to community  4
we assigned candidate  391  to community  4
we assigned candidate  392  to community  4
we assigned candidate  393  to community  4
we assigned candidate  394  to community  4
we assigned candidate  395  to community  7
we assigned candidate  396  to community  4
we assigned candidate  397  to community  4
we assigned candidate  398  to community  4
we assigned candidate  399  to community  4
we assigned candidate  400  to community  8
we assigned candidate  401  to community  8
we assigned candidate  402  to community  8
we assigned candidate  403  to community  8
we assigned candidate  404  to community  8
we assigned candidate  405  to community  8
we assigned candidate  406  to community  8
we assigned candidate  407  to community  8
we assigned candidate  408  to community  8
we assigned candidate  409  to community  8
we assigned candidate  410  to community  8
we assigned candidate  411  to community  8
we assigned candidate  412  to community  8
we assigned candidate  413  to community  8
we assigned candidate  414  to community  8
we assigned candidate  415  to community  8
we assigned candidate  416  to community  8
we assigned candidate  417  to community  8
we assigned candidate  418  to community  8
we assigned candidate  419  to community  8
we assigned candidate  420  to community  8
we assigned candidate  421  to community  8
we assigned candidate  422  to community  8
we assigned candidate  423  to community  8
we assigned candidate  424  to community  8
we assigned candidate  425  to community  8
we assigned candidate  426  to community  8
we assigned candidate  427  to community  8
we assigned candidate  428  to community  8
we assigned candidate  429  to community  8
we assigned candidate  430  to community  8
we assigned candidate  431  to community  8
we assigned candidate  432  to community  8
we assigned candidate  433  to community  8
we assigned candidate  434  to community  8
we assigned candidate  435  to community  8
we assigned candidate  436  to community  8
we assigned candidate  437  to community  8
we assigned candidate  438  to community  8
we assigned candidate  439  to community  8
we assigned candidate  440  to community  8
we assigned candidate  441  to community  8
we assigned candidate  442  to community  8
we assigned candidate  443  to community  8
we assigned candidate  444  to community  8
we assigned candidate  445  to community  8
we assigned candidate  446  to community  8
we assigned candidate  447  to community  8
we assigned candidate  448  to community  8
we assigned candidate  449  to community  8
we assigned candidate  450  to community  10
we assigned candidate  451  to community  11
we assigned candidate  452  to community  11
we assigned candidate  453  to community  10
we assigned candidate  454  to community  11
we assigned candidate  455  to community  10
we assigned candidate  456  to community  10
we assigned candidate  457  to community  10
we assigned candidate  458  to community  11
we assigned candidate  459  to community  11
we assigned candidate  460  to community  10
we assigned candidate  461  to community  10
we assigned candidate  462  to community  11
we assigned candidate  463  to community  11
we assigned candidate  464  to community  9
we assigned candidate  465  to community  10
we assigned candidate  466  to community  11
we assigned candidate  467  to community  4
we assigned candidate  468  to community  11
we assigned candidate  469  to community  11
we assigned candidate  470  to community  10
we assigned candidate  471  to community  11
we assigned candidate  472  to community  10
we assigned candidate  473  to community  3
we assigned candidate  474  to community  9
we assigned candidate  475  to community  11
we assigned candidate  476  to community  9
we assigned candidate  477  to community  11
we assigned candidate  478  to community  11
we assigned candidate  479  to community  10
we assigned candidate  480  to community  3
we assigned candidate  481  to community  3
we assigned candidate  482  to community  11
we assigned candidate  483  to community  10
we assigned candidate  484  to community  11
we assigned candidate  485  to community  3
we assigned candidate  486  to community  11
we assigned candidate  487  to community  3
we assigned candidate  488  to community  11
we assigned candidate  489  to community  10
we assigned candidate  490  to community  11
we assigned candidate  491  to community  3
we assigned candidate  492  to community  10
we assigned candidate  493  to community  11
we assigned candidate  494  to community  3
we assigned candidate  495  to community  3
we assigned candidate  496  to community  10
we assigned candidate  497  to community  9
we assigned candidate  498  to community  11
we assigned candidate  499  to community  11
we assigned candidate  500  to community  10
we assigned candidate  501  to community  10
we assigned candidate  502  to community  10
we assigned candidate  503  to community  10
we assigned candidate  504  to community  10
we assigned candidate  505  to community  10
we assigned candidate  506  to community  10
we assigned candidate  507  to community  10
we assigned candidate  508  to community  10
we assigned candidate  509  to community  10
we assigned candidate  510  to community  10
we assigned candidate  511  to community  10
we assigned candidate  512  to community  10
we assigned candidate  513  to community  10
we assigned candidate  514  to community  10
we assigned candidate  515  to community  10
we assigned candidate  516  to community  11
we assigned candidate  517  to community  10
we assigned candidate  518  to community  10
we assigned candidate  519  to community  10
we assigned candidate  520  to community  10
we assigned candidate  521  to community  10
we assigned candidate  522  to community  10
we assigned candidate  523  to community  10
we assigned candidate  524  to community  10
we assigned candidate  525  to community  10
we assigned candidate  526  to community  10
we assigned candidate  527  to community  10
we assigned candidate  528  to community  10
we assigned candidate  529  to community  10
we assigned candidate  530  to community  10
we assigned candidate  531  to community  10
we assigned candidate  532  to community  10
we assigned candidate  533  to community  10
we assigned candidate  534  to community  10
we assigned candidate  535  to community  10
we assigned candidate  536  to community  10
we assigned candidate  537  to community  10
we assigned candidate  538  to community  10
we assigned candidate  539  to community  10
we assigned candidate  540  to community  10
we assigned candidate  541  to community  10
we assigned candidate  542  to community  10
we assigned candidate  543  to community  10
we assigned candidate  544  to community  10
we assigned candidate  545  to community  10
we assigned candidate  546  to community  10
we assigned candidate  547  to community  10
we assigned candidate  548  to community  10
we assigned candidate  549  to community  10
we assigned candidate  550  to community  10
we assigned candidate  551  to community  11
we assigned candidate  552  to community  11
we assigned candidate  553  to community  11
we assigned candidate  554  to community  10
we assigned candidate  555  to community  10
we assigned candidate  556  to community  11
we assigned candidate  557  to community  11
we assigned candidate  558  to community  11
we assigned candidate  559  to community  10
we assigned candidate  560  to community  11
we assigned candidate  561  to community  11
we assigned candidate  562  to community  11
we assigned candidate  563  to community  11
we assigned candidate  564  to community  10
we assigned candidate  565  to community  11
we assigned candidate  566  to community  10
we assigned candidate  567  to community  10
we assigned candidate  568  to community  11
we assigned candidate  569  to community  11
we assigned candidate  570  to community  11
we assigned candidate  571  to community  10
we assigned candidate  572  to community  10
we assigned candidate  573  to community  10
we assigned candidate  574  to community  11
we assigned candidate  575  to community  11
we assigned candidate  576  to community  11
we assigned candidate  577  to community  10
we assigned candidate  578  to community  11
we assigned candidate  579  to community  10
we assigned candidate  580  to community  11
we assigned candidate  581  to community  11
we assigned candidate  582  to community  11
we assigned candidate  583  to community  11
we assigned candidate  584  to community  11
we assigned candidate  585  to community  10
we assigned candidate  586  to community  10
we assigned candidate  587  to community  11
we assigned candidate  588  to community  11
we assigned candidate  589  to community  11
we assigned candidate  590  to community  10
we assigned candidate  591  to community  10
we assigned candidate  592  to community  11
we assigned candidate  593  to community  11
we assigned candidate  594  to community  10
we assigned candidate  595  to community  10
we assigned candidate  596  to community  11
we assigned candidate  597  to community  11
we assigned candidate  598  to community  11
we assigned candidate  599  to community  10
we assigned candidate  600  to community  12
we assigned candidate  601  to community  12
we assigned candidate  602  to community  12
we assigned candidate  603  to community  12
we assigned candidate  604  to community  12
we assigned candidate  605  to community  12
we assigned candidate  606  to community  12
we assigned candidate  607  to community  12
we assigned candidate  608  to community  12
we assigned candidate  609  to community  12
we assigned candidate  610  to community  12
we assigned candidate  611  to community  12
we assigned candidate  612  to community  0
we assigned candidate  613  to community  12
we assigned candidate  614  to community  12
we assigned candidate  615  to community  12
we assigned candidate  616  to community  0
we assigned candidate  617  to community  12
we assigned candidate  618  to community  12
we assigned candidate  619  to community  12
we assigned candidate  620  to community  12
we assigned candidate  621  to community  12
we assigned candidate  622  to community  12
we assigned candidate  623  to community  12
we assigned candidate  624  to community  12
we assigned candidate  625  to community  12
we assigned candidate  626  to community  12
we assigned candidate  627  to community  12
we assigned candidate  628  to community  5
we assigned candidate  629  to community  12
we assigned candidate  630  to community  2
we assigned candidate  631  to community  0
we assigned candidate  632  to community  12
we assigned candidate  633  to community  12
we assigned candidate  634  to community  12
we assigned candidate  635  to community  0
we assigned candidate  636  to community  12
we assigned candidate  637  to community  12
we assigned candidate  638  to community  0
we assigned candidate  639  to community  12
we assigned candidate  640  to community  12
we assigned candidate  641  to community  12
we assigned candidate  642  to community  12
we assigned candidate  643  to community  12
we assigned candidate  644  to community  12
we assigned candidate  645  to community  12
we assigned candidate  646  to community  12
we assigned candidate  647  to community  12
we assigned candidate  648  to community  12
we assigned candidate  649  to community  12
we assigned candidate  650  to community  13
we assigned candidate  651  to community  0
we assigned candidate  652  to community  13
we assigned candidate  653  to community  0
we assigned candidate  654  to community  13
we assigned candidate  655  to community  1
we assigned candidate  656  to community  13
we assigned candidate  657  to community  13
we assigned candidate  658  to community  13
we assigned candidate  659  to community  13
we assigned candidate  660  to community  13
we assigned candidate  661  to community  13
we assigned candidate  662  to community  4
we assigned candidate  663  to community  0
we assigned candidate  664  to community  0
we assigned candidate  665  to community  0
we assigned candidate  666  to community  0
we assigned candidate  667  to community  13
we assigned candidate  668  to community  13
we assigned candidate  669  to community  0
we assigned candidate  670  to community  6
we assigned candidate  671  to community  0
we assigned candidate  672  to community  13
we assigned candidate  673  to community  13
we assigned candidate  674  to community  0
we assigned candidate  675  to community  13
we assigned candidate  676  to community  0
we assigned candidate  677  to community  13
we assigned candidate  678  to community  13
we assigned candidate  679  to community  13
we assigned candidate  680  to community  13
we assigned candidate  681  to community  13
we assigned candidate  682  to community  0
we assigned candidate  683  to community  0
we assigned candidate  684  to community  6
we assigned candidate  685  to community  13
we assigned candidate  686  to community  13
we assigned candidate  687  to community  13
we assigned candidate  688  to community  0
we assigned candidate  689  to community  13
we assigned candidate  690  to community  13
we assigned candidate  691  to community  13
we assigned candidate  692  to community  0
we assigned candidate  693  to community  13
we assigned candidate  694  to community  13
we assigned candidate  695  to community  0
we assigned candidate  696  to community  13
we assigned candidate  697  to community  4
we assigned candidate  698  to community  8
we assigned candidate  699  to community  0
we assigned candidate  700  to community  4
we assigned candidate  701  to community  14
we assigned candidate  702  to community  4
we assigned candidate  703  to community  4
we assigned candidate  704  to community  4
we assigned candidate  705  to community  4
we assigned candidate  706  to community  4
we assigned candidate  707  to community  4
we assigned candidate  708  to community  4
we assigned candidate  709  to community  14
we assigned candidate  710  to community  4
we assigned candidate  711  to community  4
we assigned candidate  712  to community  4
we assigned candidate  713  to community  4
we assigned candidate  714  to community  4
we assigned candidate  715  to community  4
we assigned candidate  716  to community  4
we assigned candidate  717  to community  4
we assigned candidate  718  to community  4
we assigned candidate  719  to community  4
we assigned candidate  720  to community  4
we assigned candidate  721  to community  4
we assigned candidate  722  to community  4
we assigned candidate  723  to community  4
we assigned candidate  724  to community  4
we assigned candidate  725  to community  4
we assigned candidate  726  to community  4
we assigned candidate  727  to community  14
we assigned candidate  728  to community  14
we assigned candidate  729  to community  14
we assigned candidate  730  to community  4
we assigned candidate  731  to community  14
we assigned candidate  732  to community  4
we assigned candidate  733  to community  4
we assigned candidate  734  to community  4
we assigned candidate  735  to community  4
we assigned candidate  736  to community  4
we assigned candidate  737  to community  4
we assigned candidate  738  to community  4
we assigned candidate  739  to community  4
we assigned candidate  740  to community  4
we assigned candidate  741  to community  4
we assigned candidate  742  to community  4
we assigned candidate  743  to community  4
we assigned candidate  744  to community  4
we assigned candidate  745  to community  4
we assigned candidate  746  to community  4
we assigned candidate  747  to community  14
we assigned candidate  748  to community  4
we assigned candidate  749  to community  14
In [38]:
correct/total
Out[38]:
0.16
In [ ]:
 
In [ ]: