void StiRelationshipStartReporter::onNewRelationship(IRelationship* relationship) { LOG_DEBUG_F("%s: rel id = %d, male id = %d, female id = %d\n", __FUNCTION__, relationship->GetSuid().data, relationship->MalePartner()->GetSuid().data, relationship->FemalePartner()->GetSuid().data ); // TODO - set the relationship suid in the relationship code (or relationship manager) auto male_partner = relationship->MalePartner(); auto female_partner = relationship->FemalePartner(); if (male_partner && female_partner) { // get set of relationships in order to count the number for each type RelationshipSet_t &his_relationships = male_partner->GetRelationships(); RelationshipSet_t &her_relationships = female_partner->GetRelationships(); RelationshipStartInfo info; info.id = relationship->GetSuid().data; info.start_time = relationship->GetStartTime(); info.scheduled_end_time = relationship->GetScheduledEndTime(); info.relationship_type = (unsigned int)relationship->GetType(); IIndividualHumanEventContext* individual = nullptr; if (male_partner->QueryInterface(GET_IID(IIndividualHumanEventContext), (void**)&individual) != s_OK) { throw QueryInterfaceException( __FILE__, __LINE__, __FUNCTION__, "male_partner", "IIndividualHumanContext", "IIndividualHumanSTI*" ); } // -------------------------------------------------------- // --- Assuming that the individuals in a relationship // --- must be in the same node. //release_assert( false ); // -------------------------------------------------------- info.original_node_id = relationship->GetOriginalNodeId(); info.current_node_id = individual->GetNodeEventContext()->GetNodeContext()->GetExternalID(); info.participant_a.id = male_partner->GetSuid().data; info.participant_a.is_infected = male_partner->IsInfected(); info.participant_a.gender = individual->GetGender(); info.participant_a.age = individual->GetAge()/365; info.participant_a.active_relationship_count = male_partner->GetRelationships().size(); info.participant_a.props = GetPropertyString( individual ) ; for( int i = 0 ; i < RelationshipType::COUNT ; ++i ) { info.participant_a.relationship_count[ i ] = 0 ; } for (auto relationship : his_relationships) { info.participant_a.relationship_count[ int(relationship->GetType()) ]++; } info.participant_a.cumulative_lifetime_relationships = male_partner->GetLifetimeRelationshipCount(); info.participant_a.relationships_in_last_six_months = male_partner->GetLast6MonthRels(); info.participant_a.extrarelational_flags = male_partner->GetExtrarelationalFlags(); info.participant_a.is_circumcised = male_partner->IsCircumcised(); info.participant_a.has_sti = male_partner->HasSTICoInfection(); info.participant_a.is_superspreader = male_partner->IsBehavioralSuperSpreader(); if (female_partner->QueryInterface(GET_IID(IIndividualHumanEventContext), (void**)&individual) != s_OK) { throw QueryInterfaceException( __FILE__, __LINE__, __FUNCTION__, "female_partner", "IIndividualHumanContext", "IIndividualHumanSTI*" ); } info.participant_b.id = female_partner->GetSuid().data; info.participant_b.is_infected = female_partner->IsInfected(); info.participant_b.gender = individual->GetGender(); info.participant_b.age = individual->GetAge()/365; info.participant_b.active_relationship_count = female_partner->GetRelationships().size(); info.participant_b.props = GetPropertyString( individual ) ; for( int i = 0 ; i < RelationshipType::COUNT ; ++i ) { info.participant_b.relationship_count[ i ] = 0 ; } for (auto relationship : her_relationships) { info.participant_b.relationship_count[ int(relationship->GetType()) ]++; } info.participant_b.cumulative_lifetime_relationships = female_partner->GetLifetimeRelationshipCount(); info.participant_b.relationships_in_last_six_months = female_partner->GetLast6MonthRels(); info.participant_b.extrarelational_flags = female_partner->GetExtrarelationalFlags(); info.participant_b.is_circumcised = female_partner->IsCircumcised(); info.participant_b.has_sti = female_partner->HasSTICoInfection(); info.participant_b.is_superspreader = female_partner->IsBehavioralSuperSpreader(); CollectOtherData( info.id, male_partner, female_partner ); report_data.push_back(info); } else { LOG_WARN_F( "%s: one or more partners of new relationship %d has already migrated\n", __FUNCTION__, relationship->GetSuid().data ); } }
/** * Initialize and activate timing of a context. */ int bfwork_context_init_timing(bfwork_context_t *context, const char *tag, const char *path_folder) { int err; char *sched; char filename[100]; char intaux[20]; assert(context); //Set tag context->tag = (char *) tag; //Create timing if(time_new_stats(20, &context->time_stats)) { LOG_ERROR("Failed to initialize time stats\n"); } //Get OMP schedule sched = getenv("OMP_SCHEDULE"); //Target folder for stats? if(path_folder != NULL) { strcpy(filename, path_folder); //Create stats directory err = mkdir(filename, S_IRWXU); if(err) { err = errno; LOG_WARN_F("Failed to create stats directory \"%s\", error code: %s\n", filename, strerror(err)); } strcat(filename, "/"); if(tag) { strcat(filename,tag); } if(sched) { strcat(filename,"_"); strcat(filename,sched); } else { printf("ERROR: Obtaining OMP_SCHEDULE environment value\n"); } //strcat(filename,"_"); //sprintf(intaux, "%d", MAX_BATCH_SIZE); //strcat(filename, intaux); strcat(filename, "_"); sprintf(intaux, "%d", omp_get_max_threads()); strcat(filename, intaux); strcat(filename, ".stats"); //Set output file if(time_set_output_file(filename, context->time_stats)) { LOG_ERROR_F("Failed to set timing file output to \"%s\"\n", filename); } else { printf("STATISTICS ACTIVATED, output file: %s\n\n", filename); } } return NO_ERROR; }