Created
June 29, 2016 15:49
-
-
Save EHadoux/5a07463086d7dd52b50c29ae79923b3d to your computer and use it in GitHub Desktop.
Computationally Viable Handling of Beliefs in Arguments for Persuasion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
#include <random> | |
#include <iostream> | |
#include <chrono> | |
#include <map> | |
#include <utility> | |
#include <algorithm> | |
//Proxy for the update as we are interesting in the time to go through the probability list, not the update itself. | |
void update(std::vector<unsigned int> &v) { | |
for( unsigned long i = 0; i < v.size(); i++ ) | |
v[i] += 1; | |
} | |
unsigned int make_cycles(unsigned int num_of_args, unsigned int num_of_cycles, std::default_random_engine gen, | |
std::vector<unsigned int> &cycles) { | |
unsigned int in_cycles_so_far; | |
do { | |
cycles.clear(); | |
in_cycles_so_far = 0; | |
for (unsigned int i = 0; i < num_of_cycles; i++) { | |
unsigned int limit = num_of_args * 2 / 3 - in_cycles_so_far; | |
if (limit > 1) { | |
std::uniform_int_distribution<unsigned int> distribution(2, limit); | |
unsigned int num_in_this_cycle = distribution(gen); | |
cycles.push_back(num_in_this_cycle); | |
in_cycles_so_far += num_in_this_cycle; | |
} | |
} | |
} while (cycles.size() < num_of_cycles); | |
return in_cycles_so_far; | |
} | |
unsigned int make_connections(unsigned int num_of_args, unsigned int num_of_cycles, unsigned int in_cycles_so_far, | |
unsigned int connectivity, std::default_random_engine gen, | |
std::map<unsigned int, unsigned int> &size_table) { | |
std::vector<std::pair<unsigned int, unsigned int>> arcs; | |
unsigned int num_solo = num_of_args - in_cycles_so_far; | |
std::uniform_int_distribution<unsigned int> attack(0, num_solo + num_of_cycles - 1); | |
unsigned int a1, a2; | |
bool onetwo, twoone; | |
unsigned int trylimit = 1000, current_try = 0; | |
for( int i = 0; i < connectivity; i++ ) { | |
do { | |
a1 = attack(gen); | |
a2 = attack(gen); | |
onetwo = std::find(arcs.begin(), arcs.end(), std::make_pair(a1, a2)) != arcs.end(); | |
twoone = std::find(arcs.begin(), arcs.end(), std::make_pair(a2, a1)) != arcs.end(); | |
current_try++; | |
} while ((onetwo || twoone || a1 == a2) && current_try < trylimit); | |
arcs.emplace_back(a1, a2); | |
if(size_table[a2] == 0) | |
size_table[a2] = 1; | |
size_table[a2] += 1; | |
} | |
return num_solo; | |
} | |
int main() { | |
/********* PARAMETERS ***********/ | |
unsigned int num_of_args = 50; | |
double num_of_connectivity_mean = 100.0, num_of_updates_mean = 100.0; | |
std::vector<unsigned int> cycle_sizes = {2, 4, 10}; | |
std::vector<unsigned int> connectivity {10, 30}; | |
std::vector<unsigned int> updates {1, 10, 50, 100}; | |
/********* PARAMETERS ***********/ | |
std::vector<unsigned int> cycles; | |
std::map<unsigned int, unsigned int> size_table; | |
unsigned int seed = (unsigned int)std::chrono::system_clock::now().time_since_epoch().count(); | |
std::default_random_engine gen(seed); | |
std::cout << num_of_args << " arguments" << std::endl; | |
for(unsigned int num_of_cycles : cycle_sizes ) { //Each number of cycles | |
std::cout << num_of_cycles << " cycles" << std::endl; | |
unsigned int in_cycles_so_far = make_cycles(num_of_args, num_of_cycles, gen, cycles); | |
for(unsigned int sizes : cycles) | |
std::cout << sizes << " "; | |
std::cout << "sizes of cycles" << std::endl; | |
for(unsigned num_of_connections : connectivity) { //Each number of arcs | |
std::cout << num_of_connections << " arcs" << std::endl; | |
std::vector<std::chrono::nanoseconds> conn_mean_time(updates.size(), std::chrono::nanoseconds::zero()); | |
for(int conn_mean = 0; conn_mean < num_of_connectivity_mean; conn_mean++) { | |
size_table.clear(); | |
for(unsigned int i = 0; i < cycles.size(); i++) | |
size_table[i] = cycles[i]; | |
unsigned int num_solo = make_connections(num_of_args, num_of_cycles, in_cycles_so_far, | |
num_of_connections, gen, size_table); | |
unsigned int num_tables = num_solo + num_of_cycles; | |
std::uniform_int_distribution<unsigned int> distribution(0, num_tables - 1); | |
for(unsigned int index_update = 0; index_update < updates.size(); index_update++) { //Each number of updates | |
std::chrono::nanoseconds time = std::chrono::nanoseconds::zero(); | |
for(unsigned int update_mean = 0; update_mean < num_of_updates_mean; update_mean++) { | |
for (unsigned int i = 0; i < updates[index_update]; i++) { | |
unsigned int arg_to_update = distribution(gen); | |
std::vector<unsigned int> vec((unsigned int) pow(2, size_table[arg_to_update]), 0); | |
auto begin = std::chrono::steady_clock::now(); | |
update(vec); | |
auto end = std::chrono::steady_clock::now(); | |
time += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); | |
} | |
} | |
conn_mean_time[index_update] += time; | |
} | |
} | |
for(unsigned int index_updates = 0; index_updates < updates.size(); index_updates++) | |
std::cout << (long)(conn_mean_time[index_updates].count() / (num_of_updates_mean * num_of_connectivity_mean)) << " ns for " << updates[index_updates] << " updates" << std::endl; | |
} | |
} | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
#include <random> | |
#include <iostream> | |
#include <chrono> | |
#include <map> | |
#include <utility> | |
#include <algorithm> | |
//Proxy for the update as we are interesting in the time to go through the probability list, not the update itself. | |
void update(std::vector<unsigned int> &v) { | |
for( unsigned long i = 0; i < v.size(); i++ ) | |
v[i] += 1; | |
} | |
int main() { | |
/* PARAMETERS */ | |
std::vector<unsigned int> var_args {25, 50, 75, 100}; | |
unsigned int min_cycle_size = 1; | |
unsigned int max_cycle_size = 15; | |
unsigned int num_updates = 20; | |
double connectivity_factor = 0.5; | |
unsigned int instance_mean = 1000; | |
unsigned int update_mean = 1000; | |
/* PARAMETERS */ | |
unsigned int seed = (unsigned int)std::chrono::system_clock::now().time_since_epoch().count(); | |
std::default_random_engine gen(seed); | |
std::uniform_int_distribution<unsigned int> size_distrib(min_cycle_size, max_cycle_size); | |
for(auto num_cycles : var_args) { | |
auto time = std::chrono::nanoseconds::zero(); | |
for(unsigned int instance_num = 0; instance_num < instance_mean; instance_num++) { | |
std::vector<unsigned int> sizes; | |
unsigned int args_left = num_cycles; | |
while (args_left > 0) { | |
unsigned int size; | |
do { | |
size = size_distrib(gen); | |
} while (size > args_left); | |
sizes.push_back(size); | |
args_left -= size; | |
} | |
std::uniform_int_distribution<unsigned int> connection_distrib(0, sizes.size() - 1); | |
for (unsigned int i = 0; i < (unsigned int) (num_cycles * connectivity_factor); i++) | |
sizes[connection_distrib(gen)]++; | |
std::vector<std::vector<unsigned int>> proba_vectors(sizes.size()); | |
for (unsigned int i = 0; i < sizes.size(); i++) | |
proba_vectors[i] = std::vector<unsigned int>(sizes[i], 0); | |
std::discrete_distribution<unsigned int> update_distrib(sizes.begin(), sizes.end()); | |
for(unsigned int i = 0; i < update_mean; i++) { | |
for (unsigned int i = 0; i < num_updates; i++) { | |
unsigned int aim = update_distrib(gen); | |
auto begin = std::chrono::steady_clock::now(); | |
update(proba_vectors[aim]); | |
auto end = std::chrono::steady_clock::now(); | |
time += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); | |
} | |
} | |
} | |
std::cout << num_cycles << ";" << (long)(time.count() / (instance_mean * update_mean)) << std::endl; //nanoseconds | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment