Commit dc41b748 authored by Denys Bulavka's avatar Denys Bulavka
Browse files

Add random sampling and random modification of database

parent 35f58028
......@@ -63,6 +63,13 @@ Software:
For each k, outputs the number of pairs of motifs with k discriminant positions:
./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 5
We can as well generate any of the previous reports using a randomly selected subset of the database, for example to select 50% of motifs at random and calculate the number of aminoacids per coordinate:
./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 1 -a 0.5
We can as well select a random sample of motifs, and in each of them uniformly at random we select uniformly at random a coordinate and set it to wildcard "." with the option -b %. For example if we select a motif class to modify with 0.5 of probability and the, over this modified datbaase we calculate the number of aminoacids per coordinate:
./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 1 -b 0.5
Python scripts:
Each python script has an input directoy and an output directory. To excecute the each python script it is enought to be inside the script folder and run 'python main.py' which will generate the output and place it in output directory. The rule is the script that has "empiric" in is name should have "structure_empiric_frequency.txt" in its input folder, while the script that has "theoretic" in its name should have "structure_theoretic_probabilities.txt" in its input folder.
......@@ -3,6 +3,8 @@
#include "Header.hpp"
#include "Motif_class.hpp"
#include <random>
#include <chrono>
class Database
{
......@@ -13,6 +15,10 @@ private:
std::vector<Motif_class> motifs_eliminated;
bool clean_ends;
bool clean_marked;
float database_sample_weight;
float database_modif_weight;
/*
{a,b} always choose a, and for | always take the shortest one.
*/
......@@ -33,12 +39,16 @@ private:
void clean_marked_motifs();
void database_sample();
void database_modif();
Motif_class modif_motif_class(Motif_class);
public:
Database();
/*
input: string location of file, bool true if modif
*/
Database(std::string , bool, std::string);
Database(std::string , bool, std::string, float, float);
std::vector<Motif_class> get_motif_database();
};
......
......@@ -26,7 +26,7 @@ private:
public:
Mdp_toolbox();
Mdp_toolbox(std::string, bool, std::string);
Mdp_toolbox(Database);
std::vector<Motif_pair> get_pairs_k_discriminant_positions(int);
int get_mdp(Motif_pair);
std::vector<Motif_class> get_k_discriminant_motifs(Motif_class, int);
......
#ifndef _REPORT_MANAGER_
#define _REPORT_MANAGER_
#include "Database.hpp"
#include "Mdp_toolbox.hpp"
#include "Statistical_toolbox.hpp"
class Report_manager{
Database database;
Mdp_toolbox mdp_toolbox;
Statistical_toolbox statistical_toolbox;
std::string separator = "\t";
public:
//first argument is database location, the second argument is if we want to remove the endpoint that have more than 10 characters
Report_manager(std::string, bool, std::string);
Report_manager(std::string, bool, std::string, float, float);
//mdp_toolbox reports
std::stringstream number_of_aminoacids_per_coordinate(void);
......
......@@ -2,7 +2,7 @@
Database::Database(){}
Database::Database(std::string database_filename, bool clean_ends, std::string marked_motifs_filename)
Database::Database(std::string database_filename, bool clean_ends, std::string marked_motifs_filename, float database_sample_weight, float database_modif_weight)
{
load_motif_database(database_filename);
......@@ -13,6 +13,51 @@ Database::Database(std::string database_filename, bool clean_ends, std::string m
this->clean_ends = clean_ends;
if(clean_ends)
clean_end_characters();
this->database_sample_weight = database_sample_weight;
if(database_sample_weight != 1)
database_sample();
this->database_modif_weight = database_modif_weight;
if(database_modif_weight != 0)
database_modif();
}
void Database::database_sample()
{
std::default_random_engine generator(std::chrono::steady_clock::now().time_since_epoch().count());
std::bernoulli_distribution distribution(database_sample_weight);
//keep the count of which entries to eliminate
std::vector<std::vector<Motif_class>::iterator> entries;
for (std::vector<Motif_class>::iterator it = motif_database.begin(); it!= motif_database.end(); ++it)
if(!distribution(generator))
entries.push_back(it);
for(auto it : entries)
motif_database.erase(it);
}
void Database::database_modif()
{
std::default_random_engine generator;
std::bernoulli_distribution distribution(database_modif_weight);
for (int i =0; i<motif_database.size(); i++)
if(distribution(generator))
motif_database[i] = modif_motif_class(motif_database[i]);
}
Motif_class Database::modif_motif_class(Motif_class motif_class)
{
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0, motif_class.get_structure().size()-1);
int index_to_modify = distribution(generator);
std::vector<std::string> new_sequence = motif_class.get_sequence();
new_sequence[index_to_modify] = all;
return Motif_class(motif_class.get_name(), new_sequence);
}
void Database::clean_marked_motifs()
......
......@@ -2,9 +2,9 @@
Mdp_toolbox::Mdp_toolbox(){}
Mdp_toolbox::Mdp_toolbox(std::string database_location, bool clean_ends, std::string clean_marked_motifs)
Mdp_toolbox::Mdp_toolbox(Database database)
{
database = Database(database_location, clean_ends, clean_marked_motifs);
this->database = database;
for(auto motif_1: database.get_motif_database())
for(auto motif_2: database.get_motif_database())
......
#include "Report_manager.hpp"
Report_manager::Report_manager(std::string database_location, bool clean_ends, std::string marked_motifs_filename)
Report_manager::Report_manager(std::string database_location, bool clean_ends, std::string marked_motifs_filename, float database_sample, float database_modif)
{
mdp_toolbox = Mdp_toolbox(database_location, clean_ends, marked_motifs_filename);
database = Database(database_location, clean_ends, marked_motifs_filename, database_sample, database_modif);
mdp_toolbox = Mdp_toolbox(database);
statistical_toolbox = Statistical_toolbox(mdp_toolbox);
}
......@@ -132,7 +133,7 @@ std::stringstream Report_manager::empiric_motif_probabilities()
{
std::stringstream output;
output << "Structure" << separator << "Probability" << std::endl;
//output << "Structure" << separator << "Probability" << std::endl;
for(std::pair<std::vector<int>, float> element: statistical_toolbox.get_empiric_motif_probabilities())
output << element.first << separator << statistical_toolbox.compute_empiric_based_probability(element.first)<< separator << element.second << std::endl;
......@@ -143,7 +144,7 @@ std::stringstream Report_manager::all_lenghts_accumulated_probabilities()
{
std::stringstream output;
output << "Structure" << separator << "Probability" << std::endl;
//output << "Structure" << separator << "Probability" << std::endl;
for(std::pair<std::vector<int>, float> element : statistical_toolbox.get_theoretic_motif_probabilities())
output << element.first << separator << element.second << std::endl;
......
......@@ -10,6 +10,7 @@ int main(int argc, char* argv[])
int report;
int option;
int discriminant_index = -1;
float database_sample = 1, database_modif = 0;
std::stringstream help_message;
help_message << "-h: Help message" << std::endl;
......@@ -18,9 +19,10 @@ int main(int argc, char* argv[])
help_message << "-m: Avoid motifs specified in the file" << std::endl;
help_message << "-r: Number of report" << std::endl;
help_message << "-k: Discriminant index" << std::endl;;
help_message << "-a: Percentage of database considered" << std::endl;;
help_message << "-b: Percentage of database to be modified" << std::endl;
if((option = getopt(argc, argv, ":hd:cm:r:k:")) == -1)
if((option = getopt(argc, argv, ":hd:cm:r:k:a:b:")) == -1)
{
std::cout << help_message.str();
return 0;
......@@ -50,17 +52,27 @@ int main(int argc, char* argv[])
case 'r':
report = std::atoi(optarg);
break;
case 'a':
database_sample = std::strtof(optarg, NULL);
if(database_sample<0 or database_sample>1)
throw std::invalid_argument("The value of a must be between 0 and 1.");
break;
case 'b':
database_modif = std::strtof(optarg, NULL);
if(database_modif<0 or database_modif>1)
throw std::invalid_argument("The value of b must be between 0 and 1.");
break;
case 'k':
discriminant_index = std::atoi(optarg);
break;
}
}while((option = getopt(argc, argv, ":hd:cm:r:k:")) != -1);
}while((option = getopt(argc, argv, ":hd:cm:r:k:a:b:")) != -1);
//Make sure that if report 3 or 4 is invoked we have specified the discriminant_index
if((report == 3 or report == 4) and discriminant_index == -1)
throw std::invalid_argument( "The parameter -k is missing." );
Report_manager report_manager(database_location, clean_ends, marked_motifs_filename);
Report_manager report_manager(database_location, clean_ends, marked_motifs_filename, database_sample, database_modif);
switch(report)
{
......
Generate input: we execute the following commands from the folder elm_processing/bin
1) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt
2) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt -a 0.25 >> structure_empiric_frequency_sample_25_i.txt
3) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt -a 0.5 >> structure_empiric_frequency_sample_5_i.txt
4) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt -b 0.25 >> structure_empiric_frequency_modif_25_i.txt
5) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt -b 0.5 >> structure_empiric_frequency_modif_50_i.txt
6) ./main -d ../../database/elm_input.txt -c -m ../../database/marked_motifs.txt -r 6 >> structure_empiric_frequency.txt -b 1 >> structure_empiric_frequency_modif_100_i.txt
Moreover, we execute 2,3,4,5 and 6 a total of 10 times each, where the "i" stands for the number of execution.
Usage: python main.py -i INPUT_FILE_NAME -o OUTPUT_FILE_NAME_PREFIX
Generate output: execute the following commands, or run ./generate_output.sh.
python main.py -i input/structure_empiric_frequency.txt -o output/all_database/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_1.txt -o output/sample_database_25_1/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_2.txt -o output/sample_database_25_2/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_3.txt -o output/sample_database_25_3/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_4.txt -o output/sample_database_25_4/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_5.txt -o output/sample_database_25_5/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_6.txt -o output/sample_database_25_6/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_7.txt -o output/sample_database_25_7/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_8.txt -o output/sample_database_25_8/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_9.txt -o output/sample_database_25_9/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_25_10.txt -o output/sample_database_25_10/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_1.txt -o output/sample_database_50_1/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_2.txt -o output/sample_database_50_2/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_3.txt -o output/sample_database_50_3/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_4.txt -o output/sample_database_50_4/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_5.txt -o output/sample_database_50_5/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_6.txt -o output/sample_database_50_6/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_7.txt -o output/sample_database_50_7/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_8.txt -o output/sample_database_50_8/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_9.txt -o output/sample_database_50_9/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_sample_50_10.txt -o output/sample_database_50_10/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_1.txt -o output/modif_database_25_1/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_2.txt -o output/modif_database_25_2/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_3.txt -o output/modif_database_25_3/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_4.txt -o output/modif_database_25_4/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_5.txt -o output/modif_database_25_5/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_6.txt -o output/modif_database_25_6/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_7.txt -o output/modif_database_25_7/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_8.txt -o output/modif_database_25_8/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_9.txt -o output/modif_database_25_9/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_25_10.txt -o output/modif_database_25_10/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_1.txt -o output/modif_database_50_1/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_2.txt -o output/modif_database_50_2/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_3.txt -o output/modif_database_50_3/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_4.txt -o output/modif_database_50_4/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_5.txt -o output/modif_database_50_5/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_6.txt -o output/modif_database_50_6/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_7.txt -o output/modif_database_50_7/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_8.txt -o output/modif_database_50_8/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_9.txt -o output/modif_database_50_9/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_50_10.txt -o output/modif_database_50_10/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_1.txt -o output/modif_database_100_1/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_2.txt -o output/modif_database_100_2/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_3.txt -o output/modif_database_100_3/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_4.txt -o output/modif_database_100_4/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_5.txt -o output/modif_database_100_5/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_6.txt -o output/modif_database_100_6/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_7.txt -o output/modif_database_100_7/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_8.txt -o output/modif_database_100_8/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_9.txt -o output/modif_database_100_9/accumulated_probability_according_to_mdp
python main.py -i input/structure_empiric_frequency_modif_100_10.txt -o output/modif_database_100_10/accumulated_probability_according_to_mdp
1 0,00581395 0.00581395
1,1 0,0181686 0.0116279
1,2 0,0145349 0.0232558
1,3 0,00363372 0.00581395
1,6 0,00363372 0.00581395
1,1,1 0,0184219 0.0290698
1,1,2 0,010628 0.00581395
1,1,9 0,0021256 0.00581395
1,1,19 0,0042512 0.00581395
1,1,20 0,00354267 0.00581395
1,2,19 0,00163508 0.00581395
1,2,20 0,00136256 0.00581395
1,4,16 0,000327015 0.00581395
2,6,20 0,000157219 0.0116279
3,4,5 2,5155e-05 0.00581395
5,6,20 6,28875e-05 0.00581395
1,1,1,1 0,0094494 0.0116279
1,1,1,2 0,02008 0.00581395
1,1,1,20 0,00974469 0.0174419
1,1,2,2 0,0160012 0.00581395
1,1,2,3 0,00752999 0.00581395
1,1,2,19 0,00470624 0.00581395
1,1,2,20 0,0155306 0.0174419
1,1,3,3 0,000885881 0.00581395
1,1,4,5 0,000249154 0.00581395
1,1,5,7 0,000581359 0.00581395
1,1,6,20 0,000456782 0.00581395
1,1,7,20 0,00319748 0.00581395
1,1,9,20 0,000456782 0.00581395
1,1,20,20 0,0025123 0.0174419
1,2,2,2 0,0056671 0.00581395
1,2,2,3 0,00400031 0.00581395
1,2,2,20 0,00825063 0.00581395
1,2,4,20 0,00145599 0.0116279
1,2,7,20 0,00339732 0.00581395
1,2,15,19 0,00014707 0.00581395
1,2,20,20 0,00266932 0.0232558
1,3,20,20 0,000628076 0.00581395
1,5,20,20 0,000235528 0.00581395
1,7,7,7 4,94559e-05 0.00581395
2,2,2,3 0,000708387 0.00581395
2,2,2,20 0,00146105 0.00581395
2,2,3,19 0,000312524 0.00581395
2,2,7,20 0,000902413 0.00581395
2,3,19,19 4,59594e-05 0.00581395
1,1,1,1,20 0,00740782 0.00581395
1,1,1,2,3 0,00296194 0.00581395
1,1,1,2,20 0,012144 0.0116279
1,1,1,3,20 0,00291455 0.00581395
1,1,1,4,20 0,00194304 0.00581395
1,1,1,19,19 0,000246829 0.00581395
1,1,1,20,20 0,00497903 0.0290698
1,1,2,2,20 0,00746555 0.0116279
1,1,2,3,5 0,000437008 0.00581395
1,1,2,3,20 0,00358347 0.00581395
1,1,2,6,7 4,85565e-05 0.00581395
1,1,2,19,19 0,000303478 0.00581395
1,1,2,20,20 0,00612175 0.0116279
1,2,2,2,20 0,00203977 0.00581395
1,2,2,20,20 0,00250892 0.0116279
1,2,5,5,20 8,8118e-05 0.00581395
1,2,20,20,20 0,00091436 0.0116279
1,4,4,13,19 1,27361e-06 0.00581395
1,6,11,20,20 1,60571e-05 0.00581395
2,2,20,20,20 0,000187369 0.00581395
3,3,4,20,20 9,4763e-06 0.00581395
1,1,1,1,1,20 0,00392235 0.00581395
1,1,1,1,2,2 0,00198902 0.00581395
1,1,1,1,5,10 1,98902e-05 0.00581395
1,1,1,1,20,20 0,00517344 0.00581395
1,1,1,2,20,20 0,00713578 0.0116279
1,1,1,3,20,20 0,00214074 0.00581395
1,1,1,4,20,20 0,00285431 0.00581395
1,1,1,19,20,20 0,00107037 0.00581395
1,1,1,20,20,20 0,00303271 0.00581395
1,1,2,5,20,20 0,000738185 0.00581395
1,1,2,19,19,20 0,000108557 0.00581395
1,1,2,20,20,20 0,00313728 0.0232558
1,1,4,4,20,20 0,000590548 0.00581395
1,1,6,20,20,20 0,000156864 0.00581395
1,2,2,3,20,20 0,000763639 0.0116279
1,2,2,4,4,4 2,08778e-05 0.00581395
1,2,2,4,20,20 0,00101819 0.00581395
1,2,2,20,20,20 0,00108182 0.00581395
1,3,3,20,20,20 9,7364e-05 0.00581395
1,3,4,20,20,20 0,000259637 0.00581395
1,1,1,1,2,2,2 0,000105918 0.00581395
1,1,1,1,2,3,20 0,000507522 0.00581395
1,1,1,1,20,20,20 0,000213079 0.00581395
1,1,1,2,4,20,20 0,000889372 0.00581395
1,1,2,2,3,4,4 0,000177942 0.00581395
1,1,3,20,20,20,20 8,23336e-05 0.00581395
1,1,4,20,20,20,20 0,000117619 0.00581395
1,1,5,20,20,20,20 2,35239e-05 0.00581395
1,2,2,4,6,6,20 3,00685e-05 0.00581395
1,2,3,4,4,5,6 1,42353e-05 0.00581395
2,2,4,4,20,20,20 4,71296e-05 0.00581395
3,3,3,4,16,16,20 4,24424e-07 0.00581395
1,1,1,1,1,2,2,2 6,94544e-05 0.00581395
1,1,1,1,1,20,20,20 3,70269e-05 0.00581395
1,1,1,1,2,2,2,3 0,000231515 0.00581395
1,1,1,2,6,20,20,20 2,13324e-05 0.00581395
1,1,2,2,2,3,4,20 0,000274388 0.00581395
1,1,2,2,2,20,20,20 0,000174214 0.00581395
1,1,3,20,20,20,20,20 1,75535e-05 0.00581395
1,1,4,5,19,19,19,19 1,0978e-07 0.00581395
1,2,2,2,2,19,19,19 4,70682e-06 0.00581395
1,3,3,3,3,5,20,20 1,37137e-05 0.00581395
2,2,2,2,3,20,20,20 4,51667e-05 0.00581395
3,3,3,3,3,4,20,20 3,65698e-06 0.0116279
1,1,1,1,1,2,3,4,4 7,21768e-06 0.00581395
1,1,1,20,20,20,20,20,20 1,85388e-06 0.00581395
1,1,2,2,3,3,5,20,20 5,02992e-05 0.00581395
1,1,2,2,3,19,19,19,19 2,92383e-06 0.00581395
1,1,2,3,4,5,6,19,20 7,984e-06 0.00581395
1,2,2,2,20,20,20,20,20 1,69568e-05 0.00581395
2,2,2,2,2,3,4,20,20 1,36317e-05 0.00581395
1,1,2,2,2,3,4,20,20,20 2,26871e-05 0.00581395
1,1,2,2,19,19,19,19,19,20 1,01734e-05 0.00581395
1,2,2,3,4,7,20,20,20,20 5,55602e-06 0.00581395
1,1,1,1,1,3,3,4,20,20,20 5,28118e-05 0.00581395
1,1,1,2,2,2,2,3,3,4,20 3,06875e-05 0.00581395
1,1,1,2,2,2,3,20,20,20,20 8,14331e-05 0.00581395
1,1,1,3,3,20,20,20,20,20,20 1,96994e-05 0.00581395
2,3,3,4,4,5,19,19,20,20,20 3,7707e-07 0.00581395
1,1,1,1,1,20,20,20,20,20,20,20 2,98036e-05 0.00581395
1,1,1,2,2,3,4,4,6,7,9,20 3,52508e-08 0.00581395
1,1,1,2,2,20,20,20,20,20,20,20 5,47413e-05 0.00581395
1,1,2,5,5,20,20,20,20,20,20,20 1,75954e-05 0.00581395
1,2,4,5,6,19,19,20,20,20,20,20 2,43295e-06 0.00581395
1,1,1,1,1,1,1,1,1,1,1,20,20 8,75229e-05 0.00581395
1,1,2,2,2,5,20,20,20,20,20,20,20 4,73707e-06 0.00581395
1,1,1,1,1,1,2,3,4,20,20,20,20,20 2,58103e-05 0.00581395
1,2,3,7,8,20,20,20,20,20,20,20,20,20 3,90179e-06 0.00581395
1,1,1,1,2,2,2,2,3,3,20,20,20,20,20 9,9212e-05 0.00581395
1,1,2,2,3,20,20,20,20,20,20,20,20,20,20,20,20 0,000158207 0.00581395
1,2,2,3,3,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20 3,57219e-05 0.00581395
1 0.00571429 0.00581395
1,1 0.0178571 0.0116279
1,1,1 0.0181061 0.0290698
1,1,1,1 0.00928741 0.0116279
1,1,1,1,1,1,1,1,1,1,1,20,20 8.60225e-05 0.00581395
1,1,1,1,1,1,2,3,4,20,20,20,20,20 2.53678e-05 0.00581395
1,1,1,1,1,2,2,2 6.82637e-05 0.00581395
1,1,1,1,1,2,3,4,4 7.09394e-06 0.00581395
1,1,1,1,1,3,3,4,20,20,20 5.19064e-05 0.00581395
1,1,1,1,1,20 0.00385511 0.00581395
1,1,1,1,1,20,20,20 3.63922e-05 0.00581395
1,1,1,1,1,20,20,20,20,20,20,20 2.92927e-05 0.00581395
1,1,1,1,2,2 0.00195492 0.00581395
1,1,1,1,2,2,2 0.000104102 0.00581395
1,1,1,1,2,2,2,2,3,3,20,20,20,20,20 9.75112e-05 0.00581395
1,1,1,1,2,2,2,3 0.000227546 0.00581395
1,1,1,1,2,3,20 0.000498822 0.00581395
1,1,1,1,5,10 1.95492e-05 0.00581395
1,1,1,1,20 0.00728083 0.00581395
1,1,1,1,20,20 0.00508476 0.00581395
1,1,1,1,20,20,20 0.000209426 0.00581395
1,1,1,2 0.0197357 0.00581395
1,1,1,2,2,2,2,3,3,4,20 3.01614e-05 0.00581395
1,1,1,2,2,2,3,20,20,20,20 8.00371e-05 0.00581395
1,1,1,2,2,3,4,4,6,7,9,20 3.46465e-08 0.00581395
1,1,1,2,2,20,20,20,20,20,20,20 5.38029e-05 0.00581395
1,1,1,2,3 0.00291117 0.00581395
1,1,1,2,4,20,20 0.000874126 0.00581395
1,1,1,2,6,20,20,20 2.09667e-05 0.00581395
1,1,1,2,20 0.0119358 0.0116279
1,1,1,2,20,20 0.00701346 0.0116279
1,1,1,3,3,20,20,20,20,20,20 1.93617e-05 0.00581395
1,1,1,3,20 0.00286459 0.00581395
1,1,1,3,20,20 0.00210404 0.00581395
1,1,1,4,20 0.00190973 0.00581395
1,1,1,4,20,20 0.00280538 0.00581395
1,1,1,19,19 0.000242597 0.00581395
1,1,1,19,20,20 0.00105202 0.00581395
1,1,1,20 0.00957764 0.0174419
1,1,1,20,20 0.00489367 0.0290698
1,1,1,20,20,20 0.00298072 0.00581395
1,1,1,20,20,20,20,20,20 1.8221e-06 0.00581395
1,1,2 0.0104458 0.00581395
1,1,2,2 0.0157269 0.00581395
1,1,2,2,2,3,4,20 0.000269684 0.00581395
1,1,2,2,2,3,4,20,20,20 2.22982e-05 0.00581395
1,1,2,2,2,5,20,20,20,20,20,20,20 4.65587e-06 0.00581395
1,1,2,2,2,20,20,20 0.000171228 0.00581395
1,1,2,2,3,3,5,20,20 4.94369e-05 0.00581395
1,1,2,2,3,4,4 0.000174891 0.00581395
1,1,2,2,3,19,19,19,19 2.8737e-06 0.00581395
1,1,2,2,3,20,20,20,20,20,20,20,20,20,20,20,20 0.000155495 0.00581395
1,1,2,2,19,19,19,19,19,20 9.99898e-06 0.00581395
1,1,2,2,20 0.00733757 0.0116279
1,1,2,3 0.0074009 0.00581395
1,1,2,3,4,5,6,19,20 7.84713e-06 0.00581395
1,1,2,3,5 0.000429517 0.00581395
1,1,2,3,20 0.00352204 0.00581395
1,1,2,5,5,20,20,20,20,20,20,20 1.72938e-05 0.00581395
1,1,2,5,20,20 0.00072553 0.00581395
1,1,2,6,7 4.77241e-05 0.00581395
1,1,2,19 0.00462556 0.00581395
1,1,2,19,19 0.000298275 0.00581395
1,1,2,19,19,20 0.000106696 0.00581395
1,1,2,20 0.0152644 0.0174419
1,1,2,20,20 0.00601681 0.0116279
1,1,2,20,20,20 0.0030835 0.0232558
1,1,3,3 0.000870694 0.00581395
1,1,3,20,20,20,20 8.09222e-05 0.00581395
1,1,3,20,20,20,20,20 1.72526e-05 0.00581395
1,1,4,4,20,20 0.000580424 0.00581395
1,1,4,5 0.000244883 0.00581395
1,1,4,5,19,19,19,19 1.07898e-07 0.00581395
1,1,4,20,20,20,20 0.000115603 0.00581395
1,1,5,7 0.000571393 0.00581395
1,1,5,20,20,20,20 2.31206e-05 0.00581395
1,1,6,20 0.000448952 0.00581395
1,1,6,20,20,20 0.000154175 0.00581395
1,1,7,20 0.00314266 0.00581395
1,1,9 0.00208916 0.00581395
1,1,9,20 0.000448952 0.00581395
1,1,19 0.00417832 0.00581395
1,1,20 0.00348193 0.00581395
1,1,20,20 0.00246923 0.0174419
1,2 0.0142857 0.0232558
1,2,2,2 0.00556995 0.00581395
1,2,2,2,2,19,19,19 4.62614e-06 0.00581395
1,2,2,2,20 0.0020048 0.00581395
1,2,2,2,20,20,20,20,20 1.66661e-05 0.00581395
1,2,2,3 0.00393173 0.00581395
1,2,2,3,3,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20 3.51095e-05 0.00581395
1,2,2,3,4,7,20,20,20,20 5.46078e-06 0.00581395
1,2,2,3,20,20 0.000750548 0.0116279
1,2,2,4,4,4 2.05199e-05 0.00581395
1,2,2,4,6,6,20 2.95531e-05 0.00581395
1,2,2,4,20,20 0.00100073 0.00581395
1,2,2,20 0.00810919 0.00581395
1,2,2,20,20 0.00246591 0.0116279
1,2,2,20,20,20 0.00106328 0.00581395
1,2,3,4,4,5,6 1.39913e-05 0.00581395
1,2,3,7,8,20,20,20,20,20,20,20,20,20 3.8349e-06 0.00581395
1,2,4,5,6,19,19,20,20,20,20,20 2.39124e-06 0.00581395
1,2,4,20 0.00143103 0.0116279
1,2,5,5,20 8.66074e-05 0.00581395
1,2,7,20 0.00333908 0.00581395
1,2,15,19 0.000144549 0.00581395
1,2,19 0.00160705 0.00581395
1,2,20 0.00133921 0.00581395
1,2,20,20 0.00262356 0.0232558
1,2,20,20,20 0.000898686 0.0116279
1,3 0.00357143 0.00581395
1,3,3,3,3,5,20,20 1.34786e-05 0.00581395
1,3,3,20,20,20 9.56949e-05 0.00581395
1,3,4,20,20,20 0.000255186 0.00581395
1,3,20,20 0.000617309 0.00581395
1,4,4,13,19 1.25178e-06 0.00581395
1,4,16 0.000321409 0.00581395
1,5,20,20 0.000231491 0.00581395
1,6 0.00357143 0.00581395
1,6,11,20,20 1.57818e-05 0.00581395
1,7,7,7 4.86081e-05 0.00581395
2,2,2,2,2,3,4,20,20 1.3398e-05 0.00581395
2,2,2,2,3,20,20,20 4.43924e-05 0.00581395
2,2,2,3 0.000696244 0.00581395
2,2,2,20 0.001436 0.00581395
2,2,3,19 0.000307166 0.00581395
2,2,4,4,20,20,20 4.63217e-05 0.00581395
2,2,7,20 0.000886943 0.00581395
2,2,20,20,20 0.000184157 0.00581395
2,3,3,4,4,5,19,19,20,20,20 3.70606e-07 0.00581395
2,3,19,19 4.51715e-05 0.00581395
2,6,20 0.000154524 0.0116279