+ {project.title} +
+ ++ {project.description} +
+diff --git a/app/globals.css b/app/globals.css
index ee2a7bb..818578f 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -265,6 +265,146 @@ a {
font-weight: 600;
}
+.graph-project {
+ --graph-paper: #f4f1e8;
+ --graph-panel: #fffdf6;
+ --graph-ink: #161512;
+ --graph-soft: #39362d;
+ --graph-muted: #6d675a;
+ --graph-line: rgba(22, 21, 18, 0.16);
+ --graph-accent: #0f6f77;
+ --graph-accent-strong: #0c4f58;
+ --graph-warm: #e28f45;
+ --graph-code: #171813;
+ --graph-code-text: #f2ead9;
+ background:
+ linear-gradient(90deg, rgba(22, 21, 18, 0.04) 1px, transparent 1px),
+ linear-gradient(180deg, rgba(22, 21, 18, 0.035) 1px, transparent 1px),
+ var(--graph-paper);
+ background-size: 4.5rem 4.5rem;
+ color: var(--graph-ink);
+}
+
+:root[data-theme="dark"] .graph-project {
+ --graph-paper: #111315;
+ --graph-panel: #181c1d;
+ --graph-ink: #f5f0e6;
+ --graph-soft: #ddd5c5;
+ --graph-muted: #a9a091;
+ --graph-line: rgba(245, 240, 230, 0.15);
+ --graph-accent: #78c7cf;
+ --graph-accent-strong: #93dbe2;
+ --graph-warm: #e3a15f;
+ --graph-code: #0d0f10;
+ --graph-code-text: #f5f0e6;
+}
+
+.graph-project .text-graph-ink {
+ color: var(--graph-ink);
+}
+
+.graph-project .text-graph-soft {
+ color: var(--graph-soft);
+}
+
+.graph-project .text-graph-muted {
+ color: var(--graph-muted);
+}
+
+.graph-project .text-graph-accent {
+ color: var(--graph-accent);
+}
+
+.graph-project .text-graph-code-text {
+ color: var(--graph-code-text);
+}
+
+.graph-project .bg-graph-paper {
+ background-color: var(--graph-paper);
+}
+
+.graph-project .bg-graph-panel {
+ background-color: var(--graph-panel);
+}
+
+.graph-project .bg-graph-line {
+ background-color: var(--graph-line);
+}
+
+.graph-project .bg-graph-code {
+ background-color: var(--graph-code);
+}
+
+.graph-project .border-graph-line {
+ border-color: var(--graph-line);
+}
+
+.graph-project .bg-graph-accent {
+ background-color: var(--graph-accent);
+}
+
+.graph-project .hover\:text-graph-accent:hover {
+ color: var(--graph-accent);
+}
+
+.graph-project .hover\:border-graph-accent:hover {
+ border-color: var(--graph-accent);
+}
+
+.graph-hero {
+ background:
+ radial-gradient(42rem 24rem at 16% 18%, rgba(226, 143, 69, 0.18), transparent 70%),
+ radial-gradient(38rem 24rem at 82% 10%, rgba(15, 111, 119, 0.16), transparent 72%);
+}
+
+.graph-hero-card {
+ overflow: hidden;
+ border: 1px solid var(--graph-line);
+ border-radius: 0.5rem;
+ background: var(--graph-panel);
+ box-shadow: 0 34px 80px rgba(22, 21, 18, 0.12);
+}
+
+.graph-card-top {
+ display: flex;
+ justify-content: space-between;
+ gap: 1rem;
+ border-bottom: 1px solid var(--graph-line);
+ padding: 0.85rem 1rem;
+ color: var(--graph-muted);
+ font-family: var(--font-mono), monospace;
+ font-size: 0.68rem;
+ text-transform: uppercase;
+}
+
+.graph-matrix {
+ display: grid;
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+ width: min(17rem, 58vw);
+ overflow: hidden;
+ border: 1px solid var(--graph-line);
+ background: #202f33;
+}
+
+.graph-matrix span {
+ aspect-ratio: 1;
+ border-right: 1px solid rgba(244, 241, 232, 0.14);
+ border-bottom: 1px solid rgba(244, 241, 232, 0.14);
+ background: #275b63;
+}
+
+.graph-matrix span.is-hot {
+ background: #f0d83a;
+}
+
+.graph-kicker {
+ color: var(--graph-muted);
+ font-family: var(--font-mono), monospace;
+ font-size: 0.72rem;
+ letter-spacing: 0;
+ text-transform: uppercase;
+}
+
@media (min-width: 1280px) {
.side-note {
float: right;
diff --git a/app/page.tsx b/app/page.tsx
index 6f6c575..787f89a 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -30,6 +30,9 @@ export default function Home() {
Latest essay
+
+ Projects
+
Writing
diff --git a/app/projects/graph-attention-topology/page.tsx b/app/projects/graph-attention-topology/page.tsx
new file mode 100644
index 0000000..d969476
--- /dev/null
+++ b/app/projects/graph-attention-topology/page.tsx
@@ -0,0 +1,307 @@
+import Image from "next/image";
+import Link from "next/link";
+import type { Metadata } from "next";
+import architectureImage from "@/public/images/graph-attention-topology/model-architecture.png";
+import simulationImage from "@/public/images/graph-attention-topology/simulation-dynamics.png";
+import resultsImage from "@/public/images/graph-attention-topology/f1-results.png";
+import attentionImage from "@/public/images/graph-attention-topology/attention-training.png";
+
+const paperLinks = [
+ { href: "https://arxiv.org/abs/2408.15449", label: "arXiv" },
+ { href: "https://arxiv.org/pdf/2408.15449", label: "PDF" },
+ { href: "https://doi.org/10.48550/arXiv.2408.15449", label: "DOI" },
+];
+
+const highlights = [
+ {
+ value: "No known graph",
+ label: "Learns topology without prior adjacency examples.",
+ },
+ {
+ value: "Unknown dynamics",
+ label: "Uses observed states instead of hand-specified equations.",
+ },
+ {
+ value: "Attention as edges",
+ label: "Interprets learned attention scores as the graph estimate.",
+ },
+];
+
+const steps = [
+ "Embed every agent into a shared latent space.",
+ "Project embeddings into key/query vectors and compute pairwise attention.",
+ "Translate observed agent states into values.",
+ "Predict the next state and read the attention matrix as topology.",
+];
+
+export const metadata: Metadata = {
+ title: "Graph Attention Topology Inference",
+ description:
+ "Project page for Graph Attention Inference of Network Topology in Multi-Agent Systems.",
+ openGraph: {
+ title: "Graph Attention Inference of Network Topology in Multi-Agent Systems",
+ description:
+ "A graph-attention approach for inferring hidden network topology from multi-agent trajectories.",
+ type: "article",
+ publishedTime: "2024-10-26",
+ images: [
+ {
+ url: "/images/graph-attention-topology/model-architecture.png",
+ width: architectureImage.width,
+ height: architectureImage.height,
+ alt: "Graph attention model architecture",
+ },
+ ],
+ },
+};
+
+function ExternalLink({ href, label }: { href: string; label: string }) {
+ return (
+
+ {label}
+
+ );
+}
+
+function Figure({
+ src,
+ alt,
+ caption,
+ className = "",
+}: {
+ src: typeof architectureImage;
+ alt: string;
+ caption: string;
+ className?: string;
+}) {
+ return (
+
+ Inferring the hidden graph behind a multi-agent system by training attention to predict what each agent does next. +
+{item.value}
+{item.label}
+Overview
++ The paper studies a practical problem in networked multi-agent systems: the agents move, synchronize, or converge, but the interaction graph behind that behavior is not given. +
++ The model is trained on state trajectories from consensus dynamics and Kuramoto oscillators. During prediction, attention scores between agent embeddings become an interpretable approximation of the adjacency matrix. +
+Method
++ Instead of supervising the graph directly, the model learns to forecast the system. The attention matrix is then thresholded and compared with the true graph. +
+Results
++ F1 link-prediction scores are above a random baseline for both tested dynamics. Consensus dynamics are easier than Kuramoto oscillators, while additional simulation data improves larger-agent inference. +
+training behavior
++ Attention first learns the obvious self-dependencies, then gradually recovers inter-agent structure as training progresses. +
+Citation
++ Graph Attention Inference of Network Topology in Multi-Agent Systems. Akshay Kolli, Reza Azadeh, and Kshitij Jerath. Accepted at the Modeling and Estimation Control Conference, 2024. +
+
+{`@misc{kolli2024graphattentioninference,
+ title={Graph Attention Inference of Network Topology in Multi-Agent Systems},
+ author={Kolli, Akshay and Azadeh, Reza and Jerath, Kshitij},
+ year={2024},
+ eprint={2408.15449},
+ archivePrefix={arXiv},
+ primaryClass={cs.MA}
+}`}
+
+ Projects
++ A compact index of paper pages, experiments, and systems work. +
++ {projects.length} active {projects.length === 1 ? "project" : "projects"} +
++ {project.description} +
+