# core/converters/finding.sequence.converter.ts

> 81 lines of code and 10 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-converters-finding-sequence-converter-ts
Source text: https://banes-lab.com/source/patterns/core/converters/finding.sequence.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/patterns/core/converters.md), after [core/converters/finding.grid.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.grid.converter.ts.md) and before [core/converters/finding.tree.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.tree.converter.ts.md).

## Definitions

- `transitionsFinding` (lexical_declaration, line 10)
- `sequenceFindings` (lexical_declaration, line 80, exported)
- `predictionFinding` (lexical_declaration, line 57)
- `runsFinding` (lexical_declaration, line 40)
- `memory` (lexical_declaration, line 11)
- `verdict` (lexical_declaration, line 12)
- `[next]` (lexical_declaration, line 58)
- `[value]` (lexical_declaration, line 62)
- `observed` (lexical_declaration, line 63)
- `explained` (lexical_declaration, line 64)

## Contained in

- [core/converters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-converters.md)

## Uses

- [core/converters/finding.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.converter.ts.md)
- [core/factories/axis.factory.ts](https://banes-lab.com/source/patterns/core/factories/axis.factory.ts.md)
- [core/factories/finding.factory.ts](https://banes-lab.com/source/patterns/core/factories/finding.factory.ts.md)
- [core/normalizers/math.normalizer.ts](https://banes-lab.com/source/patterns/core/normalizers/math.normalizer.ts.md)

## Used by

- [core/plugins/representation.sequence.plugin.ts](https://banes-lab.com/source/patterns/core/plugins/representation.sequence.plugin.ts.md)

## Linked from

- [core/converters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-converters.md)
- [core/factories](https://banes-lab.com/anatomy/patterns/folder-patterns-core-factories.md)
- [core/normalizers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-normalizers.md)
- [core/plugins](https://banes-lab.com/anatomy/patterns/folder-patterns-core-plugins.md)

## Source

```typescript
import { NULL_MODEL_LABELS, PREDICTION_METHODS, SEQUENCE_STRINGS } from "#configuration/strings/representation.strings";
import { explanationFinding, makeFinding, reasonOf } from "#core/factories/finding.factory";
import type { Finding } from "#types/finding.types";
import { ROUNDING } from "#configuration/constants/math.constants";
import type { SequenceSummary } from "#types/representation.types";
import { coordinate } from "#core/factories/axis.factory";
import { fixedTo } from "#core/normalizers/math.normalizer";
import { withSupport } from "#core/converters/finding.converter";

const transitionsFinding = function transitionsFinding(field: string, summary: SequenceSummary): Finding {
    const memory = summary.transitionSignificance;
    const verdict = memory.significant ? SEQUENCE_STRINGS.transitionsHasMemory : SEQUENCE_STRINGS.transitionsMemoryless;
    const observed = SEQUENCE_STRINGS.transitionsObserved(summary.changeRatio.toFixed(ROUNDING.standard));
    const explained = SEQUENCE_STRINGS.transitionsExplained(verdict, memory.pValue.toFixed(ROUNDING.fine));
    return makeFinding({
        coordinate: coordinate({
            analysis: "sequential",
            ontology: "change",
            reasoning: "explanation",
            representation: "symbolic",
        }),
        field,
        name: "transitions",
        narrative: reasonOf(observed, explained),
        observation: {
            changeRatio: fixedTo(summary.changeRatio, ROUNDING.fine),
            pValue: fixedTo(memory.pValue, ROUNDING.fine),
            significant: memory.significant,
            topTransitions: summary.topTransitions.map(([[from, to], count]) => ({ count, from, to })),
        },
        significance: {
            nullModel: NULL_MODEL_LABELS.transition,
            pValue: memory.pValue,
            significant: memory.significant,
            statistic: memory.statistic,
        },
    });
};

const runsFinding = function runsFinding(field: string, summary: SequenceSummary): Finding {
    return explanationFinding({
        analysis: "sequential",
        explained: SEQUENCE_STRINGS.runsExplained,
        field,
        name: "runs",
        observation: {
            longestRun: summary.longestRun,
            meanRun: fixedTo(summary.meanRun, ROUNDING.fine),
            runLengths: summary.runLengths.map(([length, count]) => ({ count, length })),
        },
        observed: SEQUENCE_STRINGS.runsObserved(summary.meanRun.toFixed(ROUNDING.standard), String(summary.longestRun)),
        ontology: "state",
        representation: "symbolic",
    });
};

const predictionFinding = function predictionFinding(field: string, summary: SequenceSummary): Finding | null {
    const [next] = summary.nextValue;
    if (!next || summary.lastValue === null) {
        return null;
    }
    const [value] = next;
    const observed = SEQUENCE_STRINGS.predictionObserved(summary.lastValue, value);
    const explained = SEQUENCE_STRINGS.predictionExplained(summary.markovAccuracy.toFixed(ROUNDING.standard));
    return makeFinding({
        coordinate: coordinate({
            analysis: "prediction",
            ontology: "change",
            reasoning: "prediction",
            representation: "dynamical-systems",
        }),
        field,
        name: "next-value-prediction",
        narrative: reasonOf(observed, explained),
        observation: { accuracy: summary.markovAccuracy, next: value },
        prediction: { accuracy: summary.markovAccuracy, method: PREDICTION_METHODS.markov },
    });
};

export const sequenceFindings = function sequenceFindings(field: string, summary: SequenceSummary): Finding[] {
    return withSupport(
        [transitionsFinding(field, summary), runsFinding(field, summary), predictionFinding(field, summary)],
        summary.count,
    );
};
```
