Skip to content

Commit 2de00ef

Browse files
committed
fix bug in Individual trait property access
1 parent 9ba2211 commit 2de00ef

3 files changed

Lines changed: 48 additions & 12 deletions

File tree

core/individual.cpp

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2627,7 +2627,7 @@ void Individual::SetProperty(EidosGlobalStringID p_property_id, const EidosValue
26272627
Species &species = subpopulation_->species_;
26282628
Trait *trait = species.TraitFromStringID(p_property_id);
26292629

2630-
if (trait)
2630+
if (trait) // ACCELERATED
26312631
{
26322632
trait_info_[trait->Index()].value_ = (slim_effect_t)p_value.FloatAtIndex_NOCAST(0, nullptr);
26332633
return;
@@ -3039,7 +3039,7 @@ void Individual::SetProperty_Accelerated_age(EidosGlobalStringID p_property_id,
30393039

30403040
void Individual::SetProperty_Accelerated_TRAIT_VALUE(EidosGlobalStringID p_property_id, EidosObject **p_values, size_t p_values_size, const EidosValue &p_source, size_t p_source_size)
30413041
{
3042-
#pragma unused (p_property_id, p_source_size)
3042+
#pragma unused (p_property_id)
30433043
const Individual **individuals_buffer = (const Individual **)p_values;
30443044
Species *species = Community::SpeciesForIndividualsVector(individuals_buffer, (int)p_values_size);
30453045
const double *source_data = p_source.FloatData();
@@ -3049,23 +3049,53 @@ void Individual::SetProperty_Accelerated_TRAIT_VALUE(EidosGlobalStringID p_prope
30493049
Trait *trait = species->TraitFromStringID(p_property_id);
30503050
int64_t trait_index = trait->Index();
30513051

3052-
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3052+
if (p_source_size == 1)
30533053
{
3054-
const Individual *value = individuals_buffer[value_index];
3054+
slim_effect_t source_value = (slim_effect_t)source_data[0];
30553055

3056-
value->trait_info_[trait_index].value_ = (slim_effect_t)source_data[value_index];
3056+
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3057+
{
3058+
const Individual *value = individuals_buffer[value_index];
3059+
3060+
value->trait_info_[trait_index].value_ = source_value;
3061+
}
3062+
}
3063+
else
3064+
{
3065+
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3066+
{
3067+
const Individual *value = individuals_buffer[value_index];
3068+
3069+
value->trait_info_[trait_index].value_ = (slim_effect_t)source_data[value_index];
3070+
}
30573071
}
30583072
}
30593073
else
30603074
{
30613075
// with a mixed-species target, the species and trait have to be looked up for each individual
3062-
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3076+
if (p_source_size == 1)
30633077
{
3064-
const Individual *value = individuals_buffer[value_index];
3065-
Trait *trait = value->subpopulation_->species_.TraitFromStringID(p_property_id);
3066-
int64_t trait_index = trait->Index();
3078+
slim_effect_t source_value = (slim_effect_t)source_data[0];
30673079

3068-
value->trait_info_[trait_index].value_ = (slim_effect_t)source_data[value_index];
3080+
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3081+
{
3082+
const Individual *value = individuals_buffer[value_index];
3083+
Trait *trait = value->subpopulation_->species_.TraitFromStringID(p_property_id);
3084+
int64_t trait_index = trait->Index();
3085+
3086+
value->trait_info_[trait_index].value_ = source_value;
3087+
}
3088+
}
3089+
else
3090+
{
3091+
for (size_t value_index = 0; value_index < p_values_size; ++value_index)
3092+
{
3093+
const Individual *value = individuals_buffer[value_index];
3094+
Trait *trait = value->subpopulation_->species_.TraitFromStringID(p_property_id);
3095+
int64_t trait_index = trait->Index();
3096+
3097+
value->trait_info_[trait_index].value_ = (slim_effect_t)source_data[value_index];
3098+
}
30693099
}
30703100
}
30713101
}

core/slim_test_genetics.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,8 @@ late() { sim.killIndividuals(p1.subsetIndividuals(minAge=1)); }
10851085
SLiMAssertScriptSuccess(mt_base_p1 + "1 late() { if (!identical(p1.individuals.weight, rep(0.0, 5))) stop(); }");
10861086
SLiMAssertScriptSuccess(mt_base_p1 + "1 late() { p1.individuals.height = 10.0; if (!identical(p1.individuals.height, rep(10.0, 5))) stop(); }");
10871087
SLiMAssertScriptSuccess(mt_base_p1 + "1 late() { p1.individuals.weight = 10.0; if (!identical(p1.individuals.weight, rep(10.0, 5))) stop(); }");
1088+
SLiMAssertScriptSuccess(mt_base_p1 + "1 late() { p1.individuals.height = 10.0:14; if (!identical(p1.individuals.height, 10.0:14)) stop(); }");
1089+
SLiMAssertScriptSuccess(mt_base_p1 + "1 late() { p1.individuals.weight = 11.0:15; if (!identical(p1.individuals.weight, 11.0:15)) stop(); }");
10881090
}
10891091

10901092
std::cout << "_RunMultitraitTests() done" << std::endl;

core/species_eidos.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,7 +1714,8 @@ EidosValue_SP Species::ExecuteContextFunction_initializeTrait(const std::string
17141714
else
17151715
{
17161716
// see also SLiMTypeInterpreter::_TypeEvaluate_FunctionCall_Internal(), which also tracks this
1717-
EidosPropertySignature_CSP signature((new EidosPropertySignature(name, true, kEidosValueMaskObject | kEidosValueMaskSingleton, gSLiM_Trait_Class))->MarkAsDynamicWithOwner("Trait"));
1717+
EidosPropertySignature_CSP signature((new EidosPropertySignature(name, true, kEidosValueMaskObject | kEidosValueMaskSingleton, gSLiM_Trait_Class))
1718+
->MarkAsDynamicWithOwner("Trait"));
17181719

17191720
gSLiM_Species_Class->AddSignatureForProperty(signature);
17201721
}
@@ -1734,7 +1735,10 @@ EidosValue_SP Species::ExecuteContextFunction_initializeTrait(const std::string
17341735
else
17351736
{
17361737
// see also SLiMTypeInterpreter::_TypeEvaluate_FunctionCall_Internal(), which also tracks this
1737-
EidosPropertySignature_CSP signature((new EidosPropertySignature(name, false, kEidosValueMaskFloat | kEidosValueMaskSingleton))->MarkAsDynamicWithOwner("Trait")->DeclareAcceleratedGet(Individual::GetProperty_Accelerated_TRAIT_VALUE));
1738+
EidosPropertySignature_CSP signature((new EidosPropertySignature(name, false, kEidosValueMaskFloat | kEidosValueMaskSingleton))->
1739+
MarkAsDynamicWithOwner("Trait")->
1740+
DeclareAcceleratedGet(Individual::GetProperty_Accelerated_TRAIT_VALUE)->
1741+
DeclareAcceleratedSet(Individual::SetProperty_Accelerated_TRAIT_VALUE));
17381742

17391743
gSLiM_Individual_Class->AddSignatureForProperty(signature);
17401744
}

0 commit comments

Comments
 (0)