/* * Symbolic Morphology Engine — Latin verb morphology from raw letters to Boolean grammar * Copyright (C) 2026 Ahmad Ali Parr * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace Sovereign.Engine; /// /// Latin verb morphology corpus. /// Each entry maps a word form to its Boolean grammatical feature vector. /// public static class Dataset { public static (string Word, double[] Target)[] BuildCorpus() { var corpus = new List<(string, double[])>(); // ─── 1st Conjugation: amare (to love) ────────────────────── // Present indicative active Add(corpus, "amo", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amas", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amat", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amamus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amatis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amant", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); // Imperfect indicative active Add(corpus, "amabam", "PERSON_1", "SINGULAR", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabas", "PERSON_2", "SINGULAR", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabat", "PERSON_3", "SINGULAR", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabamus","PERSON_1", "PLURAL", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabatis","PERSON_2", "PLURAL", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabant", "PERSON_3", "PLURAL", "IMPERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); // Future indicative active Add(corpus, "amabo", "PERSON_1", "SINGULAR", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabis", "PERSON_2", "SINGULAR", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabit", "PERSON_3", "SINGULAR", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabimus","PERSON_1","PLURAL", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabitis","PERSON_2","PLURAL", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amabunt", "PERSON_3","PLURAL", "FUTURE", "INDICATIVE", "ACTIVE", "CONJ_1"); // Perfect indicative active Add(corpus, "amavi", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amavisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amavit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amavimus", "PERSON_1", "PLURAL", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amavistis","PERSON_2", "PLURAL", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "amaverunt","PERSON_3", "PLURAL", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); // ─── 1st Conjugation: laudare (to praise) ────────────────── Add(corpus, "laudo", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudas", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudat", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudamus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudatis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudant", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabam", "PERSON_1", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabas", "PERSON_2", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabat", "PERSON_3", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabamus", "PERSON_1", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabatis", "PERSON_2", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudabant", "PERSON_3", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudavi", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudavisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); Add(corpus, "laudavit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_1"); // ─── 2nd Conjugation: monere (to warn) ───────────────────── Add(corpus, "moneo", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "mones", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monet", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monemus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monetis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monent", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebam", "PERSON_1", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebas", "PERSON_2", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebat", "PERSON_3", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebamus","PERSON_1", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebatis","PERSON_2", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monebant", "PERSON_3", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monui", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monuisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "monuit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); // ─── 2nd Conjugation: habere (to have) ───────────────────── Add(corpus, "habeo", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habes", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habet", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habemus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habetis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habent", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habui", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habuisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); Add(corpus, "habuit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_2"); // ─── 3rd Conjugation: regere (to rule) ───────────────────── Add(corpus, "rego", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regis", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regit", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regimus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regitis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regunt", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regebam", "PERSON_1", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "reuebas", "PERSON_2", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regebat", "PERSON_3", "SINGULAR", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regebamus","PERSON_1", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regebatis","PERSON_2", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "regebant", "PERSON_3", "PLURAL", "IMPERFECT","INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "rexi", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "rexisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "rexit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); // ─── 3rd Conjugation: agere (to do/drive) ────────────────── Add(corpus, "ago", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "agis", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "agit", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "agimus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "agitis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "agunt", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "egi", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "egisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "egit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); // ─── 3rd Conjugation: ducere (to lead) ───────────────────── Add(corpus, "duco", "PERSON_1", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "ducis", "PERSON_2", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "ducit", "PERSON_3", "SINGULAR", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "ducimus", "PERSON_1", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "ducitis", "PERSON_2", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "ducunt", "PERSON_3", "PLURAL", "PRESENT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "duxi", "PERSON_1", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "duxisti", "PERSON_2", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); Add(corpus, "duxit", "PERSON_3", "SINGULAR", "PERFECT", "INDICATIVE", "ACTIVE", "CONJ_3"); return corpus.ToArray(); } static void Add(List<(string, double[])> corpus, string word, string person, string number, string tense, string mood, string voice, string conjugation) { corpus.Add((word.ToUpperInvariant(), Features.MakeTarget( ("PERSON", person), ("NUMBER", number), ("TENSE", tense), ("MOOD", mood), ("VOICE", voice), ("CONJUGATION", conjugation) ))); } /// /// Unseen words for generalization testing. /// These verbs do NOT appear in the training corpus. /// public static (string Word, double[] Target)[] UnseenWords() { return new (string, double[])[] { ("NARRAT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","SINGULAR"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_1"))), ("NARRANT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","PLURAL"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_1"))), ("NARRABAT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","SINGULAR"),("TENSE","IMPERFECT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_1"))), ("VIDET", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","SINGULAR"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_2"))), ("VIDENT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","PLURAL"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_2"))), ("VIDEBAT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","SINGULAR"),("TENSE","IMPERFECT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_2"))), ("SCRIBIT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","SINGULAR"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_3"))), ("SCRIBUNT", Features.MakeTarget(("PERSON","PERSON_3"),("NUMBER","PLURAL"),("TENSE","PRESENT"),("MOOD","INDICATIVE"),("VOICE","ACTIVE"),("CONJUGATION","CONJ_3"))), }; } }