Skip to content

Commit f679ffd

Browse files
committed
Tag inequality constraints, store multipliers, and simplify parsing
1 parent 8e91d10 commit f679ffd

42 files changed

Lines changed: 949 additions & 1238 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎GridKit/AutomaticDifferentiation/Enzyme/D2LDx2.hpp‎

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ namespace GridKit
2121
/**
2222
* @brief Enzyme automatic differentiation Hessian evaluator: Lagrangian Hessian, d2L/dx2
2323
*
24-
* Hessian of \f$L = \sigma f(x) + \lambda_c^T c(x) + \lambda_d^T d(x)\f$
25-
* by one forward sweep per local variable over the reverse-mode gradient
26-
* of \f$L\f$. Only structural entries are stored, in global indices.
24+
* Hessian of \f$L = \sigma f(x) + \lambda^T g(x)\f$ by one forward sweep
25+
* per local variable over the reverse-mode gradient of \f$L\f$. Only
26+
* structural entries are stored, in global indices.
2727
*
2828
* @tparam ModelT - model type with internal and external local variables
29-
* and equality constraints, and inequality constraints
29+
* and constraints
3030
*/
3131
template <typename ModelT>
3232
struct D2LDx2
@@ -37,8 +37,7 @@ namespace GridKit
3737
* @param[in] variable_indices - Global index of each local variable
3838
* @param[in] x - Local variables
3939
* @param[in] sigma - Objective factor
40-
* @param[in] lambda_c - Local equality constraint multipliers
41-
* @param[in] lambda_d - Local inequality constraint multipliers
40+
* @param[in] lambda - Multipliers of the local constraint contributions
4241
* @param[out] rows - Row indices
4342
* @param[out] cols - Column indices
4443
* @param[out] vals - Values
@@ -50,8 +49,7 @@ namespace GridKit
5049
const IdxT* variable_indices,
5150
const ScalarT* x,
5251
const RealT sigma,
53-
const RealT* lambda_c,
54-
const RealT* lambda_d,
52+
const RealT* lambda,
5553
IdxT* rows,
5654
IdxT* cols,
5755
ScalarT* vals,
@@ -87,38 +85,27 @@ namespace GridKit
8785
enzyme_const,
8886
sigma,
8987
enzyme_const,
90-
lambda_c,
91-
enzyme_const,
92-
lambda_d);
88+
lambda);
9389
}
9490
}
9591

9692
private:
97-
using ObjectiveT = ModelWrapper<ModelT, MemberFunctions::Objective>;
98-
using EqualitiesT = ModelWrapper<ModelT, MemberFunctions::Equalities>;
99-
using InequalitiesT = ModelWrapper<ModelT, MemberFunctions::Inequalities>;
93+
using ObjectiveT = ModelWrapper<ModelT, MemberFunctions::Objective>;
94+
using ConstraintsT = ModelWrapper<ModelT, MemberFunctions::Constraints>;
10095

10196
template <typename ScalarT, typename RealT>
10297
[[gnu::always_inline]] inline static ScalarT lagrangian(const ModelT* model,
10398
const ScalarT* x,
10499
const RealT sigma,
105-
const RealT* lambda_c,
106-
const RealT* lambda_d)
100+
const RealT* lambda)
107101
{
108-
std::array<ScalarT, EqualitiesT::NUM_OUTPUTS> c{};
109-
EqualitiesT::eval(model, x, c.data());
110-
111-
std::array<ScalarT, InequalitiesT::NUM_OUTPUTS> d{};
112-
InequalitiesT::eval(model, x, d.data());
102+
std::array<ScalarT, ConstraintsT::NUM_OUTPUTS> g{};
103+
ConstraintsT::eval(model, x, g.data());
113104

114105
ScalarT value = sigma * ObjectiveT::eval(model, x);
115-
for (size_t i = 0; i < EqualitiesT::NUM_OUTPUTS; ++i)
106+
for (size_t i = 0; i < ConstraintsT::NUM_OUTPUTS; ++i)
116107
{
117-
value += lambda_c[i] * c[i];
118-
}
119-
for (size_t i = 0; i < InequalitiesT::NUM_OUTPUTS; ++i)
120-
{
121-
value += lambda_d[i] * d[i];
108+
value += lambda[i] * g[i];
122109
}
123110
return value;
124111
}
@@ -133,8 +120,7 @@ namespace GridKit
133120
const ScalarT* x,
134121
ScalarT* gradient,
135122
const RealT sigma,
136-
const RealT* lambda_c,
137-
const RealT* lambda_d)
123+
const RealT* lambda)
138124
{
139125
__enzyme_autodiff<void>((void*) lagrangian<ScalarT, RealT>,
140126
enzyme_const,
@@ -145,9 +131,7 @@ namespace GridKit
145131
enzyme_const,
146132
sigma,
147133
enzyme_const,
148-
lambda_c,
149-
enzyme_const,
150-
lambda_d);
134+
lambda);
151135
}
152136
};
153137
} // namespace Sparse

‎GridKit/AutomaticDifferentiation/Enzyme/DgDx.hpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ namespace GridKit
2525
* stored, in global indices.
2626
*
2727
* @tparam ModelT - model type with internal and external local variables
28-
* @tparam function - constraint functions, `Equalities` or `Inequalities`
28+
* and constraints
2929
*/
30-
template <typename ModelT, MemberFunctions function>
30+
template <typename ModelT>
3131
struct DgDx
3232
{
3333
/**
3434
* @param[in] model - Pointer to the model to be differentiated
3535
* @param[in] n_var - Number of local variables
36-
* @param[in] row_indices - Global row of each local constraint function
36+
* @param[in] row_indices - Global row of each local constraint contribution
3737
* @param[in] col_indices - Global column of each local variable
3838
* @param[in] x - Local variables
3939
* @param[out] rows - Row indices
@@ -52,7 +52,7 @@ namespace GridKit
5252
ScalarT* vals,
5353
IdxT& nnz)
5454
{
55-
using WrapperT = ModelWrapper<ModelT, function>;
55+
using WrapperT = ModelWrapper<ModelT, MemberFunctions::Constraints>;
5656

5757
std::array<ScalarT, WrapperT::NUM_OUTPUTS> g{};
5858
for (size_t var_i = 0; var_i < n_var; ++var_i)

‎GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp‎

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ namespace GridKit
3131
BusResidual21, //< Special case for branches that are connected to two buses
3232
BusResidual22, //< Special case for branches that are connected to two buses
3333
Objective, //< Optimization objective
34-
Equalities, //< Optimization internal and external equality contributions
35-
Inequalities //< Optimization inequality rows
34+
Constraints //< Optimization internal constraints and contributions at the ports
3635
};
3736

3837
/**
@@ -259,56 +258,32 @@ namespace GridKit
259258
};
260259

261260
/**
262-
* @brief Wrapper partial template specialization for optimization equality contributions
261+
* @brief Wrapper partial template specialization for optimization constraints
263262
*
264-
* Local contributions are those to the internal rows, then those at the ports.
263+
* Local contributions are those to the internal constraints, then those at the ports.
265264
*/
266265
template <typename ModelT>
267-
struct ModelWrapper<ModelT, MemberFunctions::Equalities>
266+
struct ModelWrapper<ModelT, MemberFunctions::Constraints>
268267
{
269268
/// Number of internal variables
270269
static constexpr std::size_t NUM_INTERNAL_INPUTS = Utilities::enum_size<typename ModelT::InternalVariablesT>();
271270

272-
/// Number of contributions to the internal rows
273-
static constexpr std::size_t NUM_INTERNAL_OUTPUTS = Utilities::enum_size<typename ModelT::InternalEqualitiesT>();
271+
/// Number of internal constraints
272+
static constexpr std::size_t NUM_INTERNAL_OUTPUTS = Utilities::enum_size<typename ModelT::InternalConstraintsT>();
274273

275-
/// Number of local equality contributions
276-
static constexpr std::size_t NUM_OUTPUTS = NUM_INTERNAL_OUTPUTS + Utilities::enum_size<typename ModelT::ExternalEqualitiesT>();
274+
/// Number of local constraint contributions
275+
static constexpr std::size_t NUM_OUTPUTS = NUM_INTERNAL_OUTPUTS + Utilities::enum_size<typename ModelT::ExternalConstraintsT>();
277276

278277
/**
279278
* @param[in] model - Pointer to the model to be differentiated
280279
* @param[in] x - Local variables
281-
* @param[out] c - Local equality contributions
280+
* @param[out] g - Local constraint contributions
282281
*/
283282
template <typename ScalarT>
284-
[[gnu::always_inline]] inline static void eval(const ModelT* model, const ScalarT* x, ScalarT* c)
283+
[[gnu::always_inline]] inline static void eval(const ModelT* model, const ScalarT* x, ScalarT* g)
285284
{
286-
model->internalEqualities(x, x + NUM_INTERNAL_INPUTS, c);
287-
model->externalEqualities(x, x + NUM_INTERNAL_INPUTS, c + NUM_INTERNAL_OUTPUTS);
288-
}
289-
};
290-
291-
/**
292-
* @brief Wrapper partial template specialization for optimization inequality rows
293-
*/
294-
template <typename ModelT>
295-
struct ModelWrapper<ModelT, MemberFunctions::Inequalities>
296-
{
297-
/// Number of internal variables
298-
static constexpr std::size_t NUM_INTERNAL_INPUTS = Utilities::enum_size<typename ModelT::InternalVariablesT>();
299-
300-
/// Number of inequality rows
301-
static constexpr std::size_t NUM_OUTPUTS = Utilities::enum_size<typename ModelT::InequalitiesT>();
302-
303-
/**
304-
* @param[in] model - Pointer to the model to be differentiated
305-
* @param[in] x - Local variables
306-
* @param[out] d - Inequality rows
307-
*/
308-
template <typename ScalarT>
309-
[[gnu::always_inline]] inline static void eval(const ModelT* model, const ScalarT* x, ScalarT* d)
310-
{
311-
model->inequalities(x, x + NUM_INTERNAL_INPUTS, d);
285+
model->internalConstraints(x, x + NUM_INTERNAL_INPUTS, g);
286+
model->externalConstraints(x, x + NUM_INTERNAL_INPUTS, g + NUM_INTERNAL_OUTPUTS);
312287
}
313288
};
314289
} // namespace Sparse

‎GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp‎

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,22 @@ namespace GridKit
2525
VI2, ///< \f$V_{\mathrm{i}2}\f$ Bus-2 imaginary voltage [p.u.]
2626
};
2727

28-
/// External equality contributions of a `Branch`, the power into the buses at its ports
29-
enum class BranchExternalEqualities : size_t
28+
/// Internal constraints of a `Branch`
29+
enum class BranchInternalConstraints : size_t
30+
{
31+
S1, ///< \f$P_1^2 + Q_1^2\f$ Squared apparent power at bus 1 [p.u.]
32+
S2, ///< \f$P_2^2 + Q_2^2\f$ Squared apparent power at bus 2 [p.u.]
33+
};
34+
35+
/// External constraint contributions of a `Branch`, the power into the buses at its ports
36+
enum class BranchExternalConstraints : size_t
3037
{
3138
DP1, ///< \f$\Delta P_1^\mathrm{bus}\f$ Active power into bus 1 [p.u.]
3239
DQ1, ///< \f$\Delta Q_1^\mathrm{bus}\f$ Reactive power into bus 1 [p.u.]
3340
DP2, ///< \f$\Delta P_2^\mathrm{bus}\f$ Active power into bus 2 [p.u.]
3441
DQ2, ///< \f$\Delta Q_2^\mathrm{bus}\f$ Reactive power into bus 2 [p.u.]
3542
};
3643

37-
/// Inequality rows of a `Branch`
38-
enum class BranchInequalities : size_t
39-
{
40-
S1, ///< \f$P_1^2 + Q_1^2\f$ Squared apparent power at bus 1 [p.u.]
41-
S2, ///< \f$P_2^2 + Q_2^2\f$ Squared apparent power at bus 2 [p.u.]
42-
};
43-
4444
/**
4545
* @brief Line or off-nominal transformer between two buses
4646
*
@@ -56,34 +56,34 @@ namespace GridKit
5656
using ModelDataT = BranchData<RealT, IdxT>;
5757
using BusT = Bus<scalar_type, index_type>;
5858

59-
using ComponentT::d_upper_;
59+
using ComponentT::g_upper_;
60+
using ComponentT::tag_;
6061

6162
public:
62-
using InternalVariablesT = Utilities::EmptyEnum;
63-
using ExternalVariablesT = BranchExternalVariables;
64-
using InternalEqualitiesT = Utilities::EmptyEnum;
65-
using ExternalEqualitiesT = BranchExternalEqualities;
66-
using InequalitiesT = BranchInequalities;
63+
using InternalVariablesT = Utilities::EmptyEnum;
64+
using ExternalVariablesT = BranchExternalVariables;
65+
using InternalConstraintsT = BranchInternalConstraints;
66+
using ExternalConstraintsT = BranchExternalConstraints;
6767

6868
static constexpr std::array<IdxT, Utilities::enum_size<BranchPorts>()> NUM_PORT_VARIABLES{
69-
Utilities::enum_size<typename BusT::InternalVariablesT>(),
70-
Utilities::enum_size<typename BusT::InternalVariablesT>()};
71-
static constexpr std::array<IdxT, Utilities::enum_size<BranchPorts>()> NUM_PORT_EQUALITIES{
72-
Utilities::enum_size<typename BusT::InternalEqualitiesT>(),
73-
Utilities::enum_size<typename BusT::InternalEqualitiesT>()};
69+
BusT::NUM_SHARED_VARIABLES,
70+
BusT::NUM_SHARED_VARIABLES};
71+
static constexpr std::array<IdxT, Utilities::enum_size<BranchPorts>()> NUM_PORT_CONSTRAINTS{
72+
BusT::NUM_SHARED_CONSTRAINTS,
73+
BusT::NUM_SHARED_CONSTRAINTS};
7474

7575
explicit Branch(const ModelDataT& data);
7676

7777
Model::ConfigurationChecks verify() const override;
78+
int tagInequality() override;
7879
int initialize() override;
7980

8081
int evaluateGradient() override;
81-
int evaluateEqualityJacobian() override;
82-
int evaluateInequalityJacobian() override;
83-
int evaluateHessian(RealT sigma, const RealT* lambda_c, const RealT* lambda_d) override;
82+
int evaluateJacobian() override;
83+
int evaluateHessian(RealT sigma) override;
8484

85-
[[gnu::always_inline]] void externalEqualities(const ScalarT* x, const ScalarT* external, ScalarT* c) const override;
86-
[[gnu::always_inline]] void inequalities(const ScalarT* x, const ScalarT* external, ScalarT* d) const override;
85+
[[gnu::always_inline]] void internalConstraints(const ScalarT* x, const ScalarT* external, ScalarT* g) const override;
86+
[[gnu::always_inline]] void externalConstraints(const ScalarT* x, const ScalarT* external, ScalarT* g) const override;
8787

8888
bool inService() const
8989
{

‎GridKit/Model/OptimalPowerFlow/Branch/BranchDependencyTracking.cpp‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,13 @@ namespace GridKit
1919
}
2020

2121
template <typename scalar_type, typename index_type>
22-
int Branch<scalar_type, index_type>::evaluateEqualityJacobian()
22+
int Branch<scalar_type, index_type>::evaluateJacobian()
2323
{
2424
return 0;
2525
}
2626

2727
template <typename scalar_type, typename index_type>
28-
int Branch<scalar_type, index_type>::evaluateInequalityJacobian()
29-
{
30-
return 0;
31-
}
32-
33-
template <typename scalar_type, typename index_type>
34-
int Branch<scalar_type, index_type>::evaluateHessian([[maybe_unused]] RealT sigma,
35-
[[maybe_unused]] const RealT* lambda_c,
36-
[[maybe_unused]] const RealT* lambda_d)
28+
int Branch<scalar_type, index_type>::evaluateHessian([[maybe_unused]] RealT sigma)
3729
{
3830
return 0;
3931
}

‎GridKit/Model/OptimalPowerFlow/Branch/BranchEnzyme.cpp‎

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,15 @@ namespace GridKit
1818
}
1919

2020
template <typename scalar_type, typename index_type>
21-
int Branch<scalar_type, index_type>::evaluateEqualityJacobian()
21+
int Branch<scalar_type, index_type>::evaluateJacobian()
2222
{
23-
return ComponentT::evaluateEqualityJacobian(*this);
23+
return ComponentT::evaluateJacobian(*this);
2424
}
2525

2626
template <typename scalar_type, typename index_type>
27-
int Branch<scalar_type, index_type>::evaluateInequalityJacobian()
27+
int Branch<scalar_type, index_type>::evaluateHessian(RealT sigma)
2828
{
29-
return ComponentT::evaluateInequalityJacobian(*this);
30-
}
31-
32-
template <typename scalar_type, typename index_type>
33-
int Branch<scalar_type, index_type>::evaluateHessian(RealT sigma, const RealT* lambda_c, const RealT* lambda_d)
34-
{
35-
return ComponentT::evaluateHessian(*this, sigma, lambda_c, lambda_d);
29+
return ComponentT::evaluateHessian(*this, sigma);
3630
}
3731

3832
// Available template instantiations

0 commit comments

Comments
 (0)