Le flux GEUL est une sequence de paquets delimitee par des Meta Nodes de debut et de fin, constituant un document GEUL complet.

Caracteristiques principales

  • Limites explicites : STREAM_START / STREAM_END (Meta Node)
  • Portee des TID : Valides uniquement au sein du flux
  • Reference en avant : Seuls les TID deja declares peuvent etre references
  • Big Endian : Network Byte Order

Structure du flux

┌─────────────────────────────────────┐
│          STREAM_START               │  ← Obligatoire (Meta Node)
│          (declaration largeur TID)  │     0xC000 (TID 16 bits)
├─────────────────────────────────────┤
│          Metadonnees (optionnel)    │
│          - VERSION    (0xC014)      │
│          - CREATED_AT (0xC008)      │
│          - CREATOR    (0xC010)      │
├─────────────────────────────────────┤
│          Paquets du corps           │
│          - Entity Node              │
│          - Quantity Node            │
│          - Verb Edge                │
│          - Triple Edge              │
│          - Event6 Edge              │
│          - Clause Edge              │
│          - Context Edge             │
│          - Group Edge               │
│          - Faber Edge               │
├─────────────────────────────────────┤
│          STREAM_END                 │  ← Optionnel (recommande)
└─────────────────────────────────────┘

Le flux minimal est STREAM_START (1 mot) + STREAM_END (1 mot) = 2 mots (4 octets), et meme un flux vide est valide.

Principes d’attribution des TID

RegleDescription
ObligatoireChaque Edge/Node du flux possede un TID
UniciteLe TID est unique au sein du flux
PorteeLe TID n’est valide que dans son flux
En avantSeuls les TID deja declares au moment de la reference peuvent etre references

Position du TID

TypePosition du TIDPosition des references
Meta NodeAucuneAucune
Entity NodeDernier motAucune
Quantity NodeDernier motAucune
Tiny Verb EdgeAucuneAucune (inline)
Verb EdgeZone d’en-teteApres le payload
Triple EdgeZone d’en-teteApres le payload
Event6 EdgeZone d’en-teteApres le payload
Clause EdgeZone d’en-teteApres le payload
Context EdgeZone d’en-teteApres le payload
Group Edge2e mot3e mot et suivants

Les Nodes ne definissent qu’eux-memes, donc le TID est en fin ; les Edges referencent d’autres TID, donc le TID precede les references.

TID reserves

TIDUsage
0x0000Marqueur de fin (Group Edge etc.)
0xFFFFReserve (base 16 bits)

Regles d’ordre des paquets

Ordre declaration-reference

Correct :
  [Entity: Jean, TID=0x0001]
  [Entity: Marie, TID=0x0002]
  [Verb Edge: rencontrer, Subject=0x0001, Object=0x0002]

Incorrect :
  [Verb Edge: rencontrer, Subject=0x0001, Object=0x0002]  ← 0x0001 non declare
  [Entity: Jean, TID=0x0001]
  [Entity: Marie, TID=0x0002]

Ordre recommande

1. STREAM_START
2. Metadonnees (VERSION, CREATED_AT, CREATOR)
3. Entity Nodes (declaration des entites)
4. Quantity Nodes (quantites/litteraux)
5. Group Edges (definition des groupes)
6. Tiny Verb Edges (predications inline)
7. Verb Edges (predications generales)
8. Triple Edges (proprietes/relations)
9. Event6 Edges (evenements)
10. Clause Edges (relations discursives)
11. Context Edges (contextes)
12. Faber Edges (code/AST)
13. STREAM_END

Ceci n’est qu’un ordre recommande ; tout placement est libre tant que la regle declaration-reference est respectee.

Interdiction des references circulaires

Les references circulaires de type A → B → A sont impossibles. Quand une relation circulaire est necessaire, elle est exprimee par des Edges separes.

Possible :
  [Entity A, TID=0x0001]
  [Entity B, TID=0x0002]
  [Edge: A→B, TID=0x0003]
  [Edge: B→A, TID=0x0004]

Exemple de flux

“Jean a rencontre Marie”

1. STREAM_START (TID 16 bits)
   0xC0 0x00

2. Entity: Jean (TID=0x0001)
   [Paquet Entity...] 0x00 0x01

3. Entity: Marie (TID=0x0002)
   [Paquet Entity...] 0x00 0x02

4. Verb Edge: meet (TID=0x0100)
   Subject: 0x0001
   Object: 0x0002

5. STREAM_END
   0xC0 0x04

“Jean et Marie se sont rencontres a l’ecole”

1. STREAM_START
   0xC0 0x00

2. Entity: Jean (TID=0x0001)
3. Entity: Marie (TID=0x0002)
4. Entity: Ecole (TID=0x0003)

5. Group Edge: AND (TID=0x0010)
   Membres: 0x0001, 0x0002, 0x0000 (fin)

6. Verb Edge: meet (TID=0x0100)
   Subject: 0x0010 (groupe)
   Location: 0x0003

7. STREAM_END
   0xC0 0x04

Validation du flux

Validations obligatoires

ElementValidation
DebutCommence-t-il par STREAM_START ?
Unicite TIDY a-t-il des TID en double ?
Validite des referencesTous les TID references sont-ils declares ?
En avantLes TID sont-ils declares avant d’etre references ?

Code de validation

def validate_stream(packets: list) -> dict:
    """Validation du flux"""
    errors = []
    declared_tids = set()

    # Validation du debut
    if not packets or packets[0].type != "STREAM_START":
        errors.append("Le flux ne commence pas par STREAM_START")

    for packet in packets:
        # Validation de l'unicite TID
        if packet.tid is not None:
            if packet.tid in declared_tids:
                errors.append(f"TID en double: {packet.tid}")
            declared_tids.add(packet.tid)

        # Validation des references
        for ref_tid in packet.references:
            if ref_tid not in declared_tids:
                errors.append(f"Reference a un TID non declare: {ref_tid}")

    return {
        "valid": len(errors) == 0,
        "errors": errors,
        "tid_count": len(declared_tids)
    }

Flux multiples

Chaque flux est independant et la portee des TID est separee par flux. TID=0x0001 dans le flux A et TID=0x0001 dans le flux B designent des entites differentes.

Les references inter-flux (Cross-reference) ne sont actuellement pas supportees et pourront etre etendues a l’avenir par l’introduction d’identifiants de flux et de mecanismes Import/Export.