packages/engine/scram/targets/scram-node/src/ScramNodeQuantify.cpp
Functions
| Name | |
|---|---|
| const scram::core::RiskAnalysis::Result * | FindSequenceResult(const scram::core::RiskAnalysis & analysis, const scram::mef::InitiatingEvent & initiating_event, const scram::mef::Sequence & sequence) |
| Napi::Value | QuantifyModel(const Napi::CallbackInfo & info) |
Functions Documentation
function FindSequenceResult
cpp
const scram::core::RiskAnalysis::Result * FindSequenceResult(
const scram::core::RiskAnalysis & analysis,
const scram::mef::InitiatingEvent & initiating_event,
const scram::mef::Sequence & sequence
)function QuantifyModel
cpp
Napi::Value QuantifyModel(
const Napi::CallbackInfo & info
)Source code
cpp
#include <chrono>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <limits>
#include <random>
#include <sstream>
#include <string>
#include <napi.h>
#include "ScramNodeSettings.h"
#include "ScramNodeModel.h"
#include "ScramNodeReporter.h"
#include "risk_analysis.h"
#include "event_tree_analysis.h"
// Forward declaration
const scram::core::RiskAnalysis::Result* FindSequenceResult(
const scram::core::RiskAnalysis& analysis,
const scram::mef::InitiatingEvent& initiating_event,
const scram::mef::Sequence& sequence);
// Step 4: The Node Addon Method for Quantifying Fault Trees
Napi::Value QuantifyModel(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2) {
Napi::TypeError::New(env, "Settings and Model - both are required").ThrowAsJavaScriptException();
return env.Null();
}
if (!info[0].IsObject()) {
Napi::TypeError::New(env, "Settings object required").ThrowAsJavaScriptException();
return env.Null();
}
if (!info[1].IsObject()) {
Napi::TypeError::New(env, "Model object required").ThrowAsJavaScriptException();
return env.Null();
}
Napi::Object nodeOptions = info[0].As<Napi::Object>();
Napi::Object nodeModel = info[1].As<Napi::Object>();
try {
// 1. Map Node options/model to C++
auto settings = ScramNodeOptions(nodeOptions);
auto model = ScramNodeModel(nodeModel);
// 2. Run analysis with timing
scram::core::RiskAnalysis analysis(model.get(), settings);
// Measure analysis time
auto analysis_start = std::chrono::steady_clock::now();
analysis.Analyze();
auto analysis_end = std::chrono::steady_clock::now();
// Calculate analysis duration in seconds
double analysis_seconds = std::chrono::duration<double>(analysis_end - analysis_start).count();
// Set runtime metrics
scram::core::RiskAnalysis::RuntimeMetrics metrics;
metrics.analysis_seconds = analysis_seconds;
metrics.total_runtime_seconds = analysis_seconds; // For now, set total to same as analysis
analysis.set_runtime_metrics(metrics);
// Check if this is an adaptive analysis
bool has_adaptive = false;
for (const auto& result : analysis.results()) {
if (result.fault_tree_analysis && result.fault_tree_analysis->adaptive_mode_used()) {
has_adaptive = true;
break;
}
}
// Also check event tree sequences (simplified - check settings)
if (!has_adaptive && settings.algorithm() == scram::core::Algorithm::kBdd && !analysis.event_tree_results().empty()) {
// If using BDD with event trees, likely has adaptive sequences
has_adaptive = true;
}
// Generate full report with cut sets
Napi::Object report = ScramNodeReport(env, analysis);
return report;
} catch (const std::exception& e) {
// Preserve the actual error message from SCRAM
std::string errorMsg = "SCRAM Error: ";
errorMsg += e.what();
Napi::Error::New(env, errorMsg).ThrowAsJavaScriptException();
return env.Null();
} catch (...) {
Napi::Error::New(env, "SCRAM Error: Unknown exception occurred").ThrowAsJavaScriptException();
return env.Null();
}
}Updated on 2026-01-09 at 21:59:13 +0000
