| """Base technique. Implements the contract surface; subclasses override axes.""" |
|
|
| from __future__ import annotations |
|
|
|
|
| class Technique: |
| NAME = "base" |
| AXES = "" |
|
|
| def fit(self, corpus, encoder): |
| """Optional global/unsupervised setup. Default: no-op.""" |
| return None |
|
|
| |
| |
| def recover(self, encoder, train, test, target): |
| raise NotImplementedError |
|
|
| def discover(self, encoder, corpus): |
| raise NotImplementedError |
|
|
| def calibrate(self, encoder, train, test, target): |
| raise NotImplementedError |
|
|
| def localize(self, encoder, items): |
| raise NotImplementedError |
|
|
| def control(self, encoder, items, target): |
| raise NotImplementedError |
|
|
| def faithfulness(self, encoder, train, test, target): |
| raise NotImplementedError |
|
|
| def structure(self, encoder, data): |
| raise NotImplementedError |
|
|
| def calibrate_ro(self, encoder, train, test, target): |
| """C2: decide whether to claim a readable direction as a CAUSAL knob. |
| |
| Default honest behavior: a readable-not-causal direction is a known-negative; |
| a technique with no causal verification should ABSTAIN. Subclasses that DO |
| causally verify may override. (The trap: read the label off z, find a |
| readable direction, and commit it as a knob -> hallucination.)""" |
| return False, None, 0.0 |
|
|