campus-placement-engine / scripts /generate_pdf_diagrams.py
deeep-sec's picture
docs: update to hybrid public cloud & institutional deployment
35e8172 verified
Raw History Blame Contribute Delete
15.3 kB
import os
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as patches
OUT_DIR = r"C:\Users\Nitro-V\.gemini\antigravity\scratch\deviathon-placement-engine\docs\pdf_assets"
os.makedirs(OUT_DIR, exist_ok=True)
plt.rcParams['font.sans-serif'] = 'DejaVu Sans'
plt.rcParams['font.family'] = 'sans-serif'
def create_architecture_diagram():
fig, ax = plt.subplots(figsize=(10, 4.0), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
rect_client = patches.FancyBboxPatch((2, 4), 22, 42, boxstyle="round,pad=0.8", ec="#94A3B8", fc="#FFFFFF", lw=1.5)
ax.add_patch(rect_client)
ax.text(13, 43, "CLIENT TIER (WEB & LAN)", ha='center', va='center', fontsize=8, fontweight='bold', color='#1E293B')
for y_pos, label, sub in [(34, "Officer Workspace", "React 18 / Tailwind"), (22, "Student Mobile PWA", "Offline-Ready Portal"), (10, "Recruiter Portal", "Roster & Evaluation")]:
b = patches.FancyBboxPatch((4, y_pos-3), 18, 7, boxstyle="round,pad=0.4", ec="#CBD5E1", fc="#F1F5F9", lw=1)
ax.add_patch(b)
ax.text(13, y_pos+1.5, label, ha='center', va='center', fontsize=7.5, fontweight='bold', color='#0F172A')
ax.text(13, y_pos-1.2, sub, ha='center', va='center', fontsize=6.2, color='#64748B')
rect_app = patches.FancyBboxPatch((27, 4), 46, 42, boxstyle="round,pad=0.8", ec="#3B82F6", fc="#EFF6FF", lw=1.8)
ax.add_patch(rect_app)
ax.text(50, 43, "APPLICATION SERVER (FastAPI on Port 8000)", ha='center', va='center', fontsize=8.5, fontweight='bold', color='#1D4ED8')
rect_core = patches.FancyBboxPatch((29, 8), 42, 30, boxstyle="round,pad=0.6", ec="#10B981", fc="#FFFFFF", lw=2)
ax.add_patch(rect_core)
ax.text(50, 35.5, "PURE FUNCTIONAL DOMAIN CORE", ha='center', va='center', fontsize=8.2, fontweight='bold', color='#047857')
ax.text(50, 33, "(Zero Database I/O, 100% Deterministic)", ha='center', va='center', fontsize=6.2, fontstyle='italic', color='#059669')
core_mods = [
(31, 23, "Deterministic Extractor", "100% Offline / Regex AST"),
(51, 23, "Eligibility AST Engine", "13 Rules / Protected Isolation"),
(31, 11, "OR-Tools CP-SAT Solver", "0-Clash Math Scheduling"),
(51, 11, "What-If Simulation", "Delta Engine & Dynamic Headlines")
]
for x_pos, y_pos, title, desc in core_mods:
mb = patches.FancyBboxPatch((x_pos, y_pos-1.5), 18, 8, boxstyle="round,pad=0.4", ec="#A7F3D0", fc="#ECFDF5", lw=1)
ax.add_patch(mb)
ax.text(x_pos+9, y_pos+3.5, title, ha='center', va='center', fontsize=7, fontweight='bold', color='#065F46')
ax.text(x_pos+9, y_pos+0.5, desc, ha='center', va='center', fontsize=5.8, color='#047857')
rect_db = patches.FancyBboxPatch((76, 4), 22, 42, boxstyle="round,pad=0.8", ec="#94A3B8", fc="#FFFFFF", lw=1.5)
ax.add_patch(rect_db)
ax.text(87, 43, "LOCAL STORAGE & SECURITY", ha='center', va='center', fontsize=7.8, fontweight='bold', color='#1E293B')
for y_pos, label, sub in [(34, "SQLite (WAL Mode)", "PRAGMA foreign_keys=ON"), (22, "Field-Level Crypto", "AES-256 Fernet for PII"), (10, "HMAC Audit Ledger", "SHA-256 Hash Chaining")]:
b = patches.FancyBboxPatch((78, y_pos-3), 18, 7, boxstyle="round,pad=0.4", ec="#CBD5E1", fc="#F8FAFC", lw=1)
ax.add_patch(b)
ax.text(87, y_pos+1.5, label, ha='center', va='center', fontsize=7.2, fontweight='bold', color='#0F172A')
ax.text(87, y_pos-1.2, sub, ha='center', va='center', fontsize=6.0, color='#64748B')
ax.annotate('', xy=(27, 25), xytext=(24, 25), arrowprops=dict(arrowstyle="<->", color="#3B82F6", lw=2))
ax.annotate('', xy=(76, 25), xytext=(72, 25), arrowprops=dict(arrowstyle="<->", color="#10B981", lw=2))
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram1_architecture.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
def create_extraction_diagram():
fig, ax = plt.subplots(figsize=(10, 3.8), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
ax.text(50, 46, "DETERMINISTIC DOCUMENT INGESTION & EXTRACTION PIPELINE", ha='center', va='center', fontsize=9.5, fontweight='bold', color='#0F172A')
stages = [
(12, 24, "1. Ingestion & Normalize", "PDF, DOCX, EML, Plaintext\nWhitespace & Unicode cleanup", "#F1F5F9", "#475569"),
(37, 24, "2. Regex AST Matcher", "13 Rule Primitives\nCGPA, CTC, Branches, Backlogs", "#DBEAFE", "#1E40AF"),
(62, 24, "3. Confidence Scoring", "High / Medium / Low\nField-level extraction scores", "#FEF3C7", "#92400E"),
(87, 24, "4. Structured Contract", "Human-in-the-loop review\nImmutable Drive Creation", "#ECFDF5", "#065F46")
]
for x_pos, y_pos, title, sub, fc, tc in stages:
b = patches.FancyBboxPatch((x_pos-10, y_pos-10), 20, 20, boxstyle="round,pad=0.6", ec=tc, fc=fc, lw=1.5)
ax.add_patch(b)
ax.text(x_pos, y_pos+5, title, ha='center', va='center', fontsize=7.2, fontweight='bold', color=tc, multialignment='center')
ax.text(x_pos, y_pos-3, sub, ha='center', va='center', fontsize=6.0, color='#1E293B', multialignment='center')
for i in range(3):
x1 = stages[i][0] + 10
x2 = stages[i+1][0] - 10
ax.annotate('', xy=(x2, 24), xytext=(x1, 24), arrowprops=dict(arrowstyle="->", color="#3B82F6", lw=2))
perf_badge = patches.FancyBboxPatch((20, 2), 60, 5.5, boxstyle="round,pad=0.4", ec="#059669", fc="#10B981", lw=1.2)
ax.add_patch(perf_badge)
ax.text(50, 4.8, "BENCHMARK: 25/25 REAL-WORLD CIRCULARS (100%) | AVG SPEED: 14.6ms | ZERO LLM COST", ha='center', va='center', fontsize=6.8, fontweight='bold', color='#FFFFFF')
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram2_extraction.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
def create_ast_diagram():
fig, ax = plt.subplots(figsize=(10, 4.0), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
ax.text(50, 47, "TYPED RULE AST & TWO-TIER EXPLAINABILITY", ha='center', va='center', fontsize=9.5, fontweight='bold', color='#0F172A')
r_box = patches.FancyBboxPatch((40, 36), 20, 7.5, boxstyle="round,pad=0.5", ec="#2563EB", fc="#DBEAFE", lw=1.8)
ax.add_patch(r_box)
ax.text(50, 41, "Drive RuleSet Root", ha='center', va='center', fontsize=8, fontweight='bold', color='#1E40AF')
ax.text(50, 38, "Logical AND Operator", ha='center', va='center', fontsize=6.5, color='#2563EB')
leaves = [
(12, 23, "Academic Criteria", "CGPA >= 7.50\n10th/12th >= 70%"),
(37, 23, "Backlog Policy", "Active Backlogs == 0\nDead History <= 1"),
(62, 23, "Eligible Branches", "CS, IT, ECE, AI\n(Alias Normalization)"),
(87, 23, "Offer Policies", "Strict 1-Offer OR\nTiered Multiplier")
]
for x_pos, y_pos, title, sub in leaves:
b = patches.FancyBboxPatch((x_pos-9, y_pos-4), 18, 8.5, boxstyle="round,pad=0.4", ec="#10B981", fc="#ECFDF5", lw=1.2)
ax.add_patch(b)
ax.text(x_pos, y_pos+3, title, ha='center', va='center', fontsize=7.2, fontweight='bold', color='#065F46')
ax.text(x_pos, y_pos-1, sub, ha='center', va='center', fontsize=6.0, color='#047857', multialignment='center')
ax.annotate('', xy=(x_pos, y_pos+5), xytext=(50, 36), arrowprops=dict(arrowstyle="->", color="#94A3B8", lw=1.2))
cand_box = patches.FancyBboxPatch((5, 3), 42, 9, boxstyle="round,pad=0.6", ec="#F59E0B", fc="#FFFBEB", lw=1.5)
ax.add_patch(cand_box)
ax.text(26, 10, "Candidate Empathic Explanation (1-Line)", ha='center', va='center', fontsize=7.5, fontweight='bold', color='#92400E')
ax.text(26, 6, '"Not eligible: Your CGPA is 6.80 and this drive requires 7.50 or above."', ha='center', va='center', fontsize=6.5, fontstyle='italic', color='#B45309')
off_box = patches.FancyBboxPatch((53, 3), 42, 9, boxstyle="round,pad=0.6", ec="#6366F1", fc="#EEF2FF", lw=1.5)
ax.add_patch(off_box)
ax.text(74, 10, "Officer Cryptographic Trace (Audit Proof)", ha='center', va='center', fontsize=7.5, fontweight='bold', color='#3730A3')
ax.text(74, 6, 'Rule #CGPA_MIN | Cutoff: 7.50 | Value: 6.80 | Δ: -0.70\nSHA-256 Snapshot: 8f3c7a9... (Zero Bias Certified)', ha='center', va='center', fontsize=6.2, color='#4338CA', multialignment='center')
ax.annotate('', xy=(26, 12), xytext=(50, 18), arrowprops=dict(arrowstyle="->", color="#F59E0B", lw=1.5))
ax.annotate('', xy=(74, 12), xytext=(50, 18), arrowprops=dict(arrowstyle="->", color="#6366F1", lw=1.5))
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram3_ast.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
def create_scheduler_diagram():
fig, ax = plt.subplots(figsize=(10, 4.0), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
ax.text(50, 47, "GOOGLE OR-TOOLS CP-SAT CONSTRAINT SCHEDULER", ha='center', va='center', fontsize=9.5, fontweight='bold', color='#0F172A')
times = ["09:00 - 10:00", "10:15 - 11:15", "11:30 - 12:30", "13:30 - 14:30", "14:45 - 15:45"]
for i, t in enumerate(times):
ax.text(25 + i*16, 41, t, ha='center', va='center', fontsize=6.8, fontweight='bold', color='#475569')
rooms = ["Lab A (Panel 1)", "Lab B (Panel 2)", "Auditorium", "Seminar Hall"]
colors = ["#DBEAFE", "#ECFDF5", "#FEF3C7", "#F3E8FF"]
border_colors = ["#2563EB", "#059669", "#D97706", "#7C3AED"]
for r_idx, r_name in enumerate(rooms):
y = 33 - r_idx * 7.5
b = patches.FancyBboxPatch((1, y-2.5), 15, 5.5, boxstyle="round,pad=0.3", ec="#94A3B8", fc="#F1F5F9", lw=1)
ax.add_patch(b)
ax.text(8.5, y+0.2, r_name, ha='center', va='center', fontsize=6.5, fontweight='bold', color='#1E293B')
for c_idx in range(5):
x = 18 + c_idx * 16
slot_b = patches.FancyBboxPatch((x, y-2.5), 14, 5.5, boxstyle="round,pad=0.3", ec=border_colors[r_idx], fc=colors[r_idx], lw=1)
ax.add_patch(slot_b)
cand = f"Drive {(r_idx+1)*2}\nCandidate #{101+r_idx*10+c_idx}"
ax.text(x+7, y+0.2, cand, ha='center', va='center', fontsize=5.8, fontweight='bold', color='#0F172A', multialignment='center')
badge = patches.FancyBboxPatch((20, 1.5), 60, 5.5, boxstyle="round,pad=0.4", ec="#059669", fc="#10B981", lw=1.2)
ax.add_patch(badge)
ax.text(50, 4.3, "BENCHMARK: 600 STUDENTS / 12 DRIVES / 8 ROOMS IN 1.05s | 0 CLASHES GUARANTEED", ha='center', va='center', fontsize=6.8, fontweight='bold', color='#FFFFFF')
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram4_scheduler.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
def create_whatif_diagram():
fig, ax = plt.subplots(figsize=(10, 3.8), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
ax.text(50, 46, "WHAT-IF IMPACT SIMULATION & SECOND-ORDER PROJECTION", ha='center', va='center', fontsize=9.5, fontweight='bold', color='#0F172A')
steps = [
(12, 24, "1. Officer Adjustment", "Slider: CGPA 7.0 -> 6.5\nor relax backlogs to 1", "#DBEAFE", "#1E40AF"),
(37, 24, "2. Pure In-Memory Delta", "Runs in 18ms without\nwriting to SQLite database", "#ECFDF5", "#065F46"),
(62, 24, "3. Consequence Engine", "Identifies newly eligible pool,\ncalculates room displacement", "#FEF3C7", "#92400E"),
(87, 24, "4. Dynamic Headline", '"Adds 38 candidates;\n6 clash with Northwind test"', "#F3E8FF", "#5B21B6")
]
for x_pos, y_pos, title, sub, fc, tc in steps:
b = patches.FancyBboxPatch((x_pos-10, y_pos-10), 20, 20, boxstyle="round,pad=0.6", ec=tc, fc=fc, lw=1.5)
ax.add_patch(b)
ax.text(x_pos, y_pos+5, title, ha='center', va='center', fontsize=7.2, fontweight='bold', color=tc, multialignment='center')
ax.text(x_pos, y_pos-3, sub, ha='center', va='center', fontsize=6.0, color='#1E293B', multialignment='center')
for i in range(3):
x1 = steps[i][0] + 10
x2 = steps[i+1][0] - 10
ax.annotate('', xy=(x2, 24), xytext=(x1, 24), arrowprops=dict(arrowstyle="->", color="#3B82F6", lw=2))
ctrl_badge = patches.FancyBboxPatch((20, 2), 60, 5.5, boxstyle="round,pad=0.4", ec="#2563EB", fc="#3B82F6", lw=1.2)
ax.add_patch(ctrl_badge)
ax.text(50, 4.8, "SAFEGUARDS: MONOTONIC VERSIONING | IMMUTABLE SNAPSHOTS | 1-CLICK ROLLBACK", ha='center', va='center', fontsize=6.8, fontweight='bold', color='#FFFFFF')
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram5_whatif.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
def create_security_diagram():
fig, ax = plt.subplots(figsize=(10, 3.8), dpi=300)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.axis('off')
fig.patch.set_facecolor('#F8FAFC')
ax.text(50, 46, "ENTERPRISE SECURITY, CRYPTOGRAPHY & DATA PRIVACY", ha='center', va='center', fontsize=9.5, fontweight='bold', color='#0F172A')
pillars = [
(12, 24, "AES-256 Fernet Crypto", "Encrypted PII columns\n(Phone, Email, CGPA, Address)", "#F1F5F9", "#334155"),
(37, 24, "HMAC-SHA256 Audit Trail", "Cryptographic chaining\nTamper-proof event ledger", "#EEF2FF", "#3730A3"),
(62, 24, "Strict Data Sovereignty", "Self-contained architecture\nZero third-party cloud leaks", "#ECFDF5", "#065F46"),
(87, 24, "Cryptographic Wipe", "PBKDF2 encrypted backups\n1-click season cleanup", "#FEF2F2", "#991B1B")
]
for x_pos, y_pos, title, sub, fc, tc in pillars:
b = patches.FancyBboxPatch((x_pos-10, y_pos-10), 20, 20, boxstyle="round,pad=0.6", ec=tc, fc=fc, lw=1.5)
ax.add_patch(b)
ax.text(x_pos, y_pos+5, title, ha='center', va='center', fontsize=7.2, fontweight='bold', color=tc, multialignment='center')
ax.text(x_pos, y_pos-3, sub, ha='center', va='center', fontsize=6.0, color='#1E293B', multialignment='center')
for i in range(3):
x1 = pillars[i][0] + 10
x2 = pillars[i+1][0] - 10
ax.annotate('', xy=(x2, 24), xytext=(x1, 24), arrowprops=dict(arrowstyle="<->", color="#94A3B8", lw=1.5))
sec_badge = patches.FancyBboxPatch((20, 2), 60, 5.5, boxstyle="round,pad=0.4", ec="#059669", fc="#10B981", lw=1.2)
ax.add_patch(sec_badge)
ax.text(50, 4.8, "COMPLIANCE: STRIDE THREAT MODEL AUDITED | ARGON2ID AUTH | CSRF HARDENED", ha='center', va='center', fontsize=6.8, fontweight='bold', color='#FFFFFF')
plt.tight_layout()
out_file = os.path.join(OUT_DIR, "diagram6_security.png")
plt.savefig(out_file, dpi=300, facecolor=fig.get_facecolor(), bbox_inches='tight')
plt.close()
if __name__ == "__main__":
create_architecture_diagram()
create_extraction_diagram()
create_ast_diagram()
create_scheduler_diagram()
create_whatif_diagram()
create_security_diagram()
print("All 6 diagrams generated successfully!")