---
# System prepended metadata

title: Übergeordnetes Ziel

---

# Übergeordnetes Ziel
- Unsere TDA basierte Featureextraktion erzielt vergleichsweise hervorragende Ergebnisse
- Hauptbeispiel: IT Sicherheit
- Weitere Beispiele sollen folgen
- Am Horizont: Mind eine Arbeit in einem Journal die zeigt, dass wir in verschiedenen Bereichen sehr gut abschneiden

# Cyber
- Ziel 1: Privatsphäreschonende Erkennung von Fakenewskampagnen in sozialen Netzwerken
  - State of the Art-Verfahren reichern Soziale Netzwerke mit halböffentlichen, privaten Metadaten an um Kampagnen zu erkennen.
  - Topologische Strukturen des Netzwerks werden dabei nicht ausschöpfend betrachtet / studiert.
- Ziel 2: Erkennung von Angriff auf Vertrauensnetzwerke bei der verteilten Softwareentwicklung insbesondere bei Software Supply Chains
  - State of the Art bewerten oft nur einzelne Softwarekomponenten.
  - Gesamtheit des Ökosystems sowie die Relationen im Entwicklungsnetzwerk bleiben unbeachtet.
  - Die topologische Strukturen des Ökosystems (inkl. zeitlichem Verlauf / Versionsverlauf) sollen genutzt werden, um bestehende Erkennungsansätze zu ergänzen / verbessern.
- Ziel 3: Angriffserkennung auf homogenen Geräten
  - Kombination von Change Drift und topologischer Datenanalyse
  - Mögliche Anwendungen: IOT-Geräte in kritischen Infrastrukturen / Microservices z.B. buchbare Shotsysteme aka Shopify
  - Change Drift: Mengen homogener Geräte erlauben Angriffserkennung auf Basis von abweichendem Verhalten
  - Topologische Datenanalyse: Die Betrachtung der topologischen Strukturen von konsekutiven Gerätezuständen ermöglicht informationserhaltende Repräsentation des Geräteverhaltens auf höherem Niveau als es Standardmethoden ermöglichen
- Ziel 4: Topologische Datenanalyse als Brückentechnologie verwenden, um neue Ansätze aus der Bilderkennung auf "rein numerischen, tabellenartigen" Daten anwenden zu können
  - Bildklassifikationsverfahren nutzen aus, dass die zugrunde liegenden Daten eine "Struktur" haben. Daten, die durch Geräte- oder Netzwerkmonitoring entstehen, enthalten auf den ersten Blick nicht ausreichend erkennbare Struktur.
  - Die "intrinstisch" Struktur wird mit topologischer Datenanalyse extrahiert und dient somit als universelle Brückentechnologie für besagte Bildklassifikationsverfahren

# Orgadinge
Daten / Paper teilen: [Sciebo](https://uni-bonn.sciebo.de/s/Jflw229mKCwmqdz)
Datensets:
- [Stanford Snap](https://snap.stanford.edu/data/)
- [Bot Repository](https://botometer.osome.iu.edu/bot-repository/datasets.html)

# Roter Faden
- TDA um (noch ungenutzte) interne Struktur kompakter darzustellen / für darauf aufbauende Berechnungen vorzubereiten
- Fokus **Feature Extraktion** um möglichst breites Interesse zu generieren; TDA in ML ist für Experten in dem ML-Gebiet spannend, aber ggf. nicht für "Generelle Leute die Datenverarbeitung machen".
- Bei Graphen / Netzwerken (typisch Sybil oder generell 1-Skelet von Metr Raum) verwenden Verfahren einen nicht ausschöpfenden Teil der Struktur dieses Netzes (Sybil-Erkennung oder nur Kanten (=Abstände)) Um *die Qualität* zu erhöhen verwenden manche Authoren *mehr Metainfo* (z.B. um die vorliegenden Graphen zu verfeinern); Wir zeigen, dass man mit TDA bereits vorliegende Struktur nutzen kann um *die Qualität* zu erhöhen. Die **Schlussfolgerung** ist dass wir einen alternativen, rein strukturbasierten, Ansatz haben um *die Qualität* zu erhöhen.


# Übergeordnete Fragen die wiederkehren
## Sampling
- Wie gut sind unsere / andere Methoden mit Sampling verträglich?
    - Ggf. als formalisierte Frage spannend für AG Driemel.

# Sybil

## TODO
- [x] Nochmal Labmotivation für TDA lesen und entscheiden was sinnvoll ist
- [x] Anzahl der Experimente festhalten
- [x] Pipeline Statistiken in DB schreiben
    - [x] Pipeline als RESTful Mikroservices
- [x] Pipeline muss mit großer Anzahl (10kk+) Eingabedateien um gehen könen 
- [x] Abgrenzung
- [x] Research Questions formulieren
    - [x] Bleiben wir bei Original-Ansatz
    - [x] Datensets auswählen (motivieren)
        - State Of The Art + Breit
    - [x] Vergleichsmethoden auswählen (motivieren)
        - Evaluation gegen mindestens jeweils ein Verfahren
        - State Of The Art + Breit
            - Nur strukturbasiert oder allgemein (sehr unterschiedliche Datensets)?
- [x] Festlegen welche Experimente durchgeführt werden müssen
    - [x] Pipeline + Kubernetes dafür anpassen 
    - [x] Einrichten der Vergleichsmethoden
- [x] Welche Teil vom Lab übernehmen; was neu?
    - [x] TDA als Werkzeug hervorheben
- [x] Twibot-22 Aufbereitung
    - [x] Extraction von Egonetzen
    - [x] Precompute and save PH
- [x] Twitter 2012
    - [x] Sampling Subnetz
    - [x] Extraktion von Egonetzen
    - [x] Precompute and save PH
- [x] Facebook
- [x] Pipeline
    - [x] Umstellung auf Adjacency Matrizen
        - [x] Anpassung Notation
    - [x] Einlesen von spärlichen Matrizen aus .npz Archiven
    - [x] Konsequentes Arbeiten mit spärlichen Matrizen
    - [x] Optimierung von PH Berechnung
    - [x] Direktes Einlesen von PH Diagrammen
- [x] Graph Mining SotA
- [x] Mit welchen Methoden klassifizieren wir?
    - Erstmal alles, was die Pipeline hergibt, eventuell später mehr
- [x] Wie berechne ich die Ego-Netze ohne mein Notebook neu aufzusetzen
- [x] Decide on conferences —> determines length of paper
    - [x] Otherway around -> Decide on length of paper based on experiments and find fitting conference
- [x] Pairwise Distance possible for anything larger than 1-hop networks?

## Ziele
### KW43/44 (Hauptpunkt: Kleine Egonetze)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Vergleich Performanz TDA zu statistischen Features
    - [x] Auswahl der Methoden
        - num_nodes
        - num_edges
        - avg_degree
        - avg_clustering_coefficient
        - avg_eigenvector_centrality
        - avg_harmonic_centrality
        - avg_pagerank
        - edge_connectivity
        - avg_num_triangles
        - avg_local_clustering_coefficient
        - avg_square_clustering_coefficient
        - transitivity
        - avg_current_flow_closeness_centrality
    - [x] Implementieren Skript Feature Extraction (potenziell in die Pipeline integrieren)
        - [x] LZ ist selbst reduziert sehr hoch --> Sampling
    - [x] Experimente 
- [x] Evaluation Codebooks
- [x] Netzwerkgröße als zusätzliches Feature in Datensatz (binär: minmal 0/1, nicht genutzt in Evaluation)
    - [x] Irgendwie temporär in die Pipeline an der TDAFE Stelle reinbasteln
    - [x] Vorberechnen
    - [x] Evaluation
        - [x] Histogram mit Prediction
        - [x] Histogram mit Label
        - [x] Jupyter reparieren
- [x] Klassifikation ohne minimalen Netze
    - [x] Docker Images anpassen
    - [x] Prune Ego-Netze
    - [x] Mit Random Forest einmal komplett durchlaufen
- [x] Investigation: Korrelation zwischen Knoten-ID und Größe des Ego-Netzes
    - [x] Nicht gegeben (Korrelation: 0.062138)
- [x] Investigation: Skript: Inbs. Warum wachsen minimale Netze nicht bei größerer Hop-Distanz
    - [x] Compute Ego Script
        - **Wichtig:** Ich nutze eine etwas erweiterte Form (dank Lab) -> wir entdecken Knoten nur mit der gegebenen Sprungweite, Kanten finden wir auch darüber hinaus, aber nur zwischen den entdeckten Knoten
        - [x] Code Review
        - [x] Konstruktion + Test synthetisches Beispielnetz
            - [x] Figure out Node-File Layout
            - [x] 1-Hop Netze sind korrekt
            - [x] 2-Hop Netze sind korrekt
    - [x] Compute Node Files Script
        - [x] Code Review
        - [x] Test synthetisches Beispielnetz
        - Verwirft den Knoten mit der höchsten ID, aber ansonsten korrekt
    - [x] Compute Node List Script
        - [x] Code Review
        - [x] Test synthetisches Beispielnetz
        - Sampling Error und zwei Zeilen nutzloser Code, aber nichts was die Egonetze beeinflussen sollte
- [x] Investigation: 50% minimale Netze aber besser arbeitende Klassifizierer ereichen haben nur 25% FP
    - [x] Sind alle Netze mit minimaler Größe auch wirklich minimal? -> Ja
    - [x] 4-fach Kreuzvalidierung mit Durchschnitt am Ende? -> Sieht so aus (mit 5x sind es 20% ...)
- [ ] RESTful Pipeline V1
    - [ ] PV + Stateful (Matthias)
    - [x] Fileserver (Artifact Handling)
        - [x] MongoDB aufsetzen
            - [x] Statefulset, Service etc.
        - [x] Implementieren
        - [x] Docker Image
        - [x] Kubernetes Service, Deployment etc.
    - [ ] Ingest (Verabeitung der Jobs)
        - [ ] Implementieren
            - [x] Ersatz meiner Logik für JSON passing
            - [x] Einführung von Endpunkten um Statusmeldungen auszulesen
            - [x] Methode um neue Daten an den Server zu übergeben
                - [ ] Potentiell sehr groß
                - [x] Potentiell sehr viele
                    -> Als ZIP
            - [x] Methode um neue Session (oder Generator) zu übergeben
            - [x] Wie mit Logging umgehen?
            - [x] Automatische Anpassung der Datenset Pfade
                - [x] An welchen Stellen der Pipeline können sie alles referenziert werden?
                - [x] An welchen Stellen des Server referenziere ich sie?
                    - Eingabe, Separate Test Data Einlese, Ergebnisse. In den ersten beiden Fällen kann es auch eine Liste von Dateinamen sein. für Ergebnisse muss ich meinen Namensgenerator beachten
                - [x] Nicht nur für Training, sondern auch für Modelle
                    - [x] Wie genau passt das überhaupt in das neue Konzept, da sie ja quergeladen werden ...
            - [x] Alle Checks (z.B. existieren alle nötigen Daten) umschreiben und anpassen
            - [x] Unique Group and Job IDS generieren und verwalten
                - [x] Handle existing sessions
                - [x] Wie allgemein mit Generatoren umgehen (auch im Bezug auf DB)
            - [x] DB Interaktion
                - [x] Wie Auth?
                    - [x] Ohne und einfach in Kubernetes limitiert
                - [x] Write to DB
                    - [x] Zwischen Sessions und Generatoren differenzieren
                    - [x] Unique Index
                - [x] Clean-up
                    - [x] Rein manuell momentan?
        - [x] Docker Image
        - [x] Kubernetes Service, Deployment etc.
        - [x] Enforce uniqueness of filenames after ZIP extraction
        - [x] TEST
            - [x] Ingest (Session, Data, Test, ZIP)
                - [x] Art von Race Condition bei Ingest von ZIP Files (Watchdog ist noch am Hashen der entpackten Dateien wenn diese an ihren Bestimmungsort bewegt werden)
            - [x] Status
            - [x] Pipeline Endpoint
            - [x] Generator
                - [x] Fix naming issues (instead based on UIDs?)
                - [x] Nach DB Anpassungen nicht mehr funktionstüchtig
            - [x] DB
                - [x] Spezifisch ob in allen Szenarien mit der UID richtig umgegangen wird
                    - [x] Fails if directly copied into directory, while server is running (wird als session interpretiert und entsprechend in die DB geschrieben)
                - [x] G_UUID wird nicht gesetzt
 
</details>

### KW43/44 (Hauptpunkt: Ergebnisse Twibot)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Twibot22 Experimente laufen lassen
    - [x] katastrophale Laufzeiten
- [ ] MWE Kubernetes Repo
- [x] REST fertig (Prio!)
    - [x] Dokumentation mit Bild
        - [x] UML, leicht anpassbar
            - [x] SVG, draw.io
        - [x] README
    - [x] Kommentare setzen
    - [ ] Persistent Volume
    - [x] Ingest 
        - [x] Rückgabetypen werden in SwaggerUI nicht korrekt angezeigt
    - [x] Pipeline
        - [x] Implementieren (insb. load, save und Statistics sind stark betroffen)
            - [x] Load
            - [x] Save
                - [x] Mit Zwischenschritt, auswerten und rumkopieren oder besser direkt pipelinegui.py anpassen
                - [x] Location is wrong
                - [x] Not everything necessary is packed
                - [x] Minimal
                - [x] Cleanup
            - [x] Stats
                - [x] Wie werden die momentan in der Pipeline verarbeitet / Wie komme ich an die dran
                - [x] Wie mit dem Groups umgehen?
            - [x] Neuen Einstiegspunkt schreiben (PipelineGUI Skript Version anpassen)
                - [x] Vorangestellter Wrapper, der sich um alles REST kümmert und dann an Pipelinegui weitergibt
                - [x] Wie wissen wir eigentlich die Endpoints der entsprechenden Services?
                - [x] Braucht Zugriff auf die Mind, da er auch Daten und Artefakte schreiben soll
                    - [x] Neue Routine innerhalb der Pipeline selber
                    - [x] Am sinnvollsten eigentlich nicht nur Modelle sondern auch Ergebnisse gepackt als Artefakt zu nutzen 
        - [x] Docker Image
        - [x] Kubernetes Service, Deployment etc.
        - [x] GUI entfernen
        - [x] Testset Path Replacement Error -> when empty
        - [x] Kommentieren
    - [x] Stats
        - [x] Endpoint für die Statistics Collection der DB implementieren
            - [x] Kommentieren
        - [x] Docker
        - [x] Fix get None 
    - [x] Artifacts
        - [x] Artifact Fileserver implementieren
            - [x] Wo residieren die Artifakte
            - [x] Übertragung von den Artifakten, oder geteilter Speicher? -> nur mit minimal sprich ohne dataset
            - [x] DB UUID: Path
            - [x] Status Codes
        - [x] Docker
        - [x] Kommentieren
        - [x] Test
    - [x] Ingest
        - [x] Update Session/Data
        - [x] Delete Session/Data
        - [x] Get singular session files
    - [x] NFS
        - [x] Setup Service
        - [x] Persistent Volume
        - [x] Test lokal
    - [ ] Reverse Proxy -> Ich will die ganzen Services nach außen hin aggregieren
    - [x] Check minimal saving
    - [x] Skript um mit dem Ganzen zu interagieren
        - [ ] Nicht wirklich nötig, aber Skript zur Visualisierung ist wichtig
    - [x] Wie komme ich aus Kubenetes raus?
        - [ ] Raus habe ich bereits ein Routine für (s. mein ursprüngliches Fileserver Skript), interessanter ist wie ich reinkomme
    - [x] Exceptions
    - [x] Wie handle ich BackUps der Datenbank?
        - [x] Regular Volume Snapshots
    - [x] Database needs a wrapper Service
        - [x] Nein, mehrere. Ingest ist ein Art Wrapper, so ist Artifacts und Statistics (entsprechend alle für die 3 Hauptsammlungen)
- [x] Full Test
- [x] Skizze Begründung, warum nur Large Networks
- [x] Vergleichsmethoden implementieren
- [x] Result directory should not be shared!
    - [x] Patch out -> einfach result path im ingest auf lokalen result ordner
- [x] Tool Namen ausdenken
- [x] Pipeline umziehen lassen
- [x] Fix Auto-Naming
- [x] What happens on service interrupts?
- [x] Wie Experimente durchführen mit der Laufzeit?
    - [x] Sampling
        - [x] Skript
        - [x] Testen
    - [x] Performance massively worse after sampling
    - [x] Das kann doch alles nicht sein mit der LZ, was läuft da falsch
        - [x] Test lokal Docker -> Läuft alles wie es soll
        - [x] Build Debug Image
        - [x] Debug Kubernetes
        - [x] Passiert nur, wenn Pipeline nicht automatisch gestartet wird
            - [x] Why tf is it hanging on data transmission??? -> remove
        - [x] Run again (try on full)
            - [x] Build new docker image (remember "fixed" script)
- [x] Evaluation
    - [x] nur ~32k bidirektionale Kanten
- [x] Wie mit Teilen der Pipeline umgehen die momentan nur in der GUI laufen, da Sie Rückmeldung benötigen
- [x] Umzug fertigstellen
- [x] Setup Registry Fat Data + CI
- [x] READMEs schreiben + Pipeline README anpassen

</details>
    
### KW44/45 (Hauptpunkt: Twitter2014 Aufbereiten und Evaluation)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [ ] Kubernetes muss laufen
- [x] Issues migrieren
- [x] Registry + CI
    - [x] Registry + Build Base anpassen
    - [x] Felix Docker Runner
    - [x] Registry Pfade überall anpassen
    - [x] Anpassen (ist nicht mehr PipelineGUI)
- [ ] READEMEs schreiben
- [ ] What happens on service interupt?
- [ ] Vergleichsmethoden implementieren (Mit Felix nochmal über Auswahl sprechen)
- [ ] Mit welchen Kriterien lösche ich alte Artifacte/DB Einträge
    - [ ] Spezifisch welche Time/Space Schwellwerte
- [x] NGINX
    - [x] How to pass path_parameter?
    - [x] Multiple locations error
    - [x] How to pass query parameter?
    - [x] How to correctly display SwaggerUI
        - [x] Erwartet eine Openapi.json im Root Path
            - [x] Wie separiere ich das auf Basis der Services (oder kann ich die kombinieren?)
        - [x] Wie erhalte ich die generelle Funktionalität der Doku?
    - [x] Set parent path for ingest
        - [x] Grafik anpassen
- [x] Docker-Compose
- [x] Docker MWE
- [x] The Pipeline just starts running -> Was genau wird da berechnet
    - [x] Pipeline muss auf neuen Ingest angepasst werden
    - [x] Die .gitkeep wird als session interpretiert ...
- [x] Pipeline Wrapper Service
    - [x] Klar definieren, was Aufbau + Aufgaben
    - [x] Handle missing test-/trainingdata
        - [x] Wie reporten wir sowas an den User?
        - [x] Muss ein Endpoint irgendwo existieren, über den wir das abgreifen könn
- [x] Pod Spawning
- [x] Pipeline bestimmt Layout der Anfragen an die verschiedenen Schritte
    - [x] Von Dictionaries auf Pydantic Modelle wechseln
        - [x] Wie mit Namen umgehen? -> sollte sich an json orientieren und entsprechend and der Mind
            - [x] Wie möchte ich das zurückgeben? Ich brauch irgendwie auch das Mapping zwischen Namen und eigentlichem Wert
            - [x] Wie spielt das dann vernünftig mit dem Rest der Pipeline zusammen? 
        - [x] Loader
        - [x] Filter
- [x] Twitter2012 Datenaufbereitung
    - [x] Berechnunng der Knoten etc. für directed Edges
    - [x] Ego Netze berechnen
        - [x] Ego 1
        - [x] Ego 2
            - [x] Laufzeit technisch machbar/sinnvoll? -> Ja aber teilweise Ego-Netze mit über 2kk Knoten, dass macht für weiteren Schritte keinen Sinn
    - [x] Persistenzdiagramme berechnen ~ 10h
        - [x] Reverse Engineering des Formats das ich damals für PDs gewählt habe
        - [x] In neues Format umwandeln
    - [x] Persistence Codebooks läuft auf den neuen Daten nicht
    - [x] 1. Untersuchung des Datensets auf Anomalien wie in Twibot gefunden
        - [x] Hierfür Datenaufbereitung auf 1% Sample
        - [x] Wachsen Ego-Netze wie sie sollen?
        - [x] Wie ist die Verteilung minimal zu normal  ~8% Minimal
            - 1-Hop:
                - Alle Minimal im Sample
                    - [x] Wie ist die Verteilung der Größe der Knotendateien?
                        - [x] Großteil nah an minimal
            -> Directed wie in meinem Lab
        - [x] Wie ist die Korrelation zwischen Größe und Label?
        - [x] Label Distribution for minimal Networks (98% normal, 2% sybil)
        - [x] Macht es Sinn auf gerichteten statt nur bidirektionalen Kanten zu arbeiten
    - [x] Ist 1% ein zu großes Sample für MLP etc.?
- [ ] Storage Management + Email Notification
- [x] Backup Sessions müllen Root-Dir zu
- [x] nginx ingest dataset 404
- [x] Fix Visualization

</details>
    
### KW 45/46 (Hauptpunkt: Experimentieren + Pipeline Service)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Test Performance einfache Features + Decision Tree
    - [x] Die Ego-Netze des Labs liegen als Distanz- anstelle von Adjacency-Matrizen vor
    - [x] Umwandeln
    - [x] Sind die Features einfach genug? 
        ```
        Time number of nodes: 3.337860107421875e-06
        Time number of edges: 0.0002067089080810547
        Time average degree: 0.0002536773681640625
        Time average clustering coefficient: 0.02041172981262207
        Time average eigenvector centrality: 0.07605719566345215
        Time average harmonic centrality: 0.31018853187561035
        Time average pagerank: 0.004741191864013672
        Time average number of triangles: 0.020103931427001953
        Time average local clustering coefficient: 0.02031087875366211
        Time transitivity: 0.020301103591918945
        ```
        ![](http://i.epvpimg.com/SYj5bab.png)
    - [x] Decision Tree
        ![](http://i.epvpimg.com/v1Kaaab.png)
        ![](http://i.epvpimg.com/ltFtbab.png)
        ![](http://i.epvpimg.com/rCCMdab.png)
    - [x] Random Forest
        ![](http://i.epvpimg.com/gE81bab.png)
        ![](http://i.epvpimg.com/aikUdab.png)
- [x] Pipeline Service
    - [x] Grundstruktur 
        - [x] Jeder Pipeline-Pod meldet sich bei dem Service mit seiner IP und ID an
        - [x] Soll ich Statusinfo in DB speichern, oder müllt das einfach nur zu und ich speichere nur Fehler
        - [x] Service ist Variante der Standard-Pipeline, die über einen CL-Parameter mitgeteilt bekommt im passiven Modus zu laufen -> Somit haben wir dann auch Zugriff auf all die relevanten Information über den Aufbau der Pipeline und die akzeptierten Methoden --> Insbesondere relevant für den interaktiven Modus
            - [x] Wie genau sehen die interaktiven Pods aus? -> Wichtiger, wie werden sie zugewiesen (gar nicht, passive Pods agieren als proxy Service, der entweder dynamisch neue Interaktive spawnt oder auf den Standard-Pods, falls gerade frei ist ausführt)
            - [x] Wie mache ich das mit FastAPI?
            - [x] Fix nginx
            - [x] Wo/Wie/Was speichere ich die Informationen
            - [x] Komische Fehler nach Switch der Registry zu Database
                - [x] Auf einmal jeder Service bis auf Ingest kaputt mit unterschiedlichsten Fehlern
                    - [x] Statistics GET docs: method not allowed
                    - [x] Artifacts attempts to download non existing artifact, when accessing the docs
                    - [x] Pipeline Service leads to connection refused error
                        - [x] nginx
            - [x] Registry Rückgabe ist leer  -> DB ebenfalls  -> Register 422
        - [x] Pipeline-Pods haben einen extra handler Process, der immer direkt vom P-Service ansprechbar ist und jetzt in der Grundstruktur nur abrufen der Statusinformationen zulässt
            - [x] Wie setze ich das um?
            - [x] Update Docker, nginx, etc. 
            - [x] Run as Daemon
            - [x] Wie handle ich *n* pods?
    - [x] Wie mache ich das mit der Dummy Pipeline. Brauche ich die wirklich?
- [x] Pipeline Interactive
    - [x] Wie setze ich das Pfadweise am besten um
- [x] Fix Version Libs
- [x] Buildbase neu
    - [x] ThunderSVM wehrt sich
    - [x] Update Image neues Ubuntu + Module
    - [x] Python 3.10 Typing Union
    - [x] Registry Auth Problem
        - [x] kann nicht mit '-' in url umgehen
    - [x] Push Ingest Image etc
        - [x] Token somehow only valid for pipeline repo..
    - [x] Update Docker Compose
    - [x] Update yaml
    - [x] Update ci.yaml
- [x] Über NFS, ansonsten lokal
- [x] 404 Data Upload nginx
    - [x] Pfad ist richtig gesetzt, muss irgendwie mit nginx zusammenhängen
    - [x] Die Weiterleitung der openapi.json schein die Probleme auszulösen
- [x] Merkwürdige Cluster
    ![](http://i.epvpimg.com/rwyndab.png)
- [ ] Unittests services
- [ ] Fileserver aus Doku raus
- [ ] MWE anpassen
- [ ] RM Kubernetes Unittests
- [x] Exploring Results
    - Mixed
        | Classifier | TDA       | Preprocessing     | Feature Extraction/Weighting | MCC   |
        | ---------- | --------- | ----------------- | ---------------------------- | ----- |
        | SVM        | DQ        | Robust Scaling    | -                            | 0.542 |
        | LinSVM     | Binning   | -                 | PCA                          | 0.555 |
        | RF         | Binning   | Robust Scaling    | -                            | 0.481 |
        | MLP        | Codebooks | Normalize by Mean | Mutual Information           | 0.570 |
    - Best CM:
        ![MLP](http://i.epvpimg.com/R94Idab.png)
    - Clear clustering for all classifiers (i.e. there are a few parameter/method changes that lead to significant changes, whith the others affecting performance only marginally)
        ![MLP](http://i.epvpimg.com/cAOLcab.png)
- [x] Directed Twitter
    - [x] Nehme ich überhaupt die bidirektionalen Kanten, oder habe ich das falsch im Kopf?
        - [x] Check by sample
    - [x] Mit Felix durchsprechen
        ```
        395385: Returning edges: 100.00% (failure rate: 0.00%)
		12306741: Returning edges: 23.30% (failure rate: 56.31%)
		24429902: Returning edges: 16.67% (failure rate: 83.33%)
		17376500: Returning edges: 0.00% (failure rate: 75.00%)
		6688935: Returning edges: 38.65% (failure rate: 50.72%)
		10585112: Returning edges: 10.00% (failure rate: 70.00%)
		5657269: Returning edges: 9.09% (failure rate: 45.45%)
		22093963: Returning edges: 14.29% (failure rate: 42.86%)
		39498133: Returning edges: 100.00% (failure rate: 0.00%)
		9294740: Returning edges: 0.00% (failure rate: 100.00%)
		10642011: Returning edges: 35.29% (failure rate: 17.65%)
        ```

</details>
    
### KW 47/48 (Hauptpunkt: Statistische Features + Pipeline Service)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Mind etc. sollte eigentlich komplett umstrukturiert werden, aber wie?
- [x] Fix Naming Results Model-Parameter
    - [x] Umbenennung läuft auch im Service falsch
        - [x] Will ich das da überhaupt, ne ist egal, läuft ja sowieso über Datenbank
    - [x] Wie/Wo genau nehme ich die vor?
- [x] Nichts directed, nur bescheidene Doku...
    - [x] Neu berechnen
    - [x] Directed nicht einfach möglich, weil keine Symmetrie mehr
    - [x] Experimente durchlaufen lassen
    - [x] Directed scheint zu anspruchsvoll für Hardware
- [x] Neue Graphen Definition:
    - [x] Wie mit leeren Graphen umgehen (i.e. keine Kanten zurück)  --> loops
    - [x] Berechnen
    - [x] Mit Loops zu groß um in den Arbeitsspeicher bei der PH-Berechnung zu laden --> Skript schreiben zur Berechnung
        - [x] Passt das größte überhaupt jemals in den RAM?  --> Ja 20gb
        - [x] Wie stehts um die Laufzeit? --> Katastrophal  (abgebrochen nach über 2h Stunden für einzelnes Netz)
        - [x] Wie sehen eigentlich die CC aus?
        ![](http://i.epvpimg.com/b8NZaab.png)
        - [x] Try removing self loops in pipeline  -> Schwierig, ohne in dichtbesetzte Matrix zu Überführen
        - [x] Warum läd das eigentlich so lange? Sollte doch eigentlich nicht so eine große Differenz zu den anderen Egonetz-Aufbau haben
            - [x] Check runtime again with the other egonetworks  --> Geht nicht, habe ja die vorberechneten vom Lab genommen (insb. damals mit GPU gearbeitet)
            - [x] Ripser++ wieder ans laufen
            - [x] Überführen zu giotto-ph
                - [x] Auch damit sehr langsam, muss ich aber glaube ich einfach durc (habe ursprünglich auch während des labs sehr lange die PH berechnen lasssen)  -> Kann ich das irgendwie weiter optimieren oder parallelisieren?
        
- [x] Statistische Features definieren
    - [x] Berechnen
        ```
        numpy.core._exceptions._ArrayMemoryError: Unable to allocate 225. GiB         for an array with shape (173817, 173816) and data type int64
        ```
        -> Load Sparse
    - [x] Alles ziemliche Katastrophe (insb. Laufzeit Tradeoff (Faktor 10)) -> min. 30Tage für die Berechnung
        - [x] Welcher Schritt genau braucht so lange?
        - [x] Umweg über pandas? -> nein
        - [x] Umweg über csc? -> nein
- [x] Pipeline Service
    - [x] Dicts
    - [x] nginx proxy troubles
    - [x] I set/define parameters at parts deep within the pipeline, or have entire seconday pipelines... How do I handle this?
    - [x] What do I serve at each step?
    - [x] Apply NLP
    - [x] Als JSON auslagern
    - [x] Webservice
        - [x] Figure out all of the html stuff
            - [x] Was gibt es da überhaupt
            - [ ] How do I retrieve Information?
        - [x] Für Weiterentwicklung in docker-compose und nginx einbauen
        - [x] Delete Cookie once we leave the website
- [x] Persistenz Parallel Kubernetes
    - [x] Implementieren
    - [x] Spezielle Images erstellen
    - [x] Jobs erstellen + Testen
        - [x] Repair Persistence Calculation
        - [x] Rebuild everything
            - [x] Include tmp etc. in images
            - [x] Formatwechsel --> Können alle FE damit umgehen?
                - [x] Nein -> Anpassen
        - [x] Einlese Fehler wenn nur Ordner übergeben wird
    - [x] Daten aufteilen
        - [x] Test run with small batch
    - [x] Berechnen
- [x] Statistik Berechnung noch für ca eine Woche am laufen
    - [x] Parallelisieren

</details> 

### KW 48/49 (Hauptpunkt: Experimente fertig)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Die Länge der Berechnung der statistischen Features der Ego-Netze ist nur schwach mit deren Größe korreliert --> Aussortieren schwierig
    - [x] Laufzeit überwachen (für einzel Statistiken!)
- [x] Korrelation Connected Components berechnen
    ![](http://i.epvpimg.com/8v4Raab.png)
    - Korrelation mit 0.00068 nicht gegeben
- [ ] Experimente:
    - [x] Durchlaufen:
        - [x] Statistik
            - [ ] Nur einfache
                - [x] Ein paar der Experimente sind nicht korrekt gelaufen  -> PCA
                    - [x] Natürlich nicht lokal reproduzierbar...  -> Bricht während PCA Berechnung ab (PCA erstellt neue features) 
        - [x] TDA
    - [x] Grobe Betrachtung Ergebnisse
        - Stats:
            | Classifier | Preprocessing     | Feature Extraction/Weighting | MCC   |
            | ---------- | ----------------- | ---------------------------- | ----- |
            | SVM        | Normalize by Mean | -                            | 0.632 |
            | LinSVM     | -                 | PCA                          | 0.334 |
            | RF         | -                 | -                            | 0.689 |
            | MLP        | Robust Scaling    | Mutual Information           | 0.679 |
        - Einfach:
            | Classifier | Preprocessing     | Feature Extraction/Weighting | MCC   |
            | ---------- | ----------------- | ---------------------------- | ----- |
            | SVM        | Standardize       | -                            | 0.511 |
            | LinSVM     | -                 | PCA                          | 0.328 |
            | RF         | Min/Max           | -                            | 0.580 |
            | MLP        | Standardize       | -                            | 0.587 |
        - TDA:
            | Classifier | TDA       | Preprocessing     | Feature Extraction/Weighting | MCC   |
            | ---------- | --------- | ----------------- | ---------------------------- | ----- |
            | SVM        | DQ        | Standardisation   | -                            | 0.639 |
            | LinSVM     | DQ        | Robust Scaling    | -                            | 0.579 |
            | RF         | DQ        | Robust Scaling    | -                            | 0.647 |
            | MLP        | DQ        | Scaling by Mean   | -                            | 0.656 |
        - Lab bidirectional -> distance-based: 0.6875
- [ ] Service Pipeline auf giotto-ph umstellen
- [x] Statistik Experimente schlagen unter Kubernetes alle fehl 
- [x] Pairwise distance between diagrams vorberechnen
    - [x] Skript schreiben
        - [x] The main diagonal must have DIAG type
        - [x] Welche library zum berechnen der Distanzen?
    - [ ] Berechnen
- [x] Service
    - [x] Javascript
        - [x] Subparmas
        - [x] Run
        - [x] Skip Button
        - [x] Anzeige der Subparameter ist buggy (werden in 99% der Fälle, aber nicht immer korrekt gelöscht)
        - [x] Subparameter werden an der falschen Stelle angezeigt
        - [x] Auswahl wird nicht vollständig gespeichert
            - [x] Korrekte Formatierung der Auswahl
            - [x] Why is the selection repopulated?
            - [x] Wie kriege ich die Auswahl zur Eingabe gemappt, sodass ich standard Parameter von Method Parametern unterscheiden kann?
                - [x] Außerdem kriege ich alle Auswahlen der dynamischen zurück
        - [x] Ich kann nicht von JS aus auf Cookies zugreifen, warum?
    - [x] Feature_in_use, weights etc.
    - [x] Rename all to "subparams"
    - [x] Ich will nicht bei jeder Parametereingabe die Seite neue laden, entsprechend Pfade etc. nicht als primäre Navigation (innerhalb des Moduls)
    
</details>


### KW 50/51/52/01 (Hauptpunkt: Statistiken)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] Save Module falsche Anzeigen
- [x] pipeline auf giotto-ph
- [x] Service:
    - [x] Skip no longer works
    - [x] Evaluate Model, Parameter werden nicht mehr korrekt gesetzt
        - [x] Einige fehlen auch
    - [x] Save is missing save location
    - [x] Evaluate apply_weights + save_model missing
    - [x] Remove manual vs clusterbased model training
    - [x] Deadlock while posting session?
        - [x] Durch falsch formatierte Session ausgelöst --> crasht den ingest server (ohne Fehlermeldung?) --> Gruppen
        - [x] Es existiert noch eine weitere Ursache
            - [x] Network + PS-Parameter
                - [x] Vereinheitlichen als Subparams Dict
            - [x] Test-Step
            - [x] Anomaly als method parameter
            - [x] Test-Step als Integer
                - [x] Proper Type Conversion for everything
            - [x] Run no longer works for load_data
    - [x] Loader support für Listen, einzelne Dateien und Ordner
        - [x] Upload files
        - [x] Wie gebe ich das weiter? Umweg über app?
        - [x] Extract name
        - [x] gui design
    - [x] Slider für Testset/Crossvalidation (dynamische auswahl)
    - [X] Überführen des Session in mind.state
        - [X] Will ich jede Interaktion mit dem Webservice als einen State betrachten und entsprechend nach und nach die mind.state aufbauen, oder stattdessen am Ende aufbauen
    - [x] Feature_in_use und weights parameter
        - [x] Wie stelle ich die sinnvoll da? -> nur im interaktiven Modus mit entsprechender Rückmeldung
    - [x] Kompletter Testdurchlauf im Debugmodus
    - [x] Dockerize
    - [x] Kompletter Testdurchlauf als Service
    - [x] NLP
    - [x] FileUpload muss in den Service rein
    - [x] Wie will ich load_data in der GUI handeln? Braucht die Möglichkeit Dateien hochzuladen
    - [x] Vollständiger Test
    - [x] Service Diagram anpassen
    - [x] YAMLs konstruieren
    - [x] NFS
        - [x] Matthias klären
        - [x] NFS Server läuft nicht länger
            - [X] Fails only under Kubernetes
            - [X] Build own server -> abandoned, strange issues
            - [x] Repair Old Server
                - [X] Entrypoint shell script fails only under kubernetes
                - [X] Repair script
                - [x] Can no longer run new image privileged
                - [x] Failing to read port
                - [x] Connection refused
                - [x] More port issues
                - [x] Test mounting outside
                - [x] More port issues v2
                - [x] Server wehrt sich vehement Logs zu generieren
                - [x] Kubernetes related? -> No
                - [x] Image related? -> No
                - [x] Routing related? -> Yes (though I can ping the server and nmap shows the correct open ports)
                - [x] Extra network
                - [x] Can't push image
                - [x] Fork Github
                - [x] Check services
                - [x] DNS Issue? -> No
                - [x] Apparmor? -> No
                - [x] NFS Problem Node? -> No
                - [x] Check Tcpdump -> Communication appears to be normal
                - [x] Is the Port the issue -> no
                - [x] Directory does not support nfs export
                - [x] How to handle subvolumes
                - [x] First write take ~60s
                    - [x] Timeouts der Skripte müssen eventuell angepasst werden
                - [x] Mount share as volume
                    - [x] DNS problems with service name
                        - [x] Inside pod
                        - [x] Outside pod -> does not work -> fixed service ips
                    - [x] Still does not work for the uni kubernetes cluster -> Matthias
- [x] Entscheidungsbaum
- [X] EDA
    - [x] Shared FP/FN
        - [x] Shuffle Proble
        - [x] Trotzedem under Unterschiede
        - [x] PD und Stats Order aligned?
        - [x] Handle Parallelization
        - [x] Handle timeouts
        - [x] Handle sampling
        - [x] Listdir... Recompute everything 
        - [x] Index mapping
        - [x] Reconstruct pipeline code
        - [x] Error best performers
        - [x] Aufbereiten

- [x] "app" always redirected to https
    
</details>

### KW 2/3 (Hauptpunkte: NFS + EDA Shared FP/FN)

<details>
<summary><b><font size="+1">TODO</font></b></summary>

- [x] NFS
    - [x] Mit Matthias besprechen
        - [x] Why not mountable as volume even though share is mountable from inside a pod
            - [x] IP/Service problem? -> No
            - [x] Does this work for minikube? -> Yes
    - [x] Notlösung implementieren
        - [x] Ins Entryscript
            - [x] Alle Services anpassen
            - [x] Env anpassen
        - [x] Adjust IPs
        - [x] Images neu bauen und pushen
    - [x] Test entire app using minikube
        - [x] Not enough memory
            - [x] Switch disks
                - [x] Permission error when trying to read the iso
    - [x] FastAPI no longer starts -> 60s error
    - [x] Artifact directory not read/writeable
    - [x] ASGI Application Error bei pipeline_api 
- [X] EDA
    - [X] DQ vs Stats vs Codebooks
    - [X] Recompute Shared FP/FN with same models etc (RF 64)
    - [X] Codeblocks Probleme mit Gröé
    - [X] Visualisierungen
    
</details>

### KW 3/4/5 (Hauptpunkte: Referenzalgos + Schreiben)
- [ ] Referenzalgos heraussuchen
    - [x] SybilBelief
        - [x] Implementieren
        - [x] Testen
        - [x] Wie muss unser Datenset angepasst werden? -> Edgelist plus Liste von Trainings- bzw. Testknoten
            - [x] Wie mache ich in dem Zusammenhang Crossvalidation? -> k-mal durchführen und avg. Metriken
        - [x] Wie groß ist deren ursprüngliches Set? ~350k
        - [x] Jede Menge andere Probleme die ich aber gelöscht habe und an die ich mich natürlich auch nicht mehr vollständig erinnere...
            - [x] Find location of error
            - [x] Wir haben 7kk Knoten die keine ausgehenden Kanten haben und als solches vom Belief algorithmus falsch interpretiert werden
                - [x] Warum? -> Arbeitet doch auf bidirektionalen Kanten (erwartet der algorithmus immer 2 Kanten?)
                    - [x] Wie sieht das beim Facebook dataset aus
            - [x] Kann Sybilbelief auch directional -> Modelliert Netzwerk als Markov Random Field -> Nein
            - [x] Wie erzeugen die die rein bidirektionalen Kanten? -> Facebook Freundschaften bidirektional by definition
            - [x] Wie transformieren wir Twitter zu bidirektionalem Netzwerk?
                - [x] Unser Ansatz nicht möglich für ganzes Netzwerk
                - [x] Entweder jede Kante als bidirektional betrachten oder nur die bidirektionalen in Erwägung ziehen
                    - [X] Wir wissen durch vorangegangene Experimente wie stark letztere Methode das Netzwerk fragmentiert -> jede Kante als bidirektional
            - [X] Konversion und Erstellen des neues Datensets
                - [x] Können wir das Netzwerk minimieren?
                    - [x] Ist über Breitensuche aufgebaut, entsprechend existieren eine große Anzahl von Knoten mit nur eingehenden Kanten. Könnten wir diese entfernen?
                        - [x] Nein, Knoten dürften weder unsere Egonetzwerkzentren noch in den entsprechenden Egonetzen vorkommen -> Falls Rechenaufwand nicht zu groß ist einfach mit komplettem Netzwerk arbeiten
            - [X] Node ID Replacement falsch in training und test
            - [x] Jede Menge Index Map Probleme
            - [x] ID Differenz in training
        - [x] Jede Menge Hardware Probleme (Limits)
            - [x] Skripte auf Speichereffizienz optimieren
            - [x] ID Mapping komplett auf C++ umstellen
    - [x] SybilFuse
        - [x] Implementieren
        - [X] Figure out usage
            - [X] Does not need ID mapping
            - [X] Where is the hybrid part?
            - [x] How is the feature extraction done?
            - [x] What is the general approach
                - Assign all edges a weigt of 0.0
                - Randomly sample 3000 benign and 3000 sybil instances as trainingsdata -> Should not contain nodes from our train/test
                - Features:
                    - Incoming requests accepted ratio
                    - Outgoing requests accepted ratio
                    - Local clustering coefficient
                - Predict weights for all edges
                - Use as prior for loopy belief propagation
        - [x] Feature Extraction ans laufen
            - [x] Relevante Statistiken fehlen und müssen neu implementiert werden
        - [x] Performance verbessern
- [ ] Vergleichsalgoesimplementieren
- [ ] Sehr viele READMEs schreiben (insb. zu den dicts. (alles bis auf possible muss alle Methoden enthalten))
- [ ] Service Pipeline auf giotto-ph umstellen
- [ ] Unittests services
- [ ] Fileserver aus Doku raus
- [ ] MWE anpassen
- [ ] Kaniko
- [ ] RM Kubernetes Unittests

### KW 6-15 (Hauptpunkte: Schreiben + Referenzalgos weiter)
- [X] Sybilbelief
    - [X] Autoren von Sybilfuse (ebenfalls die Autoren des relevanten Papers mit Ergebnissen von Sybilbelief auf dem Twitter Datensatz) nutzen nicht das vollständige Netz, dokumentieren das aber nicht richtig -> Evaluation muss neu stattfinden
    - [X] Datenset jetzt bedeutend zu groß für verfügbaren Speicher
        - [X] Anpassen (und sehr viel Testen) des Programmcodes (kleiner Stichpunkt, aber fast 2 Tage Arbeit...)
    - Largest CC: Benign: 5447 Malicious: 176
        - Accuracy: 0.9714 Precision: 0.9740 Recall: 0.9971 MCC: 0.3313
    - Full Dataset: Benign: 8767 Malicious: 961
        - Accuracy: 0.9028 Precision: 0.9039 Recall: 0.9982 MCC: 0.1310
    - Full Dataset (Default Sybil): Benign: 8767 Malicious: 961
        - Accuracy: 0.6422 Precision: 0.9740 Recall: 0.6195 MCC: 0.2827
- [ ] SybilFuse
    - [X] Adapt (parallel + memory)
    - [x] Refigure out training and prediction of the SVM
        - [x] No answer from any of the authors -> We use the features in the paper
            - [x] Write feature extraction
                - [x] Was genau sind die Ausgabedateien, die von dem Tool generiert werden?
                    - [x] Es macht überhaupt keinen Sinn, dass die so generiert/benannt werden...
                    - [x] Eingabegraph sollte in "l" supgraphen aufgeteilt werden, die wir einzeln betrachten, allerdings werden falsche dateien (sowohl vom namen, als auch inhalt) generiert
                    - [x] Woher kommt die "o" Datei???
                - [X] Brauchen wir die Anzahl der Knoten als erste Zeile in der Kantendatei? Ja -> muss ich setzen
                - [X] Act und sus nur trainings daten? -> Ja
                - [X] Wie ist Ausgabematrix formatiert? (Knoten 1, Knoten 2, label (-1 für Sybil, +1 für Benign, 0 für Unkown), Features)
                - [x] Understand ouptut of getdegree
                    - [x] Argumente für die Funktion machen keinerlei Sinn (erwartet Output Dateinamen aber erhält start index, end index und filename)
                - [x] Werden die Knoten und Kantenwahrscheinlichkeiten korrekt übernommen?
                - [X] Arbeitet der Code mit LBP und nicht RW?
                - [x] Wissen wir die Parameter für LBP? 
                - [x] Wie werden die Kantengewichtungen an LBP übergeben?
                - [x] Warum läuft es 3 mal?
                - [x] Was sind "l", "s", "n", etc. im run.sh skript?
                - [x] Code für die aufgeteilte Feature Extraction reparieren
                    - [x] Was genau sind die unterschiedlichen Dateien
                    - [x] In welcher Reihenfolge ist das was abgespeichert? (warum 5?) Es sind 5 Knoten, aber 7 Kanten...
                    - [x] Warum ist die letzte Datei vollständig leer?
                    - [x] Wie dramatisch ist es wenn ich die Aufteilung nicht nutze?
                        - [x] Speicherprobleme? -> No
                        - [x] Approximation LZ? Beten das was in meiner Progressanzeige kaputt ist, ansonsten ~10Jahre
                            - [x] Es ist deren Code, wie haben die Daten generiert?
                            - [x] Irgendetwas muss offensichtlich nicht stimmen
                    - [x] So nicht wirklich in Benutzung, stattdessen alle ***0.9***
                - [x] Node Feature Extraction
                    - [x] Ist die Bestimmung der Anzahl der gelabelten Kanten gerichtet?
            - [x] Sample training and test data
        - [x] Procedure:
            - [x] Train SVM (should not overlap with our test set)
            - [x] Predict Prior for entire dataset using SVM
        - [x] Implement new feature extraction
            - [x] optimize new feature extraction
    - [X] Relevante Parameter:
        - [X] Sybil -> 0; Benign -> 1 (nicht 0.1, 0.9)
        - [X] Feature Reihenfolge: Node ID; Incoming Ratio, Outgoing Ratio, Local Clustering Coefficient
        - [X] Min-Max skaliert
        - [X] RBF Kernel: C=2048 g=0.0001220703125
        - [X] Edge weight = 0.9
        - [X] Dataset: undirected_bi
        - [X] LBP: ./sybilfuse -graphfile Twitter_undirected_bi.txt -postfile sybilfusePost_1.txt -priorfile prior_1.txt -mIter 6 -wg 0 -nt 32
    - [x] Aufbau Prior Datei
        - [x] (node_id, score) per line
        - [x] Welcher score? Das benign, oder das sybil? -> Trust score, sprich probability das benign
    - [ ] Deren Code funktioniert nicht
    - Full Dataset: Benign: 5447 Malicious: 180  (arbeitet auf einem anderen Datenset)
    - Accuracy: 0.052781233339257154 Precision: 0.031647871953437615 Recall: 0.9666666666666667 MCC: -0.012641856282348707
- [x] SybilScar
    - [x] Memory Improvements
    - [x] Convert dataset into correct format
    - [x] There is an old (2017) and new version (2020)
    - [X] Irgendwelche extrem merkwürdigen Speicherfehler die ich mir nicht erklärt kriege --> Felix fragen
        - [X] Valgrind zeigt keine fehler
        - [X] Variable wird innerhalb des Threads erzeugt und nur innerhalb des Thread beschrieben
        - [X] Für andere Netzwerke funktioniert der Code, aber Netzwerk ist korrekt -> Mehrfach überprüft und konvertiert
        - [X] Letztendlich hat eine Reduktion der Threads geholfen (ka warum)
    - Full Dataset: Benign: 8764 Malicious: 957
    - Accuracy: 0.9038164797860302 Precision: 0.7037037037037037 Recall: 0.03970741901776385 MCC: 0.15184296003865555


## Notes
- **K** Kernmotivation / Kernziel
- **F** Futurework / Ausblick
- **A** Allgemeinere Fragen / Andere Arbeiten
- **N** Nicht ins Paper (evtl. aus verschiedenen Gründen)
- **Differenz in verwendeten Features für Sybilfuse Paper und deren Implementation**
- (**F**) Wollen wir uns irgendwie mit der Visualisierung eines solchen Netzwerkes beschäftigen (s. Mapper)?
- (**F**) Unser Ansatz verliert Informationen über die globale Struktur des Netzwerkes. Macht es Sinn ihn als Hybridmethode irgendwie mit RW/LBP-Methode zu verheiraten?
- (**F**) Potenziell kann man sich Graph-Neural-Networks einmal näher anschauen
- Wie gehen wir mit (zu) kleinen Egonetzwerken um? 
  - Wieviele sind es denn? ```find . -type f -size +100M```
      - Twibot22 ~ 50% 
      - Was ist die Ursache für diese hohe Anzahl?
- Erweiterte Netzwerke ist etwas was wir definitiv als Möglichkeit ansprechen sollten
- Denke es mach Sinn wenn ich die Evaluation auf Twibot22 schon anlaufen lasse (insb. als höhere Prio als alles andere)
- (**A**) Wie start gehen wir auf Annahmen ein? Insb. wie realistisch unsere Strukturannahmen gegenüber den klassischen sind?
    - In dem Zusammenhang, wie viel schaut man sich dann sowas wie das Twibot Datenset an, um das zu begründen
    - Nicht problematisch ist, dass wenn es um den jetzt Zustand von OSNs geht, wir nur Twitter haben (Explizit machen: Wir wählen explizit nicht-synt Datensätze sowie oft verwendete Realweltdaten aus)
    - Entsprechend kann jede Aussage die wir über Annahmen treffen wollen auch einfach nur Twitter spezifisch sein
        - Kann man begegnen mit einem Vergleich zum alten Twitter Datenset, damit decken wir aber immer noch nicht den Fall ab, dass die typischen strukturbasierten Annahmen generell schlecht für OSNs sind (falls dem so ist)

**Welche Teil vom Lab übernehmen?**
- *Einleitung/Motivation kann ähnlich vorgenommen werden*
- *Einführung in Topologie muss ausführlicher, aber ähnlich einfach starten*
    - *Stärkerer Fokus auf Topologie im Allgemeinen*
- *Feature Extraktion kürzer (auf Referenzen verweise)*
- *Methodology gekürzt übernehmen*
- *Evaluation komplett neu mit Fokus auf Breite statt Tiefe (i.e. Vergleichswerte auf vielen Datensets gg. viele Vergleichsalgorithmen)*
    - *Fokus auf globale, nicht lokale Trends*

**Ungeordnete Anmerkungen**
- Twitter 90th-percentile effective parameter $\approx4.8$ (zumindest in [2010](https://dl.acm.org/doi/10.1145/1772690.1772751))
    - Egonetze der Größe 2 sollten ausreichen

**Merkwürdigkeiten**
- Twibot22
    - Merkwürdige Korrelation zwischen Größe der Ego-Netzwerke und Knoten ID (minimale Netze gehören idR. zu Knoten mit einer um min. eine Magnitude größeren ID)
        - Erklärung im Paper über Namensschema? Oder bennenne ich die in einem der alten Skripte um (ziemlich sicher nicht)? 
    - Anzahl der minimalen Ego-Netzwerke ist für 1- und 2-hop identisch (anderen Netze wachsen wie erwartet) (kann aber doch eigentlich nicht sein, dass die alle isoliert sind, irgendwas ist bei der Aufbereitung falsch gelaufen?)

## Umriss
- Ziel ist die Bewertung unseres Ansatzes in direktem Vergleich zu anderen rein strukturbasierten Methoden
    - Mehr oder weniger indirekt damit verknüpft ist, dass wir behaupten in der Lage zu sein, Informationen zu erschließen, die anders nicht zugänglich sind
- Insbesondere ergeben sich hieraus zwei sehr klare praktische Fragen die beantwortet werden müssen
    1. Wie schneidet ein TDA-basierter Ansatz gegen State-of-the-Art strukturbasierte Methoden ab (quantifiziert an Hand Standard-Metriken in diesem Bereich)
    2. Was ist der Mehrwert(?) von TDA bzgl. der Extraktion von Information aus lokalen Strukturen gegenüber anderen bereits verwendeten Methoden
- Beide Fragen benötigen eine intuitive Einführung in TDA. Diese sollte klar am Thema orientiert sein und entsprechend den Fokus setzen auf was klar definiert sein muss und was ungenau bleiben kann
- **Methodik:**
    - Ziel ist Vergleichbarkeit $\rightarrow$ entsprechend einheitliche Auswahl der Datensets für alle Methoden
        - Manche der Referenzmethoden, werden potentiell nicht mit den vollen Datensets umgehen können
            $\rightarrow$ <span style="color:red"> Wie samplen wir einheitlich ohne Bias durch unterschiedliche Klassifikationsmethoden?</span>
        - Gerade Sampling kann auch schön als Stärke unseres Ansatzes herausgestellt werden
    - Feature Extraktions- sowie Klassifkationsmethoden sollten möglichst breit gewählt werden, um aussagekräftige Bewertung zu ermöglichen (wir vergleichen Feature Extraction mit ganzen Klassifikationsmethoden)



### LAB
1. There are significant difference in the structure of social cliques between sybil and benign nodes 
2. TDA enables us to capture this information

### Neu

## Reference Paper

<details>
<summary><b><font size="+1">SybilBlind</font></b></summary>

[Paper 2018](https://arxiv.org/abs/1806.04853)
- Structure-based without manual labels
    - Goal is to avoid attackers leveraging knowledge about training data (questionable as knowledge of structure is still exploitable)
- Node prediction is handled using *one-side entropy* and *homophily*
    - *Homophily:*
        $$h = \frac {\#homogeneous\:edges} {\# edges\:in\:total}$$
    - *One-side Entropy:*
        $$e = \begin{cases}
          0 & \text{if $s > 0.5$}\\
          -s \cdot log(s) - (1-s) \cdot log(1-s) & \text{otherwise}
        \end{cases}$$
        where $s$ is the fraction of nodes in the network predicted to be sybil
    
- Intuition:
    - Perform $k$ sampling trials sampling equal sized sets $S$ and $B$
        - Assume all nodes in $S$ are sybil and all in $B$ benign
    - Deploy classifier (here SybilSCAR) to predict a sybil probability for all other nodes in the network
    - Aggregate by selecting trials maximizing *homophily* and *one-side entropy*
        - Scenario 1: both sets contain equal amounts of sybil and benigns
            - small *homophily*
        - Scenario 2: $B$ has more sybils than $S$
            - *One-side entropy* is $0$
        - Scenario 3: $B$ has more benign than $S$
            - High *homophily*  and *one-side entropy* 
            
- Datasets:
    - Classic Twitter (both small and full)
    - Synthesized network

</details>

<details>
<summary><b><font size="+1">TrustCGN</font></b></summary>

[Paper 2022](https://arxiv.org/abs/2205.12784)
- Computes trust scores for nodes based on short random walks which are than used as edge weights in a graph convolutional network
- Vulnerable to adversarial attacks, where attacker manipulates local edges to mimic real users
    - How does our scorer stack up here?
- They evaluate three types of attacking strategies:
    - **Collusion** (many edges among sybils)
    - **Self-rejection** (some sybil reject friendrequest from other sybils)
    - **Promotion** (standard establishment of attack edges)
- Datasets:
    - Renren friend requests (not yet tested by us)

</details>

<details>
<summary><b><font size="+1">SybilHunter</font></b></summary>
    
[Paper 2022](https://dl.acm.org/doi/abs/10.1016/j.neucom.2021.07.106)
- Hybrid approach constructing a intermediary *weighted-strong-social graph* before utilizing random walks
![*Weighted-strong-social graph* generation](https://i.imgur.com/XjOtt08.png)
- *WSS*  construction:
    - First 1-string link graph is constructed (at least one common neighbor of the connected nodes)
    - Assign weights to edges based on local classifier
- Datasets:
    - Weibo dataset

</details>
    
<details>
<summary><b><font size="+1">Social-Activity Net</font></b></summary>
   
[Paper 2022](https://ieeexplore.ieee.org/document/9714881)

- Considers a more realistic number of attack edges in OSN (i.e., lots more)
- Main idea is to focus on interactions instead to establish the necessary social activity graph (SAN)

![Bildschirmfoto vom 2022-09-01 15-13-51.png](http://i.epvpimg.com/on5Tbab.png)

- SAN includes user activities as graph overlay
    → No longer just undirected edges
    → Undirected edge $(v, a)$ = activity $a$ was created by user $v$
    → Directed edge $(a,v)$ = activity $a$ mentions user $v$
    → Directed edge $(a_i, a_j)$ = activity $a_i$ follows activity $a_j$
- Requires a seed set $S$ of labeled nodes (composition irrelevant)
- Intuition:
    > (…) the activities of a trusted user can be trusted, while an activity with high trust score can certify the trustiness of its creator.
    > 
- Procedure:
    - Split network into three subgraphs:
    - Coupled random walks for each of the 3 subgraphs
    
    ![Bildschirmfoto vom 2022-09-02 13-31-33.png](http://i.epvpimg.com/FCZPdab.png)
    
    ![Bildschirmfoto vom 2022-09-05 14-31-28.png](http://i.epvpimg.com/CNlOdab.png)
    
- Datasets:
    - Twitter (utilized as honest region, Sybils synthesized)

</details>
    
## Datasets

<details>
<summary><b><font size="+1">Twibot-22</font></b></summary>
    
- Extensive up-to-date Twitter dataset, featuring ~140k bots and ~860k benign users
![Entity Types](https://github.com/LuoUndergradXJTU/TwiBot-22/raw/master/pics/entity_type.png)

![Relation Types](https://github.com/LuoUndergradXJTU/TwiBot-22/raw/master/pics/relation_type.png)

![Detailed Statistics](https://github.com/LuoUndergradXJTU/TwiBot-22/raw/master/pics/detailed_sta.png)

![Comparison other datasets](https://github.com/LuoUndergradXJTU/TwiBot-22/raw/master/pics/compare.png)

</details>
    
<details>
<summary><b><font size="+1">Twitter 2014</font></b></summary>    
    
- Älteres Datenset (ursprünglich gecrawled in 2009)
- In 2012 und 2014 wurde der Status aller Nutzer im Datenset erneut abgefragt und auf Basis davon Label festgesetzt
    - Aktive Nutzer -> Benign
    - Suspended Nutzer -> Sybil
    - Rest -> Unkown
    - Auf diese Weise werden Label für 10.000.000 Benign und 100.000 Sybil Knoten bereitgestellt
- Biased, da Labeling ausschließlich auf Basis von Twitter's Vorgehensweise
- 41.652.240 Nutzer mit 1.468.364.884 Kanten

</details>

<details>
    <summary><b><font size="+1">Facebook 2008</font></b></summary>

- Datenset von Freundeslisten (i.e. Egonetzwerke)
- Ebenfalls eines der absoluten Standard-Datensets
![Detailed Statistics](http://i.epvpimg.com/WqJmbab.png)

</details>

<details>
    <summary><b><font size="+1">Slashdot 2009</font></b></summary>
- Slashdot ist eine Tech fokussierte Website welche Nutzer erlaubt sich gegenseitig als Freund oder Feind zu markieren
- Dataenset beinhaltet Freund/Feind Verknüpfungen zwischen den Nutzerns des Netzwerkes
- Eines der im Lab verwendeten Datensets mit moderater Nutzung in Referenzliteratur

![Detailed Statistics](https://i.imgur.com/yzQ1KEk.png)

</details>

<details>
    <summary><b><font size="+1">(Twitter Kaggle)</font></b></summary>

- Reines Label Dataset (sprich nur Twitter ID + Label) für 37438 Nutzer
    - Netzwerkstruktur müssen wir selber scrapen, aber habe im Kopf, dass Twitter eine sehr vernünftige API hat
- 25013 Benign und 12425 Sybil
- Nicht ganz klar wie das gelabelt wurde

</details>

<details>
    <summary><b><font size="+1">(RenRen)</font></b></summary>

- Viel Verwendung in Referenzliteratur, aber mir bis jetzt unklar, wie ich an das Datenset herankommen kann

</details>


Es existieren noch einige weitere Datensets im [Bot Repository](https://botometer.osome.iu.edu/bot-repository/datasets.html). Einige davon sind auf Grund von Twitters Richtlinien nur als gelabelte User-IDs verfügbar und müssten entsprechend selber gescraped werden. Allgemein sind diese Datensets aber (zumindest im Rahmen der Sybil Erkennung) eher wenig benutzt. Dafür finden sie stärker Verwendung im Rahmen der Bot Erkennung.


# Homogene Geräte; Datensätze
- Vlt ist der Fokus: Guten Datensätze sind rar; Wir geben eine methodisch herausragende Lösung in einem Bereich an.

# Homogene Geräte; TDA

# Conferences:

## EuroS&P:

> Since 1980, the IEEE Symposium on Security and Privacy has been the premier forum for presenting developments in computer security and electronic privacy, and for bringing together researchers and practitioners in the field. Following this story of success, IEEE initiated the *European* Symposium on Security and Privacy (EuroS&P), which is organized every year in a European city.
> 

### Deadlines:

- Submission Deadline:                   **26 October 2022 (Wednesday)**
- Early rejection notification:            8 December 2022 (Thursday)
- Rebuttal period:                            18 - 25 January 2023
- Author Notification:                       12 February 2023 (Sunday)
- Submission of revised papers:     14 March 2023 (Tuesday)
- Camera ready deadline:                3 April 2023 (Wednesday)
- Conference:                                   **3 - 7 July 2023**

### Conditions:

- Carefully consider and address the potential harms in body of the paper
- Papers must be submitted in a form suitable for anonymous review
- Papers shall not exceed 13 pages of body text, with unlimited additional pages for references and appendices
- Papers must be typeset in LaTeX in A4 format (not "US Letter") using the IEEE conference proceeding template [eurosp2023-template.zip](https://www.ieee-security.org/TC/EuroSP2023/eurosp2023-template.zip)
- Submissions must be in Portable Document Format (.pdf)