Skip to content

Commit

Permalink
clang-tidy + sonar cloud
Browse files Browse the repository at this point in the history
Signed-off-by: Martijn Govers <Martijn.Govers@Alliander.com>
  • Loading branch information
mgovers committed Oct 12, 2023
1 parent 7ccd987 commit 6c80ebb
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 67 deletions.
Expand Up @@ -15,7 +15,7 @@ namespace power_grid_model::common_solver_functions {
template <bool sym>
void add_sources(grouped_idx_vector_type auto const& sources_per_bus, Idx const& bus_number, YBus<sym> const& y_bus,
ComplexVector const& u_source_vector, ComplexTensor<sym>& diagonal_element, ComplexValue<sym>& u_bus) {
for (Idx source_number : sources_per_bus.get_element_range(bus_number)) {
for (Idx const source_number : sources_per_bus.get_element_range(bus_number)) {
ComplexTensor<sym> const y_source = y_bus.math_model_param().source_param[source_number];
diagonal_element += y_source; // add y_source to the diagonal of Ybus
u_bus += dot(y_source, ComplexValue<sym>{u_source_vector[source_number]}); // rhs += Y_source * U_source
Expand All @@ -35,7 +35,7 @@ template <bool sym> void copy_y_bus(YBus<sym> const& y_bus, ComplexTensorVector<
template <bool sym>
void calculate_source_result(Idx const& bus_number, YBus<sym> const& y_bus, PowerFlowInput<sym> const& input,
MathOutput<sym>& output, grouped_idx_vector_type auto const& sources_per_bus) {
for (Idx source : sources_per_bus.get_element_range(bus_number)) {
for (Idx const source : sources_per_bus.get_element_range(bus_number)) {
ComplexValue<sym> const u_ref{input.source[source]};
ComplexTensor<sym> const y_ref = y_bus.math_model_param().source_param[source];
output.source[source].i = dot(y_ref, u_ref - output.u[bus_number]);
Expand Down
Expand Up @@ -186,7 +186,7 @@ template <bool sym> class IterativeCurrentPFSolver : public IterativePFSolver<sy

void add_sources(Idx const& bus_number, YBus<sym> const& y_bus, PowerFlowInput<sym> const& input,
grouped_idx_vector_type auto const& sources_per_bus) {
for (Idx source_number : sources_per_bus.get_element_range(bus_number)) {
for (Idx const source_number : sources_per_bus.get_element_range(bus_number)) {
// I_inj_i += Y_source_j * U_ref_j
rhs_u_[bus_number] += dot(y_bus.math_model_param().source_param[source_number],
ComplexValue<sym>{input.source[source_number]});
Expand Down
Expand Up @@ -188,10 +188,10 @@ template <bool sym> class MeasuredValues {
load_gen_flow, source_flow);
}
// current injection
for (Idx load_gen : load_gens) {
for (Idx const load_gen : load_gens) {
load_gen_flow[load_gen].i = conj(load_gen_flow[load_gen].s / u[bus]);
}
for (Idx source : sources) {
for (Idx const source : sources) {
source_flow[source].i = conj(source_flow[source].s / u[bus]);
}
}
Expand Down Expand Up @@ -319,11 +319,11 @@ template <bool sym> class MeasuredValues {
Idx n_unmeasured = 0;
SensorCalcParam<sym> appliance_injection_measurement{};

for (Idx load_gen : topo.load_gens_per_bus.get_element_range(bus)) {
for (Idx const load_gen : topo.load_gens_per_bus.get_element_range(bus)) {
add_appliance_measurements(idx_load_gen_power_[load_gen], appliance_injection_measurement, n_unmeasured);
}

for (Idx source : topo.sources_per_bus.get_element_range(bus)) {
for (Idx const source : topo.sources_per_bus.get_element_range(bus)) {
add_appliance_measurements(idx_source_power_[source], appliance_injection_measurement, n_unmeasured);
}

Expand Down Expand Up @@ -485,63 +485,21 @@ template <bool sym> class MeasuredValues {
1.0 / accumulated_inverse_variance};
}

// process objects in batch for shunt, load_gen, source
// return the status of the object type, if all the connected objects are measured
// TODO(mgovers): deprecate + remove
static void process_bus_objects(Idx const bus, IdxVector const& obj_indptr, IdxVector const& sensor_indptr,
IntSVector const& obj_status, std::vector<SensorCalcParam<sym>> const& input_data,
std::vector<SensorCalcParam<sym>>& result_data, IdxVector& result_idx) {
for (Idx obj = obj_indptr[bus]; obj != obj_indptr[bus + 1]; ++obj) {
result_idx[obj] = process_one_object(obj, sensor_indptr, obj_status, input_data, result_data);
}
}

// process objects in batch for shunt, load_gen, source
// return the status of the object type, if all the connected objects are measured
// TODO(mgovers): deprecate + remove
static void process_bus_objects(Idx const bus, grouped_idx_vector_type auto const& objects,
IdxVector const& sensor_indptr, IntSVector const& obj_status,
std::vector<SensorCalcParam<sym>> const& input_data,
std::vector<SensorCalcParam<sym>>& result_data, IdxVector& result_idx) {
for (Idx obj : objects.get_element_range(bus)) {
result_idx[obj] = process_one_object(obj, sensor_indptr, obj_status, input_data, result_data);
}
}

// process objects in batch for shunt, load_gen, source
// return the status of the object type, if all the connected objects are measured
// TODO(mgovers): get element range of single bus instead of bus + objects
static void process_bus_objects(Idx const bus, grouped_idx_vector_type auto const& objects,
grouped_idx_vector_type auto const& sensors, IntSVector const& obj_status,
std::vector<SensorCalcParam<sym>> const& input_data,
std::vector<SensorCalcParam<sym>>& result_data, IdxVector& result_idx) {
for (Idx obj : objects.get_element_range(bus)) {
for (Idx const obj : objects.get_element_range(bus)) {
result_idx[obj] = process_one_object(obj, sensors, obj_status, input_data, result_data);
}
}

// process one object
static constexpr auto default_status_checker = [](auto x) -> bool { return x; };

// TODO(mgovers): deprecate + remove
template <class TS, class StatusChecker = decltype(default_status_checker)>
static Idx process_one_object(Idx const obj, IdxVector const& sensor_indptr, std::vector<TS> const& obj_status,
std::vector<SensorCalcParam<sym>> const& input_data,
std::vector<SensorCalcParam<sym>>& result_data,
StatusChecker status_checker = default_status_checker) {
Idx const begin = sensor_indptr[obj];
Idx const end = sensor_indptr[obj + 1];
if (!status_checker(obj_status[obj])) {
return disconnected;
}
if (begin == end) {
return unmeasured;
}
result_data.push_back(combine_measurements(input_data, begin, end));
return static_cast<Idx>(result_data.size()) - 1;
}

// process one object
template <class TS, class StatusChecker = decltype(default_status_checker)>
static Idx process_one_object(Idx const obj, grouped_idx_vector_type auto const& sensors_per_obj,
std::vector<TS> const& obj_status,
Expand Down Expand Up @@ -584,14 +542,14 @@ template <bool sym> class MeasuredValues {
// calculate residual, divide, and assign to unmeasured (but connected) appliances
ComplexValue<sym> const s_residual_per_appliance =
(s - bus_appliance_injection.value) / static_cast<double>(n_unmeasured);
for (Idx load_gen : load_gens) {
for (Idx const load_gen : load_gens) {
if (has_load_gen(load_gen)) {
load_gen_flow[load_gen].s = load_gen_power(load_gen).value;
} else if (idx_load_gen_power_[load_gen] == unmeasured) {
load_gen_flow[load_gen].s = s_residual_per_appliance;
}
}
for (Idx source : sources) {
for (Idx const source : sources) {
if (has_source(source)) {
source_flow[source].s = source_power(source).value;
} else if (idx_source_power_[source] == unmeasured) {
Expand All @@ -609,12 +567,12 @@ template <bool sym> class MeasuredValues {
// mu = (sum[S_i] - S_cal) / sum[variance]
ComplexValue<sym> const mu = (bus_appliance_injection.value - s) / bus_appliance_injection.variance;
// S_i = S_i_mea - var_i * mu
for (Idx load_gen : load_gens) {
for (Idx const load_gen : load_gens) {
if (has_load_gen(load_gen)) {
load_gen_flow[load_gen].s = load_gen_power(load_gen).value - (load_gen_power(load_gen).variance) * mu;
}
}
for (Idx source : sources) {
for (Idx const source : sources) {
if (has_source(source)) {
source_flow[source].s = source_power(source).value - (source_power(source).variance) * mu;
}
Expand Down
Expand Up @@ -47,7 +47,7 @@ template <bool sym, typename DerivedSolver> class IterativePFSolver {
DoubleComplex const u_ref = [&]() {
DoubleComplex sum_u_ref = 0.0;
for (Idx bus = 0; bus != n_bus_; ++bus) {
for (Idx source : sources_per_bus.get_element_range(bus)) {
for (Idx const source : sources_per_bus.get_element_range(bus)) {
sum_u_ref += input.source[source] * std::exp(1.0i * -phase_shift[bus]); // offset phase shift
}
}
Expand Down
Expand Up @@ -406,7 +406,7 @@ template <bool sym> class NewtonRaphsonPFSolver : public IterativePFSolver<sym,
void add_sources(Idx const& bus_number, Idx const& diagonal_position, YBus<sym> const& y_bus,
PowerFlowInput<sym> const& input, grouped_idx_vector_type auto const& sources_per_bus,
ComplexValueVector<sym> const& u) {
for (Idx source_number : sources_per_bus.get_element_range(bus_number)) {
for (Idx const source_number : sources_per_bus.get_element_range(bus_number)) {
ComplexTensor<sym> const y_ref = y_bus.math_model_param().source_param[source_number];
ComplexValue<sym> const u_ref{input.source[source_number]};
// calculate block, um = ui, us = uref
Expand Down
Expand Up @@ -117,7 +117,7 @@ struct YBusStructure {
}
// loop shunt
for (Idx bus = 0; bus != n_bus; ++bus) {
for (Idx shunt : topo.shunts_per_bus.get_element_range(bus)) {
for (Idx const shunt : topo.shunts_per_bus.get_element_range(bus)) {
append_element_vector(vec_map_element, bus, bus, YBusElementType::shunt, shunt);
}
}
Expand Down Expand Up @@ -403,7 +403,7 @@ template <bool sym> class YBus {
std::vector<MathOutputType> shunt_flow(math_topology_->n_shunt());
// loop all bus, then all shunt within the bus
for (Idx bus = 0; bus != size(); ++bus) {
for (Idx shunt : math_topology_->shunts_per_bus.get_element_range(bus)) {
for (Idx const shunt : math_topology_->shunts_per_bus.get_element_range(bus)) {
// See "Branch/Shunt Power Flow" in "State Estimation Alliander"
// NOTE: the negative sign for injection direction!
shunt_flow[shunt].i = -dot(math_model_param_->shunt_param[shunt], u[bus]);
Expand Down
Expand Up @@ -587,8 +587,10 @@ class Topology {
// Only connect the component if include(component_i) returns true
template <Idx (MathModelTopology::*n_obj_fn)() const, typename ObjectFinder = SingleTypeObjectFinder,
typename Predicate = decltype(include_all)>
void couple_object_components(std::invocable<Idx, IdxVector> auto&& assign_indptr, ObjectFinder object_finder,
std::vector<Idx2D>& coupling, Predicate include = include_all) {
void couple_object_components(auto&& assign_indptr, ObjectFinder object_finder, std::vector<Idx2D>& coupling,
Predicate include = include_all)
requires std::invocable<std::remove_cvref_t<decltype(assign_indptr)>, Idx, IdxVector>
{
auto const n_math_topologies(static_cast<Idx>(math_topology_.size()));
auto const n_components = object_finder.size();
std::vector<IdxVector> topo_obj_idx(n_math_topologies);
Expand Down Expand Up @@ -659,8 +661,8 @@ class Topology {

// source
couple_object_components<&MathModelTopology::n_bus>(
[this](Idx topo_idx, IdxVector indptr) {
math_topology_[topo_idx].sources_per_bus = {from_sparse, std::move(indptr)};
[this](Idx topo_idx, IdxVector const& indptr) {
math_topology_[topo_idx].sources_per_bus = {from_sparse, indptr};
},
{comp_topo_.source_node_idx, comp_coup_.node}, comp_coup_.source,
[this](Idx i) { return comp_conn_.source_connected[i]; });
Expand Down
5 changes: 0 additions & 5 deletions tests/cpp_unit_tests/test_topology.cpp
Expand Up @@ -92,11 +92,6 @@ namespace power_grid_model {

namespace {

std::ostream& operator<<(std::ostream& s, Idx2D const& idx) {
s << "(" << idx.group << ", " << idx.pos << ")";
return s;
}

template <grouped_idx_vector_type T> void check_equal(T const& first, T const& second) {
REQUIRE(first.size() == second.size());
for ([[maybe_unused]] auto const& [index, first, second] : enumerated_zip_sequence(first, second)) {
Expand Down

0 comments on commit 6c80ebb

Please sign in to comment.