/**
 * De gemeenschappelijke gedaante van de twee motoren &mdash; sinds mijlpaal M9.
 *
 * <p>{@link Qwen2} (de klassieke transformer, hoofdstuk 14) en {@link Qwen35}
 * (de hybride Gated DeltaNet-graf) delen dezelfde buitenkant: tokens erin,
 * logits eruit, met een positie en een resetknop. De gereedschappen (Forward,
 * Chat, Agent) kiezen via {@link #open} de juiste motor op grond van de
 * architectuurstring in het bestand &mdash; en weigeren luid wat geen van beide is.
 */
public interface Motor {

    /** Voert één token en geeft de logits voor het volgende terug. */
    float[] forward(int token);

    /** Hoeveel tokens er al gevoerd zijn. */
    int position();

    /** De contextgrens van deze motor-instantie. */
    int ctx();

    /** Begin een vers gesprek: positie nul, alle toestand gewist. */
    void reset();

    /** De grootte van de woordenschat (de lengte van de logits). */
    int vocab();

    /** Eén regel zelfbeschrijving voor de opstartmelding van de gereedschappen. */
    String omschrijving();

    static Motor open(Gguf g, int maxContext) {
        return switch (g.architecture()) {
            case "qwen2"  -> new Qwen2(g, maxContext);
            case "qwen35" -> new Qwen35(g, maxContext);
            default -> throw new IllegalArgumentException("dit is een '" + g.architecture()
                    + "'-model; dit project kent qwen2 en qwen35. De graf verschilt per "
                    + "architectuur, dus raden zou stil verkeerde antwoorden geven.");
        };
    }
}
