00001
00011 #include "DegreeDistributionConnections.h"
00012
00013 DegreeDistributionConnections::DegreeDistributionConnections( RandomDistribution const& degreeDistribution, DegreeType degreeType) :
00014 dist(NULL),
00015 degree_type(degreeType)
00016 {
00017 dist = degreeDistribution.clone();
00018 }
00019
00020 DegreeDistributionConnections::~DegreeDistributionConnections()
00021 {
00022 if( dist ) delete dist;
00023 }
00024
00025
00026 void DegreeDistributionConnections::init(const SimObjectPopulation &srcPopulation, const SimObjectPopulation &destPopulation)
00027 {
00028 src_popul = &srcPopulation;
00029 dest_popul = &destPopulation;
00030 }
00031
00032
00033 void DegreeDistributionConnections::reset(
00034 SimObject::ID::SortedVector::const_iterator src_begin_it,
00035 SimObject::ID::SortedVector::const_iterator src_end_it,
00036 SimObject::ID::SortedVector::const_iterator dest_begin_it,
00037 SimObject::ID::SortedVector::const_iterator dest_end_it)
00038 {
00039 if (degree_type == incoming) {
00040 from_begin_it = src_begin_it;
00041 from_seq_size = src_end_it - src_begin_it;
00042 curr_to_it = dest_begin_it;
00043 to_end_it = dest_end_it;
00044 } else {
00045 from_begin_it = dest_begin_it;
00046 from_seq_size = dest_end_it - dest_begin_it;
00047 curr_to_it = src_begin_it;
00048 to_end_it = src_end_it;
00049 }
00050
00051 curr_degree = (unsigned)round((*dist)(*m_rnd_eng));
00052
00053 curr_made_connections = 0;
00054
00055 if (curr_degree >= from_seq_size) {
00056 throw PCSIM::ConstructionException("DegreeDistributionConnections::initGenerateConnections" , "Degree generated by distribution is larger than srcPopulation size");
00057 }
00058 nonrepeat_rng.reset(0, from_seq_size - 1, curr_degree);
00059 }
00060
00061 bool DegreeDistributionConnections::next( pair<SimObject::ID, SimObject::ID> &conn_pair )
00062 {
00063 last_conn_valid = false;
00064
00065 if (curr_made_connections == curr_degree) {
00066 curr_to_it ++;
00067 if (curr_to_it == to_end_it)
00068 return false;
00069
00070 curr_degree = (unsigned)round((*dist)(*m_rnd_eng));
00071 if (curr_degree >= from_seq_size) {
00072 throw PCSIM::ConstructionException("DegreeDistributionConnections::initGenerateConnections" , "Degree generated by distribution is larger than srcPopulation size");
00073 }
00074 nonrepeat_rng.reset(curr_degree);
00075 curr_made_connections = 0;
00076 }
00077
00078 do {
00079 int from_idx = nonrepeat_rng(*m_rnd_eng);
00080 if (degree_type == incoming) {
00081 last_conn_idx.first = *(from_begin_it + from_idx);
00082 conn_pair.first = (*src_popul).getID(last_conn_idx.first);
00083
00084 last_conn_idx.second = *curr_to_it;
00085 conn_pair.second = (*dest_popul).getID(last_conn_idx.second);
00086 } else {
00087 last_conn_idx.first = *curr_to_it;
00088 conn_pair.first = (*src_popul).getID(last_conn_idx.first);
00089
00090 last_conn_idx.second = *(from_begin_it + from_idx);
00091 conn_pair.second = (*dest_popul).getID(last_conn_idx.second);
00092 }
00093 } while (conn_pair.first == conn_pair.second);
00094
00095 curr_made_connections++;
00096
00097 last_conn_valid = true;
00098
00099 return true;
00100 }