9#include <casadi/casadi.hpp>
61 int n_rows()
const {
return static_cast<int>(sp_.size1()); }
67 int n_cols()
const {
return static_cast<int>(sp_.size2()); }
73 int nnz()
const {
return static_cast<int>(sp_.nnz()); }
81 return total > 0 ?
static_cast<double>(
nnz()) / total : 0.0;
90 bool has_nz(
int row,
int col)
const {
return sp_.has_nz(row, col); }
96 std::vector<std::pair<int, int>>
nonzeros()
const {
97 std::vector<std::pair<int, int>> result;
98 result.reserve(
nnz());
101 for (
size_t i = 0; i < row_idx.size(); ++i) {
102 result.emplace_back(row_idx[i], col_idx[i]);
113 std::tuple<std::vector<int>, std::vector<int>>
get_triplet()
const {
114 std::vector<casadi_int> rows, cols;
115 sp_.get_triplet(rows, cols);
118 std::vector<int> row_int(rows.begin(), rows.end());
119 std::vector<int> col_int(cols.begin(), cols.end());
120 return {row_int, col_int};
127 std::tuple<std::vector<int>, std::vector<int>>
get_crs()
const {
128 auto crs_sp = sp_.T();
129 std::vector<casadi_int> colind = crs_sp.get_colind();
130 std::vector<casadi_int> row = crs_sp.get_row();
132 std::vector<int> row_ptr(colind.begin(), colind.end());
133 std::vector<int> col_idx(row.begin(), row.end());
134 return {row_ptr, col_idx};
141 std::tuple<std::vector<int>, std::vector<int>>
get_ccs()
const {
142 std::vector<casadi_int> colind = sp_.get_colind();
143 std::vector<casadi_int> row = sp_.get_row();
145 std::vector<int> col_ptr(colind.begin(), colind.end());
146 std::vector<int> row_idx(row.begin(), row.end());
147 return {col_ptr, row_idx};
161 std::string
to_string(
int max_rows = 40,
int max_cols = 80)
const {
162 std::ostringstream oss;
168 oss <<
"Sparsity: " << rows <<
"x" << cols <<
", nnz=" <<
nnz()
169 <<
" (density=" << std::fixed << std::setprecision(3) <<
density() * 100 <<
"%)\n";
172 int disp_rows = std::min(rows, max_rows);
173 int disp_cols = std::min(cols, max_cols);
177 for (
int j = 0; j < disp_cols; ++j)
184 for (
int i = 0; i < disp_rows; ++i) {
186 for (
int j = 0; j < disp_cols; ++j) {
187 oss << (
has_nz(i, j) ?
'*' :
'.');
194 if (rows > max_rows) {
196 for (
int j = 0; j < disp_cols; ++j)
205 for (
int j = 0; j < disp_cols; ++j)
223 void export_spy_dot(
const std::string &filename,
const std::string &name =
"sparsity")
const {
224 std::ofstream file(filename +
".dot");
225 if (!file.is_open()) {
226 throw RuntimeError(
"Cannot open file: " + filename +
".dot");
229 file <<
"digraph " << name <<
" {\n";
230 file <<
" node [shape=plaintext];\n";
231 file <<
" labelloc=\"t\";\n";
232 file <<
" label=\"" << name <<
" (" <<
n_rows() <<
"x" <<
n_cols() <<
", nnz=" <<
nnz()
235 file <<
" matrix [label=<\n";
236 file <<
" <TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"4\">\n";
239 for (
int i = 0; i <
n_rows(); ++i) {
241 for (
int j = 0; j <
n_cols(); ++j) {
244 file <<
" <TD BGCOLOR=\"black\" WIDTH=\"20\" HEIGHT=\"20\"></TD>\n";
247 file <<
" <TD BGCOLOR=\"white\" WIDTH=\"20\" HEIGHT=\"20\"></TD>\n";
253 file <<
" </TABLE>\n";
272 return render_graph(output_base +
".dot", output_base +
".pdf");
287 void export_spy_html(
const std::string &filename,
const std::string &name =
"sparsity")
const {
288 std::string html_filename = filename +
".html";
289 std::ofstream out(html_filename);
290 if (!out.is_open()) {
291 throw RuntimeError(
"Cannot open file: " + html_filename);
299 if (rows > 100 || cols > 100) {
300 cell_size = std::max(3, 1200 / std::max(rows, cols));
304 int margin_left = 50;
306 int svg_width = cols * cell_size + margin_left + 20;
307 int svg_height = rows * cell_size + margin_top + 20;
310 int tick_interval = 1;
311 if (rows > 50 || cols > 50)
313 else if (rows > 20 || cols > 20)
316 out << R
"SPYHTML(<!DOCTYPE html>
319 <meta charset="UTF-8">
321 << name << R"SPYHTML(</title>
323 * { margin: 0; padding: 0; box-sizing: border-box; }
324 html, body { height: 100%; width: 100%; }
325 body { font-family: 'Segoe UI', sans-serif; background: #1a1a2e; color: #eee; overflow: hidden; display: flex; }
326 #controls { position: fixed; top: 10px; left: 10px; z-index: 100; background: rgba(0,0,0,0.8);
327 padding: 12px; border-radius: 8px; }
328 #controls button { margin: 2px; padding: 8px 14px; cursor: pointer; border: none;
329 border-radius: 4px; background: #4a4a6a; color: white; font-size: 13px; }
330 #controls button:hover { background: #6a6a8a; }
331 #container { flex: 1; cursor: grab; overflow: hidden; height: 100%; }
332 #container:active { cursor: grabbing; }
333 #sidebar { width: 280px; height: 100%; background: #16213e; padding: 16px; overflow-y: auto;
334 border-left: 2px solid #0f3460; }
335 #sidebar h2 { color: #e94560; margin-bottom: 12px; font-size: 16px; }
336 #sidebar .section { margin-bottom: 14px; }
337 #sidebar .label { color: #888; font-size: 11px; text-transform: uppercase; margin-bottom: 4px; }
338 #sidebar .value { background: #0f3460; padding: 10px; border-radius: 6px; font-family: monospace;
340 #sidebar .stat { display: flex; justify-content: space-between; padding: 6px 0;
341 border-bottom: 1px solid #0f3460; }
342 #sidebar .stat-value { color: #4dc3ff; font-weight: bold; }
343 #info { position: fixed; bottom: 10px; left: 10px; background: rgba(0,0,0,0.8);
344 padding: 10px; border-radius: 4px; font-size: 12px; }
345 .nz { cursor: pointer; }
346 .nz:hover { fill: #e94560 !important; }
347 .axis-label { font-family: monospace; font-size: 10px; fill: #666; }
348 .grid-line { stroke: #ddd; stroke-width: 0.5; }
353 <button onclick="zoomIn()">Zoom +</button>
354 <button onclick="zoomOut()">Zoom -</button>
355 <button onclick="resetView()">Reset</button>
356 <button onclick="fitToScreen()">Fit</button>
359 <svg id="spy" width=")SPYHTML"
360 << svg_width << R"SPYHTML(" height=")SPYHTML" << svg_height
361 << R"SPYHTML(" style="background:#ffffff;">
362 <g id="matrix" transform="translate()SPYHTML"
363 << margin_left << "," << margin_top << R
"SPYHTML()">
367 for (
int r = 0; r <= rows; r += tick_interval) {
368 out <<
" <line class=\"grid-line\" x1=\"0\" y1=\"" << (r * cell_size)
369 <<
"\" x2=\"" << (cols * cell_size) <<
"\" y2=\"" << (r * cell_size) <<
"\"/>\n";
371 for (
int c = 0; c <= cols; c += tick_interval) {
372 out <<
" <line class=\"grid-line\" x1=\"" << (c * cell_size)
373 <<
"\" y1=\"0\" x2=\"" << (c * cell_size) <<
"\" y2=\"" << (rows * cell_size)
378 for (
int r = 0; r <= rows; r += tick_interval) {
379 out <<
" <text class=\"axis-label\" x=\"-5\" y=\""
380 << (r * cell_size + cell_size / 2)
381 <<
"\" text-anchor=\"end\" dominant-baseline=\"middle\">" << r <<
"</text>\n";
383 for (
int c = 0; c <= cols; c += tick_interval) {
384 out <<
" <text class=\"axis-label\" x=\""
385 << (c * cell_size + cell_size / 2) <<
"\" y=\"-8\" text-anchor=\"middle\">" << c
391 for (
size_t i = 0; i < row_idx.size(); ++i) {
394 out <<
" <rect class=\"nz\" x=\"" << (c * cell_size) <<
"\" y=\""
395 << (r * cell_size) <<
"\" width=\"" << cell_size <<
"\" height=\"" << cell_size
396 <<
"\" fill=\"#1e3a5f\" data-row=\"" << r <<
"\" data-col=\"" << c <<
"\"/>\n";
399 out << R
"SPYHTML( </g>
403 <h2>Sparsity Info</h2>
404 <div class="section">
405 <div class="stat"><span>Matrix Size</span><span class="stat-value">)SPYHTML"
406 << rows << " x " << cols << R
"SPYHTML(</span></div>
407 <div class="stat"><span>Non-zeros</span><span class="stat-value">)SPYHTML"
408 << nnz() << R"SPYHTML(</span></div>
409 <div class="stat"><span>Density</span><span class="stat-value">)SPYHTML";
413 out << std::fixed << std::setprecision(2) << dens;
415 out << R
"SPYHTML(%</span></div>
417 <div class="section">
418 <div class="label">Selected Cell</div>
419 <div class="value" id="cell-info">Click on a non-zero cell</div>
421 <div class="section">
422 <div class="label">Notation</div>
423 <div class="value" id="notation-info">A(row, col)</div>
426 <div id="info">Scroll to zoom - Drag to pan - Click cells for info</div>
428 let scale = 1, panX = 0, panY = 0, isDragging = false, startX, startY;
429 const container = document.getElementById('container');
430 const svg = document.getElementById('spy');
431 const cellInfo = document.getElementById('cell-info');
432 const notationInfo = document.getElementById('notation-info');
433 const svgWidth = )SPYHTML"
434 << svg_width << R"SPYHTML(;
435 const svgHeight = )SPYHTML"
436 << svg_height << R"SPYHTML(;
437 const matrixRows = )SPYHTML"
438 << rows << R"SPYHTML(;
439 const matrixCols = )SPYHTML"
440 << cols << R"SPYHTML(;
444 function updateTransform() {
445 svg.style.transform = `translate(${panX}px, ${panY}px) scale(${scale})`;
446 svg.style.transformOrigin = '0 0';
448 function zoomIn() { scale *= 1.3; updateTransform(); }
449 function zoomOut() { scale /= 1.3; updateTransform(); }
450 function resetView() { scale = 1; panX = 0; panY = 0; updateTransform(); }
451 function fitToScreen() {
452 const availWidth = window.innerWidth - 280;
453 const scaleX = (availWidth - 40) / svgWidth;
454 const scaleY = (window.innerHeight - 40) / svgHeight;
455 scale = Math.min(scaleX, scaleY);
456 panX = (availWidth - svgWidth * scale) / 2;
457 panY = (window.innerHeight - svgHeight * scale) / 2;
460 container.addEventListener('wheel', e => {
462 const rect = container.getBoundingClientRect();
463 const mouseX = e.clientX - rect.left, mouseY = e.clientY - rect.top;
464 const zoomFactor = e.deltaY < 0 ? 1.15 : 0.87;
465 panX = mouseX - (mouseX - panX) * zoomFactor;
466 panY = mouseY - (mouseY - panY) * zoomFactor;
470 container.addEventListener('mousedown', e => {
471 if (e.target.classList.contains('nz')) return;
472 isDragging = true; startX = e.clientX - panX; startY = e.clientY - panY;
474 container.addEventListener('mousemove', e => { if (isDragging) { panX = e.clientX - startX; panY = e.clientY - startY; updateTransform(); } });
475 container.addEventListener('mouseup', () => isDragging = false);
476 container.addEventListener('mouseleave', () => isDragging = false);
479 let selectedCell = null;
480 svg.querySelectorAll('.nz').forEach(rect => {
481 rect.addEventListener('click', e => {
483 if (selectedCell) selectedCell.style.stroke = 'none';
484 selectedCell = e.target;
485 selectedCell.style.stroke = '#e94560';
486 selectedCell.style.strokeWidth = '2';
488 const r = parseInt(e.target.dataset.row);
489 const c = parseInt(e.target.dataset.col);
490 cellInfo.textContent = `Row: ${r}, Col: ${c}`;
491 notationInfo.textContent = `A(${r}, ${c}) = nonzero`;
493 rect.addEventListener('mouseenter', e => {
494 const r = e.target.dataset.row;
495 const c = e.target.dataset.col;
496 cellInfo.textContent = `Row: ${r}, Col: ${c}`;
520 casadi::Sparsity sp_;
537 explicit GraphColoring(
const casadi::Sparsity &coloring) : pattern_(coloring) {}
564 std::vector<int> colors(
n_entries(), -1);
565 auto [rows, cols] = pattern_.get_triplet();
566 for (
size_t i = 0; i < rows.size(); ++i) {
567 colors.at(rows[i]) = cols[i];
592inline std::vector<SymbolicScalar>
to_mx_vector(
const std::vector<SymbolicArg> &args) {
593 std::vector<SymbolicScalar> ret;
594 ret.reserve(args.size());
595 for (
const auto &arg : args) {
596 ret.push_back(arg.get());
602 std::vector<SymbolicArg> ret;
603 ret.reserve(args.size());
604 for (
const auto &arg : args) {
605 ret.emplace_back(arg);
611 std::vector<SymbolicScalar> nz = expr.get_nonzeros();
615 return SymbolicScalar::vertcat(nz);
621 if (output_idx < 0 || output_idx >= cfn.n_out()) {
624 if (input_idx < 0 || input_idx >= cfn.n_in()) {
630 const std::string &prefix) {
632 std::vector<SymbolicScalar> inputs;
633 inputs.reserve(cfn.n_in());
634 for (
int i = 0; i < cfn.n_in(); ++i) {
635 inputs.push_back(SymbolicScalar::sym(prefix + cfn.name_in(i), cfn.sparsity_in(i)));
641 return GraphColoring(jac_sparsity.T().uni_coloring(jac_sparsity));
645 return GraphColoring(jac_sparsity.uni_coloring(jac_sparsity.T()));
657 const std::vector<SymbolicArg> &variables,
const std::string &name) {
669 std::move(values_function),
675 const std::string &name) {
680 SymbolicScalar jac = SymbolicScalar::jacobian(outputs.at(output_idx), inputs.at(input_idx));
690 std::move(values_function),
702 const std::vector<SymbolicArg> &variables,
const std::string &name) {
712 std::move(values_function),
718 const std::string &name) {
723 if (!outputs.at(output_idx).is_scalar()) {
724 throw InvalidArgument(
"sparse_hessian: selected function output must be scalar");
727 SymbolicScalar hess = SymbolicScalar::hessian(outputs.at(output_idx), inputs.at(input_idx));
735 std::move(values_function),
745 SymbolicScalar::jacobian(outputs.at(output_idx), inputs.at(input_idx)).sparsity());
764 const std::string &name =
"")
765 : artifacts_(
detail::make_sparse_jacobian_artifacts({expression}, {variables}, name)) {}
772 const std::vector<SymbolicArg> &variables,
const std::string &name =
"")
773 : artifacts_(
detail::make_sparse_jacobian_artifacts(expressions, variables, name)) {}
781 const std::string &name =
"")
782 : artifacts_(
detail::make_sparse_jacobian_artifacts(fn, output_idx, input_idx, name)) {}
790 int nnz()
const {
return artifacts_.sparsity.nnz(); }
812 : artifacts_.reverse_coloring;
823 template <
typename... Args>
auto values(Args &&...args)
const {
824 return artifacts_.values_function.eval(std::forward<Args>(args)...);
831 template <
typename... Args>
auto operator()(Args &&...args)
const {
832 return values(std::forward<Args>(args)...);
853 const std::string &name =
"")
854 : artifacts_(
detail::make_sparse_hessian_artifacts(expression, {variables}, name)) {}
861 const std::string &name =
"")
862 : artifacts_(
detail::make_sparse_hessian_artifacts(expression, variables, name)) {}
870 const std::string &name =
"")
871 : artifacts_(
detail::make_sparse_hessian_artifacts(fn, output_idx, input_idx, name)) {}
879 int nnz()
const {
return artifacts_.sparsity.nnz(); }
893 template <
typename... Args>
auto values(Args &&...args)
const {
894 return artifacts_.values_function.eval(std::forward<Args>(args)...);
901 template <
typename... Args>
auto operator()(Args &&...args)
const {
902 return values(std::forward<Args>(args)...);
923 casadi::Sparsity sp = casadi::MX::jacobian_sparsity(expr, vars);
938 auto grad = casadi::MX::gradient(expr, vars);
939 casadi::Sparsity sp = casadi::MX::jacobian_sparsity(grad, vars);
969 if (!outputs.at(output_idx).is_scalar()) {
970 throw InvalidArgument(
"get_hessian_sparsity: selected function output must be scalar");
973 SymbolicScalar::hessian(outputs.at(output_idx), inputs.at(input_idx)).sparsity());
1007 const std::string &name =
"") {
1019 const std::vector<SymbolicArg> &variables,
1020 const std::string &name =
"") {
1033 int input_idx = 0,
const std::string &name =
"") {
1046 const std::string &name =
"") {
1058 const std::vector<SymbolicArg> &variables,
1059 const std::string &name =
"") {
1072 int input_idx = 0,
const std::string &name =
"") {
1122template <
typename Func>
1127 if (opts.reference_point.size() == n_inputs) {
1128 x0 = opts.reference_point;
1135 if (y0.size() != n_outputs) {
1136 throw InvalidArgument(
"nan_propagation_sparsity: function returned " +
1137 std::to_string(y0.size()) +
" outputs, expected " +
1138 std::to_string(n_outputs));
1142 std::vector<casadi_int> row_indices;
1143 std::vector<casadi_int> col_indices;
1145 for (
int i = 0; i < n_inputs; ++i) {
1148 x_perturbed(i) = std::numeric_limits<double>::quiet_NaN();
1154 for (
int j = 0; j < n_outputs; ++j) {
1155 if (std::isnan(y_perturbed(j))) {
1157 row_indices.push_back(j);
1158 col_indices.push_back(i);
1164 casadi::Sparsity sp = casadi::Sparsity::triplet(n_outputs, n_inputs, row_indices, col_indices);
1183 int n_inputs =
static_cast<int>(sp_in.nnz());
1184 int n_outputs =
static_cast<int>(sp_out.nnz());
1189 auto results = fn(x);
1192 for (
const auto &m : results) {
1193 total_size +=
static_cast<int>(m.size());
1197 for (
const auto &m : results) {
1198 for (
int i = 0; i < m.size(); ++i) {
1199 y(offset + i) = m(i);
1201 offset +=
static_cast<int>(m.size());
Symbolic function wrapper around CasADi with Eigen-native IO.
Custom exception hierarchy for Janus framework.
IO Utilities and Traits for Janus.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
Wrapper around casadi::Function providing Eigen-native IO.
Definition Function.hpp:46
const casadi::Function & casadi_function() const
Access the underlying CasADi function.
Definition Function.hpp:186
Wrapper around a CasADi graph coloring assignment.
Definition Sparsity.hpp:530
int n_entries() const
Number of original entries being colored.
Definition Sparsity.hpp:543
std::vector< int > colorvec() const
0-based color assignment for each original entry
Definition Sparsity.hpp:563
double compression_ratio() const
Compression factor relative to one direction per entry.
Definition Sparsity.hpp:555
int n_colors() const
Number of compressed seed directions (colors).
Definition Sparsity.hpp:549
GraphColoring()=default
Default-construct an empty coloring.
const SparsityPattern & pattern() const
Access the sparse assignment matrix behind the coloring.
Definition Sparsity.hpp:576
GraphColoring(const casadi::Sparsity &coloring)
Construct from a CasADi coloring sparsity.
Definition Sparsity.hpp:537
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Operation failed at runtime (e.g., CasADi eval with free variables).
Definition JanusError.hpp:41
Cached sparse Hessian evaluator with fixed structural ordering.
Definition Sparsity.hpp:846
SparseHessianEvaluator(const SymbolicArg &expression, const std::vector< SymbolicArg > &variables, const std::string &name="")
Construct from a scalar expression and multiple variable blocks.
Definition Sparsity.hpp:860
auto values(Args &&...args) const
Evaluate and return Hessian non-zero values.
Definition Sparsity.hpp:893
SparseHessianEvaluator(const Function &fn, int output_idx=0, int input_idx=0, const std::string &name="")
Construct from a janus::Function.
Definition Sparsity.hpp:869
int nnz() const
Number of structural non-zeros.
Definition Sparsity.hpp:879
const GraphColoring & coloring() const
Get the star coloring for symmetric compression.
Definition Sparsity.hpp:883
auto operator()(Args &&...args) const
Shorthand for values().
Definition Sparsity.hpp:901
SparseHessianEvaluator(const SymbolicArg &expression, const SymbolicArg &variables, const std::string &name="")
Construct from a scalar expression and single variable block.
Definition Sparsity.hpp:852
const Function & values_function() const
Access the compiled values function.
Definition Sparsity.hpp:887
const SparsityPattern & sparsity() const
Get the Hessian sparsity pattern.
Definition Sparsity.hpp:875
Cached sparse Jacobian evaluator with fixed structural ordering.
Definition Sparsity.hpp:757
const GraphColoring & preferred_coloring() const
Get the coloring for the preferred mode.
Definition Sparsity.hpp:810
SparseJacobianEvaluator(const Function &fn, int output_idx=0, int input_idx=0, const std::string &name="")
Construct from a janus::Function.
Definition Sparsity.hpp:780
const GraphColoring & reverse_coloring() const
Get reverse-mode graph coloring.
Definition Sparsity.hpp:798
auto operator()(Args &&...args) const
Shorthand for values().
Definition Sparsity.hpp:831
const SparsityPattern & sparsity() const
Get the Jacobian sparsity pattern.
Definition Sparsity.hpp:786
auto values(Args &&...args) const
Evaluate and return Jacobian non-zero values.
Definition Sparsity.hpp:823
SparseJacobianMode preferred_mode() const
Determine the cheaper directional mode.
Definition Sparsity.hpp:802
SparseJacobianEvaluator(const SymbolicArg &expression, const SymbolicArg &variables, const std::string &name="")
Construct from a single symbolic expression and variable.
Definition Sparsity.hpp:763
const GraphColoring & forward_coloring() const
Get forward-mode graph coloring.
Definition Sparsity.hpp:794
int nnz() const
Number of structural non-zeros.
Definition Sparsity.hpp:790
SparseJacobianEvaluator(const std::vector< SymbolicArg > &expressions, const std::vector< SymbolicArg > &variables, const std::string &name="")
Construct from multiple symbolic expressions and variables.
Definition Sparsity.hpp:771
const Function & values_function() const
Access the compiled values function.
Definition Sparsity.hpp:817
Definition Sparsity.hpp:38
int n_cols() const
Number of columns in the pattern.
Definition Sparsity.hpp:67
bool operator!=(const SparsityPattern &other) const
Definition Sparsity.hpp:382
bool visualize_spy(const std::string &output_base) const
Export/Render sparsity pattern to PDF via Graphviz.
Definition Sparsity.hpp:268
double density() const
Sparsity density (nnz / total elements).
Definition Sparsity.hpp:79
int n_rows() const
Number of rows in the pattern.
Definition Sparsity.hpp:61
SparsityPattern(const SymbolicScalar &mx)
Construct from CasADi MX (extracts its sparsity).
Definition Sparsity.hpp:53
std::vector< std::pair< int, int > > nonzeros() const
Get all non-zero positions as (row, col) pairs.
Definition Sparsity.hpp:96
std::string to_string(int max_rows=40, int max_cols=80) const
Generate ASCII spy plot of sparsity pattern.
Definition Sparsity.hpp:161
std::tuple< std::vector< int >, std::vector< int > > get_crs() const
Get Compressed Row Storage (CRS) format.
Definition Sparsity.hpp:127
SparsityPattern(const casadi::Sparsity &sp)
Construct from CasADi Sparsity object.
Definition Sparsity.hpp:47
std::tuple< std::vector< int >, std::vector< int > > get_ccs() const
Get Compressed Column Storage (CCS) format.
Definition Sparsity.hpp:141
SparsityPattern()
Default-construct an empty 0x0 pattern.
Definition Sparsity.hpp:41
void export_spy_dot(const std::string &filename, const std::string &name="sparsity") const
Export sparsity pattern to DOT format as a matrix grid (spy plot).
Definition Sparsity.hpp:223
bool operator==(const SparsityPattern &other) const
Definition Sparsity.hpp:381
void export_spy_html(const std::string &filename, const std::string &name="sparsity") const
Export sparsity pattern to an interactive HTML file.
Definition Sparsity.hpp:287
int nnz() const
Number of structural non-zeros.
Definition Sparsity.hpp:73
std::tuple< std::vector< int >, std::vector< int > > get_triplet() const
Get triplet format (row indices, column indices).
Definition Sparsity.hpp:113
bool has_nz(int row, int col) const
Check if a specific element is structurally non-zero.
Definition Sparsity.hpp:90
const casadi::Sparsity & casadi_sparsity() const
Access underlying CasADi Sparsity object.
Definition Sparsity.hpp:377
Universal symbolic argument wrapper for Function inputs/outputs.
Definition JanusTypes.hpp:250
SymbolicScalar get() const
Get underlying CasADi MX object.
Definition JanusTypes.hpp:286
Smooth approximation of ReLU function: softplus(x) = (1/beta) * log(1 + exp(beta * x)).
Definition Diagnostics.hpp:131
SparseHessianArtifacts make_sparse_hessian_artifacts(const SymbolicArg &expression, const std::vector< SymbolicArg > &variables, const std::string &name)
Definition Sparsity.hpp:701
std::vector< SymbolicScalar > to_mx_vector(const std::vector< SymbolicArg > &args)
Definition Sparsity.hpp:592
SparseJacobianArtifacts make_sparse_jacobian_artifacts(const std::vector< SymbolicArg > &expressions, const std::vector< SymbolicArg > &variables, const std::string &name)
Definition Sparsity.hpp:656
SparsityPattern function_jacobian_sparsity(const Function &fn, int output_idx, int input_idx)
Definition Sparsity.hpp:739
GraphColoring make_forward_coloring(const casadi::Sparsity &jac_sparsity)
Definition Sparsity.hpp:640
std::vector< SymbolicScalar > symbolic_inputs_like(const Function &fn, const std::string &prefix)
Definition Sparsity.hpp:629
SymbolicScalar stack_nonzeros(const SymbolicScalar &expr)
Definition Sparsity.hpp:610
GraphColoring make_reverse_coloring(const casadi::Sparsity &jac_sparsity)
Definition Sparsity.hpp:644
std::vector< SymbolicArg > to_symbolic_args(const std::vector< SymbolicScalar > &args)
Definition Sparsity.hpp:601
void validate_function_indices(const Function &fn, int output_idx, int input_idx, const char *where)
Definition Sparsity.hpp:618
Definition Diagnostics.hpp:19
SparsityPattern sparsity_of_hessian(const SymbolicScalar &expr, const SymbolicScalar &vars)
Get Hessian sparsity of a scalar expression.
Definition Sparsity.hpp:936
auto where(const Cond &cond, const T1 &if_true, const T2 &if_false)
Select values based on condition (ternary operator) Returns: cond ? if_true : if_false Supports mixed...
Definition Logic.hpp:43
SparseJacobianMode
Preferred directional mode for a sparse Jacobian evaluator.
Definition Sparsity.hpp:585
@ Forward
Forward-mode (column compression).
Definition Sparsity.hpp:586
@ Reverse
Reverse-mode (row compression).
Definition Sparsity.hpp:587
SparseHessianEvaluator sparse_hessian(const SymbolicArg &expression, const SymbolicArg &variables, const std::string &name="")
Compile a sparse Hessian evaluator from symbolic expressions.
Definition Sparsity.hpp:1044
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
bool render_graph(const std::string &dot_file, const std::string &output_file)
Export a janus::Function to DOT format for visualization.
Definition JanusIO.hpp:349
SparsityPattern sparsity_of_jacobian(const SymbolicScalar &expr, const SymbolicScalar &vars)
Get Jacobian sparsity without computing the full Jacobian.
Definition Sparsity.hpp:921
SparseJacobianEvaluator sparse_jacobian(const SymbolicArg &expression, const SymbolicArg &variables, const std::string &name="")
Compile a sparse Jacobian evaluator from symbolic expressions.
Definition Sparsity.hpp:1005
SparsityPattern get_hessian_sparsity(const Function &fn, int output_idx=0, int input_idx=0)
Get Hessian sparsity of a scalar janus::Function output.
Definition Sparsity.hpp:964
SparsityPattern get_jacobian_sparsity(const Function &fn, int output_idx=0, int input_idx=0)
Get sparsity of a janus::Function Jacobian.
Definition Sparsity.hpp:951
SparsityPattern nan_propagation_sparsity(Func &&fn, int n_inputs, int n_outputs, const NaNSparsityOptions &opts={})
Detect Jacobian sparsity using NaN propagation.
Definition Sparsity.hpp:1123
SparsityPattern get_sparsity_out(const Function &fn, int output_idx=0)
Get output sparsity of a janus::Function.
Definition Sparsity.hpp:993
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70
SparsityPattern get_sparsity_in(const Function &fn, int input_idx=0)
Get input sparsity of a janus::Function.
Definition Sparsity.hpp:982
Options for NaN-propagation sparsity detection.
Definition Sparsity.hpp:1084
NumericVector reference_point
Point to evaluate at (default: zeros).
Definition Sparsity.hpp:1085
Definition Sparsity.hpp:694
SparsityPattern sparsity
Definition Sparsity.hpp:695
GraphColoring coloring
Definition Sparsity.hpp:696
Function values_function
Definition Sparsity.hpp:697
Definition Sparsity.hpp:648
GraphColoring forward_coloring
Definition Sparsity.hpp:650
GraphColoring reverse_coloring
Definition Sparsity.hpp:651
SparsityPattern sparsity
Definition Sparsity.hpp:649
Function values_function
Definition Sparsity.hpp:652
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67