)]}'
{
  "log": [
    {
      "commit": "565274ef29a94438e63dffac72ac74c24a534c40",
      "tree": "bab44688a0ecfbc487dc94cf7e3f85d65604e5fa",
      "parents": [
        "5b8aaf7556e4c5f677d51601c3f1c15e90557516"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Sep 06 13:17:17 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Sep 06 13:17:17 2026 +0200"
      },
      "message": "Search the embedding space with vector expressions\n\n\"König - Mann + Frau\" now looks for the neighbours of\nvec(König) - vec(Mann) + vec(Frau) instead of the neighbours of a single\nword. A \u0027+\u0027 or \u0027-\u0027 is an operator only at the beginning of a token, so\nhyphenated words like \"Nord-Süd-Dialog\" stay searchable, and blank\nseparated words keep entering the query with a \u0027+\u0027, as before.\n\n_get_neighbours() already had the branch for it, but nothing ever filled\nwl-\u003esep: the wordlist came from malloc() and the signs were read out of\nuninitialised memory, so a multi word query subtracted operands at\nrandom. It is filled now, and its indexing corrected - sep[b] is the sign\nof operand b, not sep[b-1].\n\nThe predictive collocators answer for the whole query as well.\ngetCollocators() read the input weights of wl-\u003ewordi[0], the first\noperand, and nothing said so: \"Haus Auto\" answered with the collocators\nof Haus, \"Auto Haus\" with those of Auto. The score of a candidate is\nsigmoid(q . syn1neg[collocate, position]), linear in q before the\nsigmoid, so q can be the signed combination the paradigmatic side\nsearches around rather than the vector of one word.\n\nThe terms are averaged rather than summed. The sigmoid is informative\nover a narrow range only - the strongest collocates of a single word\nreach 0.994 to 0.997 on dereko-2026-ii, against the 0.9975 that MAX_EXP\nallows - so a plain sum would push them into saturation. Dividing by the\nnumber of terms keeps every query in the range MIN_RESP and the auto\nfocus are calibrated for, and leaves one word exactly as it was, divisor\none. A balanced analogy is one term as well, +1 -1 +1.\n\nThose tails now saturate instead of being dropped. Activations outside\n±MAX_EXP used to skip the collocate entirely, removing the strongest ones\nfrom the list and from the position and target sums.\n\nThe count based collocators cannot follow: they are looked up per node in\nthe co-occurrence database. They used to be fetched for the first\nparadigmatic neighbour, i.e. for the word nearest to the query vector,\nwhich for an expression is not what was asked for. The interface says so\nin place of that table now, and get_neighbours() reports the number of\noperands so it can tell the two cases apart.\n\nOperands outside the vocabulary are named above the result instead of\nbeing dropped in silence. The vocabulary lookup only recognised a miss at\nthe very end of the vocabulary, so in a merged model a missing word\nresolved to whatever sits at the boundary between the two vocabularies;\nit returns -1 in both halves now.\n\nTwo more things the tokeniser uncovered. The best array was sized for\n10 * max(N, 200) entries but sorted over N * para_threads, which fits\nonly as long as the syntagmatic threads take half of them - it is sized\nfor num_threads slices now. And its unfilled slots kept wordi \u003d\u003d 0 from\nthe memset, which the result loop emitted as vocab[-1 * max_w] once a\nthread found fewer candidates than were asked for; slots start at -1 and\nthe loop stops there.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ia91727eb669d73fc055adf652500464b8a743795\n"
    },
    {
      "commit": "043db1500f3e2677770e2701cb96cd996482062d",
      "tree": "725b1e98f5d845c50c7b9f7d69a6e72502186037",
      "parents": [
        "b36bc7439838d1a0102e85d117b066b9583094eb"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 17:47:53 2023 +0100"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 17:47:53 2023 +0100"
      },
      "message": "Add getVocabSize\n\nChange-Id: I642b39b1186752387da2b555b6e6cb20a0952be5\n"
    },
    {
      "commit": "b36bc7439838d1a0102e85d117b066b9583094eb",
      "tree": "6e8210bff3d006e2410db71904b4fe70a709d336",
      "parents": [
        "91f021b6bf25a59c8e0575339078ebcd5df27d5f"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 17:46:11 2023 +0100"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 17:46:11 2023 +0100"
      },
      "message": "Use proper json encoding for new API methods\n\nChange-Id: I3a7ee7168b196fbbd7e38b09b67d10994dda3568\n"
    },
    {
      "commit": "dea505eff0bc11e843176c91e056200959d049c0",
      "tree": "0d6d4e7a7d996148847b38bd4f14fb1e9308fb40",
      "parents": [
        "af708c221f9258049c9032f24c9757792a963783"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 11:42:36 2023 +0100"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 11:42:36 2023 +0100"
      },
      "message": "Add getModelName\n\nChange-Id: I07a7e1db71eb522237721700c444d6873c81f5c0\n"
    },
    {
      "commit": "af708c221f9258049c9032f24c9757792a963783",
      "tree": "6b723e9da77c340dff17220a3028ca5a32657516",
      "parents": [
        "a546b1e3fbf25ec59f77b2d46c4146d183c4cd53"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 11:20:20 2023 +0100"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Nov 05 11:28:03 2023 +0100"
      },
      "message": "Add getVersion\n\nChange-Id: Iddace1378a02dac8ee5ce4ab717689a319758387\n"
    },
    {
      "commit": "c82b15fd22b3aabe7a59c41a8ced2d0d66de502f",
      "tree": "c7536dc9137d2a9914c5913e244d5c66475b759c",
      "parents": [
        "89cb6bc0ca2cbed8209da15d8bb8ce36aefc84c4"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Jul 19 17:36:27 2022 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Jul 19 17:36:27 2022 +0200"
      },
      "message": "Revive -d option to dump vecs as ascii file\n\nChange-Id: Ib78b6ad00af74aaf410544f8c872ac6cf67e90e8\n"
    },
    {
      "commit": "3e3e3262f2394d438e01a566f836da7cf41a20d0",
      "tree": "071bd699045e36303ce351129ae6501bcc491a59",
      "parents": [
        "9a7996a7231b44600efdd851873e45eb38554c3b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Apr 12 23:11:45 2022 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Apr 13 11:15:49 2022 +0200"
      },
      "message": "Add example data and tests\n\nChange-Id: Ife7b03d33607ec6c27da39b783e66e28f6496bbc\n"
    }
  ]
}
