//  [python]
def run_models(process_queue, container, offset, kmer, kmer2index, kmers, sampling_length1, sampling_number1, sampling_length2, sampling_number2, weight, min_clustering_probability, outlier, random_number):
    while True:
        sequences, clusters, seeds_list, length, kmer_frequency, coverage, bin_coverage, SEQUENCES = process_queue.get()
        if clusters > 0:
            # Run the seed selection model. #
            seeds = select_seed(
                sequences,
                seeds_list, # groups of seeds #
                clusters, # number of clusters estimated by seeds #
                SEQUENCES, # sequence #
                coverage, # coverage #
                kmer_frequency, # kmer frequence matrix #
                kmer, # k #
                kmer2index, # hash #
                kmers, # number of kinds of kmer #
                sampling_length1, # length of sequence #
                sampling_number1, # number of sampling #
                random_number # random number #
            )
            if seeds:
                # Run the kmer frequency probabilistic model. #
                x4training = sample_kmer_frequency(seeds, kmer, kmer2index, kmers, sampling_length2, sampling_number2, 1, random_number)
                y4training = numpy.repeat(numpy.arange(clusters, dtype = numpy.int64), sampling_number2)
                clustering_probability = run_svm(x4training, y4training, kmer_frequency, True, random_number)
                
                # Run the coverage probabilistic model. #
                gmm = GMM(clusters, bin_coverage, clustering_probability, weight)
                gmm.main()
                clustering_probability = gmm.log_responsibility
            else:
                gmm = GaussianMixture(n_components = clusters, covariance_type = 'full', n_init = 1, init_params = 'kmeans', random_state = random_number)
                x = numpy.concatenate((kmer_frequency, coverage), axis = 1)
                gmm.fit(x)
                clustering_probability = numpy.log(gmm.predict_proba(x) + numpy.finfo(numpy.float64).eps)

            clustered_sequences_list, unclustered_sequences = cluster_sequences(sequences, clustering_probability, min_clustering_probability)
            if len(clustered_sequences_list) > 1:
                for clustered_sequences in clustered_sequences_list:
                    container_value = numpy.min(clustered_sequences)
                    for sequence in clustered_sequences:
                        container[sequence] = container_value
                if unclustered_sequences.shape[0] > 0:
                    container_value = -offset - 1
                    for sequence in unclustered_sequences:
                        container[sequence] = container_value
            else:
                sequences_, unclustered_sequences = isolation_forest(sequences, numpy.concatenate((kmer_frequency, coverage), axis = 1), length, 1, outlier, random_number)
                if unclustered_sequences.shape[0] > 0:
                    container_value = numpy.min(sequences_)
                    for sequence in sequences_:
                        container[sequence] = container_value
                    container_value = -offset - 1
                    for sequence in unclustered_sequences:
                        container[sequence] = container_value
                else:
                    container_value = -offset - 1
                    for sequence in sequences_:
                        container[sequence] = container_value
            process_queue.task_done()
        else: # All tasks have been finished. #
            process_queue.task_done()
            break
    return None