In [1]:
import DSGRN
import time
import sys

class PQNetworkAnalyzer:
    def __init__(self, network, P):
        self.network = network
        self.P_index = network.index(P)
        self.parametergraph = DSGRN.ParameterGraph(network)

    def AnalyzeParameter(self, parameterindex):
        parameter = self.parametergraph.parameter(parameterindex)
        dg = DSGRN.DomainGraph(parameter)
        md = DSGRN.MorseDecomposition(dg.digraph())
        mg = DSGRN.MorseGraph(dg, md)
        return mg

    def is_FP(self, annotation):
        return annotation.startswith("FP")

    def is_quiescent_FP(self, annotation):
        if self.is_FP(annotation):
            digits = [int(s) for s in annotation.replace(",", "").split() if s.isdigit()]
            if digits[self.P_index] == 0:
                return True
        return False

    def is_proliferative_FP(self, annotation):
        if self.is_FP(annotation):
            digits = [int(s) for s in annotation.replace(",", "").split() if s.isdigit()]
            if digits[self.P_index] >= 1:
                return True
        return False

    def AnalyzeMorseGraph(self, mg):
        mg_poset = mg.poset()
        stable_annotations = [ mg.annotation(i)[0] for i in range(0,mg.poset().size()) if len(mg.poset().children(i)) == 0]
        monostable = len(stable_annotations) == 1
        quiescent = any( self.is_quiescent_FP(annotation) for annotation in stable_annotations )
        proliferative = any( self.is_proliferative_FP(annotation) for annotation in stable_annotations )
        if monostable and quiescent:
            return 'Q'
        if monostable and proliferative:
            return 'P'
        if quiescent and proliferative:
            return 'B'
        if quiescent:
            return 'q'
        if proliferative:
            return 'p'
        return 'O'

    def Classify(self, parameterindex):
        analyzed_param = self.AnalyzeParameter(parameterindex)
        ret_val = self.AnalyzeMorseGraph(analyzed_param) 
        return ret_val

def topological_sort(graph):
    """
    Return list of vertices in (reverse) topologically sorted order
    """
    result = []
    explored = set()
    dfs_stack = [ (v,0) for v in range(0,graph.num_vertices())]
    while dfs_stack:
        (v,i) = dfs_stack.pop()
        if (v,i) in explored: continue
        explored.add((v,i))
        if i == 0: # preordering visit
            dfs_stack.extend([(v,1)] + [ (u,0) for u in graph.unlabelled_adjacencies(v) if u != v ])
        elif i == 1: # postordering visit
            result.append(v)
    return result

def count_paths(graph):
    """
    returns card{ (u,v) : source(u) & target(v) & there is an allowed path from u to v}
    """
    ts = topological_sort(graph)
    paths = {}
    result = 0
    for v in ts:
        paths[v] = sum([ paths[u] for u in graph.unlabelled_adjacencies(v) if u != v]) + ( 1 if v == graph.final() else 0)
        if v == graph.initial(): result += paths[v]
    return result
    
class PartialPathAutomata:
    def __init__(self, network, S, P):
        self.network = network 
        self.analyzer = PQNetworkAnalyzer(self.network, P)
        self.query = DSGRN.NewComputeSingleGeneQuery(network,S,lambda pi : self.analyzer.Classify(pi))

    def __call__(self,reduced_parameter_index):
        searchautomaton = self.query(reduced_parameter_index)
        start = searchautomaton.add_vertex()
        stop = searchautomaton.final()
        for i in range(0,searchautomaton.num_vertices()):
            if i != stop: searchautomaton.add_edge(start,i,' ')
            if i != start and i != stop: 
                label = self.analyzer.Classify(self.query.full_parameter_index(reduced_parameter_index,i))
                searchautomaton.add_edge(i,stop,label)
        searchautomaton.set_initial(start)
        searchautomaton.set_final(stop)
        return searchautomaton
    
class FullPathAutomata:
    def __init__(self, network, S, P):
        self.network = network 
        self.analyzer = PQNetworkAnalyzer(self.network, P)
        self.query = DSGRN.NewComputeSingleGeneQuery(network,S,lambda pi : self.analyzer.Classify(pi))

    def __call__(self,reduced_parameter_index):
        searchautomaton = self.query(reduced_parameter_index)
        return searchautomaton
    
class ReducedParameterGraphQuery:
    def __init__(self, searchautomata, queryautomaton):
        self.searchautomata = searchautomata 
        self.queryautomaton = queryautomaton

    def __call__(self,reduced_parameter_index):
        (intersection, proj) = DSGRN.NFA.intersect(self.queryautomaton, self.searchautomata(reduced_parameter_index))
        return count_paths(intersection)

    def num_paths(self):
        return count_paths(self.searchautomata(0))
    

def WorkJob(network_specification_file, partial_hysteresis_output_file, partial_resettable_output_file,
            full_hysteresis_output_file, full_resettable_output_file, starting_rpi, ending_rpi, S, P ):
    def RunQueries(query, filename):
        start_time = time.time()
        result = 0    
        for rpi in range(starting_rpi, ending_rpi):
            number_of_matches = query(rpi)
            #    DSGRN.LogToSTDOUT("Reduced parameter " + str(rpi) + " has " + str(number_of_matches) + " matches for query " + query.__class__.__name__)
            result += number_of_matches
            if (rpi - starting_rpi) % 1 == 0:
                DSGRN.LogToSTDOUT("Processed from " + str(starting_rpi) + " to " + str(rpi) + " out of " + str(ending_rpi))
        normalization = (ending_rpi - starting_rpi)*query.num_paths() 
        with open(filename, 'w') as outfile:
            outfile.write(str(result) + " " + str(normalization) + "\n")
        with open(filename + ".log", 'w') as outfile:
            outfile.write(str(time.time() - start_time) + '\n')

    # Queries to run
    network = DSGRN.Network(network_specification_file)
    DSGRN.LogToSTDOUT("Parameter graph has " + str(DSGRN.ParameterGraph(network).size()) + " parameters. ")

    PPA = PartialPathAutomata(network, S, P)
    FPA = FullPathAutomata(network, S, P)
    HysA = DSGRN.CompileRegexToNFA("Q(Q|q)*B+(P|p)*P")
    ResA = DSGRN.CompileRegexToNFA("Q(Q|q)*B+")

    PHQ = ReducedParameterGraphQuery(PPA, HysA)
    PRQ = ReducedParameterGraphQuery(PPA, ResA)
    FHQ = ReducedParameterGraphQuery(FPA, HysA)
    FRQ = ReducedParameterGraphQuery(FPA, ResA)
    
    RunQueries(PHQ, partial_hysteresis_output_file)
    RunQueries(PRQ, partial_resettable_output_file)
    RunQueries(FHQ, full_hysteresis_output_file)
    RunQueries(FRQ, full_resettable_output_file)

In [2]:
%%time
spec = """
X : (X+Y)
Y : (X+Z)
Z : X
"""
net = DSGRN.Network(spec)
N = DSGRN.ParameterGraph(net).size()//len(DSGRN.ParameterGraph(net).factorgraph(0))
WorkJob(spec, "pho.txt","pro.txt","fho.txt","fro.txt",0,N,'X','Z')


2018-05-29 13:37:52.359894:
Parameter graph has 5400 parameters. 
2018-05-29 13:37:52.380631:
Processed from 0 to 0 out of 108
2018-05-29 13:37:52.398936:
Processed from 0 to 1 out of 108
2018-05-29 13:37:52.418204:
Processed from 0 to 2 out of 108
2018-05-29 13:37:52.437130:
Processed from 0 to 3 out of 108
2018-05-29 13:37:52.456598:
Processed from 0 to 4 out of 108
2018-05-29 13:37:52.475728:
Processed from 0 to 5 out of 108
2018-05-29 13:37:52.497717:
Processed from 0 to 6 out of 108
2018-05-29 13:37:52.523464:
Processed from 0 to 7 out of 108
2018-05-29 13:37:52.546281:
Processed from 0 to 8 out of 108
2018-05-29 13:37:52.575675:
Processed from 0 to 9 out of 108
2018-05-29 13:37:52.601162:
Processed from 0 to 10 out of 108
2018-05-29 13:37:52.627326:
Processed from 0 to 11 out of 108
2018-05-29 13:37:52.647686:
Processed from 0 to 12 out of 108
2018-05-29 13:37:52.673551:
Processed from 0 to 13 out of 108
2018-05-29 13:37:52.694645:
Processed from 0 to 14 out of 108
2018-05-29 13:37:52.715681:
Processed from 0 to 15 out of 108
2018-05-29 13:37:52.738681:
Processed from 0 to 16 out of 108
2018-05-29 13:37:52.759064:
Processed from 0 to 17 out of 108
2018-05-29 13:37:52.781626:
Processed from 0 to 18 out of 108
2018-05-29 13:37:52.804403:
Processed from 0 to 19 out of 108
2018-05-29 13:37:52.823766:
Processed from 0 to 20 out of 108
2018-05-29 13:37:52.846587:
Processed from 0 to 21 out of 108
2018-05-29 13:37:52.870449:
Processed from 0 to 22 out of 108
2018-05-29 13:37:52.892652:
Processed from 0 to 23 out of 108
2018-05-29 13:37:52.914390:
Processed from 0 to 24 out of 108
2018-05-29 13:37:52.939344:
Processed from 0 to 25 out of 108
2018-05-29 13:37:52.960785:
Processed from 0 to 26 out of 108
2018-05-29 13:37:52.991812:
Processed from 0 to 27 out of 108
2018-05-29 13:37:53.015310:
Processed from 0 to 28 out of 108
2018-05-29 13:37:53.036442:
Processed from 0 to 29 out of 108
2018-05-29 13:37:53.061124:
Processed from 0 to 30 out of 108
2018-05-29 13:37:53.082774:
Processed from 0 to 31 out of 108
2018-05-29 13:37:53.108534:
Processed from 0 to 32 out of 108
2018-05-29 13:37:53.129051:
Processed from 0 to 33 out of 108
2018-05-29 13:37:53.148035:
Processed from 0 to 34 out of 108
2018-05-29 13:37:53.172138:
Processed from 0 to 35 out of 108
2018-05-29 13:37:53.196063:
Processed from 0 to 36 out of 108
2018-05-29 13:37:53.216388:
Processed from 0 to 37 out of 108
2018-05-29 13:37:53.237546:
Processed from 0 to 38 out of 108
2018-05-29 13:37:53.258764:
Processed from 0 to 39 out of 108
2018-05-29 13:37:53.286020:
Processed from 0 to 40 out of 108
2018-05-29 13:37:53.303847:
Processed from 0 to 41 out of 108
2018-05-29 13:37:53.325742:
Processed from 0 to 42 out of 108
2018-05-29 13:37:53.349298:
Processed from 0 to 43 out of 108
2018-05-29 13:37:53.372170:
Processed from 0 to 44 out of 108
2018-05-29 13:37:53.396829:
Processed from 0 to 45 out of 108
2018-05-29 13:37:53.417325:
Processed from 0 to 46 out of 108
2018-05-29 13:37:53.440425:
Processed from 0 to 47 out of 108
2018-05-29 13:37:53.458500:
Processed from 0 to 48 out of 108
2018-05-29 13:37:53.479106:
Processed from 0 to 49 out of 108
2018-05-29 13:37:53.500192:
Processed from 0 to 50 out of 108
2018-05-29 13:37:53.518011:
Processed from 0 to 51 out of 108
2018-05-29 13:37:53.541377:
Processed from 0 to 52 out of 108
2018-05-29 13:37:53.564719:
Processed from 0 to 53 out of 108
2018-05-29 13:37:53.587317:
Processed from 0 to 54 out of 108
2018-05-29 13:37:53.607362:
Processed from 0 to 55 out of 108
2018-05-29 13:37:53.628825:
Processed from 0 to 56 out of 108
2018-05-29 13:37:53.650315:
Processed from 0 to 57 out of 108
2018-05-29 13:37:53.674130:
Processed from 0 to 58 out of 108
2018-05-29 13:37:53.695934:
Processed from 0 to 59 out of 108
2018-05-29 13:37:53.715435:
Processed from 0 to 60 out of 108
2018-05-29 13:37:53.737988:
Processed from 0 to 61 out of 108
2018-05-29 13:37:53.758242:
Processed from 0 to 62 out of 108
2018-05-29 13:37:53.778894:
Processed from 0 to 63 out of 108
2018-05-29 13:37:53.798035:
Processed from 0 to 64 out of 108
2018-05-29 13:37:53.815575:
Processed from 0 to 65 out of 108
2018-05-29 13:37:53.829965:
Processed from 0 to 66 out of 108
2018-05-29 13:37:53.846718:
Processed from 0 to 67 out of 108
2018-05-29 13:37:53.863146:
Processed from 0 to 68 out of 108
2018-05-29 13:37:53.879270:
Processed from 0 to 69 out of 108
2018-05-29 13:37:53.894414:
Processed from 0 to 70 out of 108
2018-05-29 13:37:53.911229:
Processed from 0 to 71 out of 108
2018-05-29 13:37:53.930387:
Processed from 0 to 72 out of 108
2018-05-29 13:37:53.948630:
Processed from 0 to 73 out of 108
2018-05-29 13:37:53.967662:
Processed from 0 to 74 out of 108
2018-05-29 13:37:53.986633:
Processed from 0 to 75 out of 108
2018-05-29 13:37:54.004871:
Processed from 0 to 76 out of 108
2018-05-29 13:37:54.022879:
Processed from 0 to 77 out of 108
2018-05-29 13:37:54.040240:
Processed from 0 to 78 out of 108
2018-05-29 13:37:54.058781:
Processed from 0 to 79 out of 108
2018-05-29 13:37:54.075949:
Processed from 0 to 80 out of 108
2018-05-29 13:37:54.096139:
Processed from 0 to 81 out of 108
2018-05-29 13:37:54.115452:
Processed from 0 to 82 out of 108
2018-05-29 13:37:54.134184:
Processed from 0 to 83 out of 108
2018-05-29 13:37:54.151466:
Processed from 0 to 84 out of 108
2018-05-29 13:37:54.169020:
Processed from 0 to 85 out of 108
2018-05-29 13:37:54.186621:
Processed from 0 to 86 out of 108
2018-05-29 13:37:54.202298:
Processed from 0 to 87 out of 108
2018-05-29 13:37:54.219809:
Processed from 0 to 88 out of 108
2018-05-29 13:37:54.237081:
Processed from 0 to 89 out of 108
2018-05-29 13:37:54.253698:
Processed from 0 to 90 out of 108
2018-05-29 13:37:54.270169:
Processed from 0 to 91 out of 108
2018-05-29 13:37:54.290152:
Processed from 0 to 92 out of 108
2018-05-29 13:37:54.308973:
Processed from 0 to 93 out of 108
2018-05-29 13:37:54.327454:
Processed from 0 to 94 out of 108
2018-05-29 13:37:54.345844:
Processed from 0 to 95 out of 108
2018-05-29 13:37:54.362621:
Processed from 0 to 96 out of 108
2018-05-29 13:37:54.380935:
Processed from 0 to 97 out of 108
2018-05-29 13:37:54.399827:
Processed from 0 to 98 out of 108
2018-05-29 13:37:54.419154:
Processed from 0 to 99 out of 108
2018-05-29 13:37:54.438645:
Processed from 0 to 100 out of 108
2018-05-29 13:37:54.456856:
Processed from 0 to 101 out of 108
2018-05-29 13:37:54.470631:
Processed from 0 to 102 out of 108
2018-05-29 13:37:54.487827:
Processed from 0 to 103 out of 108
2018-05-29 13:37:54.505433:
Processed from 0 to 104 out of 108
2018-05-29 13:37:54.520215:
Processed from 0 to 105 out of 108
2018-05-29 13:37:54.537366:
Processed from 0 to 106 out of 108
2018-05-29 13:37:54.552738:
Processed from 0 to 107 out of 108
2018-05-29 13:37:54.585966:
Processed from 0 to 0 out of 108
2018-05-29 13:37:54.602254:
Processed from 0 to 1 out of 108
2018-05-29 13:37:54.620715:
Processed from 0 to 2 out of 108
2018-05-29 13:37:54.639493:
Processed from 0 to 3 out of 108
2018-05-29 13:37:54.657622:
Processed from 0 to 4 out of 108
2018-05-29 13:37:54.675222:
Processed from 0 to 5 out of 108
2018-05-29 13:37:54.692082:
Processed from 0 to 6 out of 108
2018-05-29 13:37:54.710878:
Processed from 0 to 7 out of 108
2018-05-29 13:37:54.729265:
Processed from 0 to 8 out of 108
2018-05-29 13:37:54.748727:
Processed from 0 to 9 out of 108
2018-05-29 13:37:54.767245:
Processed from 0 to 10 out of 108
2018-05-29 13:37:54.783491:
Processed from 0 to 11 out of 108
2018-05-29 13:37:54.800876:
Processed from 0 to 12 out of 108
2018-05-29 13:37:54.817144:
Processed from 0 to 13 out of 108
2018-05-29 13:37:54.833846:
Processed from 0 to 14 out of 108
2018-05-29 13:37:54.850133:
Processed from 0 to 15 out of 108
2018-05-29 13:37:54.866189:
Processed from 0 to 16 out of 108
2018-05-29 13:37:54.880943:
Processed from 0 to 17 out of 108
2018-05-29 13:37:54.897237:
Processed from 0 to 18 out of 108
2018-05-29 13:37:54.914303:
Processed from 0 to 19 out of 108
2018-05-29 13:37:54.931052:
Processed from 0 to 20 out of 108
2018-05-29 13:37:54.947533:
Processed from 0 to 21 out of 108
2018-05-29 13:37:54.965097:
Processed from 0 to 22 out of 108
2018-05-29 13:37:54.983614:
Processed from 0 to 23 out of 108
2018-05-29 13:37:55.003890:
Processed from 0 to 24 out of 108
2018-05-29 13:37:55.024009:
Processed from 0 to 25 out of 108
2018-05-29 13:37:55.042412:
Processed from 0 to 26 out of 108
2018-05-29 13:37:55.064088:
Processed from 0 to 27 out of 108
2018-05-29 13:37:55.091865:
Processed from 0 to 28 out of 108
2018-05-29 13:37:55.116895:
Processed from 0 to 29 out of 108
2018-05-29 13:37:55.141222:
Processed from 0 to 30 out of 108
2018-05-29 13:37:55.169749:
Processed from 0 to 31 out of 108
2018-05-29 13:37:55.194276:
Processed from 0 to 32 out of 108
2018-05-29 13:37:55.213848:
Processed from 0 to 33 out of 108
2018-05-29 13:37:55.232781:
Processed from 0 to 34 out of 108
2018-05-29 13:37:55.252169:
Processed from 0 to 35 out of 108
2018-05-29 13:37:55.271482:
Processed from 0 to 36 out of 108
2018-05-29 13:37:55.288196:
Processed from 0 to 37 out of 108
2018-05-29 13:37:55.307028:
Processed from 0 to 38 out of 108
2018-05-29 13:37:55.324114:
Processed from 0 to 39 out of 108
2018-05-29 13:37:55.342077:
Processed from 0 to 40 out of 108
2018-05-29 13:37:55.360238:
Processed from 0 to 41 out of 108
2018-05-29 13:37:55.380339:
Processed from 0 to 42 out of 108
2018-05-29 13:37:55.400526:
Processed from 0 to 43 out of 108
2018-05-29 13:37:55.419319:
Processed from 0 to 44 out of 108
2018-05-29 13:37:55.438358:
Processed from 0 to 45 out of 108
2018-05-29 13:37:55.457149:
Processed from 0 to 46 out of 108
2018-05-29 13:37:55.472278:
Processed from 0 to 47 out of 108
2018-05-29 13:37:55.489728:
Processed from 0 to 48 out of 108
2018-05-29 13:37:55.510488:
Processed from 0 to 49 out of 108
2018-05-29 13:37:55.527167:
Processed from 0 to 50 out of 108
2018-05-29 13:37:55.543559:
Processed from 0 to 51 out of 108
2018-05-29 13:37:55.560895:
Processed from 0 to 52 out of 108
2018-05-29 13:37:55.576166:
Processed from 0 to 53 out of 108
2018-05-29 13:37:55.594276:
Processed from 0 to 54 out of 108
2018-05-29 13:37:55.615368:
Processed from 0 to 55 out of 108
2018-05-29 13:37:55.640648:
Processed from 0 to 56 out of 108
2018-05-29 13:37:55.662931:
Processed from 0 to 57 out of 108
2018-05-29 13:37:55.680591:
Processed from 0 to 58 out of 108
2018-05-29 13:37:55.698673:
Processed from 0 to 59 out of 108
2018-05-29 13:37:55.714210:
Processed from 0 to 60 out of 108
2018-05-29 13:37:55.732675:
Processed from 0 to 61 out of 108
2018-05-29 13:37:55.750534:
Processed from 0 to 62 out of 108
2018-05-29 13:37:55.768931:
Processed from 0 to 63 out of 108
2018-05-29 13:37:55.785356:
Processed from 0 to 64 out of 108
2018-05-29 13:37:55.802154:
Processed from 0 to 65 out of 108
2018-05-29 13:37:55.817599:
Processed from 0 to 66 out of 108
2018-05-29 13:37:55.836911:
Processed from 0 to 67 out of 108
2018-05-29 13:37:55.854371:
Processed from 0 to 68 out of 108
2018-05-29 13:37:55.870365:
Processed from 0 to 69 out of 108
2018-05-29 13:37:55.885122:
Processed from 0 to 70 out of 108
2018-05-29 13:37:55.901036:
Processed from 0 to 71 out of 108
2018-05-29 13:37:55.918487:
Processed from 0 to 72 out of 108
2018-05-29 13:37:55.935568:
Processed from 0 to 73 out of 108
2018-05-29 13:37:55.954595:
Processed from 0 to 74 out of 108
2018-05-29 13:37:55.972944:
Processed from 0 to 75 out of 108
2018-05-29 13:37:55.990606:
Processed from 0 to 76 out of 108
2018-05-29 13:37:56.007351:
Processed from 0 to 77 out of 108
2018-05-29 13:37:56.029303:
Processed from 0 to 78 out of 108
2018-05-29 13:37:56.046509:
Processed from 0 to 79 out of 108
2018-05-29 13:37:56.065118:
Processed from 0 to 80 out of 108
2018-05-29 13:37:56.085262:
Processed from 0 to 81 out of 108
2018-05-29 13:37:56.107072:
Processed from 0 to 82 out of 108
2018-05-29 13:37:56.124687:
Processed from 0 to 83 out of 108
2018-05-29 13:37:56.141249:
Processed from 0 to 84 out of 108
2018-05-29 13:37:56.162257:
Processed from 0 to 85 out of 108
2018-05-29 13:37:56.179778:
Processed from 0 to 86 out of 108
2018-05-29 13:37:56.196792:
Processed from 0 to 87 out of 108
2018-05-29 13:37:56.214418:
Processed from 0 to 88 out of 108
2018-05-29 13:37:56.230820:
Processed from 0 to 89 out of 108
2018-05-29 13:37:56.246428:
Processed from 0 to 90 out of 108
2018-05-29 13:37:56.264008:
Processed from 0 to 91 out of 108
2018-05-29 13:37:56.283353:
Processed from 0 to 92 out of 108
2018-05-29 13:37:56.301080:
Processed from 0 to 93 out of 108
2018-05-29 13:37:56.319092:
Processed from 0 to 94 out of 108
2018-05-29 13:37:56.338791:
Processed from 0 to 95 out of 108
2018-05-29 13:37:56.357934:
Processed from 0 to 96 out of 108
2018-05-29 13:37:56.377807:
Processed from 0 to 97 out of 108
2018-05-29 13:37:56.396560:
Processed from 0 to 98 out of 108
2018-05-29 13:37:56.415968:
Processed from 0 to 99 out of 108
2018-05-29 13:37:56.435522:
Processed from 0 to 100 out of 108
2018-05-29 13:37:56.451794:
Processed from 0 to 101 out of 108
2018-05-29 13:37:56.466764:
Processed from 0 to 102 out of 108
2018-05-29 13:37:56.484821:
Processed from 0 to 103 out of 108
2018-05-29 13:37:56.501609:
Processed from 0 to 104 out of 108
2018-05-29 13:37:56.516488:
Processed from 0 to 105 out of 108
2018-05-29 13:37:56.532453:
Processed from 0 to 106 out of 108
2018-05-29 13:37:56.548489:
Processed from 0 to 107 out of 108
2018-05-29 13:37:56.576134:
Processed from 0 to 0 out of 108
2018-05-29 13:37:56.587443:
Processed from 0 to 1 out of 108
2018-05-29 13:37:56.602057:
Processed from 0 to 2 out of 108
2018-05-29 13:37:56.614876:
Processed from 0 to 3 out of 108
2018-05-29 13:37:56.631868:
Processed from 0 to 4 out of 108
2018-05-29 13:37:56.644079:
Processed from 0 to 5 out of 108
2018-05-29 13:37:56.658093:
Processed from 0 to 6 out of 108
2018-05-29 13:37:56.672313:
Processed from 0 to 7 out of 108
2018-05-29 13:37:56.687302:
Processed from 0 to 8 out of 108
2018-05-29 13:37:56.700731:
Processed from 0 to 9 out of 108
2018-05-29 13:37:56.713939:
Processed from 0 to 10 out of 108
2018-05-29 13:37:56.728774:
Processed from 0 to 11 out of 108
2018-05-29 13:37:56.739137:
Processed from 0 to 12 out of 108
2018-05-29 13:37:56.750360:
Processed from 0 to 13 out of 108
2018-05-29 13:37:56.762252:
Processed from 0 to 14 out of 108
2018-05-29 13:37:56.773574:
Processed from 0 to 15 out of 108
2018-05-29 13:37:56.786560:
Processed from 0 to 16 out of 108
2018-05-29 13:37:56.800815:
Processed from 0 to 17 out of 108
2018-05-29 13:37:56.815019:
Processed from 0 to 18 out of 108
2018-05-29 13:37:56.827388:
Processed from 0 to 19 out of 108
2018-05-29 13:37:56.840323:
Processed from 0 to 20 out of 108
2018-05-29 13:37:56.853858:
Processed from 0 to 21 out of 108
2018-05-29 13:37:56.866378:
Processed from 0 to 22 out of 108
2018-05-29 13:37:56.878392:
Processed from 0 to 23 out of 108
2018-05-29 13:37:56.890383:
Processed from 0 to 24 out of 108
2018-05-29 13:37:56.905309:
Processed from 0 to 25 out of 108
2018-05-29 13:37:56.917798:
Processed from 0 to 26 out of 108
2018-05-29 13:37:56.931503:
Processed from 0 to 27 out of 108
2018-05-29 13:37:56.945422:
Processed from 0 to 28 out of 108
2018-05-29 13:37:56.961165:
Processed from 0 to 29 out of 108
2018-05-29 13:37:56.971256:
Processed from 0 to 30 out of 108
2018-05-29 13:37:56.983512:
Processed from 0 to 31 out of 108
2018-05-29 13:37:56.995123:
Processed from 0 to 32 out of 108
2018-05-29 13:37:57.004999:
Processed from 0 to 33 out of 108
2018-05-29 13:37:57.018881:
Processed from 0 to 34 out of 108
2018-05-29 13:37:57.029747:
Processed from 0 to 35 out of 108
2018-05-29 13:37:57.042599:
Processed from 0 to 36 out of 108
2018-05-29 13:37:57.055023:
Processed from 0 to 37 out of 108
2018-05-29 13:37:57.067293:
Processed from 0 to 38 out of 108
2018-05-29 13:37:57.080075:
Processed from 0 to 39 out of 108
2018-05-29 13:37:57.093179:
Processed from 0 to 40 out of 108
2018-05-29 13:37:57.107222:
Processed from 0 to 41 out of 108
2018-05-29 13:37:57.118362:
Processed from 0 to 42 out of 108
2018-05-29 13:37:57.132825:
Processed from 0 to 43 out of 108
2018-05-29 13:37:57.147094:
Processed from 0 to 44 out of 108
2018-05-29 13:37:57.163228:
Processed from 0 to 45 out of 108
2018-05-29 13:37:57.179149:
Processed from 0 to 46 out of 108
2018-05-29 13:37:57.191543:
Processed from 0 to 47 out of 108
2018-05-29 13:37:57.202620:
Processed from 0 to 48 out of 108
2018-05-29 13:37:57.213679:
Processed from 0 to 49 out of 108
2018-05-29 13:37:57.224361:
Processed from 0 to 50 out of 108
2018-05-29 13:37:57.235868:
Processed from 0 to 51 out of 108
2018-05-29 13:37:57.245747:
Processed from 0 to 52 out of 108
2018-05-29 13:37:57.255544:
Processed from 0 to 53 out of 108
2018-05-29 13:37:57.267918:
Processed from 0 to 54 out of 108
2018-05-29 13:37:57.280125:
Processed from 0 to 55 out of 108
2018-05-29 13:37:57.292587:
Processed from 0 to 56 out of 108
2018-05-29 13:37:57.303026:
Processed from 0 to 57 out of 108
2018-05-29 13:37:57.315908:
Processed from 0 to 58 out of 108
2018-05-29 13:37:57.331405:
Processed from 0 to 59 out of 108
2018-05-29 13:37:57.343561:
Processed from 0 to 60 out of 108
2018-05-29 13:37:57.356679:
Processed from 0 to 61 out of 108
2018-05-29 13:37:57.369896:
Processed from 0 to 62 out of 108
2018-05-29 13:37:57.385433:
Processed from 0 to 63 out of 108
2018-05-29 13:37:57.400145:
Processed from 0 to 64 out of 108
2018-05-29 13:37:57.412792:
Processed from 0 to 65 out of 108
2018-05-29 13:37:57.422773:
Processed from 0 to 66 out of 108
2018-05-29 13:37:57.434796:
Processed from 0 to 67 out of 108
2018-05-29 13:37:57.447344:
Processed from 0 to 68 out of 108
2018-05-29 13:37:57.458725:
Processed from 0 to 69 out of 108
2018-05-29 13:37:57.469637:
Processed from 0 to 70 out of 108
2018-05-29 13:37:57.481583:
Processed from 0 to 71 out of 108
2018-05-29 13:37:57.494285:
Processed from 0 to 72 out of 108
2018-05-29 13:37:57.507006:
Processed from 0 to 73 out of 108
2018-05-29 13:37:57.521553:
Processed from 0 to 74 out of 108
2018-05-29 13:37:57.535896:
Processed from 0 to 75 out of 108
2018-05-29 13:37:57.549663:
Processed from 0 to 76 out of 108
2018-05-29 13:37:57.562174:
Processed from 0 to 77 out of 108
2018-05-29 13:37:57.575055:
Processed from 0 to 78 out of 108
2018-05-29 13:37:57.586767:
Processed from 0 to 79 out of 108
2018-05-29 13:37:57.600339:
Processed from 0 to 80 out of 108
2018-05-29 13:37:57.614796:
Processed from 0 to 81 out of 108
2018-05-29 13:37:57.628023:
Processed from 0 to 82 out of 108
2018-05-29 13:37:57.638728:
Processed from 0 to 83 out of 108
2018-05-29 13:37:57.650622:
Processed from 0 to 84 out of 108
2018-05-29 13:37:57.663344:
Processed from 0 to 85 out of 108
2018-05-29 13:37:57.675426:
Processed from 0 to 86 out of 108
2018-05-29 13:37:57.686158:
Processed from 0 to 87 out of 108
2018-05-29 13:37:57.697040:
Processed from 0 to 88 out of 108
2018-05-29 13:37:57.707986:
Processed from 0 to 89 out of 108
2018-05-29 13:37:57.719240:
Processed from 0 to 90 out of 108
2018-05-29 13:37:57.731712:
Processed from 0 to 91 out of 108
2018-05-29 13:37:57.747411:
Processed from 0 to 92 out of 108
2018-05-29 13:37:57.759868:
Processed from 0 to 93 out of 108
2018-05-29 13:37:57.773063:
Processed from 0 to 94 out of 108
2018-05-29 13:37:57.785531:
Processed from 0 to 95 out of 108
2018-05-29 13:37:57.797500:
Processed from 0 to 96 out of 108
2018-05-29 13:37:57.810737:
Processed from 0 to 97 out of 108
2018-05-29 13:37:57.822834:
Processed from 0 to 98 out of 108
2018-05-29 13:37:57.836655:
Processed from 0 to 99 out of 108
2018-05-29 13:37:57.850454:
Processed from 0 to 100 out of 108
2018-05-29 13:37:57.862650:
Processed from 0 to 101 out of 108
2018-05-29 13:37:57.873468:
Processed from 0 to 102 out of 108
2018-05-29 13:37:57.884696:
Processed from 0 to 103 out of 108
2018-05-29 13:37:57.895116:
Processed from 0 to 104 out of 108
2018-05-29 13:37:57.905951:
Processed from 0 to 105 out of 108
2018-05-29 13:37:57.916207:
Processed from 0 to 106 out of 108
2018-05-29 13:37:57.927391:
Processed from 0 to 107 out of 108
2018-05-29 13:37:57.950093:
Processed from 0 to 0 out of 108
2018-05-29 13:37:57.962601:
Processed from 0 to 1 out of 108
2018-05-29 13:37:57.976382:
Processed from 0 to 2 out of 108
2018-05-29 13:37:57.987908:
Processed from 0 to 3 out of 108
2018-05-29 13:37:58.000078:
Processed from 0 to 4 out of 108
2018-05-29 13:37:58.012175:
Processed from 0 to 5 out of 108
2018-05-29 13:37:58.023625:
Processed from 0 to 6 out of 108
2018-05-29 13:37:58.037243:
Processed from 0 to 7 out of 108
2018-05-29 13:37:58.050950:
Processed from 0 to 8 out of 108
2018-05-29 13:37:58.066013:
Processed from 0 to 9 out of 108
2018-05-29 13:37:58.078059:
Processed from 0 to 10 out of 108
2018-05-29 13:37:58.088465:
Processed from 0 to 11 out of 108
2018-05-29 13:37:58.100069:
Processed from 0 to 12 out of 108
2018-05-29 13:37:58.113435:
Processed from 0 to 13 out of 108
2018-05-29 13:37:58.127958:
Processed from 0 to 14 out of 108
2018-05-29 13:37:58.145372:
Processed from 0 to 15 out of 108
2018-05-29 13:37:58.159301:
Processed from 0 to 16 out of 108
2018-05-29 13:37:58.168876:
Processed from 0 to 17 out of 108
2018-05-29 13:37:58.181389:
Processed from 0 to 18 out of 108
2018-05-29 13:37:58.192367:
Processed from 0 to 19 out of 108
2018-05-29 13:37:58.206243:
Processed from 0 to 20 out of 108
2018-05-29 13:37:58.218120:
Processed from 0 to 21 out of 108
2018-05-29 13:37:58.229649:
Processed from 0 to 22 out of 108
2018-05-29 13:37:58.242054:
Processed from 0 to 23 out of 108
2018-05-29 13:37:58.253155:
Processed from 0 to 24 out of 108
2018-05-29 13:37:58.267486:
Processed from 0 to 25 out of 108
2018-05-29 13:37:58.279549:
Processed from 0 to 26 out of 108
2018-05-29 13:37:58.292933:
Processed from 0 to 27 out of 108
2018-05-29 13:37:58.305408:
Processed from 0 to 28 out of 108
2018-05-29 13:37:58.321943:
Processed from 0 to 29 out of 108
2018-05-29 13:37:58.332173:
Processed from 0 to 30 out of 108
2018-05-29 13:37:58.345016:
Processed from 0 to 31 out of 108
2018-05-29 13:37:58.356636:
Processed from 0 to 32 out of 108
2018-05-29 13:37:58.368601:
Processed from 0 to 33 out of 108
2018-05-29 13:37:58.379413:
Processed from 0 to 34 out of 108
2018-05-29 13:37:58.390559:
Processed from 0 to 35 out of 108
2018-05-29 13:37:58.402363:
Processed from 0 to 36 out of 108
2018-05-29 13:37:58.417525:
Processed from 0 to 37 out of 108
2018-05-29 13:37:58.431826:
Processed from 0 to 38 out of 108
2018-05-29 13:37:58.443142:
Processed from 0 to 39 out of 108
2018-05-29 13:37:58.457385:
Processed from 0 to 40 out of 108
2018-05-29 13:37:58.468481:
Processed from 0 to 41 out of 108
2018-05-29 13:37:58.479702:
Processed from 0 to 42 out of 108
2018-05-29 13:37:58.495203:
Processed from 0 to 43 out of 108
2018-05-29 13:37:58.507874:
Processed from 0 to 44 out of 108
2018-05-29 13:37:58.520963:
Processed from 0 to 45 out of 108
2018-05-29 13:37:58.532923:
Processed from 0 to 46 out of 108
2018-05-29 13:37:58.544727:
Processed from 0 to 47 out of 108
2018-05-29 13:37:58.554914:
Processed from 0 to 48 out of 108
2018-05-29 13:37:58.567869:
Processed from 0 to 49 out of 108
2018-05-29 13:37:58.579007:
Processed from 0 to 50 out of 108
2018-05-29 13:37:58.589579:
Processed from 0 to 51 out of 108
2018-05-29 13:37:58.601341:
Processed from 0 to 52 out of 108
2018-05-29 13:37:58.615331:
Processed from 0 to 53 out of 108
2018-05-29 13:37:58.628622:
Processed from 0 to 54 out of 108
2018-05-29 13:37:58.643142:
Processed from 0 to 55 out of 108
2018-05-29 13:37:58.655186:
Processed from 0 to 56 out of 108
2018-05-29 13:37:58.667221:
Processed from 0 to 57 out of 108
2018-05-29 13:37:58.679510:
Processed from 0 to 58 out of 108
2018-05-29 13:37:58.693679:
Processed from 0 to 59 out of 108
2018-05-29 13:37:58.705223:
Processed from 0 to 60 out of 108
2018-05-29 13:37:58.717444:
Processed from 0 to 61 out of 108
2018-05-29 13:37:58.730809:
Processed from 0 to 62 out of 108
2018-05-29 13:37:58.743100:
Processed from 0 to 63 out of 108
2018-05-29 13:37:58.754530:
Processed from 0 to 64 out of 108
2018-05-29 13:37:58.766717:
Processed from 0 to 65 out of 108
2018-05-29 13:37:58.777661:
Processed from 0 to 66 out of 108
2018-05-29 13:37:58.788904:
Processed from 0 to 67 out of 108
2018-05-29 13:37:58.800489:
Processed from 0 to 68 out of 108
2018-05-29 13:37:58.810731:
Processed from 0 to 69 out of 108
2018-05-29 13:37:58.823493:
Processed from 0 to 70 out of 108
2018-05-29 13:37:58.834963:
Processed from 0 to 71 out of 108
2018-05-29 13:37:58.846077:
Processed from 0 to 72 out of 108
2018-05-29 13:37:58.857023:
Processed from 0 to 73 out of 108
2018-05-29 13:37:58.868759:
Processed from 0 to 74 out of 108
2018-05-29 13:37:58.879909:
Processed from 0 to 75 out of 108
2018-05-29 13:37:58.892342:
Processed from 0 to 76 out of 108
2018-05-29 13:37:58.903162:
Processed from 0 to 77 out of 108
2018-05-29 13:37:58.914046:
Processed from 0 to 78 out of 108
2018-05-29 13:37:58.926552:
Processed from 0 to 79 out of 108
2018-05-29 13:37:58.938695:
Processed from 0 to 80 out of 108
2018-05-29 13:37:58.955024:
Processed from 0 to 81 out of 108
2018-05-29 13:37:58.968269:
Processed from 0 to 82 out of 108
2018-05-29 13:37:58.979968:
Processed from 0 to 83 out of 108
2018-05-29 13:37:58.990529:
Processed from 0 to 84 out of 108
2018-05-29 13:37:59.001255:
Processed from 0 to 85 out of 108
2018-05-29 13:37:59.013818:
Processed from 0 to 86 out of 108
2018-05-29 13:37:59.025604:
Processed from 0 to 87 out of 108
2018-05-29 13:37:59.035782:
Processed from 0 to 88 out of 108
2018-05-29 13:37:59.051837:
Processed from 0 to 89 out of 108
2018-05-29 13:37:59.066981:
Processed from 0 to 90 out of 108
2018-05-29 13:37:59.080659:
Processed from 0 to 91 out of 108
2018-05-29 13:37:59.094165:
Processed from 0 to 92 out of 108
2018-05-29 13:37:59.107549:
Processed from 0 to 93 out of 108
2018-05-29 13:37:59.123878:
Processed from 0 to 94 out of 108
2018-05-29 13:37:59.138913:
Processed from 0 to 95 out of 108
2018-05-29 13:37:59.154231:
Processed from 0 to 96 out of 108
2018-05-29 13:37:59.169534:
Processed from 0 to 97 out of 108
2018-05-29 13:37:59.183670:
Processed from 0 to 98 out of 108
2018-05-29 13:37:59.198532:
Processed from 0 to 99 out of 108
2018-05-29 13:37:59.211836:
Processed from 0 to 100 out of 108
2018-05-29 13:37:59.222655:
Processed from 0 to 101 out of 108
2018-05-29 13:37:59.234824:
Processed from 0 to 102 out of 108
2018-05-29 13:37:59.247971:
Processed from 0 to 103 out of 108
2018-05-29 13:37:59.261204:
Processed from 0 to 104 out of 108
2018-05-29 13:37:59.271374:
Processed from 0 to 105 out of 108
2018-05-29 13:37:59.283521:
Processed from 0 to 106 out of 108
2018-05-29 13:37:59.294485:
Processed from 0 to 107 out of 108
CPU times: user 6.49 s, sys: 570 ms, total: 7.06 s
Wall time: 6.95 s

In [ ]: