Skip to content

Commit be5aee0

Browse files
authored
make GeneticValueToFitnessMap a pure ABC on the C++ side (#1375)
1 parent f4c6fcb commit be5aee0

File tree

9 files changed

+63
-36
lines changed

9 files changed

+63
-36
lines changed

cpp/genetic_value_to_fitness/GeneticValueIsFitness.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ init_GeneticValueIsFitness(py::module& m)
1111
.def(py::init<std::size_t>())
1212
.def(py::pickle(
1313
[](const fwdpy11::GeneticValueIsFitness& g) {
14-
return py::make_tuple(g.total_dim);
14+
return py::make_tuple(g.ndim());
1515
},
1616
[](py::tuple t) {
1717
std::size_t ndim = t[0].cast<std::size_t>();

cpp/genetic_value_to_fitness/GeneticValueToFitnessMap.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ init_GeneticValueToFitnessMap(py::module& m)
1212
.def_property_readonly(
1313
"shape",
1414
[](const fwdpy11::GeneticValueToFitnessMap& self) {
15-
return pybind11::make_tuple(self.total_dim);
15+
return pybind11::make_tuple(self.ndim());
1616
},
1717
R"delim(
1818
Returns the shape (dimensonality) of the object
@@ -21,7 +21,9 @@ init_GeneticValueToFitnessMap(py::module& m)
2121
)delim")
2222
.def_property_readonly(
2323
"maps_to_fitness",
24-
[](const fwdpy11::GeneticValueToFitnessMap& self) { return self.isfitness; },
24+
[](const fwdpy11::GeneticValueToFitnessMap& self) {
25+
return self.is_fitness();
26+
},
2527
R"delim(
2628
Returns True if object represents a mapping directly to fitness, and
2729
False otherwise.
@@ -31,7 +33,7 @@ init_GeneticValueToFitnessMap(py::module& m)
3133
.def_property_readonly(
3234
"maps_to_trait_value",
3335
[](const fwdpy11::GeneticValueToFitnessMap& self) {
34-
return !self.isfitness;
36+
return !self.is_fitness();
3537
},
3638
R"delim(
3739
Returns True if object represents a trait value, and
@@ -40,4 +42,3 @@ init_GeneticValueToFitnessMap(py::module& m)
4042
.. versionadded:: 0.7.0
4143
)delim");
4244
}
43-

cpp/genetic_values/DiploidGeneticValue.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ init_DiploidGeneticValue(py::module& m)
4242
.def_property_readonly(
4343
"maps_to_fitness",
4444
[](const fwdpy11::DiploidGeneticValue& self) {
45-
return self.gv2w->isfitness;
45+
return self.gv2w->is_fitness();
4646
},
4747
R"delim(
4848
Returns True if object represents a mapping directly to fitness, and
@@ -53,7 +53,7 @@ init_DiploidGeneticValue(py::module& m)
5353
.def_property_readonly(
5454
"maps_to_trait_value",
5555
[](const fwdpy11::DiploidGeneticValue& self) {
56-
return !self.gv2w->isfitness;
56+
return !self.gv2w->is_fitness();
5757
},
5858
R"delim(
5959
Returns True if object represents a trait value, and

fwdpy11/headers/fwdpy11/genetic_value_to_fitness/GaussianStabilizingSelection.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,18 @@ namespace fwdpy11
1515

1616
public:
1717
explicit GaussianStabilizingSelection(const GSSmo &input)
18-
: GeneticValueIsTrait(input.total_dim), pimpl(input.clone())
18+
: GeneticValueIsTrait(input.ndim()), pimpl(input.clone())
1919
{
2020
}
2121

2222
explicit GaussianStabilizingSelection(const MultivariateGSSmo &input)
23-
: GeneticValueIsTrait(input.total_dim), pimpl(input.clone())
23+
: GeneticValueIsTrait(input.ndim()), pimpl(input.clone())
2424
{
2525
}
2626

2727
double
28-
operator()(const DiploidGeneticValueToFitnessData data) const final {
28+
operator()(const DiploidGeneticValueToFitnessData data) const final
29+
{
2930
return this->pimpl->operator()(data);
3031
}
3132

fwdpy11/headers/fwdpy11/genetic_value_to_fitness/GeneticValueIsFitness.hpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@
2424

2525
namespace fwdpy11
2626
{
27-
struct GeneticValueIsFitness : public GeneticValueToFitnessMap
27+
class GeneticValueIsFitness : public GeneticValueToFitnessMap
2828
{
29+
private:
30+
std::size_t dim;
31+
32+
public:
2933
explicit GeneticValueIsFitness(std::size_t ndim)
30-
: GeneticValueToFitnessMap(ndim, maps_to_fitness(true))
34+
: GeneticValueToFitnessMap(), dim(ndim)
3135
{
3236
}
3337

@@ -45,7 +49,17 @@ namespace fwdpy11
4549
std::shared_ptr<GeneticValueToFitnessMap>
4650
clone() const override
4751
{
48-
return std::make_shared<GeneticValueIsFitness>(this->total_dim);
52+
return std::make_shared<GeneticValueIsFitness>(this->dim);
53+
}
54+
55+
std::size_t
56+
ndim() const override
57+
{
58+
return this->dim;
59+
}
60+
61+
bool is_fitness() const override {
62+
return true;
4963
}
5064
};
5165
} // namespace fwdpy11

fwdpy11/headers/fwdpy11/genetic_value_to_fitness/GeneticValueIsTrait.hpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,33 @@
2424

2525
namespace fwdpy11
2626
{
27-
struct GeneticValueIsTrait : public GeneticValueToFitnessMap
27+
class GeneticValueIsTrait : public GeneticValueToFitnessMap
2828
/// Another ABC. Effectively a type trait
2929
{
30+
private:
31+
std::size_t dim;
32+
33+
public:
3034
explicit GeneticValueIsTrait(std::size_t ndim)
31-
: GeneticValueToFitnessMap(ndim, maps_to_fitness(false))
35+
: GeneticValueToFitnessMap(), dim(ndim)
3236
{
3337
}
3438
virtual ~GeneticValueIsTrait() = default;
3539
GeneticValueIsTrait(const GeneticValueIsTrait&) = delete;
3640
GeneticValueIsTrait(GeneticValueIsTrait&&) = default;
3741
GeneticValueIsTrait& operator=(const GeneticValueIsTrait&) = delete;
3842
GeneticValueIsTrait& operator=(GeneticValueIsTrait&&) = default;
43+
std::size_t
44+
ndim() const override
45+
{
46+
return this->dim;
47+
}
48+
49+
bool
50+
is_fitness() const override
51+
{
52+
return false;
53+
}
3954
};
4055
} // namespace fwdpy11
4156

fwdpy11/headers/fwdpy11/genetic_value_to_fitness/GeneticValueToFitnessMap.hpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,13 @@
2121

2222
#include <memory>
2323
#include <fwdpy11/types/DiploidPopulation.hpp>
24-
#include <fwdpy11/genetic_values/default_update.hpp>
25-
#include <fwdpp/util/named_type.hpp>
2624
#include <fwdpy11/genetic_value_data/genetic_value_data.hpp>
2725

2826
namespace fwdpy11
2927
{
30-
struct genetic_value_maps_to_fitness
31-
{
32-
};
33-
34-
using maps_to_fitness
35-
= fwdpp::strong_types::named_type<bool, genetic_value_maps_to_fitness>;
36-
3728
struct GeneticValueToFitnessMap
3829
{
39-
std::size_t total_dim;
40-
bool isfitness;
41-
explicit GeneticValueToFitnessMap(std::size_t ndim, const maps_to_fitness& m)
42-
: total_dim{ndim}, isfitness{m.get()}
30+
GeneticValueToFitnessMap()
4331
{
4432
}
4533

@@ -49,10 +37,12 @@ namespace fwdpy11
4937
GeneticValueToFitnessMap& operator=(const GeneticValueToFitnessMap&) = delete;
5038
GeneticValueToFitnessMap& operator=(GeneticValueToFitnessMap&&) = default;
5139

52-
virtual double
53-
operator()(const DiploidGeneticValueToFitnessData /*data*/) const = 0;
40+
virtual double operator()(const DiploidGeneticValueToFitnessData /*data*/) const
41+
= 0;
5442
virtual void update(const DiploidPopulation& /*pop*/) = 0;
5543
virtual std::shared_ptr<GeneticValueToFitnessMap> clone() const = 0;
44+
virtual bool is_fitness() const = 0;
45+
virtual std::size_t ndim() const = 0;
5646
};
5747
} //namespace fwdpy11
5848

fwdpy11/headers/fwdpy11/genetic_value_to_fitness/MultivariateGSSmo.hpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ namespace fwdpy11
3939

4040
MultivariateGSSmo(const std::vector<PleiotropicOptima> &po)
4141
: GeneticValueIsTrait{po.empty() ? 0 : po[0].optima.size()}, optima(po),
42-
current_timepoint(0),
43-
current_timepoint_optima{}, VW{std::numeric_limits<double>::quiet_NaN()}
42+
current_timepoint(0), current_timepoint_optima{},
43+
VW{std::numeric_limits<double>::quiet_NaN()}
4444
{
4545
if (po.empty())
4646
{
@@ -54,9 +54,10 @@ namespace fwdpy11
5454
"invalid when value for PleiotropicOptima");
5555
}
5656
}
57+
auto x = po[0].optima.size();
5758
for (auto &o : optima)
5859
{
59-
if (o.optima.size() != total_dim)
60+
if (o.optima.size() != x)
6061
{
6162
throw std::invalid_argument(
6263
"all lists of optima must be the same length");
@@ -71,7 +72,7 @@ namespace fwdpy11
7172
double
7273
operator()(const DiploidGeneticValueToFitnessData data) const override
7374
{
74-
if (data.gvalues.get().size() != total_dim)
75+
if (data.gvalues.get().size() != optima[0].optima.size())
7576
{
7677
throw std::runtime_error("dimension mismatch");
7778
}
@@ -115,8 +116,13 @@ namespace fwdpy11
115116
{
116117
update_details(pop);
117118
}
119+
120+
std::size_t
121+
ndim() const
122+
{
123+
return optima[0].optima.size();
124+
}
118125
};
119126
} // namespace fwdpy11
120127

121128
#endif
122-

fwdpy11/headers/fwdpy11/genetic_values/fwdpp_wrappers/fwdpp_genetic_value.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ namespace fwdpy11
104104
const GeneticValueNoise* noise_)
105105
: DiploidGeneticValue{ndim, gv2w_, noise_}, gv{clamp}, aa_scaling(scaling),
106106
make_return_value(std::move(mrv)),
107-
callback(init_callback(ndim, aa_scaling)), isfitness(gv2w->isfitness)
107+
callback(init_callback(ndim, aa_scaling)), isfitness(gv2w->is_fitness())
108108
{
109109
}
110110

0 commit comments

Comments
 (0)