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 );
        }
    }
Beispiel #2
0
/**
 * 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;
}