#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ SriYantra OS - Hugging Face Space Launcher =========================================== Automatically downloads dataset, normalizes CSVs, runs pipeline, and serves app. """ import os import sys import subprocess import json from pathlib import Path # ============================================ # STEP 1: Download Dataset from HF Hub # ============================================ print("=" * 60) print("SriYantra OS - Space Launcher") print("=" * 60) print() print("Step 1: Downloading dataset from Hugging Face Hub...") try: from huggingface_hub import snapshot_download, login # Get token from environment (Space Secrets) token = os.environ.get("HF_TOKEN") if token: login(token=token) print(" HF Token authenticated") else: print(" No HF_TOKEN found - using unauthenticated access") # Download dataset snapshot_download( repo_id="kalpesh77/vedic-neural-geometry", repo_type="dataset", local_dir=".", token=token, resume_download=True ) print(" Dataset downloaded successfully!") except Exception as e: print(" Error downloading dataset: " + str(e)) print(" Using local files if available...") # ============================================ # STEP 2: Check Downloaded Files # ============================================ print() print("Step 2: Checking downloaded files...") required_files = { "scripts/build_pipeline_enhanced.py": "Build Pipeline", "scripts/normalize_csv.py": "CSV Normalizer", "scripts/vedic_dataset_loader.py": "Dataset Loader", "ontology/entity_registry.csv": "Ontology Entity Registry", "ontology/module_registry.csv": "Ontology Module Registry", "ontology/relation_registry.csv": "Ontology Relation Registry", "shriyantra_geometry/triangle_geometry.csv": "Triangle Geometry", "shriyantra_geometry/bindu_registry.csv": "Bindu Registry", "docs/REASONING_PATHS.md": "Reasoning Paths (Marathi)", "text_data/qa_pairs.jsonl": "QA Pairs", } missing_files = [] for file_path, description in required_files.items(): if os.path.exists(file_path): print(" OK " + description + ": " + file_path) else: print(" MISSING " + description + ": " + file_path) missing_files.append(file_path) if missing_files: print(" " + str(len(missing_files)) + " files missing - some features may not work") # ============================================ # STEP 3: Fix CSV Column Names (CRITICAL FIX) # ============================================ print() print("Step 3: Normalizing CSV column names...") def normalize_csv_columns(input_dir, output_dir=None): """Normalize all CSV column names to lowercase""" import pandas as pd import glob input_path = Path(input_dir) if not input_path.exists(): print(" Directory not found: " + input_dir) return 0 if output_dir: output_path = Path(output_dir) output_path.mkdir(parents=True, exist_ok=True) fixed_count = 0 for csv_file in input_path.rglob("*.csv"): try: df = pd.read_csv(csv_file) # Check if columns need normalization original_cols = df.columns.tolist() normalized_cols = [col.lower().strip() for col in original_cols] if original_cols != normalized_cols: df.columns = normalized_cols if output_dir: # Save to output directory rel_path = csv_file.relative_to(input_path) out_file = output_path / rel_path out_file.parent.mkdir(parents=True, exist_ok=True) df.to_csv(out_file, index=False) print(" Fixed: " + str(csv_file) + " -> " + str(out_file)) else: # Overwrite original df.to_csv(csv_file, index=False) print(" Fixed: " + str(csv_file)) fixed_count += 1 else: # Copy to output if needed if output_dir: rel_path = csv_file.relative_to(input_path) out_file = output_path / rel_path out_file.parent.mkdir(parents=True, exist_ok=True) df.to_csv(out_file, index=False) except Exception as e: print(" Error processing " + str(csv_file) + ": " + str(e)) return fixed_count # Normalize ontology CSVs ontology_fixed = normalize_csv_columns("ontology", "ontology_normalized") print(" Normalized " + str(ontology_fixed) + " ontology CSV files") # Normalize shriyantra_geometry CSVs geometry_fixed = normalize_csv_columns("shriyantra_geometry", "shriyantra_geometry_normalized") print(" Normalized " + str(geometry_fixed) + " geometry CSV files") # ============================================ # STEP 4: Run Build Pipeline # ============================================ print() print("Step 4: Running build pipeline...") pipeline_path = "scripts/build_pipeline_enhanced.py" if os.path.exists(pipeline_path): try: # Run pipeline with normalized directories result = subprocess.run( [sys.executable, pipeline_path, "--input-dir", ".", "--output-dir", "canonical", "--validate", "--normalize"], capture_output=True, text=True, timeout=300 ) print(result.stdout) if result.returncode != 0: print(" Pipeline warnings/errors:") print(result.stderr) else: print(" Pipeline completed successfully!") except subprocess.TimeoutExpired: print(" Pipeline timed out (5 minutes)") except Exception as e: print(" Error running pipeline: " + str(e)) else: print(" Pipeline script not found: " + pipeline_path) # ============================================ # STEP 5: Verify Output # ============================================ print() print("Step 5: Verifying output...") output_files = { "canonical/nodes.parquet": "Nodes", "canonical/edges.parquet": "Edges", "canonical/modules.parquet": "Modules", "canonical/knowledge_graph.graphml": "Knowledge Graph", } for file_path, description in output_files.items(): if os.path.exists(file_path): size = os.path.getsize(file_path) print(" OK " + description + ": " + file_path + " (" + str(size) + " bytes)") else: print(" NOT GENERATED " + description + ": " + file_path) # ============================================ # STEP 6: Launch Gradio App # ============================================ print() print("Step 6: Launching SriYantra OS Viewer...") import gradio as gr import pandas as pd import networkx as nx from pathlib import Path # Load data try: # Try to load normalized data first ontology_dir = "ontology_normalized" if os.path.exists("ontology_normalized") else "ontology" geometry_dir = "shriyantra_geometry_normalized" if os.path.exists("shriyantra_geometry_normalized") else "shriyantra_geometry" # Load entity registry entity_file = Path(ontology_dir) / "entity_registry.csv" if entity_file.exists(): df_entities = pd.read_csv(entity_file) print(" Loaded " + str(len(df_entities)) + " entities") else: df_entities = pd.DataFrame() print(" No entity registry found") # Load module registry module_file = Path(ontology_dir) / "module_registry.csv" if module_file.exists(): df_modules = pd.read_csv(module_file) print(" Loaded " + str(len(df_modules)) + " modules") else: df_modules = pd.DataFrame() print(" No module registry found") # Load relation registry relation_file = Path(ontology_dir) / "relation_registry.csv" if relation_file.exists(): df_relations = pd.read_csv(relation_file) print(" Loaded " + str(len(df_relations)) + " relations") else: df_relations = pd.DataFrame() print(" No relation registry found") # Load triangle geometry triangle_file = Path(geometry_dir) / "triangle_geometry.csv" if triangle_file.exists(): df_triangles = pd.read_csv(triangle_file) print(" Loaded " + str(len(df_triangles)) + " triangles") else: df_triangles = pd.DataFrame() print(" No triangle geometry found") # Load bindu registry bindu_file = Path(geometry_dir) / "bindu_registry.csv" if bindu_file.exists(): df_bindus = pd.read_csv(bindu_file) print(" Loaded " + str(len(df_bindus)) + " bindus") else: df_bindus = pd.DataFrame() print(" No bindu registry found") except Exception as e: print(" Error loading data: " + str(e)) df_entities = pd.DataFrame() df_modules = pd.DataFrame() df_relations = pd.DataFrame() df_triangles = pd.DataFrame() df_bindus = pd.DataFrame() # ============================================ # GRADIO INTERFACE # ============================================ def get_entity_info(entity_id): """Get entity information""" if df_entities.empty or 'entity_id' not in df_entities.columns: return "No entity data available" entity = df_entities[df_entities['entity_id'] == entity_id] if entity.empty: return "Entity " + entity_id + " not found" return entity.to_string() def get_module_info(module_id): """Get module information""" if df_modules.empty or 'module_id' not in df_modules.columns: return "No module data available" module = df_modules[df_modules['module_id'] == module_id] if module.empty: return "Module " + module_id + " not found" return module.to_string() def get_relations(entity_id): """Get relations for an entity""" if df_relations.empty: return "No relation data available" relations = df_relations[ (df_relations.get('source_id') == entity_id) | (df_relations.get('target_id') == entity_id) ] if relations.empty: return "No relations found for " + entity_id return relations.to_string() def get_triangle_geometry(): """Get triangle geometry data""" if df_triangles.empty: return "No triangle geometry available" return df_triangles.head(10).to_string() def get_bindu_data(): """Get bindu data""" if df_bindus.empty: return "No bindu data available" return df_bindus.head(10).to_string() def get_system_status(): """Get overall system status""" status = { "Entities": len(df_entities), "Modules": len(df_modules), "Relations": len(df_relations), "Triangles": len(df_triangles), "Bindus": len(df_bindus), } return json.dumps(status, indent=2) # Create Gradio interface with gr.Blocks(title="SriYantra OS - Vedic Neural Geometry") as demo: gr.Markdown("# SriYantra OS - Vedic Neural Geometry Viewer") gr.Markdown("### Universal Knowledge Operating System") with gr.Tab("System Status"): gr.Markdown("## System Overview") status_output = gr.Textbox( label="Dataset Status", value=get_system_status(), lines=10 ) refresh_btn = gr.Button("Refresh Status") refresh_btn.click( fn=get_system_status, outputs=status_output ) with gr.Tab("Entities"): gr.Markdown("## Vedic Ontology Entities") with gr.Row(): entity_input = gr.Textbox(label="Entity ID", placeholder="Enter entity ID...") entity_button = gr.Button("Get Entity Info") entity_output = gr.Textbox(label="Entity Information", lines=15) entity_button.click( fn=get_entity_info, inputs=entity_input, outputs=entity_output ) with gr.Tab("Modules"): gr.Markdown("## SriYantra OS Modules (9 Engines)") with gr.Row(): module_input = gr.Textbox(label="Module ID", placeholder="Enter module ID...") module_button = gr.Button("Get Module Info") module_output = gr.Textbox(label="Module Information", lines=15) module_button.click( fn=get_module_info, inputs=module_input, outputs=module_output ) with gr.Tab("Relations"): gr.Markdown("## Entity Relationships") with gr.Row(): relation_input = gr.Textbox(label="Entity ID", placeholder="Enter entity ID...") relation_button = gr.Button("Get Relations") relation_output = gr.Textbox(label="Relations", lines=15) relation_button.click( fn=get_relations, inputs=relation_input, outputs=relation_output ) with gr.Tab("Geometry"): gr.Markdown("## Sri Yantra Geometry") with gr.Row(): triangle_button = gr.Button("Show Triangles") bindu_button = gr.Button("Show Bindus") triangle_output = gr.Textbox(label="Triangle Geometry", lines=15) bindu_output = gr.Textbox(label="Bindu Data", lines=15) triangle_button.click(fn=get_triangle_geometry, outputs=triangle_output) bindu_button.click(fn=get_bindu_data, outputs=bindu_output) with gr.Tab("Reasoning Paths"): gr.Markdown("## Multi-Hop Reasoning Paths") gr.Markdown(""" ### Available Paths: 1. **Vastu Path** (Scale 60-100): Land -> Vastu -> Panchabhuta -> Graha -> Yantra 2. **Mantra Path** (Scale 10-60): Consciousness -> Graha -> Mantra -> Frequency 3. **Quantum Path** (Scale 0-30): Intention -> Quantum -> Frequency -> Yantra 4. **Healing Path** (Scale 40-100): Body -> Chakra -> Tattva -> Mantra -> Yantra 5. **Time Path** (Scale 40-60): Event -> Kaal -> Graha -> Panchabhuta -> Yantra """) gr.Markdown("---") gr.Markdown("*SriYantra OS v2.0.0 | Last Updated: 2026-06-10*") # Launch the app if __name__ == "__main__": demo.launch()