# Robust Kernels Helper

## Interface Definition

**Interface Name**: `IRobustKernels`

### Interface Methods

```python
class IRobustKernels(ABC):
    @abstractmethod
    def huber_loss(self, error: float, threshold: float) -> float:
        pass
    
    @abstractmethod
    def cauchy_loss(self, error: float, k: float) -> float:
        pass
    
    @abstractmethod
    def compute_weight(self, error: float, kernel_type: str, params: Dict[str, float]) -> float:
        pass
```

## Component Description

Huber/Cauchy loss functions for outlier rejection in optimization.

## API Methods

### `huber_loss(error: float, threshold: float) -> float`

**Description**: Huber robust loss function.

**Formula**:
```
if |error| <= threshold:
    loss = 0.5 * error^2
else:
    loss = threshold * (|error| - 0.5 * threshold)
```

**Purpose**: Quadratic for small errors, linear for large errors (outliers).

---

### `cauchy_loss(error: float, k: float) -> float`

**Description**: Cauchy robust loss function.

**Formula**:
```
loss = (k^2 / 2) * log(1 + (error/k)^2)
```

**Purpose**: More aggressive outlier rejection than Huber.

---

### `compute_weight(error: float, kernel_type: str, params: Dict[str, float]) -> float`

**Description**: Computes robust weight for error.

**Usage**: Factor Graph applies weights to downweight outliers.

## Dependencies

**External**: numpy

## Test Cases

1. Small error → weight ≈ 1.0
2. Large error (350m outlier) → weight ≈ 0.1 (downweighted)
3. Huber vs Cauchy → Cauchy more aggressive

