Skip to main content

powerio_matrix/io/
mod.rs

1//! File I/O: Matrix Market (`.mtx`) and JSON metadata, plus the gridfm-datakit
2//! Parquet export (`--features gridfm`).
3
4#[cfg(feature = "gridfm")]
5pub mod gridfm;
6pub mod meta;
7pub mod mtx;
8pub mod sensitivity;
9
10#[cfg(feature = "gridfm")]
11pub use gridfm::{
12    GridfmOptions, GridfmOutputs, GridfmRead, GridfmSnapshot, GridfmTables, gridfm_base_case,
13    gridfm_record_batches, gridfm_record_batches_batch, numbered_snapshots, read_gridfm_dataset,
14    read_gridfm_network, read_gridfm_scenarios, write_gridfm_batch, write_gridfm_dataset,
15};
16pub use meta::{CaseMetadata, MatrixMetadata, write_meta_json};
17pub use mtx::{read_mtx, read_vector_mtx, write_mtx, write_vector_mtx};
18pub use sensitivity::write_sensitivity_mtx_with_options;
19
20/// Read one scenario from a dataset directory in the named `from` format.
21/// This function dispatches dataset format names; the C ABI's `pio_read_dir`
22/// wraps it.
23/// `gridfm` is the currently supported dataset format; `scenario` selects within it.
24/// PyPSA CSV directories are case inputs, not datasets, and parse through
25/// `parse_file`.
26///
27/// # Errors
28/// [`powerio::Error::UnknownFormat`] for a non-dataset format name; otherwise
29/// as [`read_gridfm_dataset`].
30#[cfg(feature = "gridfm")]
31pub fn read_dataset_dir(
32    dir: impl AsRef<std::path::Path>,
33    from: &str,
34    scenario: i64,
35) -> crate::Result<GridfmRead> {
36    require_dataset_format(from)?;
37    read_gridfm_dataset(dir, scenario)
38}
39
40/// Return the distinct scenario IDs in ascending order for dataset directory
41/// `dir` in the named `from` format. The C ABI exposes the same query through
42/// `pio_scenario_ids`.
43///
44/// # Errors
45/// As [`read_dataset_dir`].
46#[cfg(feature = "gridfm")]
47pub fn dataset_scenario_ids(
48    dir: impl AsRef<std::path::Path>,
49    from: &str,
50) -> crate::Result<Vec<i64>> {
51    require_dataset_format(from)?;
52    gridfm::gridfm_scenario_ids(dir)
53}
54
55#[cfg(feature = "gridfm")]
56fn require_dataset_format(from: &str) -> powerio::Result<()> {
57    if from.eq_ignore_ascii_case("gridfm") {
58        return Ok(());
59    }
60    Err(powerio::Error::UnknownFormat(format!(
61        "{from} is not a dataset directory format (dataset formats: gridfm); \
62         PyPSA CSV directories parse through parse_file"
63    )))
64}