float SusceptibilityVector::BitingRiskAgeFactor(float _age)
    {
        float risk = 1.0f;
        switch(SusceptibilityVectorConfig::age_dependent_biting_risk_type)
        {
            case AgeDependentBitingRisk::OFF:
                // risk is independent by age
                break;

            case AgeDependentBitingRisk::LINEAR:
                risk = LinearBitingFunction(_age);
                break;

            case AgeDependentBitingRisk::SURFACE_AREA_DEPENDENT:
                risk = SurfaceAreaBitingFunction(_age);
                break;

            default:
                throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, 
                    "age_dependent_biting_risk_type", SusceptibilityVectorConfig::age_dependent_biting_risk_type, 
                    AgeDependentBitingRisk::pairs::lookup_key(SusceptibilityVectorConfig::age_dependent_biting_risk_type) );
        }

        LOG_DEBUG_F("Age-dependent biting-risk = %f for %0.2f-year-old individual.\n", risk, _age/DAYSPERYEAR);
        return risk;
    }
    void Action::CheckConfigurationTriggers()
    {
        if( m_EventToBroadcast.empty() || (m_EventToBroadcast == JsonConfigurable::default_string) )
        {
            throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, "You must define Event_To_Broadcast" );
        } 

        switch( m_EventType )
        {
            case EventType::INDIVIDUAL:
            {
                m_TriggerIndividual = EventTriggerFactory::GetInstance()->CreateTrigger( "Event_To_Broadcast", m_EventToBroadcast );
                break;
            }
            case EventType::NODE:
            {
                m_TriggerNode = EventTriggerNodeFactory::GetInstance()->CreateTrigger( "Event_To_Broadcast", m_EventToBroadcast );
                break;
            }
            case EventType::COORDINATOR:
            {
                m_TriggerCoordinator = EventTriggerCoordinatorFactory::GetInstance()->CreateTrigger( "Event_To_Broadcast", m_EventToBroadcast );
                break;
            }
            default:
                throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Event_Type", m_EventType, EventType::pairs::lookup_key( m_EventType ) );
        }
    }
예제 #3
0
    void SimpleVaccine::Update( float dt )
    {
        // -----------------------------------------------------------------
        // --- Still update waning_effect even if the vaccine did not take.
        // --- This allows it to expire on schedule.
        // -----------------------------------------------------------------
        waning_effect->Update(dt);

        // ----------------------------------------------------------------------
        // --- If the vaccine did not take, do not attempt to update the vaccine
        // --- behavior within the individual.  
        // ----------------------------------------------------------------------
        if( vaccine_took )
        {
            release_assert(ivc);
            switch( vaccine_type )
            {
                case SimpleVaccineType::AcquisitionBlocking:
                    ivc->UpdateVaccineAcquireRate( waning_effect->Current() );
                    break;

                case SimpleVaccineType::TransmissionBlocking:
                    ivc->UpdateVaccineTransmitRate( waning_effect->Current() );
                    break;

                case SimpleVaccineType::MortalityBlocking:
                    ivc->UpdateVaccineMortalityRate( waning_effect->Current() );
                    break;

                case SimpleVaccineType::Generic:
                    ivc->UpdateVaccineAcquireRate(   waning_effect->Current() );
                    ivc->UpdateVaccineTransmitRate(  waning_effect->Current() );
                    ivc->UpdateVaccineMortalityRate( waning_effect->Current() );
                    break;

                default:
                    throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "vaccine_type", vaccine_type, SimpleVaccineType::pairs::lookup_key( vaccine_type ) );
                    break;
            }
        }

        if( !expired )
        {
            expired = waning_effect->Expired();
        }
    }
예제 #4
0
    void IndividualHumanVector::Expose( const IContagionPopulation* cp, float dt, TransmissionRoute::Enum transmission_route )
    {
        release_assert( cp );
        release_assert( susceptibility );
        release_assert( interventions );
#if 1
        // get rid of this. but seems to be needed for malaria garki. :( :( :(
        if( !vector_interventions )
        {
            vector_interventions = static_cast<VectorInterventionsContainer*>(interventions);
        }
#endif
        release_assert( vector_interventions );
        float acqmod = GetRelativeBitingRate() * susceptibility->getModAcquire() * interventions->GetInterventionReducedAcquire();

        switch( transmission_route )
        {
            case TransmissionRoute::TRANSMISSIONROUTE_VECTOR_TO_HUMAN_INDOOR:
                acqmod *= vector_interventions->GetblockIndoorVectorAcquire();
                break;

            case TransmissionRoute::TRANSMISSIONROUTE_VECTOR_TO_HUMAN_OUTDOOR:
                acqmod *= vector_interventions->GetblockOutdoorVectorAcquire();
                break;
        
            default:
                throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "transmission_route", transmission_route, "Stringified enum value not available" );
        }

        // Accumulate vector of pairs of strain ids and cumulative infection probability
        float infection_probability = cp->GetTotalContagion() * acqmod * dt;
        if ( infection_probability > 0 )
        {
            // Increment total exposure
            m_total_exposure += infection_probability;

            // With a weighted random draw, pick a strain from the ContagionPopulation CDF
            StrainIdentity strain_id;
            strain_id.SetAntigenID(cp->GetAntigenId());
            cp->ResolveInfectingStrain(&strain_id); 

            // Push this exposure and strain back to the storage array for all vector-to-human pools (e.g. indoor, outdoor)
            m_strain_exposure.push_back( std::make_pair(strain_id, m_total_exposure) );
        }
    }
예제 #5
0
파일: Drugs.cpp 프로젝트: clorton/EMOD
    // I think we can get rid of this altogether
    void
    GenericDrug::Update(float dt)
    {
        if( !BaseIntervention::UpdateIndividualsInterventionStatus() ) return;

        switch (durability_time_profile)
        {
            case PKPDModel::FIXED_DURATION_CONSTANT_EFFECT:
                SimpleUpdate(dt);
                break;
            case PKPDModel::CONCENTRATION_VERSUS_TIME:
                UpdateWithPkPd(dt);
                break;
            default:
                throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "durability_time_profile", durability_time_profile, PKPDModel::pairs::lookup_key(durability_time_profile) );
        }
        ApplyEffects();
    }
    bool ReferenceTrackingEventCoordinatorHIV::qualifiesDemographically( const IIndividualHumanEventContext * pIndividual )
    {
        bool qualifies = ReferenceTrackingEventCoordinator::qualifiesDemographically( pIndividual );
        if( qualifies )
        {
            IIndividualHumanHIV* p_hiv_individual = nullptr;
            if(const_cast<IIndividualHumanEventContext*>(pIndividual)->QueryInterface( GET_IID( IIndividualHumanHIV ), (void**)&p_hiv_individual ) != s_OK)
            {
                throw QueryInterfaceException( __FILE__, __LINE__, __FUNCTION__, "pIndividual", "IIndividualHumanHIV", "IIndividualHumanEventContext" );
            }

            IHIVInterventionsContainer* p_hiv_container = p_hiv_individual->GetHIVInterventionsContainer();
            IHIVMedicalHistory* p_med_history = nullptr;
            if( p_hiv_container->QueryInterface( GET_IID( IHIVMedicalHistory ), (void**)&p_med_history ) != s_OK)
            {
                throw QueryInterfaceException( __FILE__, __LINE__, __FUNCTION__, "p_hiv_container", "IHIVMedicalHistory", "IHIVInterventionsContainer" );
            }

            switch( target_disease_state )
            {
                case TargetDiseaseStateType::Everyone:
                    qualifies = true;
                    break;
                case TargetDiseaseStateType::HIV_Positive:
                    qualifies = p_hiv_individual->HasHIV();
                    break;
                case TargetDiseaseStateType::HIV_Negative:
                    qualifies = !p_hiv_individual->HasHIV();
                    break;
                case TargetDiseaseStateType::Tested_Positive:
                    qualifies = p_med_history->EverTestedHIVPositive();
                    break;
                case TargetDiseaseStateType::Tested_Negative:
                    qualifies = p_med_history->EverTested() && !p_med_history->EverTestedHIVPositive();
                    break;
                case TargetDiseaseStateType::Not_Tested_Or_Tested_Negative:
                    qualifies = !p_med_history->EverTested() || !p_med_history->EverTestedHIVPositive();
                    break;
                default:
                    throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "target_disease_state", target_disease_state );
            }
        }
        return qualifies;
    }
예제 #7
0
 float PairFormationParametersImpl::FormationRate( const IdmDateTime& rCurrentTime, float dt ) const
 {
     float formation_rate = 0.0 ;
     switch( formation_rate_type )
     {
         case FormationRateType::CONSTANT:
             formation_rate = formation_rate_constant ;
             break;
         case FormationRateType::SIGMOID_VARIABLE_WIDTH_HEIGHT:
             formation_rate = formation_rate_sigmoid.variableWidthAndHeightSigmoid( rCurrentTime.Year() );
             break;
         case FormationRateType::INTERPOLATED_VALUES:
             formation_rate = formation_rate_value_map.getValueLinearInterpolation( rCurrentTime.Year(), 0.0f );
             break;
         default:
             throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Formation_Rate_Type", formation_rate_type );
     }
     return formation_rate;
 }
    uint32_t IncidenceCounterSurveillance::GetCountOfQualifyingPopulation( const std::vector<INodeEventContext*>& rNodes )
    {
        if( (m_PercentageEventsToCountIndividual.size()  != 0) ||
            (m_PercentageEventsToCountNode.size()        != 0) ||
            (m_PercentageEventsToCountCoordinator.size() != 0) )
        {
            return m_PercentageEventsCounted;
        }

        //Took Dan's methood from https://github.com/Bridenbecker/DtkTrunk/pull/10#discussion_r171112313
        // Not finished/tested yet
        int count = 0;
        switch( m_CounterEventType )
        {
            case EventType::COORDINATOR:
            {
                count = 1;
                break;
            }
            case EventType::NODE:
            {
                for( INodeEventContext* const& inec : rNodes )
                {
                    if( m_NodePropertyRestrictions.Qualifies( inec->GetNodeContext()->GetNodeProperties() ) )
                    {
                        ++count;
                    }
                }
                break;
            }
            case EventType::INDIVIDUAL:
            {
                count = IncidenceCounter::GetCountOfQualifyingPopulation( rNodes );
                break;
            }
            default:
                throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Counter_Event_Type", m_CounterEventType, EventType::pairs::lookup_key( m_CounterEventType ) );
        }
        return count;
    }
예제 #9
0
파일: InputEIR.cpp 프로젝트: clorton/EMOD
    bool InputEIR::Configure( const Configuration * inputJson )
    {
        initConfig( "Age_Dependence", age_dependence, inputJson, MetadataDescriptor::Enum("Age_Dependence", IE_Age_Dependence_DESC_TEXT, MDD_ENUM_ARGS(AgeDependentBitingRisk)) );
        initConfigComplexType( "Monthly_EIR", &monthly_EIR, IE_Config_Type_DESC_TEXT);

        switch(age_dependence)
        {
            case AgeDependentBitingRisk::OFF:
                risk_function=nullptr;
                break;

            case AgeDependentBitingRisk::LINEAR:
                risk_function = SusceptibilityVector::LinearBitingFunction;
                break;

            case AgeDependentBitingRisk::SURFACE_AREA_DEPENDENT:
                risk_function = SusceptibilityVector::SurfaceAreaBitingFunction;
                break;

            default:
                if( !JsonConfigurable::_dryrun )
                {
                    throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, 
                        "age_dependence", age_dependence, 
                        AgeDependentBitingRisk::pairs::lookup_key(age_dependence) );
                }
        }

        bool configured = BaseNodeIntervention::Configure( inputJson );

        if(monthly_EIR.size() != MONTHSPERYEAR && JsonConfigurable::_dryrun == false )
        {
            throw GeneralConfigurationException( __FILE__, __LINE__, __FUNCTION__, 
                "'Monthly_EIR' parameterizes the mean number of infectious bites experienced by an individual for each month of the year.  As such, it must be an array of EXACTLY length 12." );
        }

        return configured;
    }
 void IncidenceCounterSurveillance::CheckConfigurationTriggers()
 {
     switch( m_CounterEventType )
     {
         case EventType::INDIVIDUAL:
         {
             m_TriggerConditionListIndividual = EventTriggerFactory::GetInstance()->CreateTriggerList( "Trigger_Condition_List", m_TriggerConditionList );
             break;
         }
         case EventType::NODE:
         {
             m_TriggerConditionListNode = EventTriggerNodeFactory::GetInstance()->CreateTriggerList( "Trigger_Condition_List", m_TriggerConditionList );
             break;
         }
         case EventType::COORDINATOR:
         {
             m_TriggerConditionListCoordinator = EventTriggerCoordinatorFactory::GetInstance()->CreateTriggerList( "Trigger_Condition_List", m_TriggerConditionList );
             break;
         }
         default:
             throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Counter_Event_Type", m_CounterEventType, EventType::pairs::lookup_key( m_CounterEventType ) );
     }
 }
 void IncidenceCounterSurveillance::SetPercentageEventsToCount( const std::vector<std::string>& rPercentageEvents )
 {
     switch( m_CounterEventType )
     {
         case EventType::INDIVIDUAL:
         {
             m_PercentageEventsToCountIndividual = EventTriggerFactory::GetInstance()->CreateTriggerList( "Percentage_Events_To_Count", rPercentageEvents );
             break;
         }
         case EventType::NODE:
         {
             m_PercentageEventsToCountNode = EventTriggerNodeFactory::GetInstance()->CreateTriggerList( "Percentage_Events_To_Count", rPercentageEvents );
             break;
         }
         case EventType::COORDINATOR:
         {
             m_PercentageEventsToCountCoordinator = EventTriggerCoordinatorFactory::GetInstance()->CreateTriggerList( "Percentage_Events_To_Count", rPercentageEvents );
             break;
         }
         default:
             throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Counter_Event_Type", m_CounterEventType, EventType::pairs::lookup_key( m_CounterEventType ) );
     }
 }
예제 #12
0
    bool PairFormationParametersImpl::Configure( const Configuration* inputJson )
    {
        initConfig( "Formation_Rate_Type", 
                    formation_rate_type,
                    inputJson, 
                    MetadataDescriptor::Enum("Formation_Rate_Type", "TBD"/*Formation_Rate_Type_DESC_TEXT*/, MDD_ENUM_ARGS( FormationRateType ) ) );

        if( formation_rate_type == FormationRateType::CONSTANT )
        {
            initConfigTypeMap( "Formation_Rate_Constant", &formation_rate_constant, "TBD"/*Formation_Rate_DESC_TEXT*/, 0, 1, 0.001f );
        }
        else if( formation_rate_type == FormationRateType::SIGMOID_VARIABLE_WIDTH_HEIGHT )
        {
            initConfigTypeMap( "Formation_Rate_Sigmoid", &formation_rate_sigmoid, "TBD"/*Formation_Rate_Sigmoid_DESC_TEXT*/ );
        }
        else if( formation_rate_type == FormationRateType::INTERPOLATED_VALUES )
        {
            initConfigComplexType("Formation_Rate_Interpolated_Values", &formation_rate_value_map, "TBD"/*Formation_Rate_Interpolated_Values_DESC_TEXT*/ );
        }
        else
        {
            throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Formation_Rate_Type", formation_rate_type );
        }

        initConfigTypeMap( "Extra_Relational_Rate_Ratio_Male",   &rate_ratio[Gender::MALE  ], PFA_Extra_Relational_Rate_Ratio_Male_DESC_TEXT,   1.0, FLT_MAX, 1.0f );
        initConfigTypeMap( "Extra_Relational_Rate_Ratio_Female", &rate_ratio[Gender::FEMALE], PFA_Extra_Relational_Rate_Ratio_Female_DESC_TEXT, 1.0, FLT_MAX, 1.0f );

        initConfigTypeMap( "Update_Period",                  &update_period,            "TBD"/*Update_Period_DESC_TEXT*/,         0,    FLT_MAX,    0      );
        initConfigTypeMap( "Number_Age_Bins_Male",           &male_age_bin_count,       Number_Age_Bins_Male_DESC_TEXT,           1,       1000,    1      );
        initConfigTypeMap( "Number_Age_Bins_Female",         &female_age_bin_count,     Number_Age_Bins_Female_DESC_TEXT,         1,       1000,    1      );
        initConfigTypeMap( "Age_of_First_Bin_Edge_Male",     &initial_male_age,         Age_of_First_Bin_Edge_Male_DESC_TEXT,     0,        100,    1      );
        initConfigTypeMap( "Age_of_First_Bin_Edge_Female",   &initial_female_age,       Age_of_First_Bin_Edge_Female_DESC_TEXT,   0,        100,    1      );
        initConfigTypeMap( "Years_Between_Bin_Edges_Male",   &male_age_increment,       Years_Between_Bin_Edges_Male_DESC_TEXT,   0.1f,     100.0f, 1.0f   );
        initConfigTypeMap( "Years_Between_Bin_Edges_Female", &female_age_increment,     Years_Between_Bin_Edges_Female_DESC_TEXT, 0.1f,     100.0f, 1.0f   );
        initConfigTypeMap( "Joint_Probabilities",            &joint_probabilities,      Joint_Probabilities_DESC_TEXT,            0.0,  FLT_MAX,    0.0f   ); 

        bool ret = false;
        bool prev_use_defaults = JsonConfigurable::_useDefaults ;
        bool reset_track_missing = JsonConfigurable::_track_missing;
        JsonConfigurable::_track_missing = false;
        JsonConfigurable::_useDefaults = false ;
        
        try
        {

            ret = JsonConfigurable::Configure( inputJson );

            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;
        }
        catch( DetailedException& e )
        {
            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;

            std::stringstream ss ;
            ss << e.GetMsg() << "\n" << "Was reading values for " << RelationshipType::pairs::lookup_key( rel_type ) << "." ;
            throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
        }
        catch( json::Exception& e )
        {
            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;

            std::stringstream ss ;
            ss << e.what() << "\n" << "Was reading values for " << RelationshipType::pairs::lookup_key( rel_type ) << "." ;
            throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
        }

        if( ret )
        {
            CheckArraySizes();

            InitializeAgeBins( Gender::MALE,   male_age_bin_count,   initial_male_age,   male_age_increment   );
            InitializeAgeBins( Gender::FEMALE, female_age_bin_count, initial_female_age, female_age_increment );

            InitializeMarginalValues();
            InitializeCumulativeProbabilities();
        }
        return ret ;
    }