Skip to content

Commit

Permalink
Add some additional operations to better match some unit standards fo…
Browse files Browse the repository at this point in the history
…r python
  • Loading branch information
phlptp committed Jan 12, 2025
1 parent 9d91e0d commit d6cd718
Show file tree
Hide file tree
Showing 7 changed files with 1,057 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ endif()
project(
${UNITS_CMAKE_PROJECT_NAME}
LANGUAGES C CXX
VERSION 0.12.0
VERSION 0.12.1
)
include(CMakeDependentOption)
include(CTest)
Expand Down
3 changes: 3 additions & 0 deletions python/units_llnl/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from typing import TypeAlias
from .units_llnl_ext import (
Unit,
Measurement,
Expand All @@ -8,3 +9,5 @@
defined_units_from_file,
__doc__,
)

Quantity: TypeAlias = Measurement
97 changes: 92 additions & 5 deletions python/units_python.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SPDX-License-Identifier: BSD-3-Clause
#include <nanobind/nanobind.h>
#include <nanobind/operators.h>
#include <nanobind/stl/string.h>
#include <nanobind/stl/bind_map.h>

#include "units/units.hpp"
#include "units/units_math.hpp"
Expand All @@ -32,14 +33,21 @@ NB_MODULE(units_llnl_ext, mod)
[](units::precise_unit* type, const char* arg0) {
new (type) units::precise_unit(
units::unit_from_string(std::string(arg0)));
})
},"unit"_a)
.def(
"__init__",
[](units::precise_unit* type,
double multiplier,
const units::precise_unit& base) {
new (type) units::precise_unit(multiplier, base);
})
},"multiplier"_a,"unit"_a)
.def(
"__init__",
[](units::precise_unit* type,
double multiplier,
const char *base) {
new (type) units::precise_unit(multiplier, units::unit_from_string(base));
},"multiplier"_a,"unit"_a)
.def(
"__init__",
[](units::precise_unit* type,
Expand All @@ -48,7 +56,17 @@ NB_MODULE(units_llnl_ext, mod)
new (type) units::precise_unit{
units::unit_from_string(std::string(arg0)),
units::getCommodity(std::string(commodity))};
})
},"unit"_a,"commodity"_a)
.def(
"__init__",
[](units::precise_unit* type,
double multiplier,
const char* arg0,
const char* commodity) {
new (type) units::precise_unit{multiplier,
units::unit_from_string(std::string(arg0)),
units::getCommodity(std::string(commodity))};
},"multiplier"_a,"unit"_a,"commodity"_a)
.def_prop_ro("multiplier", &units::precise_unit::multiplier)
.def_prop_ro(
"commodity",
Expand Down Expand Up @@ -145,6 +163,29 @@ NB_MODULE(units_llnl_ext, mod)
"value"_a,
"unit_out"_a,
"value represented by one unit in terms of another")
.def(
"to",
[](units::precise_unit* unit,
double value,
const units::precise_unit& convert_to_units) {
return units::convert(value, *unit, convert_to_units);
},
"value"_a,
"unit_out"_a,
"value represented by one unit in terms of another")
.def(
"to",
[](units::precise_unit* unit,
double value,
const char* convert_to_units) {
return units::convert(
value,
*unit,
units::unit_from_string(std::string(convert_to_units)));
},
"value"_a,
"unit_out"_a,
"value represented by one unit in terms of another")
.def("is_per_unit", &units::precise_unit::is_per_unit)
.def("is_equation", &units::precise_unit::is_equation)
.def(
Expand Down Expand Up @@ -196,6 +237,13 @@ NB_MODULE(units_llnl_ext, mod)
is_valid(unit) && !is_error(unit) &&
unit.multiplier() != 0);
})
.def(
"to_dict",
[](const units::precise_unit& unit) {
nb::dict dictionary;
dictionary["unit"]=units::to_string(unit);
return dictionary;
})
.def("__hash__", [](const units::precise_unit& unit) {
return std::hash<units::precise_unit>()(unit);
});
Expand All @@ -218,14 +266,25 @@ NB_MODULE(units_llnl_ext, mod)
const char* arg0) {
new (measurement) units::precise_measurement(
value, units::unit_from_string(std::string(arg0)));
})
},"value"_a,
"unit"_a)
.def(
"__init__",
[](units::precise_measurement* measurement,
std::string value,
std::string unit) {
new (measurement) units::precise_measurement(
units::measurement_from_string(value + " "+unit));
},"value"_a,
"unit"_a)
.def(
"__init__",
[](units::precise_measurement* measurement,
double value,
const units::precise_unit& unit) {
new (measurement) units::precise_measurement(value, unit);
})
},"value"_a,
"unit"_a)
.def_prop_ro(
"value",
[](const units::precise_measurement& measurement) {
Expand All @@ -241,6 +300,11 @@ NB_MODULE(units_llnl_ext, mod)
[](const units::precise_measurement& measurement) {
return measurement.units();
})
.def_prop_ro(
"unit",
[](const units::precise_measurement& measurement) {
return measurement.units();
})
.def(
"set_units",
[](const units::precise_measurement* measurement,
Expand Down Expand Up @@ -282,6 +346,21 @@ NB_MODULE(units_llnl_ext, mod)
units::unit_from_string(std::string(units)));
},
"create a new `Measurement` with the new units and the value converted to those units")
.def(
"to",
[](const units::precise_measurement& measurement,
const units::precise_unit& unit) {
return measurement.convert_to(unit);
},
"create a new `Measurement` with the new units and the value converted to those units")
.def(
"to",
[](const units::precise_measurement& measurement,
const char* units) {
return measurement.convert_to(
units::unit_from_string(std::string(units)));
},
"create a new `Measurement` with the new units and the value converted to those units")
.def(
"convert_to_base",
&units::precise_measurement::convert_to_base,
Expand Down Expand Up @@ -382,6 +461,14 @@ NB_MODULE(units_llnl_ext, mod)
units::unit_from_string(fmt_string)));
}
})
.def(
"to_dict",
[](const units::precise_measurement& measurement) {
nb::dict dictionary;
dictionary["unit"]=units::to_string(measurement.units());
dictionary["value"]=measurement.value();
return dictionary;
})
.def(
"__neg__",
[](const units::precise_measurement& measurement) {
Expand Down
Loading

0 comments on commit d6cd718

Please sign in to comment.