---
title: "Core workflow"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Core workflow}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(comment = "#>", message = FALSE, warning = FALSE)
```

This vignette walks through the standard **tidyfault** pipeline from tidy node and edge tables to minimal cutsets and a coverage summary, using the bundled database failure example.

## Represent the fault tree

**tidyfault** represents a fault tree as two tables:

- **`nodes`**: one row per gate or basic event, with columns `id`, `event`, and `type` (`"top"`, `"and"`, `"or"`, or `"not"`).
- **`edges`**: directed links between node `id` values (`from`, `to`), forming a DAG with a single top event. The top event has exactly one child, an `and` or `or` gate; `curate()` stops with a message otherwise.

The objects [`db_nodes`](https://tidyfault.netlify.app/reference/db_nodes.html) and [`db_edges`](https://tidyfault.netlify.app/reference/db_edges.html) model a small database system whose top event is overall system failure. Load them and inspect the first few rows:

```{r}
library(tidyfault)
library(dplyr)

data("db_nodes")
data("db_edges")

knitr::kable(head(db_nodes, 6), caption = "Nodes (excerpt)")
knitr::kable(head(db_edges, 6), caption = "Edges (excerpt)")
```

---

## Pipeline overview

From nodes and edges you typically:

1. [**`curate()`**](https://tidyfault.netlify.app/reference/curate.html) — build a gates table (one row per gate, boolean `set`, list-column `items`).
2. [**`equate()`**](https://tidyfault.netlify.app/reference/equate.html) — substitute gates recursively into one top-level boolean string.
3. [**`formulate()`**](https://tidyfault.netlify.app/reference/formulate.html) — turn that string into an R function with one argument per basic event.
4. [**`calculate()`**](https://tidyfault.netlify.app/reference/calculate.html) (optional) — enumerate the full truth table when the number of basic events is moderate.
5. [**`concentrate()`**](https://tidyfault.netlify.app/reference/concentrate.html) — minimal cutsets (default MOCUS backend: Rcpp).
6. [**`tabulate()`**](https://tidyfault.netlify.app/reference/tabulate.html) — coverage of each minimal cutset against failing scenarios in the truth table.

The next sections run steps 1–3 and 5–6 on `db_*`; see the [quantify binary](https://tidyfault.netlify.app/articles/quantify-binary) vignette for evaluation with [`quantify()`](https://tidyfault.netlify.app/reference/quantify.html).

---

## Gates table: `curate()`

```{r}
gates <- curate(nodes = db_nodes, edges = db_edges)
gates
```

Each row is a gate (including the top); `set` encodes children with `*` (AND) and `+` (OR).

---

## Boolean equation: `equate()`

```{r}
equation <- equate(gates)
equation
```

---

## Executable structure: `formulate()`

```{r}
f <- formulate(equation)
sort(names(formals(f)))
```

`f()` evaluates the top event for one scenario when you pass named binary inputs (see the quantify vignettes).

---

## Optional: full truth table with `calculate()`

When $2^n$ rows is acceptable, [`calculate()`](https://tidyfault.netlify.app/reference/calculate.html) expands every combination of basic events:

```{r}
truth <- calculate(f)
dim(truth)
sum(truth$outcome) # failure scenarios
```

---

## Minimal cutsets: `concentrate()` and `tabulate()`

[`concentrate()`](https://tidyfault.netlify.app/reference/concentrate.html) returns a character vector of minimal cutset expressions. The default method matches the Rcpp MOCUS expansion used by [`mocus()`](https://tidyfault.netlify.app/reference/mocus.html).

```{r}
mymin <- concentrate(gates)
mymin
```

[`tabulate()`](https://tidyfault.netlify.app/reference/tabulate.html) joins these cutsets to the truth table implied by `f` and reports how many failing rows each cutset explains:

```{r}
mytab <- tabulate(mymin, formula = f)
knitr::kable(mytab, digits = 4)
```

Each row is one minimal cutset; `coverage` is the share of all failure scenarios (`failures`) that the cutset matches.

---

## Summary

| Step | Role |
|------|------|
| `curate` | Nodes/edges → gates data frame |
| `equate` | Gates → single boolean string |
| `formulate` | String → R function `f` |
| `calculate` | `f` → full truth table (optional) |
| `concentrate` | Gates → minimal cutset strings |
| `tabulate` | Cutsets + `f` → coverage table |

For visualization, see [Visualizing fault trees](https://tidyfault.netlify.app/articles/visualizing-fault-trees).
