RustedSciThe 0.4.1

Rust framework for symbolic and numerical computing:BVP ( Newton-Raphson ), IVP ( BDF, Radau, Backward Euler, LSODE, LSODA, RK45, DoPri), nonlinear equations ( Levenberg, Gavin)
Documentation
use RustedSciThe::command_interpreter::task_parser_bvp::create_bvp_template_file;
use RustedSciThe::command_interpreter::task_parser_ivp::create_ivp_template_file;
use RustedSciThe::command_interpreter::task_runner::{
    TaskDocumentKind, TaskRunResult, parse_task_spec_from_file, render_task_preview,
    run_task_from_spec,
};
use std::path::PathBuf;

fn print_usage() {
    println!("RustedSciThe task-shell CLI");
    println!();
    println!("Usage:");
    println!("  rustedscithe <task-file>");
    println!("  rustedscithe --template ivp [output-path]");
    println!("  rustedscithe --template bvp [output-path]");
    println!("  rustedscithe --showcase");
    println!();
    println!("Examples:");
    println!("  rustedscithe examples/task_docs/ivp_decay_task.txt");
    println!("  rustedscithe --template ivp");
    println!("  rustedscithe --showcase");
}

fn print_showcase() {
    println!("RustedSciThe showcase (minimal crate storefront)");
    println!();
    println!("1) Task-shell quick start (text task -> solver run):");
    println!("  rustedscithe examples/task_docs/ivp_decay_task.txt");
    println!("  rustedscithe examples/task_docs/bvp_reference_task.txt");
    println!("  rustedscithe examples/task_docs/ivp_solid_combustion_with_sublimation_task.txt");
    println!("  rustedscithe examples/task_docs/bvp_combustion_1000_task.txt");
    println!("  rustedscithe --template ivp");
    println!("  rustedscithe --template bvp");
    println!();
    println!("2) Dispatcher / shell infrastructure:");
    println!("  cargo run --example task_dispatcher_guide");
    println!("  cargo run --example task_shell_guides_index");
    println!();
    println!("3) Legacy compatibility mini-showcase:");
    println!("  cargo run --example legacy_main_compat -- 0");
    println!("  cargo run --example legacy_main_compat -- 2");
    println!("  cargo run --example legacy_main_compat -- 4");
    println!("  cargo run --example legacy_main_compat -- 5");
    println!("  cargo run --example legacy_main_compat -- 9");
    println!("  cargo run --example legacy_main_compat -- 10");
    println!("  cargo run --example legacy_main_compat -- 11");
    println!("  cargo run --example legacy_main_compat -- 15");
    println!("  cargo run --example legacy_main_compat -- 19");
    println!();
    println!("4) Modern IVP / LSODE2 guides:");
    println!("  cargo run --example ivp_backends_guide");
    println!("  cargo run --example lsode2_task_shell_guide");
    println!("  cargo run --example lsode2_numerical_guide");
    println!("  cargo run --example lsode2_lambdify_guide");
    println!("  cargo run --example lsode2_aot_guide");
    println!("  cargo run --example lsode2_manual_bdf_guide");
    println!("  cargo run --example lsode2_manual_adams_guide");
    println!();
    println!("5) Modern BVP / banded guides:");
    println!("  cargo run --example bvp_backends_guide");
    println!("  cargo run --example banded_solvers_guide");
    println!();
    println!("6) More examples:");
    println!("  cargo run --example task_shell_guides_index");
    println!("  cargo run --example radau_backends_guide");
    println!("  cargo run --example curve_fitting_guide");
    println!("  cargo run --example nonlinear_systems_guide");
}

fn print_run_summary(result: &TaskRunResult) {
    match result {
        TaskRunResult::Ivp(ivp) => {
            let status = ivp.status.as_deref().unwrap_or("unknown");
            let rows = ivp.t_result.as_ref().map(|t| t.len()).unwrap_or(0);
            let cols = ivp.y_result.as_ref().map(|y| y.ncols()).unwrap_or(0);
            println!("Task kind : IVP");
            println!("Status    : {status}");
            println!("Grid rows : {rows}");
            println!("State dim : {cols}");
        }
        TaskRunResult::Bvp(bvp) => {
            let (rows, cols) = bvp
                .result
                .as_ref()
                .map(|m| (m.nrows(), m.ncols()))
                .unwrap_or((0, 0));
            println!("Task kind : BVP");
            println!("Status    : finished");
            println!("Grid rows : {rows}");
            println!("State dim : {cols}");
        }
    }
}

fn main() {
    let args: Vec<String> = std::env::args().collect();
    if args.len() <= 1 {
        print_usage();
        std::process::exit(1);
    }

    if args[1] == "--help" || args[1] == "-h" {
        print_usage();
        return;
    }
    if args[1] == "--showcase" {
        print_showcase();
        return;
    }

    if args[1] == "--template" {
        if args.len() < 3 {
            eprintln!("`--template` expects `ivp` or `bvp`.");
            print_usage();
            std::process::exit(2);
        }
        let output = if args.len() >= 4 {
            Some(PathBuf::from(&args[3]))
        } else {
            None
        };
        match args[2].to_ascii_lowercase().as_str() {
            "ivp" => {
                create_ivp_template_file(output);
                println!("IVP template created.");
            }
            "bvp" => {
                create_bvp_template_file(output);
                println!("BVP template created.");
            }
            other => {
                eprintln!("Unknown template kind `{other}` (expected `ivp` or `bvp`).");
                std::process::exit(2);
            }
        }
        return;
    }

    let input_path = PathBuf::from(&args[1]);
    match parse_task_spec_from_file(&input_path) {
        Ok(spec) => {
            let kind = match spec.kind() {
                TaskDocumentKind::Ivp => "IVP",
                TaskDocumentKind::Bvp => "BVP",
            };
            println!("Task file : {}", input_path.display());
            println!("Detected  : {kind}");
            println!();
            println!("{}", render_task_preview(&spec));
            match run_task_from_spec(spec) {
                Ok(result) => {
                    print_run_summary(&result);
                }
                Err(err) => {
                    eprintln!("Task execution failed: {err}");
                    std::process::exit(3);
                }
            }
        }
        Err(err) => {
            eprintln!("Task execution failed: {err}");
            std::process::exit(3);
        }
    }
}