Skip to content

packages/engine/scram/targets/scram-node/src/ScramNodeSettings.cpp

Functions

Name
scram::core::SettingsScramNodeOptions(const Napi::Object & nodeOptions)

Functions Documentation

function ScramNodeOptions

cpp
scram::core::Settings ScramNodeOptions(
    const Napi::Object & nodeOptions
)

Source code

cpp
#include "ScramNodeSettings.h"

// Step 1: TypeScript to C++ Settings Mapping
scram::core::Settings ScramNodeOptions(const Napi::Object& nodeOptions) {
    scram::core::Settings settings;

    // Set a default input file name for Monte Carlo progress logging
    // (required by convergence_controller for timestamp_string generation)
    std::vector<std::string> input_files = {"scram-node-model"};
    settings.input_files(input_files);

    // Check if Monte Carlo is requested (needs PDAG algorithm)
    bool needsPdag = false;
    if (nodeOptions.Has("monteCarlo") && nodeOptions.Get("monteCarlo").ToBoolean().Value()) {
        needsPdag = true;
    }

    // Algorithm (mocus, bdd, zbdd, pdag)
    // If monteCarlo is set and no algorithm is explicitly specified, default to pdag
    if (nodeOptions.Has("mocus")) {
        if (nodeOptions.Get("mocus").ToBoolean().Value())
            settings.algorithm("mocus");
    } else if (nodeOptions.Has("bdd")) {
        if (nodeOptions.Get("bdd").ToBoolean().Value())
            settings.algorithm("bdd");
    } else if (nodeOptions.Has("zbdd")) {
        if (nodeOptions.Get("zbdd").ToBoolean().Value())
            settings.algorithm("zbdd");
    } else if (nodeOptions.Has("pdag")) {
        if (nodeOptions.Get("pdag").ToBoolean().Value())
            settings.algorithm("pdag");
    } else {
        // Default: use PDAG if Monte Carlo is requested, otherwise MOCUS
        if (needsPdag) {
            settings.algorithm("pdag");
        } else {
            settings.algorithm("mocus");
        }
    }

    // Approximation (rare-event, mcub, monte-carlo, none)
    // Only set if explicitly provided - otherwise let the algorithm setter choose the default
    if (nodeOptions.Has("rareEvent")) {
        if (nodeOptions.Get("rareEvent").ToBoolean().Value())
            settings.approximation("rare-event");
    } else if (nodeOptions.Has("mcub")) {
        if (nodeOptions.Get("mcub").ToBoolean().Value())
            settings.approximation("mcub");
    } else if (nodeOptions.Has("monteCarlo")) {
        if (nodeOptions.Get("monteCarlo").ToBoolean().Value())
            settings.approximation("monte-carlo");
    }
    // Note: No "else" clause - let the algorithm() setter choose the appropriate default approximation

    // Prime implicants (bool)
    if (nodeOptions.Has("primeImplicants")) {
        settings.prime_implicants(nodeOptions.Get("primeImplicants").ToBoolean().Value());
    }

    // Adaptive quantification (bool)
    if (nodeOptions.Has("adaptive")) {
        settings.adaptive(nodeOptions.Get("adaptive").ToBoolean().Value());
    }

    // Probability analysis (bool)
    if (nodeOptions.Has("probability")) {
        settings.probability_analysis(nodeOptions.Get("probability").ToBoolean().Value());
    }

    // Importance analysis (bool)
    if (nodeOptions.Has("importance")) {
        settings.importance_analysis(nodeOptions.Get("importance").ToBoolean().Value());
    }

    // Uncertainty analysis (bool)
    if (nodeOptions.Has("uncertainty")) {
        settings.uncertainty_analysis(nodeOptions.Get("uncertainty").ToBoolean().Value());
    }

    // CCF analysis (bool)
    if (nodeOptions.Has("ccf")) {
        settings.ccf_analysis(nodeOptions.Get("ccf").ToBoolean().Value());
    }

    // Safety Integrity Levels (bool)
    if (nodeOptions.Has("sil")) {
        settings.safety_integrity_levels(nodeOptions.Get("sil").ToBoolean().Value());
    }

    // Limit order (int)
    if (nodeOptions.Has("limitOrder")) {
        settings.limit_order(nodeOptions.Get("limitOrder").ToNumber().Int32Value());
    }

    // Cut-off (double)
    if (nodeOptions.Has("cutOff")) {
        settings.cut_off(nodeOptions.Get("cutOff").ToNumber().DoubleValue());
    }

    // Mission time (double)
    if (nodeOptions.Has("missionTime")) {
        settings.mission_time(nodeOptions.Get("missionTime").ToNumber().DoubleValue());
    }

    // Time step (double)
    if (nodeOptions.Has("timeStep")) {
        settings.time_step(nodeOptions.Get("timeStep").ToNumber().DoubleValue());
    }

    // Number of trials (int)
    if (nodeOptions.Has("numTrials")) {
        settings.num_trials(nodeOptions.Get("numTrials").ToNumber().Int32Value());
    }

    // Number of quantiles (int)
    if (nodeOptions.Has("numQuantiles")) {
        settings.num_quantiles(nodeOptions.Get("numQuantiles").ToNumber().Int32Value());
    }

    // Number of bins (int)
    if (nodeOptions.Has("numBins")) {
        settings.num_bins(nodeOptions.Get("numBins").ToNumber().Int32Value());
    }

    // Seed (int)
    if (nodeOptions.Has("seed")) {
        settings.seed(nodeOptions.Get("seed").ToNumber().Int32Value());
    }

    // Graph compilation and preprocessing flags
    // Expand at-least gates (--no-kn flag disables K/N gate optimization)
    if (nodeOptions.Has("noKn")) {
        settings.expand_atleast_gates(nodeOptions.Get("noKn").ToBoolean().Value());
    }

    // Expand XOR gates (--no-xor flag disables XOR gate optimization)
    if (nodeOptions.Has("noXor")) {
        settings.expand_xor_gates(nodeOptions.Get("noXor").ToBoolean().Value());
    }

    // Keep null gates (don't remove gates with no effect)
    if (nodeOptions.Has("keepNullGates")) {
        settings.keep_null_gates(nodeOptions.Get("keepNullGates").ToBoolean().Value());
    }

    // Compilation level (0-8, higher = more optimization)
    if (nodeOptions.Has("compilationLevel")) {
        settings.compilation_level(nodeOptions.Get("compilationLevel").ToNumber().Int32Value());
    }

    return settings;
}

Updated on 2026-01-09 at 21:59:13 +0000