# LINEARTRANS: Linear Scaling Transformer

> "The simplest transformations are often the most powerful—linear scaling is the mathematical equivalent of adjusting the volume and tuning the dial."

The Linear transformer applies an affine transformation $y = \text{slope} \cdot x + \text{intercept}$ to each value in a time series. This fundamental operation enables scaling, offsetting, unit conversion, and normalization—the building blocks for preparing data for analysis or combining signals from different sources.

## Mathematical Foundation

### Core Formula

$$
\text{Linear}_t = m \cdot x_t + b
$$

where:
- $m$ is the slope (multiplicative factor)
- $b$ is the intercept (additive constant)
- $x_t$ is the input value at time $t$

### Key Properties

| Property | Formula | Description |
|:---------|:--------|:------------|
| **Identity** | $1 \cdot x + 0 = x$ | Default parameters preserve input |
| **Composition** | $c(ax+b)+d = (ac)x + (bc+d)$ | Sequential transforms combine linearly |
| **Inverse** | $\frac{1}{m}(y - b) = x$ | Recoverable when $m \neq 0$ |
| **Difference Preservation** | $y_2 - y_1 = m(x_2 - x_1)$ | Relative differences scaled by slope |
| **Zero Crossing** | $y = 0$ when $x = -b/m$ | Predictable intercept with x-axis |

### Domain and Range

| | Value |
|:--|:--|
| **Domain** | $(-\infty, +\infty)$ |
| **Range** | $(-\infty, +\infty)$ when $m \neq 0$; $\{b\}$ when $m = 0$ |

## Financial Applications

### Unit Conversion

Convert between price units or currencies:

$$
P_{\text{USD}} = \text{rate} \cdot P_{\text{EUR}}
$$

### Percentage to Decimal

Convert percentage values to decimal form:

$$
r_{\text{decimal}} = 0.01 \cdot r_{\text{percent}}
$$

### Basis Point Scaling

Convert decimal rates to basis points:

$$
r_{\text{bps}} = 10000 \cdot r_{\text{decimal}}
$$

### Price Normalization

Normalize prices to a baseline:

$$
P_{\text{norm}} = \frac{P_t - P_0}{P_0} = \frac{1}{P_0} \cdot P_t - 1
$$

This is `Linear(1/P₀, -1)`.

### Signal Combination

Scale and combine multiple indicators:

$$
\text{Combo} = w_1 \cdot \text{RSI} + w_2 \cdot \text{MACD}_{\text{scaled}}
$$

## Implementation Details

### Fused Multiply-Add (FMA)

The implementation uses `Math.FusedMultiplyAdd(slope, value, intercept)` which computes $m \cdot x + b$ with a single rounding operation, providing:
- Better numerical precision
- Potential hardware acceleration
- Reduced floating-point error accumulation

### Special Cases

| slope | intercept | Effect |
|:------|:----------|:-------|
| 1.0 | 0.0 | Identity (passthrough) |
| 0.0 | b | Constant output |
| -1.0 | 0.0 | Negation |
| m | 0.0 | Pure scaling |
| 1.0 | b | Pure offset |

### Streaming Characteristics

| Metric | Value |
|:-------|:------|
| **Warmup Period** | 0 |
| **Memory** | O(1) |
| **Complexity** | O(1) per update |

## Performance Profile

### Operation Count (Scalar)

| Operation | Count | Notes |
|:----------|:-----:|:------|
| FMA | 1 | Single fused operation |
| **Total** | ~4 cycles | Near-instantaneous |

### SIMD Optimization

The span-based `Calculate` method uses AVX2/FMA intrinsics:
- Processes 4 doubles per iteration
- Hardware FMA when available
- ~8× throughput improvement for large datasets

### Quality Metrics

| Metric | Score | Notes |
|:-------|:-----:|:------|
| **Accuracy** | 10/10 | FMA provides optimal precision |
| **Timeliness** | 10/10 | Zero lag |
| **Smoothness** | N/A | Transform preserves input characteristics |

## Usage Examples

### Basic Usage

```csharp
// Scale values by 2x and add 10
var linear = new Lineartrans(slope: 2.0, intercept: 10.0);

var input = new TValue(DateTime.UtcNow, 50.0);
var result = linear.Update(input);  // 110.0
```

### Converting Percentage to Decimal

```csharp
var toDecimal = new Lineartrans(slope: 0.01, intercept: 0.0);

var percent = new TValue(DateTime.UtcNow, 5.5);  // 5.5%
var decimalRate = toDecimal.Update(percent);     // 0.055
```

### Normalizing to Baseline

```csharp
double baseline = 100.0;
var normalizer = new Lineartrans(slope: 1.0 / baseline, intercept: -1.0);

// Converts prices to percentage change from baseline
var price = new TValue(DateTime.UtcNow, 105.0);
var pctChange = normalizer.Update(price);  // 0.05 (5% above baseline)
```

### Inverting a Transform

```csharp
double m = 2.0, b = 10.0;

var transform = new Lineartrans(m, b);
var inverse = new Lineartrans(1.0 / m, -b / m);

// Round-trip: value → transformed → original
var original = new TValue(DateTime.UtcNow, 50.0);
var transformed = transform.Update(original);  // 110.0
var recovered = inverse.Update(transformed);   // 50.0
```

### Chaining Transforms

```csharp
var scale = new Lineartrans(2.0, 0.0);
var offset = new Lineartrans(scale, 1.0, 10.0);  // Chain: scale then add 10

// Equivalent to: Linear(2.0, 10.0)
```

## Common Pitfalls

1. **Zero Slope Trap**: Setting `slope=0` produces constant output regardless of input. This is valid but often unintentional.

2. **Division by Zero in Inverse**: When computing inverse transforms, ensure the original slope is non-zero.

3. **Overflow Risk**: Large slopes combined with large inputs can overflow. For slope=1e100 and x=1e100, the result exceeds double precision.

4. **Precision Accumulation**: While single transforms are precise, many chained transforms accumulate error. Use composition formula to combine into single transform when possible.

5. **Parameter Validation**: Constructor rejects NaN/Infinity for slope and intercept to fail fast rather than propagate invalid results.

## Validation

| Test | Status |
|:-----|:------:|
| **Mathematical Formula Parity** | ✅ |
| **Identity Transform** | ✅ |
| **Composition Property** | ✅ |
| **Inverse Recovery** | ✅ |
| **Difference Preservation** | ✅ |
| **FMA Accuracy** | ✅ |

## References

- Strang, G. (2016). *Introduction to Linear Algebra*. Wellesley-Cambridge Press.
- Goldberg, D. (1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic." *ACM Computing Surveys*.
- Intel Corporation. (2023). *Intel 64 and IA-32 Architectures Optimization Reference Manual*. (FMA instruction details)
